下位ハーフワードについてと上位ハーフワードについての 2 つの 16 ビット乗算を実行し、下位ハーフワードの積から上位ハーフワードの積を減算することによってその積の差を求め、64 ビット累算オペランドにその差を加算することができます。乗算中も減算中もオーバーフローが発生することはありません。オーバーフローは、64 ビット加算の結果として発生する可能性があります。このオーバーフローは検出されません。264 を法(モジュロ)として結果がラップアラウンドされます。
構文
unsigned long long __smlsld(unsigned int
val1
, unsigned int
val2
, unsigned long long
val3
)
各項目には以下の意味があります。
-
val1
-
それぞれの乗算の第 1 オペランドとなるハーフワードを保持します。
-
val2
-
それぞれの乗算の第 2 オペランドとなるハーフワードを保持します。
-
val3
-
累算値を保持します。
戻り値
__smlsld
コンパイラ組み込み関数は、各乗算の積の差を累算値に加算して返します。
例
unsigned long long dual_multiply_diff_prods(unsigned int val1, unsigned int val2, unsigned long long val3)
{
unsigned int res;
res = __smlsld(val1,val2,val3); /* p1 = val1[15:0] × val2[15:0]
p2 = val1[31:16] × val2[31:16]
res[63:0] = p1 - p2 + val3[63:0]
*/
return res;
}