brintos

brintos / llvm-project-archived public Read only

0
0
Text · 10.1 KiB · d6e96a6 Raw
269 lines · c
1// REQUIRES: aarch64-registered-target2// RUN: %clang_cc1 -triple aarch64 -target-feature +neon -S -O2 -o - %s | FileCheck %s3#include <stdarg.h>4#include <arm_neon.h>5 6// natural alignment 16, adjusted alignment 167// expected alignment of copy on callee stack: 168struct non_packed_struct {9  uint16x8_t M0; // member alignment 1610};11 12// natural alignment 1, adjusted alignment 113// expected alignment of copy on callee stack: 814struct __attribute((packed)) packed_struct {15  uint16x8_t M0; // member alignment 1, because the field is packed when the struct is packed16};17 18// natural alignment 1, adjusted alignment 119// expected alignment of copy on callee stack: 820struct packed_member {21  uint16x8_t M0 __attribute((packed)); // member alignment 122};23 24// natural alignment 16, adjusted alignment 16 since __attribute((aligned (n))) sets the minimum alignment25// expected alignment of copy on callee stack: 1626struct __attribute((aligned (8))) aligned_struct_8 {27  uint16x8_t M0; // member alignment 1628};29 30// natural alignment 16, adjusted alignment 1631// expected alignment of copy on callee stack: 1632struct aligned_member_8 {33  uint16x8_t M0 __attribute((aligned (8))); // member alignment 16 since __attribute((aligned (n))) sets the minimum alignment34};35 36// natural alignment 8, adjusted alignment 837// expected alignment of copy on callee stack: 838#pragma pack(8)39struct pragma_packed_struct_8 {40  uint16x8_t M0; // member alignment 8 because the struct is subject to packed(8)41};42 43// natural alignment 4, adjusted alignment 444// expected alignment of copy on callee stack: 845#pragma pack(4)46struct pragma_packed_struct_4 {47  uint16x8_t M0; // member alignment 4 because the struct is subject to packed(4)48};49 50double gd;51void init(int, ...);52 53struct non_packed_struct gs_non_packed_struct;54 55__attribute__((noinline)) void named_arg_non_packed_struct(double d0, double d1, double d2, double d3,56                                 double d4, double d5, double d6, double d7,57                                 double d8, struct non_packed_struct s_non_packed_struct) {58// CHECK: ldr q1, [sp, #16]59    gd = d8;60    gs_non_packed_struct = s_non_packed_struct;61}62 63void variadic_non_packed_struct(double d0, double d1, double d2, double d3,64                                 double d4, double d5, double d6, double d7,65                                 double d8, ...) {66  va_list vl;67  va_start(vl, d8);68  struct non_packed_struct on_callee_stack;69  on_callee_stack = va_arg(vl, struct non_packed_struct);70}71 72void test_non_packed_struct() {73    struct non_packed_struct s_non_packed_struct;74    init(1, &s_non_packed_struct);75 76// CHECK: mov x8, #4611686018427387904        // =0x400000000000000077// CHECK: str x8, [sp]78// CHECK: str q0, [sp, #16]79    named_arg_non_packed_struct(1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 2.0, s_non_packed_struct);80// CHECK: str q0, [sp, #16]81    variadic_non_packed_struct(1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 2.0, s_non_packed_struct);82}83 84struct packed_struct gs_packed_struct;85 86__attribute__((noinline)) void named_arg_packed_struct(double d0, double d1, double d2, double d3,87                                 double d4, double d5, double d6, double d7,88                                 double d8, struct packed_struct s_packed_struct) {89// CHECK: ldur q1, [sp, #8]90    gd = d8;91    gs_packed_struct = s_packed_struct;92}93 94void variadic_packed_struct(double d0, double d1, double d2, double d3,95                                 double d4, double d5, double d6, double d7,96                                 double d8, ...) {97  va_list vl;98  va_start(vl, d8);99  struct packed_struct on_callee_stack;100  on_callee_stack = va_arg(vl, struct packed_struct);101}102 103void test_packed_struct() {104    struct packed_struct s_packed_struct;105    init(1, &s_packed_struct);106 107// CHECK: mov x8, #4611686018427387904        // =0x4000000000000000108// CHECK: str x8, [sp]109// CHECK: stur q0, [sp, #8]110    named_arg_packed_struct(1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 2.0, s_packed_struct);111// CHECK: stur q0, [sp, #8]112    variadic_packed_struct(1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 2.0, s_packed_struct);113}114 115struct packed_member gs_packed_member;116 117__attribute__((noinline)) void named_arg_packed_member(double d0, double d1, double d2, double d3,118                                 double d4, double d5, double d6, double d7,119                                 double d8, struct packed_member s_packed_member) {120// CHECK: ldur q1, [sp, #8]121    gd = d8;122    gs_packed_member = s_packed_member;123}124 125void variadic_packed_member(double d0, double d1, double d2, double d3,126                                 double d4, double d5, double d6, double d7,127                                 double d8, ...) {128  va_list vl;129  va_start(vl, d8);130  struct packed_member on_callee_stack;131  on_callee_stack = va_arg(vl, struct packed_member);132}133 134void test_packed_member() {135    struct packed_member s_packed_member;136    init(1, &s_packed_member);137 138// CHECK: mov x8, #4611686018427387904        // =0x4000000000000000139// CHECK: str x8, [sp]140// CHECK: stur q0, [sp, #8]141    named_arg_packed_member(1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 2.0, s_packed_member);142// CHECK: stur q0, [sp, #8]143    variadic_packed_member(1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 2.0, s_packed_member);144}145 146struct aligned_struct_8 gs_aligned_struct_8;147 148__attribute__((noinline)) void named_arg_aligned_struct_8(double d0, double d1, double d2, double d3,149                                 double d4, double d5, double d6, double d7,150                                 double d8, struct aligned_struct_8 s_aligned_struct_8) {151// CHECK: ldr q1, [sp, #16]152    gd = d8;153    gs_aligned_struct_8 = s_aligned_struct_8;154}155 156void variadic_aligned_struct_8(double d0, double d1, double d2, double d3,157                                 double d4, double d5, double d6, double d7,158                                 double d8, ...) {159  va_list vl;160  va_start(vl, d8);161  struct aligned_struct_8 on_callee_stack;162  on_callee_stack = va_arg(vl, struct aligned_struct_8);163}164 165void test_aligned_struct_8() {166    struct aligned_struct_8 s_aligned_struct_8;167    init(1, &s_aligned_struct_8);168 169// CHECK: mov x8, #4611686018427387904        // =0x4000000000000000170// CHECK: str x8, [sp]171// CHECK: str q0, [sp, #16]172    named_arg_aligned_struct_8(1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 2.0, s_aligned_struct_8);173// CHECK: str q0, [sp, #16]174    variadic_aligned_struct_8(1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 2.0, s_aligned_struct_8);175}176 177struct aligned_member_8 gs_aligned_member_8;178 179__attribute__((noinline)) void named_arg_aligned_member_8(double d0, double d1, double d2, double d3,180                                 double d4, double d5, double d6, double d7,181                                 double d8, struct aligned_member_8 s_aligned_member_8) {182// CHECK: ldr q1, [sp, #16]183    gd = d8;184    gs_aligned_member_8 = s_aligned_member_8;185}186 187void variadic_aligned_member_8(double d0, double d1, double d2, double d3,188                                 double d4, double d5, double d6, double d7,189                                 double d8, ...) {190  va_list vl;191  va_start(vl, d8);192  struct aligned_member_8 on_callee_stack;193  on_callee_stack = va_arg(vl, struct aligned_member_8);194}195 196void test_aligned_member_8() {197    struct aligned_member_8 s_aligned_member_8;198    init(1, &s_aligned_member_8);199 200// CHECK: mov x8, #4611686018427387904        // =0x4000000000000000201// CHECK: str x8, [sp]202// CHECK: str q0, [sp, #16]203    named_arg_aligned_member_8(1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 2.0, s_aligned_member_8);204// CHECK: str q0, [sp, #16]205    variadic_aligned_member_8(1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 2.0, s_aligned_member_8);206}207 208struct pragma_packed_struct_8 gs_pragma_packed_struct_8;209 210__attribute__((noinline)) void named_arg_pragma_packed_struct_8(double d0, double d1, double d2, double d3,211                                 double d4, double d5, double d6, double d7,212                                 double d8, struct pragma_packed_struct_8 s_pragma_packed_struct_8) {213// CHECK: ldur q1, [sp, #8]214    gd = d8;215    gs_pragma_packed_struct_8 = s_pragma_packed_struct_8;216}217 218void variadic_pragma_packed_struct_8(double d0, double d1, double d2, double d3,219                                 double d4, double d5, double d6, double d7,220                                 double d8, ...) {221  va_list vl;222  va_start(vl, d8);223  struct pragma_packed_struct_8 on_callee_stack;224  on_callee_stack = va_arg(vl, struct pragma_packed_struct_8);225}226 227void test_pragma_packed_struct_8() {228    struct pragma_packed_struct_8 s_pragma_packed_struct_8;229    init(1, &s_pragma_packed_struct_8);230 231// CHECK: mov x8, #4611686018427387904        // =0x4000000000000000232// CHECK: str x8, [sp]233// CHECK: stur q0, [sp, #8]234    named_arg_pragma_packed_struct_8(1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 2.0, s_pragma_packed_struct_8);235// CHECK: stur q0, [sp, #8]236    variadic_pragma_packed_struct_8(1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 2.0, s_pragma_packed_struct_8);237}238 239struct pragma_packed_struct_4 gs_pragma_packed_struct_4;240 241__attribute__((noinline)) void named_arg_pragma_packed_struct_4(double d0, double d1, double d2, double d3,242                                 double d4, double d5, double d6, double d7,243                                 double d8, struct pragma_packed_struct_4 s_pragma_packed_struct_4) {244// CHECK: ldur q1, [sp, #8]245    gd = d8;246    gs_pragma_packed_struct_4 = s_pragma_packed_struct_4;247}248 249void variadic_pragma_packed_struct_4(double d0, double d1, double d2, double d3,250                                 double d4, double d5, double d6, double d7,251                                 double d8, ...) {252  va_list vl;253  va_start(vl, d8);254  struct pragma_packed_struct_4 on_callee_stack;255  on_callee_stack = va_arg(vl, struct pragma_packed_struct_4);256}257 258void test_pragma_packed_struct_4() {259    struct pragma_packed_struct_4 s_pragma_packed_struct_4;260    init(1, &s_pragma_packed_struct_4);261 262// CHECK: mov x8, #4611686018427387904        // =0x4000000000000000263// CHECK: str x8, [sp]264// CHECK: stur q0, [sp, #8]265    named_arg_pragma_packed_struct_4(1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 2.0, s_pragma_packed_struct_4);266// CHECK: stur q0, [sp, #8]267    variadic_pragma_packed_struct_4(1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 2.0, s_pragma_packed_struct_4);268}269