| /* { dg-do run { target { s390*-*-* } } } */ |
| /* { dg-require-effective-target s390_vx } */ |
| /* { dg-options "-O3 -mzarch -march=z13" } */ |
| |
| /* For FP zero checks we use the ltdbr instruction. Since this is an |
| load and test it actually writes the FPR. Whenever an FPR gets |
| written the rest of the overlapping VR is clobbered. */ |
| typedef double __attribute__((vector_size(16))) v2df; |
| |
| v2df a = { 1.0, 2.0 }; |
| |
| extern void abort (void); |
| |
| void __attribute__((noinline)) |
| foo (v2df a) |
| { |
| v2df b = { 1.0, 3.0 }; |
| |
| b -= a; |
| |
| /* Take away all the VRs not overlapping with FPRs. */ |
| asm volatile ("" : : : |
| "v16","v17","v18","v19", |
| "v20","v21","v22","v23", |
| "v24","v25","v26","v27", |
| "v28","v29","v30","v31"); |
| if (b[0] != 0.0) /* ltdbr */ |
| abort (); |
| if (b[1] != 1.0) |
| abort (); |
| } |
| |
| int |
| main () |
| { |
| foo (a); |
| return 0; |
| } |