OSDN Git Service

浮動小数点判定部の条件ジャンプを全部条件実効に変更した。
authorsuikan <suikan@users.sourceforge.jp>
Sun, 21 Oct 2012 08:50:54 +0000 (17:50 +0900)
committersuikan <suikan@users.sourceforge.jp>
Sun, 21 Oct 2012 08:50:54 +0000 (17:50 +0900)
asp/arch/arm_m_gcc/common/core_support.S

index 69dbb02..ea70d68 100644 (file)
@@ -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