OSDN Git Service
(root)
/
toppersasp4lpc
/
asp.git
/ commitdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
| commitdiff |
tree
raw
|
patch
|
inline
| side by side (from parent 1:
be4ba5e
)
浮動小数点判定部の条件ジャンプを全部条件実効に変更した。
author
suikan
<suikan@users.sourceforge.jp>
Sun, 21 Oct 2012 08:50:54 +0000
(17:50 +0900)
committer
suikan
<suikan@users.sourceforge.jp>
Sun, 21 Oct 2012 08:50:54 +0000
(17:50 +0900)
asp/arch/arm_m_gcc/common/core_support.S
patch
|
blob
|
history
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
(file)
--- 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コプロセッサを使用したか */
/* 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を読み込む */
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コプロセッサを使用したタスクか */
/* CORTEX-M4Fコア固有の処理 */
pop {r0} /* FPCAビットを保存 */
tst r0, #CONTROL_FPCA /* FPコプロセッサを使用したタスクか */
- beq dispatch_m4f_2
- vldmia
sp!,{s16-s31}
/* 使用したのならレジスタを復帰。これでFPCAビットは1になる */
+ it ne
+ vldmia
ne sp!,{s16-s31}
/* 使用したのならレジスタを復帰。これでFPCAビットは1になる */
dispatch_m4f_2:
#endif /* defined(__ARM_ARCH_7EM__) & !defined(__SOFTFP__)*/
ldmfd sp!,{r4 - r11,lr} /* レジスタの復帰 */
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。例外フレームには浮動小数点コンテキストを含んでいるか */
#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度プッシュ */
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__)*/
/* この先はショート例外フレームである */
#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 /* 例外フレームには浮動小数点コンテキストを含んでいるか */
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
#endif /* defined(__ARM_ARCH_7EM__) & !defined(__SOFTFP__)*/
msr psp, r0
mov r0, #0