From 8c08d4b1283110acfee09d8c7d906402eb15f5a7 Mon Sep 17 00:00:00 2001 From: suikan Date: Sun, 21 Oct 2012 17:50:54 +0900 Subject: [PATCH] =?utf8?q?=E6=B5=AE=E5=8B=95=E5=B0=8F=E6=95=B0=E7=82=B9?= =?utf8?q?=E5=88=A4=E5=AE=9A=E9=83=A8=E3=81=AE=E6=9D=A1=E4=BB=B6=E3=82=B8?= =?utf8?q?=E3=83=A3=E3=83=B3=E3=83=97=E3=82=92=E5=85=A8=E9=83=A8=E6=9D=A1?= =?utf8?q?=E4=BB=B6=E5=AE=9F=E5=8A=B9=E3=81=AB=E5=A4=89=E6=9B=B4=E3=81=97?= =?utf8?q?=E3=81=9F=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit --- asp/arch/arm_m_gcc/common/core_support.S | 34 +++++++++++++------------------- 1 file changed, 14 insertions(+), 20 deletions(-) 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 -- 2.11.0