2 /* { dg-options "-O2 -msha" } */
3 /* { dg-require-effective-target sha } */
6 #include "m128-check.h"
11 f0 (int b
, int c
, int d
)
13 return (b
& c
) ^ (~b
& d
);
17 f1 (int b
, int c
, int d
)
23 f2 (int b
, int c
, int d
)
25 return (b
& c
) ^ (b
& d
) ^ (c
& d
);
28 int (*f_arr
[4])(int, int, int) = { f0
, f1
, f2
, f1
};
29 const int k_arr
[4] = { 0x5A827999, 0x6ED9EBA1, 0x8F1BBCDC, 0xCA62C1D6 };
33 compute_sha1rnds4 (int *src1
, int *src2
, int imm
, int *res
)
36 int (*f
)(int, int, int) = f_arr
[imm
];
38 int w
[4] = { src2
[3], src2
[2], src2
[1], src2
[0] };
39 int a
[5], b
[5], c
[5], d
[5], e
[5];
48 for (i
= 0; i
<= 3; i
++)
50 a
[i
+1] = f(b
[i
], c
[i
], d
[i
]) + __rold (a
[i
], 5) + w
[i
] + e
[i
] + k
;
52 c
[i
+1] = __rold (b
[i
], 30);
68 union128i_d s1
, s2
, res
;
71 s1
.x
= _mm_set_epi32 (111, 222, 333, 444);
72 s2
.x
= _mm_set_epi32 (555, 666, 777, 888);
74 res
.x
= _mm_sha1rnds4_epu32 (s1
.x
, s2
.x
, 0);
75 compute_sha1rnds4 (s1
.a
, s2
.a
, 0, res_ref
);
76 if (check_union128i_d (res
, res_ref
))
79 res
.x
= _mm_sha1rnds4_epu32 (s1
.x
, s2
.x
, 1);
80 compute_sha1rnds4 (s1
.a
, s2
.a
, 1, res_ref
);
81 if (check_union128i_d (res
, res_ref
))
84 res
.x
= _mm_sha1rnds4_epu32 (s1
.x
, s2
.x
, 2);
85 compute_sha1rnds4 (s1
.a
, s2
.a
, 2, res_ref
);
86 if (check_union128i_d (res
, res_ref
))
89 res
.x
= _mm_sha1rnds4_epu32 (s1
.x
, s2
.x
, 3);
90 compute_sha1rnds4 (s1
.a
, s2
.a
, 3, res_ref
);
91 if (check_union128i_d (res
, res_ref
))