更新:2011 年 3 月
必須有 Visual Studio 2010 SP1。
Microsoft 專有的
產生 XOP 指令 vpmadcswd,以執行其來源的整數積和累計運算。
__m128i _mm_maddd_epi16 (
__m128i src1,
__m128i src2,
__m128i src3
);
參數
[in] src1
128 位元參數,這個參數包含八個 16 位元帶正負號的整數。[in] src2
128 位元參數,這個參數包含八個 16 位元帶正負號的整數。[in] src3
128 位元參數,這個參數包含四個 32 位元帶正負號的整數。
傳回值
128 位元結果 r,這個結果包含四個 32 位元帶正負號的整數。
tempeven[i] := src1[2*i] * src2[2*i]; // 16*16->32
tempodd[i] := src1[2*i+1] * src2[2*i+1]; // 16*16->32
r[i] = tempeven[i] + tempodd[i] + src3[i];
需求
內建 |
架構 |
|---|---|
_mm_maddd_epi16 |
XOP |
標頭檔 <intrin.h>
備註
src1 中每個奇數索引的 16 位元帶正負號整數值會乘以 src2 中對應的 16 位元帶正負號整數值。 src1 中下一個 (奇數索引) 16 位元帶正負號整數值會乘以 src2 中對應的 16 位元帶正負號整數值。 加上 32 位元帶正負號的整數乘積,並將其總和與 src3 中對應的 32 位元帶正負號整數值相加,然後將帶正負號的 32 位元整數結果儲存為目的地中的對應值。
會忽略溢位。
vpmadcswd 指令屬於 XOP 指令家族的一部分。 在使用這個內建之前,您必須先確定處理器支援這個指令。 若要判斷這個指令的硬體支援,請指定 InfoType = 0x80000001 以呼叫 __cpuid 內建,並檢查 CPUInfo[2] (ECX) 的位元 11。 當支援指令時,這個位元為 1,否則為 0。
範例
#include <stdio.h>
#include <intrin.h>
int main()
{
__m128i a, b, c, d;
int i;
for (i = 0; i < 8; i++) {
a.m128i_i16[i] = 8000*(i-4);
b.m128i_i16[i] = 10000;
}
for (i = 0; i < 4; i++) {
c.m128i_i32[i] = -1900000000;
}
d = _mm_maddd_epi16(a, b, c);
for (i = 0; i < 4; i++) printf_s(" %d", d.m128i_i32[i]);
printf_s("\n");
}
請參閱
參考
其他資源
針對 Visual Studio 2010 SP1 加入的 XOP 內建
變更記錄
日期 |
記錄 |
原因 |
|---|---|---|
|
2011 年 3 月 |
新增此內容。 |
SP1 功能變更。 |