2016-04-24 79 views
0

我想從編譯RT的ARM Cortex M3/M4F處理器(armv7m和armv7em與fpu)。爲Arm Cortex M3/M4(CPSR/APSR位操作)修改Comipler RT彙編代碼

我除了兩行代碼(msr CPSR_f, ipmsr 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, ipmsr 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