From: suikan Date: Sun, 21 Oct 2012 08:50:54 +0000 (+0900) Subject: 浮動小数点判定部の条件ジャンプを全部条件実効に変更した。 X-Git-Url: http://git.osdn.net/view?p=toppersasp4lpc%2Fasp.git;a=commitdiff_plain;h=8c08d4b1283110acfee09d8c7d906402eb15f5a7 浮動小数点判定部の条件ジャンプを全部条件実効に変更した。 --- diff --git a/asp/arch/arm_m_gcc/common/core_support.S b/asp/arch/arm_m_gcc/common/core_support.S index 69dbb02..ea70d68 100644 --- a/asp/arch/arm_m_gcc/common/core_support.S +++ b/asp/arch/arm_m_gcc/common/core_support.S @@ -71,12 +71,11 @@ dispatch: /* 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を読み込む */ @@ -95,8 +94,8 @@ dispatch_r: /* 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} /* レジスタの復帰 */ @@ -491,17 +490,13 @@ ret_int_3: #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__)*/ @@ -587,9 +582,8 @@ svc_handler: 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