2016-04-24 1 views
0

Я пытаюсь получить математические процедуры из компилятора RT, работающего с инструментальной цепочкой GCC для процессоров ARM Cortex M3/M4F (armv7m и armv7em с fpu).Модификация Comipler RT Сборочный код для компиляции для Arm Cortex M3/M4 (обработка бит CPSR/APSR)

У меня есть все компиляции (с минимальными изменениями), за исключением двух строк кода (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)?

ответ

0

Вам необходимо использовать инструкцию MOV APSR, Rm. Процессоры Cortex-M в основном не имеют CPSR, а регистр APSR выступает в качестве замены, поскольку коды условий идут.

Первая функция легко исправить, так как она использует регистр как исходный операнд. Просто замените msr CPSR_f, ip на msr APSR_nzcvq, ip. Вторая функция потребует пройти через регистр. Предполагая, что регистр IP может быть сбит так же, как и в первой функции, которую вы можете использовать:

mov ip, #APSR_C 
msr APSR_nzcvq, ip 
+0

Как обрабатывать часть CPSR_f? _f означает, что он влияет только на верхние 8 бит (я думаю). Поэтому мне нужно будет прочитать APSR, очистить верхние 8 бит, а затем записать его обратно. Есть 3 инструкции самый быстрый и единственный способ сделать это? – TylerG

+0

Элемент '_f' означает, что он влияет только на биты флажков условий, для которых используется все, что используется APSR. Другие части CPSR находятся в других регистрах или не существуют. Тебе не нужно ничего, кроме того, что я описал. –

+0

Я пытаюсь это сделать. Я думаю, мне нужно «msr APSR, ip', а не« mov APSR, ip », но затем я получаю сообщение« запись в APSR без указания битмаски, устаревшей ». Поэтому я попробовал 'msr APSR_nzcvq, ip' и скомпилировал OK. Правильно ли это? – TylerG

Смежные вопросы