Модификация кода сборки Comipler RT для компиляции Arm Cortex M3/M4 (манипулирование битами CPSR/APSR)
Я пытаюсь получить математические процедуры из Compiler RT, работающие с набором инструментов GCC для процессоров ARM Cortex M3/M4F (armv7m и armv7em с fpu).
У меня есть все компиляции (с минимальными изменениями), кроме двух строк кода (msr CPSR_f, ip
а также msr CPSR_f, #APSR_C
) в функциях ниже
#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)
И другая функция:
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)
Нотация CPSR_f недоступна в наборе команд armv7m. Как мне конвертировать msr CPSR_f, ip
а также msr CPSR_f, #APSR_C
в код armv7m (должно быть то же самое для armv7em)?
1 ответ
Вам нужно использовать MOV APSR, Rm
инструкция. Процессоры Cortex-M в основном не имеют CPSR, и регистр APSR действует как его замена в отношении кодов условий.
Первую функцию легко исправить, поскольку она использует регистр в качестве исходного операнда. Просто замени msr CPSR_f, ip
с msr APSR_nzcvq, ip
, Вторая функция потребует пройти через регистр. Предполагая, что IP-регистр может быть закрыт, как в первой функции, которую вы можете использовать:
mov ip, #APSR_C
msr APSR_nzcvq, ip