Jim Grosbach | f794705 | 2012-07-09 18:34:21 +0000 | [diff] [blame] | 1 | // REQUIRES: arm-registered-target |
Amara Emerson | 2440fb1 | 2013-09-16 18:07:35 +0000 | [diff] [blame] | 2 | // RUN: %clang_cc1 -triple armv7-apple-darwin9 -target-feature +neon -target-abi apcs-gnu -emit-llvm -w -o - %s | FileCheck -check-prefix=APCS-GNU %s |
| 3 | // RUN: %clang_cc1 -triple armv7-apple-darwin9 -target-feature +neon -target-abi aapcs -emit-llvm -w -o - %s | FileCheck -check-prefix=AAPCS %s |
Daniel Dunbar | 16a0808 | 2009-09-14 00:56:55 +0000 | [diff] [blame] | 4 | |
Stephen Lin | 93ab6bf | 2013-08-15 06:47:53 +0000 | [diff] [blame] | 5 | // APCS-GNU-LABEL: define signext i8 @f0() |
| 6 | // AAPCS-LABEL: define arm_aapcscc signext i8 @f0() |
Daniel Dunbar | 16a0808 | 2009-09-14 00:56:55 +0000 | [diff] [blame] | 7 | char f0(void) { |
| 8 | return 0; |
| 9 | } |
| 10 | |
Stephen Lin | 93ab6bf | 2013-08-15 06:47:53 +0000 | [diff] [blame] | 11 | // APCS-GNU-LABEL: define i8 @f1() |
| 12 | // AAPCS-LABEL: define arm_aapcscc i8 @f1() |
Daniel Dunbar | 16a0808 | 2009-09-14 00:56:55 +0000 | [diff] [blame] | 13 | struct s1 { char f0; }; |
| 14 | struct s1 f1(void) {} |
| 15 | |
Stephen Lin | 93ab6bf | 2013-08-15 06:47:53 +0000 | [diff] [blame] | 16 | // APCS-GNU-LABEL: define i16 @f2() |
| 17 | // AAPCS-LABEL: define arm_aapcscc i16 @f2() |
Daniel Dunbar | 16a0808 | 2009-09-14 00:56:55 +0000 | [diff] [blame] | 18 | struct s2 { short f0; }; |
| 19 | struct s2 f2(void) {} |
| 20 | |
Stephen Lin | 93ab6bf | 2013-08-15 06:47:53 +0000 | [diff] [blame] | 21 | // APCS-GNU-LABEL: define i32 @f3() |
| 22 | // AAPCS-LABEL: define arm_aapcscc i32 @f3() |
Daniel Dunbar | 16a0808 | 2009-09-14 00:56:55 +0000 | [diff] [blame] | 23 | struct s3 { int f0; }; |
| 24 | struct s3 f3(void) {} |
| 25 | |
Stephen Lin | 93ab6bf | 2013-08-15 06:47:53 +0000 | [diff] [blame] | 26 | // APCS-GNU-LABEL: define i32 @f4() |
| 27 | // AAPCS-LABEL: define arm_aapcscc i32 @f4() |
Daniel Dunbar | 16a0808 | 2009-09-14 00:56:55 +0000 | [diff] [blame] | 28 | struct s4 { struct s4_0 { int f0; } f0; }; |
| 29 | struct s4 f4(void) {} |
| 30 | |
Stephen Lin | 93ab6bf | 2013-08-15 06:47:53 +0000 | [diff] [blame] | 31 | // APCS-GNU-LABEL: define void @f5( |
Bill Wendling | 5e31474 | 2013-01-31 23:17:12 +0000 | [diff] [blame] | 32 | // APCS-GNU: struct.s5* noalias sret |
Stephen Lin | 93ab6bf | 2013-08-15 06:47:53 +0000 | [diff] [blame] | 33 | // AAPCS-LABEL: define arm_aapcscc i32 @f5() |
Daniel Dunbar | 16a0808 | 2009-09-14 00:56:55 +0000 | [diff] [blame] | 34 | struct s5 { struct { } f0; int f1; }; |
| 35 | struct s5 f5(void) {} |
| 36 | |
Stephen Lin | 93ab6bf | 2013-08-15 06:47:53 +0000 | [diff] [blame] | 37 | // APCS-GNU-LABEL: define void @f6( |
Bill Wendling | 5e31474 | 2013-01-31 23:17:12 +0000 | [diff] [blame] | 38 | // APCS-GNU: struct.s6* noalias sret |
Stephen Lin | 93ab6bf | 2013-08-15 06:47:53 +0000 | [diff] [blame] | 39 | // AAPCS-LABEL: define arm_aapcscc i32 @f6() |
Daniel Dunbar | 16a0808 | 2009-09-14 00:56:55 +0000 | [diff] [blame] | 40 | struct s6 { int f0[1]; }; |
| 41 | struct s6 f6(void) {} |
| 42 | |
Stephen Lin | 93ab6bf | 2013-08-15 06:47:53 +0000 | [diff] [blame] | 43 | // APCS-GNU-LABEL: define void @f7() |
| 44 | // AAPCS-LABEL: define arm_aapcscc void @f7() |
Daniel Dunbar | 16a0808 | 2009-09-14 00:56:55 +0000 | [diff] [blame] | 45 | struct s7 { struct { int : 0; } f0; }; |
| 46 | struct s7 f7(void) {} |
| 47 | |
Stephen Lin | 93ab6bf | 2013-08-15 06:47:53 +0000 | [diff] [blame] | 48 | // APCS-GNU-LABEL: define void @f8( |
Bill Wendling | 5e31474 | 2013-01-31 23:17:12 +0000 | [diff] [blame] | 49 | // APCS-GNU: struct.s8* noalias sret |
Stephen Lin | 93ab6bf | 2013-08-15 06:47:53 +0000 | [diff] [blame] | 50 | // AAPCS-LABEL: define arm_aapcscc void @f8() |
Daniel Dunbar | 16a0808 | 2009-09-14 00:56:55 +0000 | [diff] [blame] | 51 | struct s8 { struct { int : 0; } f0[1]; }; |
| 52 | struct s8 f8(void) {} |
| 53 | |
Stephen Lin | 93ab6bf | 2013-08-15 06:47:53 +0000 | [diff] [blame] | 54 | // APCS-GNU-LABEL: define i32 @f9() |
| 55 | // AAPCS-LABEL: define arm_aapcscc i32 @f9() |
Daniel Dunbar | 16a0808 | 2009-09-14 00:56:55 +0000 | [diff] [blame] | 56 | struct s9 { int f0; int : 0; }; |
| 57 | struct s9 f9(void) {} |
| 58 | |
Stephen Lin | 93ab6bf | 2013-08-15 06:47:53 +0000 | [diff] [blame] | 59 | // APCS-GNU-LABEL: define i32 @f10() |
| 60 | // AAPCS-LABEL: define arm_aapcscc i32 @f10() |
Daniel Dunbar | 16a0808 | 2009-09-14 00:56:55 +0000 | [diff] [blame] | 61 | struct s10 { int f0; int : 0; int : 0; }; |
| 62 | struct s10 f10(void) {} |
| 63 | |
Stephen Lin | 93ab6bf | 2013-08-15 06:47:53 +0000 | [diff] [blame] | 64 | // APCS-GNU-LABEL: define void @f11( |
Bill Wendling | 5e31474 | 2013-01-31 23:17:12 +0000 | [diff] [blame] | 65 | // APCS-GNU: struct.s11* noalias sret |
Stephen Lin | 93ab6bf | 2013-08-15 06:47:53 +0000 | [diff] [blame] | 66 | // AAPCS-LABEL: define arm_aapcscc i32 @f11() |
Daniel Dunbar | 16a0808 | 2009-09-14 00:56:55 +0000 | [diff] [blame] | 67 | struct s11 { int : 0; int f0; }; |
| 68 | struct s11 f11(void) {} |
| 69 | |
Stephen Lin | 93ab6bf | 2013-08-15 06:47:53 +0000 | [diff] [blame] | 70 | // APCS-GNU-LABEL: define i32 @f12() |
| 71 | // AAPCS-LABEL: define arm_aapcscc i32 @f12() |
Daniel Dunbar | 16a0808 | 2009-09-14 00:56:55 +0000 | [diff] [blame] | 72 | union u12 { char f0; short f1; int f2; }; |
| 73 | union u12 f12(void) {} |
Daniel Dunbar | b0d5819 | 2009-09-14 02:20:34 +0000 | [diff] [blame] | 74 | |
Stephen Lin | 93ab6bf | 2013-08-15 06:47:53 +0000 | [diff] [blame] | 75 | // APCS-GNU-LABEL: define void @f13( |
Bill Wendling | 5e31474 | 2013-01-31 23:17:12 +0000 | [diff] [blame] | 76 | // APCS-GNU: struct.s13* noalias sret |
Daniel Dunbar | b0d5819 | 2009-09-14 02:20:34 +0000 | [diff] [blame] | 77 | |
| 78 | // FIXME: This should return a float. |
Rafael Espindola | 75d0f82 | 2010-06-16 17:49:52 +0000 | [diff] [blame] | 79 | // AAPCS-FIXME: darm_aapcscc efine float @f13() |
Daniel Dunbar | b0d5819 | 2009-09-14 02:20:34 +0000 | [diff] [blame] | 80 | struct s13 { float f0; }; |
| 81 | struct s13 f13(void) {} |
| 82 | |
Stephen Lin | 93ab6bf | 2013-08-15 06:47:53 +0000 | [diff] [blame] | 83 | // APCS-GNU-LABEL: define void @f14( |
Bill Wendling | 5e31474 | 2013-01-31 23:17:12 +0000 | [diff] [blame] | 84 | // APCS-GNU: union.u14* noalias sret |
Stephen Lin | 93ab6bf | 2013-08-15 06:47:53 +0000 | [diff] [blame] | 85 | // AAPCS-LABEL: define arm_aapcscc i32 @f14() |
Daniel Dunbar | b0d5819 | 2009-09-14 02:20:34 +0000 | [diff] [blame] | 86 | union u14 { float f0; }; |
| 87 | union u14 f14(void) {} |
Daniel Dunbar | 4202557 | 2009-09-14 21:54:03 +0000 | [diff] [blame] | 88 | |
Stephen Lin | 93ab6bf | 2013-08-15 06:47:53 +0000 | [diff] [blame] | 89 | // APCS-GNU-LABEL: define void @f15() |
| 90 | // AAPCS-LABEL: define arm_aapcscc void @f15() |
Daniel Dunbar | 4202557 | 2009-09-14 21:54:03 +0000 | [diff] [blame] | 91 | void f15(struct s7 a0) {} |
| 92 | |
Stephen Lin | 93ab6bf | 2013-08-15 06:47:53 +0000 | [diff] [blame] | 93 | // APCS-GNU-LABEL: define void @f16() |
| 94 | // AAPCS-LABEL: define arm_aapcscc void @f16() |
Daniel Dunbar | 4202557 | 2009-09-14 21:54:03 +0000 | [diff] [blame] | 95 | void f16(struct s8 a0) {} |
Daniel Dunbar | 679855a | 2010-01-29 03:22:29 +0000 | [diff] [blame] | 96 | |
Stephen Lin | 93ab6bf | 2013-08-15 06:47:53 +0000 | [diff] [blame] | 97 | // APCS-GNU-LABEL: define i32 @f17() |
| 98 | // AAPCS-LABEL: define arm_aapcscc i32 @f17() |
Daniel Dunbar | 679855a | 2010-01-29 03:22:29 +0000 | [diff] [blame] | 99 | struct s17 { short f0 : 13; char f1 : 4; }; |
| 100 | struct s17 f17(void) {} |
| 101 | |
Stephen Lin | 93ab6bf | 2013-08-15 06:47:53 +0000 | [diff] [blame] | 102 | // APCS-GNU-LABEL: define i32 @f18() |
| 103 | // AAPCS-LABEL: define arm_aapcscc i32 @f18() |
Daniel Dunbar | 679855a | 2010-01-29 03:22:29 +0000 | [diff] [blame] | 104 | struct s18 { short f0; char f1 : 4; }; |
| 105 | struct s18 f18(void) {} |
| 106 | |
Stephen Lin | 93ab6bf | 2013-08-15 06:47:53 +0000 | [diff] [blame] | 107 | // APCS-GNU-LABEL: define void @f19( |
Bill Wendling | 5e31474 | 2013-01-31 23:17:12 +0000 | [diff] [blame] | 108 | // APCS-GNU: struct.s19* noalias sret |
Stephen Lin | 93ab6bf | 2013-08-15 06:47:53 +0000 | [diff] [blame] | 109 | // AAPCS-LABEL: define arm_aapcscc i32 @f19() |
Daniel Dunbar | 679855a | 2010-01-29 03:22:29 +0000 | [diff] [blame] | 110 | struct s19 { int f0; struct s8 f1; }; |
| 111 | struct s19 f19(void) {} |
| 112 | |
Stephen Lin | 93ab6bf | 2013-08-15 06:47:53 +0000 | [diff] [blame] | 113 | // APCS-GNU-LABEL: define void @f20( |
Bill Wendling | 5e31474 | 2013-01-31 23:17:12 +0000 | [diff] [blame] | 114 | // APCS-GNU: struct.s20* noalias sret |
Stephen Lin | 93ab6bf | 2013-08-15 06:47:53 +0000 | [diff] [blame] | 115 | // AAPCS-LABEL: define arm_aapcscc i32 @f20() |
Daniel Dunbar | 679855a | 2010-01-29 03:22:29 +0000 | [diff] [blame] | 116 | struct s20 { struct s8 f1; int f0; }; |
| 117 | struct s20 f20(void) {} |
| 118 | |
Stephen Lin | 93ab6bf | 2013-08-15 06:47:53 +0000 | [diff] [blame] | 119 | // APCS-GNU-LABEL: define i8 @f21() |
| 120 | // AAPCS-LABEL: define arm_aapcscc i32 @f21() |
Daniel Dunbar | 679855a | 2010-01-29 03:22:29 +0000 | [diff] [blame] | 121 | struct s21 { struct {} f1; int f0 : 4; }; |
| 122 | struct s21 f21(void) {} |
Daniel Dunbar | 4cc753f | 2010-02-01 23:31:19 +0000 | [diff] [blame] | 123 | |
Stephen Lin | 93ab6bf | 2013-08-15 06:47:53 +0000 | [diff] [blame] | 124 | // APCS-GNU-LABEL: define i16 @f22() |
| 125 | // APCS-GNU-LABEL: define i32 @f23() |
| 126 | // APCS-GNU-LABEL: define i64 @f24() |
| 127 | // APCS-GNU-LABEL: define i128 @f25() |
| 128 | // APCS-GNU-LABEL: define i64 @f26() |
| 129 | // APCS-GNU-LABEL: define i128 @f27() |
| 130 | // AAPCS-LABEL: define arm_aapcscc i16 @f22() |
| 131 | // AAPCS-LABEL: define arm_aapcscc i32 @f23() |
Bill Wendling | 5e31474 | 2013-01-31 23:17:12 +0000 | [diff] [blame] | 132 | // AAPCS: define arm_aapcscc void @f24({{.*}} noalias sret |
| 133 | // AAPCS: define arm_aapcscc void @f25({{.*}} noalias sret |
| 134 | // AAPCS: define arm_aapcscc void @f26({{.*}} noalias sret |
| 135 | // AAPCS: define arm_aapcscc void @f27({{.*}} noalias sret |
Daniel Dunbar | 4cc753f | 2010-02-01 23:31:19 +0000 | [diff] [blame] | 136 | _Complex char f22(void) {} |
| 137 | _Complex short f23(void) {} |
| 138 | _Complex int f24(void) {} |
| 139 | _Complex long long f25(void) {} |
| 140 | _Complex float f26(void) {} |
| 141 | _Complex double f27(void) {} |
Daniel Dunbar | 4581581 | 2010-02-01 23:31:26 +0000 | [diff] [blame] | 142 | |
Stephen Lin | 93ab6bf | 2013-08-15 06:47:53 +0000 | [diff] [blame] | 143 | // APCS-GNU-LABEL: define i16 @f28() |
| 144 | // AAPCS-LABEL: define arm_aapcscc i16 @f28() |
Daniel Dunbar | 4581581 | 2010-02-01 23:31:26 +0000 | [diff] [blame] | 145 | struct s28 { _Complex char f0; }; |
| 146 | struct s28 f28() {} |
| 147 | |
Stephen Lin | 93ab6bf | 2013-08-15 06:47:53 +0000 | [diff] [blame] | 148 | // APCS-GNU-LABEL: define i32 @f29() |
| 149 | // AAPCS-LABEL: define arm_aapcscc i32 @f29() |
Daniel Dunbar | 4581581 | 2010-02-01 23:31:26 +0000 | [diff] [blame] | 150 | struct s29 { _Complex short f0; }; |
| 151 | struct s29 f29() {} |
| 152 | |
Bill Wendling | 5e31474 | 2013-01-31 23:17:12 +0000 | [diff] [blame] | 153 | // APCS-GNU: define void @f30({{.*}} noalias sret |
| 154 | // AAPCS: define arm_aapcscc void @f30({{.*}} noalias sret |
Daniel Dunbar | 4581581 | 2010-02-01 23:31:26 +0000 | [diff] [blame] | 155 | struct s30 { _Complex int f0; }; |
| 156 | struct s30 f30() {} |
Evgeniy Stepanov | a6ce20e | 2012-02-10 09:30:15 +0000 | [diff] [blame] | 157 | |
| 158 | // PR11905 |
| 159 | struct s31 { char x; }; |
| 160 | void f31(struct s31 s) { } |
| 161 | // AAPCS: @f31([1 x i32] %s.coerce) |
| 162 | // AAPCS: %s = alloca %struct.s31, align 4 |
Evgeniy Stepanov | 1067d05 | 2012-02-10 10:04:01 +0000 | [diff] [blame] | 163 | // AAPCS: alloca [1 x i32] |
| 164 | // AAPCS: store [1 x i32] %s.coerce, [1 x i32]* |
Evgeniy Stepanov | a6ce20e | 2012-02-10 09:30:15 +0000 | [diff] [blame] | 165 | // APCS-GNU: @f31([1 x i32] %s.coerce) |
| 166 | // APCS-GNU: %s = alloca %struct.s31, align 4 |
Evgeniy Stepanov | 1067d05 | 2012-02-10 10:04:01 +0000 | [diff] [blame] | 167 | // APCS-GNU: alloca [1 x i32] |
| 168 | // APCS-GNU: store [1 x i32] %s.coerce, [1 x i32]* |
Eli Friedman | 79f3098 | 2012-08-09 00:31:40 +0000 | [diff] [blame] | 169 | |
| 170 | // PR13562 |
| 171 | struct s32 { double x; }; |
| 172 | void f32(struct s32 s) { } |
| 173 | // AAPCS: @f32([1 x i64] %s.coerce) |
| 174 | // APCS-GNU: @f32([2 x i32] %s.coerce) |
Manman Ren | 16ba7c8 | 2012-08-10 20:42:31 +0000 | [diff] [blame] | 175 | |
| 176 | // PR13350 |
| 177 | struct s33 { char buf[32*32]; }; |
| 178 | void f33(struct s33 s) { } |
Pirama Arumuga Nainar | 3ea9e33 | 2015-04-08 08:57:32 -0700 | [diff] [blame] | 179 | // APCS-GNU-LABEL: define void @f33(%struct.s33* byval align 4 %s) |
| 180 | // AAPCS-LABEL: define arm_aapcscc void @f33(%struct.s33* byval align 4 %s) |
Chandler Carruth | f82232c | 2012-10-10 11:29:08 +0000 | [diff] [blame] | 181 | |
| 182 | // PR14048 |
| 183 | struct s34 { char c; }; |
| 184 | void f34(struct s34 s); |
| 185 | void g34(struct s34 *s) { f34(*s); } |
Chandler Carruth | f82232c | 2012-10-10 11:29:08 +0000 | [diff] [blame] | 186 | // AAPCS: @g34(%struct.s34* %s) |
Stephen Hines | 176edba | 2014-12-01 14:53:08 -0800 | [diff] [blame] | 187 | // AAPCS: %[[a:.*]] = alloca [1 x i32] |
Pirama Arumuga Nainar | 3ea9e33 | 2015-04-08 08:57:32 -0700 | [diff] [blame] | 188 | // AAPCS: load [1 x i32], [1 x i32]* %[[a]] |
Manman Ren | 885ad69 | 2012-11-06 04:58:01 +0000 | [diff] [blame] | 189 | |
| 190 | // rdar://12596507 |
| 191 | struct s35 |
| 192 | { |
| 193 | float v[18]; //make sure byval is on. |
| 194 | } __attribute__((aligned(16))); |
| 195 | typedef struct s35 s35_with_align; |
| 196 | |
| 197 | typedef __attribute__((neon_vector_type(4))) float float32x4_t; |
| 198 | static __attribute__((__always_inline__, __nodebug__)) float32x4_t vaddq_f32( |
| 199 | float32x4_t __a, float32x4_t __b) { |
| 200 | return __a + __b; |
| 201 | } |
| 202 | float32x4_t f35(int i, s35_with_align s1, s35_with_align s2) { |
| 203 | float32x4_t v = vaddq_f32(*(float32x4_t *)&s1, |
| 204 | *(float32x4_t *)&s2); |
| 205 | return v; |
| 206 | } |
Pirama Arumuga Nainar | 3ea9e33 | 2015-04-08 08:57:32 -0700 | [diff] [blame] | 207 | // APCS-GNU-LABEL: define <4 x float> @f35(i32 %i, %struct.s35* byval align 4, %struct.s35* byval align 4) |
Manman Ren | 885ad69 | 2012-11-06 04:58:01 +0000 | [diff] [blame] | 208 | // APCS-GNU: %[[a:.*]] = alloca %struct.s35, align 16 |
| 209 | // APCS-GNU: %[[b:.*]] = bitcast %struct.s35* %[[a]] to i8* |
| 210 | // APCS-GNU: %[[c:.*]] = bitcast %struct.s35* %0 to i8* |
| 211 | // APCS-GNU: call void @llvm.memcpy.p0i8.p0i8.i32(i8* %[[b]], i8* %[[c]] |
| 212 | // APCS-GNU: %[[d:.*]] = bitcast %struct.s35* %[[a]] to <4 x float>* |
Pirama Arumuga Nainar | 3ea9e33 | 2015-04-08 08:57:32 -0700 | [diff] [blame] | 213 | // APCS-GNU: load <4 x float>, <4 x float>* %[[d]], align 16 |
| 214 | // AAPCS-LABEL: define arm_aapcscc <4 x float> @f35(i32 %i, %struct.s35* byval align 8, %struct.s35* byval align 8) |
Manman Ren | 885ad69 | 2012-11-06 04:58:01 +0000 | [diff] [blame] | 215 | // AAPCS: %[[a:.*]] = alloca %struct.s35, align 16 |
| 216 | // AAPCS: %[[b:.*]] = bitcast %struct.s35* %[[a]] to i8* |
| 217 | // AAPCS: %[[c:.*]] = bitcast %struct.s35* %0 to i8* |
| 218 | // AAPCS: call void @llvm.memcpy.p0i8.p0i8.i32(i8* %[[b]], i8* %[[c]] |
| 219 | // AAPCS: %[[d:.*]] = bitcast %struct.s35* %[[a]] to <4 x float>* |
Pirama Arumuga Nainar | 3ea9e33 | 2015-04-08 08:57:32 -0700 | [diff] [blame] | 220 | // AAPCS: load <4 x float>, <4 x float>* %[[d]], align 16 |