/* { dg-do run } */ /* { dg-require-effective-target sse3 } */ /* { dg-options "-O3 -msse3" } */ #ifndef CHECK_H #define CHECK_H "sse3-check.h" #endif #ifndef TEST #define TEST sse3_test #endif #include CHECK_H double a[2], b[2], c[2]; void __attribute__((noipa)) foo () { /* When we want to use addsubpd we have to keep permuting both loads, if instead we blend the result of an add and a sub we can combine the blend with the permute. Both are similar in cost, verify we did not wrongly apply both. */ double tem0 = a[1] - b[1]; double tem1 = a[0] + b[0]; c[0] = tem0; c[1] = tem1; } static void TEST (void) { a[0] = 1.; a[1] = 2.; b[0] = 2.; b[1] = 4.; foo (); if (c[0] != -2. || c[1] != 3.) __builtin_abort (); }