ARM Cortex M3/M4Fプロセッサ用のGCCツールチェーンで動作するコンパイラRTの算術ルーチンを取得しようとしていますarmv7emとfpu)。ARM Cortex M3/M4(Compaq/M4Fプロセッサ用)をコンパイルするためのComipler RTアセンブリコードの変更
Iは
#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)
そして、他の機能以下の機能における2行のコード(msr CPSR_f, ip
とmsr CPSR_f, #APSR_C
)を除く(最小限の変更で)コンパイルすべてを有する:CPSR_f表記である
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)
をarmv7m命令セットでは使用できません。 msr CPSR_f, ip
とmsr CPSR_f, #APSR_C
をarmv7mコードに変換するにはどうすればよいですか(armv7emも同じにする必要があります)。
どのようにCPSR_f部分を処理できますか? _fは、それが上位8ビットにしか影響しないことを意味します(私は思っています)。だから私はAPSRを読んで、上位8ビットをクリアしてからそれを書き戻す必要があります。 3つの命令が最速かつ唯一の方法ですか? – TylerG
'_f'部分は、それが条件フラグビットにのみ影響することを意味します。これは、APSRが使用されるすべてです。 CPSRの他の部分は他のレジスタに存在するか、存在しません。あなたは私が記述したもの以外に何もする必要はありません。 –
私はこれを試しています。私は 'mov APSR、ip'ではなく' msr APSR、ip'が必要だと思うが、 "ビットマスクを指定しないでAPSRに書き込む"というエラーが出る。だから、私は 'msr APSR_nzcvq、ip'を試してみて、OKをコンパイルしました。それは正しく見えますか? – TylerG