Note
Access to this page requires authorization. You can try signing in or changing directories.
Access to this page requires authorization. You can try changing directories.
Microsoft Specific
Emit the two forms of the IPF Parallel Multiply (pmpy2) instruction, which performs multiplication in parallel on multiple integers.
__m64 __m64_pmpy2l(
__m64 a,
__m64 b
);
__m64 __m64_pmpy2r(
__m64 a,
__m64 b
);
Parameters
[in] a
An __m64 union containing an array of four 16-bit signed integers.[in] b
An __m64 union containing an array of four 16-bit signed integers.
Return Value
An __m64 union containing two 32-bit signed integers representing the results of the multiplication.
Requirements
Intrinsic |
Architecture |
---|---|
__m64_pmpy2l |
IPF |
__m64_pmpy2r |
IPF |
Header file <intrin.h>
Remarks
The __m64_pmpy2l (left) intrinsic multiplies a[1]*b[1] and a[3]*b[3]. The __m64_pmpy2r (right) intrinsic multiplies a[0]*b[0] and a[2]*b[2]. In both cases, the result is two 32-bit signed integers, which are placed in elements 0 and 1 of the result.
Example
// pmpy2.cpp
// processor: IPF
#include <stdio.h>
#include <intrin.h>
#pragma intrinsic(__m64_pmpy2l, __m64_pmpy2r)
void print16(__int16* ia)
{
printf_s("{ %8d, %8d, %8d, %8d }\n", ia[0], ia[1], ia[2], ia[3]);
}
void print32(__int32* ia)
{
printf_s("{ %8d, %8d }\n", ia[0], ia[1]);
}
int main()
{
__int16 a[4] = { -1, 1, -2, 6000 };
__int16 b[4] = { -1, 2, 10, 15000 };
__int32 cl[2], cr[2], i;
__m64 m, n, result;
printf_s("a: \n");
print16(a);
printf_s("b: \n");
print16(b);
for (int i = 0; i < 4; i+)
{
m.m64_i16[i] = a[i];
n.m64_i16[i] = b[i];
}
printf_s("__m64_pmpy2r computes a[0]*b[0] and a[2]*b[2] : ");
result = __m64_pmpy2r(m, n);
print32(result.m64_i32);
result = __m64_pmpy2l(m, n);
printf_s("__m64_pmpy2l computes a[1]*b[1] and a[3]*b[3] : ");
print32(result.m64_i32);
}
a: { -1, 1, -2, 6000 } b: { -1, 2, 10, 15000 } __m64_pmpy2r computes a[0]*b[0] and a[2]*b[2] : { 1, -20 } __m64_pmpy2l computes a[1]*b[1] and a[3]*b[3] : { 2, 90000000 }