/* CORTEX-M4Fコア固有の処理 */
mrs r0, control /* CONTROL レジスタを読む */
tst r0, #CONTROL_FPCA /* FPコプロセッサを使用したか */
- beq dispatch_m4f_1
- vstmdb sp!,{s16-s31} /* 使用したのなら保存 */
- bic r1,r0, #CONTROL_FPCA /* タスク切り替えまで浮動小数点レジスタを使わないのでFPCAをクリア */
- msr control, r1 /* これでディスパッチャ内部での割り込み受付は、FPレジスタを保存しない */
- isb
-dispatch_m4f_1:
+ itttt ne
+ vstmdbne sp!,{s16-s31} /* 使用したのなら保存 */
+ bicne r1,r0, #CONTROL_FPCA /* タスク切り替えまで浮動小数点レジスタを使わないのでFPCAをクリア */
+ msrne control, r1 /* これでディスパッチャ内部での割り込み受付は、FPレジスタを保存しない */
+ isbne
push {r0} /* FPCAビットを保存 */
#endif /* defined(__ARM_ARCH_7EM__) & !defined(__SOFTFP__)*/
ldr r0, =p_runtsk /* p_runtskを読み込む */
/* CORTEX-M4Fコア固有の処理 */
pop {r0} /* FPCAビットを保存 */
tst r0, #CONTROL_FPCA /* FPコプロセッサを使用したタスクか */
- beq dispatch_m4f_2
- vldmia sp!,{s16-s31} /* 使用したのならレジスタを復帰。これでFPCAビットは1になる */
+ it ne
+ vldmiane sp!,{s16-s31} /* 使用したのならレジスタを復帰。これでFPCAビットは1になる */
dispatch_m4f_2:
#endif /* defined(__ARM_ARCH_7EM__) & !defined(__SOFTFP__)*/
ldmfd sp!,{r4 - r11,lr} /* レジスタの復帰 */
#if defined(__ARM_ARCH_7EM__) & !defined(__SOFTFP__)
tst r3,#FP_EXC_FRAME /* r3はLR。例外フレームには浮動小数点コンテキストを含んでいるか */
- beq ret_int_m4f_1 /* このbitは0の時浮動小数点コンテキストが含まれていることを示す */
- /* 含んでいないときの処理 */
+ it eq /* 含まれている場合の処理 */
+ vstmdbeq r2!,{s16-s31} /* preserved FPレジスタを保存。ここでlazystackingは解消される */
+ /* 共通処理 */
stmfd r2!,{r3} /* LRは、後でsvc_handlerから擬似リターンするときに使う */
stmfd r2!,{r3} /* アライメントのために2度プッシュ */
- b ret_int_m4f_2
-ret_int_m4f_1: /* 例外フレームが浮動小数点コンテキストを含んでいるときの処理 */
- vstmdb r2!,{s16-s31} /* preserved FPレジスタを保存。ここでlazystackingは解消される */
- stmfd r2!,{r3} /* LRは、後でsvc_handlerから擬似リターンするときに使う */
- stmfd r2!,{r3} /* アライメントのために2度プッシュ */
- orr r3,#FP_EXC_FRAME /* r3はLR。EXC_RETURNをFPなしフレームに強制する */
-ret_int_m4f_2:
+ it eq /* 含まれている場合の処理 */
+ orreq r3,#FP_EXC_FRAME /* r3はLR。EXC_RETURNをFPなしフレームに強制する */
/* この先はショート例外フレームである */
#endif /* defined(__ARM_ARCH_7EM__) & !defined(__SOFTFP__)*/
ldmfd r0!,{lr}
ldmfd r0!,{lr} /* LRフレームはアライメントのために二度積まれている */
tst lr,#FP_EXC_FRAME /* 例外フレームには浮動小数点コンテキストを含んでいるか */
- bne svc_handler_m4f_1 /* 当該ビットが1なら含んでいない */
- vldmia r0!,{s16-s31} /* 含んでいるならpreserved FPレジスタを復帰する */
-svc_handler_m4f_1:
+ it eq /* 当該ビットが0なら含んでいなる */
+ vldmiaeq r0!,{s16-s31} /* 含んでいるならpreserved FPレジスタを復帰する */
#endif /* defined(__ARM_ARCH_7EM__) & !defined(__SOFTFP__)*/
msr psp, r0
mov r0, #0