1 /* { dg-do run { target i?86-*-* x86_64-*-* } } */
2 /* { dg-require-effective-target sse5 } */
3 /* { dg-options "-O2 -msse5" } */
5 #include "sse5-check.h"
18 } dst
, res
, src1
, src2
, src3
;
21 /* Note that in macc*,msub*,mnmacc* and mnsub* instructions, the intermdediate
22 product is not rounded, only the addition is rounded. */
28 for (i
= 0; i
< NUM
* 4; i
++)
40 for (i
= 0; i
< NUM
* 4; i
++)
51 int i
, j
, check_fails
= 0;
52 for (i
= 0; i
< NUM
* 4; i
= i
+ 4)
53 for (j
= 0; j
< 4; j
++)
55 res
.f
[i
+ j
] = (src1
.f
[i
+ j
] * src2
.f
[i
+ j
]) + src3
.f
[i
+ j
];
56 if (dst
.f
[i
+ j
] != res
.f
[i
+ j
])
65 int i
, j
, check_fails
= 0;
66 for (i
= 0; i
< NUM
* 2; i
= i
+ 2)
67 for (j
= 0; j
< 2; j
++)
69 res
.d
[i
+ j
] = (src1
.d
[i
+ j
] * src2
.d
[i
+ j
]) + src3
.d
[i
+ j
];
70 if (dst
.d
[i
+ j
] != res
.d
[i
+ j
])
80 int i
, j
, check_fails
= 0;
81 for (i
= 0; i
< NUM
* 4; i
= i
+ 4)
83 res
.f
[i
] = (src1
.f
[i
] * src2
.f
[i
]) + src3
.f
[i
];
84 if (dst
.f
[i
] != res
.f
[i
])
93 int i
, j
, check_fails
= 0;
94 for (i
= 0; i
< NUM
* 2; i
= i
+ 2)
96 res
.d
[i
] = (src1
.d
[i
] * src2
.d
[i
]) + src3
.d
[i
];
97 if (dst
.d
[i
] != res
.d
[i
])
100 return check_fails
++;
111 for (i
= 0; i
< NUM
; i
++)
112 dst
.x
[i
] = _mm_macc_ps (src1
.x
[i
], src2
.x
[i
], src3
.x
[i
]);
118 for (i
= 0; i
< NUM
; i
++)
119 dst
.x
[i
] = _mm_macc_ss (src1
.x
[i
], src2
.x
[i
], src3
.x
[i
]);
127 for (i
= 0; i
< NUM
; i
++)
128 dst
.y
[i
] = _mm_macc_pd (src1
.y
[i
], src2
.y
[i
], src3
.y
[i
]);
134 for (i
= 0; i
< NUM
; i
++)
135 dst
.y
[i
] = _mm_macc_sd (src1
.y
[i
], src2
.y
[i
], src3
.y
[i
]);