| /* { dg-do run } */ |
| /* { dg-options "-O2 -fomit-frame-pointer --save-temps -fno-inline" } */ |
| |
| extern void abort (void); |
| |
| typedef float float16x4_t __attribute__ ((vector_size ((16)))); |
| |
| float a; |
| float b; |
| |
| float16x4_t |
| make_vector () |
| { |
| return (float16x4_t) { 0, 0, a, b }; |
| } |
| |
| int |
| main (int argc, char **argv) |
| { |
| a = 4.0; |
| b = 3.0; |
| float16x4_t vec = make_vector (); |
| if (vec[0] != 0 || vec[1] != 0 || vec[2] != a || vec[3] != b) |
| abort (); |
| return 0; |
| } |
| |
| /* For memory models that don't have an addend on the lane value |
| load we can merge the load and lane insert into an LD1. |
| For others we expect LDR + INS sequences. */ |
| /* { dg-final { scan-assembler-times "ld1\\t" 2 { target { aarch64_tiny || aarch64_large } } } } */ |
| /* { dg-final { scan-assembler-times "ins\\t" 2 { target aarch64_small } } } */ |
| /* What we want to check, is that make_vector does not stp the whole vector |
| to the stack. Unfortunately here we scan the body of main() too, which may |
| be a bit fragile - the test is currently passing only because of the option |
| -fomit-frame-pointer which avoids use of stp in the prologue to main(). */ |
| /* { dg-final { scan-assembler-not "stp\\t" } } */ |