新石器Wiki

近年はシリコン(石)から進化した便利なもので溢れる時代。そんな気になった事や試した事など記す。

ユーザ用ツール

サイト用ツール


programing:c-language:64bit-multiply-instruction


**文書の過去の版を表示しています。**

32bit×32bit→64bit演算の注意

IAR社のEWARMでは、64bit変数(long long)がサポートされているので、32bit変数同士のかけ算で64bit結果を得る時の留意点について備忘録。(他のコンパイラでは未確認)

ソース例1でアセンブラ出力を確認

下記記述では、「MULS」命令で32bit演算命令が使われてしまっている。

dat64.c
int64_t dmuls(int32_t dat1, int32_t dat2)
{
    return (int64_t)(dat1 * dat2);
}

   ↓(アセンブラ出力リスト)

49          int64_t dmuls(int32_t dat1, int32_t dat2)
50          {
51          	return (int64_t)(dat1 * dat2);
                    dmuls: (+1)
       0x0   0x4348             MULS     R0,R1,R0
       0x2   0x17C1             ASRS     R1,R0,#+31
       0x4   0x4770             BX       LR               ;; return
52          }

ソース例2でアセンブラ出力を確認

下記記述では、「SMULL」命令で期待通り64bit演算命令が使われた。

dat64.c
int64_t dmuls(int32_t dat1, int32_t dat2)
{
    return (int64_t)dat1 * (int64_t)dat2;
}

   ↓(アセンブラ出力リスト)

49          int64_t dmuls(int32_t dat1, int32_t dat2)
50          {
51          	return (int64_t)dat1 * (int64_t)dat2;
                     dmuls: (+1)
        0x0   0xFB81 0x0100      SMULL    R0,R1,R1,R0
        0x4   0x4770             BX       LR               ;; return
52          }

64bit結果を得たい時には、上記のように非演算側をキャストする必要があるので注意。

programing/c-language/64bit-multiply-instruction.1552956877.txt.gz · 最終更新: 2019/03/19 09:54 by 管理者