2016-04-24 19 views
0

Ich versuche, die mathematischen Routinen von Compiler RT arbeiten mit einem GCC-Toolchain für die ARM Cortex M3/M4F Prozessoren (Armv7m und armv7em mit fpu).Ändern Comipler RT Assembly Code für Arm Cortex M3/M4 (CPSR/APSR Bit Manipulation)

Ich habe alles kompilieren (mit minimalen Änderungen) mit Ausnahme von zwei Zeilen Code (msr CPSR_f, ip und msr CPSR_f, #APSR_C) in den Funktionen unter

#define APSR_Z (1 << 30) 
#define APSR_C (1 << 29) 

DEFINE_COMPILERRT_FUNCTION(__aeabi_cfcmple) 
    // Per the RTABI, this function must preserve r0-r11. 
    // Save lr in the same instruction for compactness 
    push {r0-r3, lr} 

    bl __aeabi_fcmplt 
    cmp r0, #1 
    IT(eq) 
    moveq ip, #0 
    beq 1f 

    ldm sp, {r0-r3} 
    bl __aeabi_fcmpeq 
    cmp r0, #1 
    IT(eq) 
    moveq ip, #(APSR_C | APSR_Z) 
    IT(ne) 
    movne ip, #(APSR_C) 

1: 
    msr CPSR_f, ip 
    pop {r0-r3} 
    POP_PC() 
END_COMPILERRT_FUNCTION(__aeabi_cfcmple) 

und der anderen Funktion:

DEFINE_COMPILERRT_FUNCTION(__aeabi_cfcmpeq) 
    push {r0-r3, lr} 
    bl __aeabi_cfcmpeq_check_nan 
    cmp r0, #1 
    pop {r0-r3, lr} 

    // NaN has been ruled out, so __aeabi_cfcmple can't trap 
    bne __aeabi_cfcmple 

    msr CPSR_f, #APSR_C 
    JMP(lr) 
END_COMPILERRT_FUNCTION(__aeabi_cfcmpeq) 

Die CPSR_f Notation nicht verfügbar auf dem armv7m Befehlssatz. Wie konvertiere ich und msr CPSR_f, #APSR_C in armv7m code (sollte für armv7em gleich sein)?

Antwort

0

Sie müssen die MOV APSR, Rm Anweisung verwenden. Die Cortex-M-Prozessoren haben grundsätzlich kein CPSR, und das APSR-Register dient als Ersatz für die Condition-Codes.

Die erste Funktion ist leicht zu beheben, da sie ein Register als Quelloperand verwendet. Ersetzen Sie einfach durch msr APSR_nzcvq, ip. Die zweite Funktion würde das Durchlaufen eines Registers erfordern. Angenommen, das IP-Register kann wie in der ersten Funktion geplottert werden:

+0

Wie gehe ich mit dem CPSR_f-Teil um? Das _f bedeutet, dass es nur die oberen 8 Bits betrifft (denke ich). Also müsste ich APSR lesen, die obersten 8 Bits löschen und dann zurückschreiben. Sind 3 Anweisungen der schnellste und einzige Weg das zu tun? – TylerG

+0

Der '_f' Teil bedeutet, dass er nur die Bedingungsflagsbits beeinflusst, für die APSR nur verwendet wird. Die anderen Teile des CPSR sind in anderen Registern oder existieren nicht. Du brauchst nichts anderes als das, was ich beschrieben habe. –

+0

Ich probiere das aus. Ich denke, ich brauche 'msr APSR, ip' anstatt' mov APSR, ip', aber dann bekomme ich eine "Schreiben an APSR ohne Angabe einer Bitmaske ist veraltet" Fehler. Also habe ich 'msr APSR_nzcvq, ip' ausprobiert und das kompiliert OK. Sieht das richtig aus? – TylerG