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)?
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
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. –
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