2018-03-08 Richard Biener <rguenther@suse.de>
[official-gcc.git] / gcc / testsuite / gcc.target / i386 / pr81502.c
blobd28791aacd7c8b88ae755c55e2c9558d5d340cf2
1 /* { dg-do compile { target lp64 } } */
2 /* { dg-options "-O2 -msse2" } */
4 #include <emmintrin.h>
6 #define SIZE (sizeof (void *))
8 static int foo(unsigned char (*foo)[SIZE])
10 __m128i acc = _mm_set_epi32(0, 0, 0, 0);
11 size_t i = 0;
12 for(; i + sizeof(__m128i) <= SIZE; i += sizeof(__m128i)) {
13 __m128i word;
14 __builtin_memcpy(&word, foo + i, sizeof(__m128i));
15 acc = _mm_add_epi32(word, acc);
17 if (i != SIZE) {
18 __m128i word = _mm_set_epi32(0, 0, 0, 0);
19 __builtin_memcpy(&word, foo + i, SIZE - i); // (1)
20 acc = _mm_add_epi32(word, acc);
22 int res;
23 __builtin_memcpy(&res, &acc, sizeof(res));
24 return res;
27 int bar(void *ptr)
29 unsigned char buf[SIZE];
30 __builtin_memcpy(buf, &ptr, SIZE);
31 return foo((unsigned char(*)[SIZE])buf);
34 /* { dg-final { scan-assembler-times "mov" 1 } } */