MIPS 乗算はオーバーフローできません。完全な 64 ビットの結果を伴う 32x32 ビットの操作です。
同様に、署名された結果と署名されていない結果の間にも大きな違いがあります。
これらを C で簡単にシミュレートするには、以下の C99 整数型が必要です<stdint.h>
。
uint32_t reg1, reg2; /* Use this type for the registers, normally */
uint32_t hi, lo; /* special MIPS registers for 64-bit products and dividends */
/* Signed mult instruction: */
int64_t temp = (int64_t)(int32_t)reg1 * (int_64_t)(int32_t)reg2;
hi = (uint32_t)((temp>>32) & 0xFFFFFFFF);
lo = (uint32_t)(temp & 0xFFFFFFFF);
符号付き 32 ビット型への中間キャストは、符号付き 64 ビット型へのキャストが乗算の前に符号拡張されるように行われます。符号なし乗算も同様ですが、中間キャストが必要ない点が異なります。
/* Unsigned multu instruction: */
uint64_t tempu = (uint64_t)reg1 * (uint64_t)reg2;
hi = (uint32_t)((temp>>32) & 0xFFFFFFFF);
lo = (uint32_t)(temp & 0xFFFFFFFF);