Модификация кода сборки 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
Другие вопросы по тегам