2016-04-24 20 views
0

ARM Cortex M3/M4Fプロセッサ用のGCCツールチェーンで動作するコンパイラRTの算術ルーチンを取得しようとしていますarmv7emとfpu)。ARM Cortex M3/M4(Compaq/M4Fプロセッサ用)をコンパイルするためのComipler RTアセンブリコードの変更

Iは

#define APSR_Z (1 << 30) 
#define APSR_C (1 << 29) 

DEFINE_COMPILERRT_FUNCTION(__aeabi_cfcmple) 
    // Per the RTABI, this function must preserve r0-r11. 
    // Save lr in the same instruction for compactness 
    push {r0-r3, lr} 

    bl __aeabi_fcmplt 
    cmp r0, #1 
    IT(eq) 
    moveq ip, #0 
    beq 1f 

    ldm sp, {r0-r3} 
    bl __aeabi_fcmpeq 
    cmp r0, #1 
    IT(eq) 
    moveq ip, #(APSR_C | APSR_Z) 
    IT(ne) 
    movne ip, #(APSR_C) 

1: 
    msr CPSR_f, ip 
    pop {r0-r3} 
    POP_PC() 
END_COMPILERRT_FUNCTION(__aeabi_cfcmple) 

そして、他の機能以下の機能における2行のコード(msr CPSR_f, ipmsr CPSR_f, #APSR_C)を除く(最小限の変更で)コンパイルすべてを有する:CPSR_f表記である

DEFINE_COMPILERRT_FUNCTION(__aeabi_cfcmpeq) 
    push {r0-r3, lr} 
    bl __aeabi_cfcmpeq_check_nan 
    cmp r0, #1 
    pop {r0-r3, lr} 

    // NaN has been ruled out, so __aeabi_cfcmple can't trap 
    bne __aeabi_cfcmple 

    msr CPSR_f, #APSR_C 
    JMP(lr) 
END_COMPILERRT_FUNCTION(__aeabi_cfcmpeq) 

をarmv7m命令セットでは使用できません。 msr CPSR_f, ipmsr CPSR_f, #APSR_Cをarmv7mコードに変換するにはどうすればよいですか(armv7emも同じにする必要があります)。

答えて

0

MOV APSR, Rm命令を使用する必要があります。 Cortex-Mプロセッサは、基本的にCPSRを持たず、条件コードが適用される限り、APSRレジスタがその置換えとして機能します。

最初の関数は、ソースオペランドとしてレジスタを使用するため、簡単に修正できます。ちょうどmsr CPSR_f, ipmsr APSR_nzcvq, ipと置き換えてください。 2番目の関数はレジスタを通過する必要があります。最初の関数のようにIPレジスタが壊れる可能性があると仮定すると、

mov ip, #APSR_C 
msr APSR_nzcvq, ip 
+0

どのようにCPSR_f部分を処理できますか? _fは、それが上位8ビットにしか影響しないことを意味します(私は思っています)。だから私はAPSRを読んで、上位8ビットをクリアしてからそれを書き戻す必要があります。 3つの命令が最速かつ唯一の方法ですか? – TylerG

+0

'_f'部分は、それが条件フラグビットにのみ影響することを意味します。これは、APSRが使用されるすべてです。 CPSRの他の部分は他のレジスタに存在するか、存在しません。あなたは私が記述したもの以外に何もする必要はありません。 –

+0

私はこれを試しています。私は 'mov APSR、ip'ではなく' msr APSR、ip'が必要だと思うが、 "ビットマスクを指定しないでAPSRに書き込む"というエラーが出る。だから、私は 'msr APSR_nzcvq、ip'を試してみて、OKをコンパイルしました。それは正しく見えますか? – TylerG

関連する問題