0
我想從編譯RT的ARM Cortex M3/M4F處理器(armv7m和armv7em與fpu)。爲Arm Cortex M3/M4(CPSR/APSR位操作)修改Comipler RT彙編代碼
我除了兩行代碼(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應該是相同的)?
如何處理CPSR_f部分? _f意味着它隻影響前8位(我認爲)。所以我需要閱讀APSR,清除前8位,然後寫回。 3條指令是最快和唯一的方法嗎? – TylerG
'_f'部分意味着它隻影響條件標誌位,這是所有APSR用於。 CPSR的其他部分在其他寄存器中或不存在。除了我所描述的,你不需要任何其他的東西。 –
我正在嘗試。我想我需要'msr APSR,ip'而不是'mov APSR,ip',但是我得到了「寫入APSR而未指定位掩碼」的錯誤。所以我嘗試了'msr APSR_nzcvq,ip'並且編譯成OK。這看起來不錯嗎? – TylerG