1 // REQUIRES: aarch64-registered-target 2 // RUN: %clang_cc1 -triple arm64-apple-darwin -target-feature +neon \ 3 // RUN: -ffp-contract=fast -S -O3 -o - %s | FileCheck %s 4 5 #include <arm_neon.h> 6 7 uint8_t test_vget_lane_u8(uint8x8_t a) { 8 // CHECK-LABEL: test_vget_lane_u8: 9 // CHECK-NEXT: umov.b w0, v0[7] 10 // CHECK-NEXT: ret 11 return vget_lane_u8(a, 7); 12 } 13 14 uint16_t test_vget_lane_u16(uint16x4_t a) { 15 // CHECK-LABEL: test_vget_lane_u16: 16 // CHECK-NEXT: umov.h w0, v0[3] 17 // CHECK-NEXT: ret 18 return vget_lane_u16(a, 3); 19 } 20 21 uint32_t test_vget_lane_u32(uint32x2_t a) { 22 // CHECK-LABEL: test_vget_lane_u32: 23 // CHECK-NEXT: mov.s w0, v0[1] 24 // CHECK-NEXT: ret 25 return vget_lane_u32(a, 1); 26 } 27 28 int8_t test_vget_lane_s8(int8x8_t a) { 29 // CHECK-LABEL: test_vget_lane_s8: 30 // CHECK-NEXT: umov.b w0, v0[7] 31 // CHECK-NEXT: ret 32 return vget_lane_s8(a, 7); 33 } 34 35 int16_t test_vget_lane_s16(int16x4_t a) { 36 // CHECK-LABEL: test_vget_lane_s16: 37 // CHECK-NEXT: umov.h w0, v0[3] 38 // CHECK-NEXT: ret 39 return vget_lane_s16(a, 3); 40 } 41 42 int32_t test_vget_lane_s32(int32x2_t a) { 43 // CHECK-LABEL: test_vget_lane_s32: 44 // CHECK-NEXT: mov.s w0, v0[1] 45 // CHECK-NEXT: ret 46 return vget_lane_s32(a, 1); 47 } 48 49 poly8_t test_vget_lane_p8(poly8x8_t a) { 50 // CHECK-LABEL: test_vget_lane_p8: 51 // CHECK-NEXT: umov.b w0, v0[7] 52 // CHECK-NEXT: ret 53 return vget_lane_p8(a, 7); 54 } 55 56 poly16_t test_vget_lane_p16(poly16x4_t a) { 57 // CHECK-LABEL: test_vget_lane_p16: 58 // CHECK-NEXT: umov.h w0, v0[3] 59 // CHECK-NEXT: ret 60 return vget_lane_p16(a, 3); 61 } 62 63 float32_t test_vget_lane_f32(float32x2_t a) { 64 // CHECK-LABEL: test_vget_lane_f32: 65 // CHECK-NEXT: mov s0, v0[1] 66 // CHECK-NEXT: ret 67 return vget_lane_f32(a, 1); 68 } 69 70 float32_t test_vget_lane_f16(float16x4_t a) { 71 // CHECK-LABEL: test_vget_lane_f16: 72 // CHECK-NEXT: umov.h w8, v0[1] 73 // CHECK-NEXT: fmov s0, w8 74 // CHECK-NEXT: fcvt s0, h0 75 // CHECK-NEXT: ret 76 return vget_lane_f16(a, 1); 77 } 78 79 uint8_t test_vgetq_lane_u8(uint8x16_t a) { 80 // CHECK-LABEL: test_vgetq_lane_u8: 81 // CHECK-NEXT: umov.b w0, v0[15] 82 // CHECK-NEXT: ret 83 return vgetq_lane_u8(a, 15); 84 } 85 86 uint16_t test_vgetq_lane_u16(uint16x8_t a) { 87 // CHECK-LABEL: test_vgetq_lane_u16: 88 // CHECK-NEXT: umov.h w0, v0[7] 89 // CHECK-NEXT: ret 90 return vgetq_lane_u16(a, 7); 91 } 92 93 uint32_t test_vgetq_lane_u32(uint32x4_t a) { 94 // CHECK-LABEL: test_vgetq_lane_u32: 95 // CHECK-NEXT: mov.s w0, v0[3] 96 // CHECK-NEXT: ret 97 return vgetq_lane_u32(a, 3); 98 } 99 100 int8_t test_vgetq_lane_s8(int8x16_t a) { 101 // CHECK-LABEL: test_vgetq_lane_s8: 102 // CHECK-NEXT: umov.b w0, v0[15] 103 // CHECK-NEXT: ret 104 return vgetq_lane_s8(a, 15); 105 } 106 107 int16_t test_vgetq_lane_s16(int16x8_t a) { 108 // CHECK-LABEL: test_vgetq_lane_s16: 109 // CHECK-NEXT: umov.h w0, v0[7] 110 // CHECK-NEXT: ret 111 return vgetq_lane_s16(a, 7); 112 } 113 114 int32_t test_vgetq_lane_s32(int32x4_t a) { 115 // CHECK-LABEL: test_vgetq_lane_s32: 116 // CHECK-NEXT: mov.s w0, v0[3] 117 // CHECK-NEXT: ret 118 return vgetq_lane_s32(a, 3); 119 } 120 121 poly8_t test_vgetq_lane_p8(poly8x16_t a) { 122 // CHECK-LABEL: test_vgetq_lane_p8: 123 // CHECK-NEXT: umov.b w0, v0[15] 124 // CHECK-NEXT: ret 125 return vgetq_lane_p8(a, 15); 126 } 127 128 poly16_t test_vgetq_lane_p16(poly16x8_t a) { 129 // CHECK-LABEL: test_vgetq_lane_p16: 130 // CHECK-NEXT: umov.h w0, v0[7] 131 // CHECK-NEXT: ret 132 return vgetq_lane_p16(a, 7); 133 } 134 135 float32_t test_vgetq_lane_f32(float32x4_t a) { 136 // CHECK-LABEL: test_vgetq_lane_f32: 137 // CHECK-NEXT: mov s0, v0[3] 138 // CHECK-NEXT: ret 139 return vgetq_lane_f32(a, 3); 140 } 141 142 float32_t test_vgetq_lane_f16(float16x8_t a) { 143 // CHECK-LABEL: test_vgetq_lane_f16: 144 // CHECK-NEXT: umov.h w8, v0[3] 145 // CHECK-NEXT: fmov s0, w8 146 // CHECK-NEXT: fcvt s0, h0 147 // CHECK-NEXT: ret 148 return vgetq_lane_f16(a, 3); 149 } 150 151 int64_t test_vget_lane_s64(int64x1_t a) { 152 // CHECK-LABEL: test_vget_lane_s64: 153 // CHECK-NEXT: fmov x0, d0 154 // CHECK-NEXT: ret 155 return vget_lane_s64(a, 0); 156 } 157 158 uint64_t test_vget_lane_u64(uint64x1_t a) { 159 // CHECK-LABEL: test_vget_lane_u64: 160 // CHECK-NEXT: fmov x0, d0 161 // CHECK-NEXT: ret 162 return vget_lane_u64(a, 0); 163 } 164 165 int64_t test_vgetq_lane_s64(int64x2_t a) { 166 // CHECK-LABEL: test_vgetq_lane_s64: 167 // CHECK-NEXT: mov.d x0, v0[1] 168 // CHECK-NEXT: ret 169 return vgetq_lane_s64(a, 1); 170 } 171 172 uint64_t test_vgetq_lane_u64(uint64x2_t a) { 173 // CHECK-LABEL: test_vgetq_lane_u64: 174 // CHECK-NEXT: mov.d x0, v0[1] 175 // CHECK-NEXT: ret 176 return vgetq_lane_u64(a, 1); 177 } 178 179 180 uint8x8_t test_vset_lane_u8(uint8_t a, uint8x8_t b) { 181 // CHECK-LABEL: test_vset_lane_u8: 182 // CHECK-NEXT: ins.b v0[7], w0 183 // CHECK-NEXT: ret 184 return vset_lane_u8(a, b, 7); 185 } 186 187 uint16x4_t test_vset_lane_u16(uint16_t a, uint16x4_t b) { 188 // CHECK-LABEL: test_vset_lane_u16: 189 // CHECK-NEXT: ins.h v0[3], w0 190 // CHECK-NEXT: ret 191 return vset_lane_u16(a, b, 3); 192 } 193 194 uint32x2_t test_vset_lane_u32(uint32_t a, uint32x2_t b) { 195 // CHECK-LABEL: test_vset_lane_u32: 196 // CHECK-NEXT: ins.s v0[1], w0 197 // CHECK-NEXT: ret 198 return vset_lane_u32(a, b, 1); 199 } 200 201 int8x8_t test_vset_lane_s8(int8_t a, int8x8_t b) { 202 // CHECK-LABEL: test_vset_lane_s8: 203 // CHECK-NEXT: ins.b v0[7], w0 204 // CHECK-NEXT: ret 205 return vset_lane_s8(a, b, 7); 206 } 207 208 int16x4_t test_vset_lane_s16(int16_t a, int16x4_t b) { 209 // CHECK-LABEL: test_vset_lane_s16: 210 // CHECK-NEXT: ins.h v0[3], w0 211 // CHECK-NEXT: ret 212 return vset_lane_s16(a, b, 3); 213 } 214 215 int32x2_t test_vset_lane_s32(int32_t a, int32x2_t b) { 216 // CHECK-LABEL: test_vset_lane_s32: 217 // CHECK-NEXT: ins.s v0[1], w0 218 // CHECK-NEXT: ret 219 return vset_lane_s32(a, b, 1); 220 } 221 222 poly8x8_t test_vset_lane_p8(poly8_t a, poly8x8_t b) { 223 // CHECK-LABEL: test_vset_lane_p8: 224 // CHECK-NEXT: ins.b v0[7], w0 225 // CHECK-NEXT: ret 226 return vset_lane_p8(a, b, 7); 227 } 228 229 poly16x4_t test_vset_lane_p16(poly16_t a, poly16x4_t b) { 230 // CHECK-LABEL: test_vset_lane_p16: 231 // CHECK-NEXT: ins.h v0[3], w0 232 // CHECK-NEXT: ret 233 return vset_lane_p16(a, b, 3); 234 } 235 236 float32x2_t test_vset_lane_f32(float32_t a, float32x2_t b) { 237 // CHECK-LABEL: test_vset_lane_f32: 238 // CHECK-NEXT: ins.s v1[1], v0[0] 239 // CHECK-NEXT: mov.16b v0, v1 240 // CHECK-NEXT: ret 241 return vset_lane_f32(a, b, 1); 242 } 243 244 float16x4_t test_vset_lane_f16(float16_t *a, float16x4_t b) { 245 // CHECK-LABEL: test_vset_lane_f16: 246 // CHECK-NEXT: ld1.h { v0 }[3], [x0] 247 // CHECK-NEXT: ret 248 return vset_lane_f16(*a, b, 3); 249 } 250 251 uint8x16_t test_vsetq_lane_u8(uint8_t a, uint8x16_t b) { 252 // CHECK-LABEL: test_vsetq_lane_u8: 253 // CHECK-NEXT: ins.b v0[15], w0 254 // CHECK-NEXT: ret 255 return vsetq_lane_u8(a, b, 15); 256 } 257 258 uint16x8_t test_vsetq_lane_u16(uint16_t a, uint16x8_t b) { 259 // CHECK-LABEL: test_vsetq_lane_u16: 260 // CHECK-NEXT: ins.h v0[7], w0 261 // CHECK-NEXT: ret 262 return vsetq_lane_u16(a, b, 7); 263 } 264 265 uint32x4_t test_vsetq_lane_u32(uint32_t a, uint32x4_t b) { 266 // CHECK-LABEL: test_vsetq_lane_u32: 267 // CHECK-NEXT: ins.s v0[3], w0 268 // CHECK-NEXT: ret 269 return vsetq_lane_u32(a, b, 3); 270 } 271 272 int8x16_t test_vsetq_lane_s8(int8_t a, int8x16_t b) { 273 // CHECK-LABEL: test_vsetq_lane_s8: 274 // CHECK-NEXT: ins.b v0[15], w0 275 // CHECK-NEXT: ret 276 return vsetq_lane_s8(a, b, 15); 277 } 278 279 int16x8_t test_vsetq_lane_s16(int16_t a, int16x8_t b) { 280 // CHECK-LABEL: test_vsetq_lane_s16: 281 // CHECK-NEXT: ins.h v0[7], w0 282 // CHECK-NEXT: ret 283 return vsetq_lane_s16(a, b, 7); 284 } 285 286 int32x4_t test_vsetq_lane_s32(int32_t a, int32x4_t b) { 287 // CHECK-LABEL: test_vsetq_lane_s32: 288 // CHECK-NEXT: ins.s v0[3], w0 289 // CHECK-NEXT: ret 290 return vsetq_lane_s32(a, b, 3); 291 } 292 293 poly8x16_t test_vsetq_lane_p8(poly8_t a, poly8x16_t b) { 294 // CHECK-LABEL: test_vsetq_lane_p8: 295 // CHECK-NEXT: ins.b v0[15], w0 296 // CHECK-NEXT: ret 297 return vsetq_lane_p8(a, b, 15); 298 } 299 300 poly16x8_t test_vsetq_lane_p16(poly16_t a, poly16x8_t b) { 301 // CHECK-LABEL: test_vsetq_lane_p16: 302 // CHECK-NEXT: ins.h v0[7], w0 303 // CHECK-NEXT: ret 304 return vsetq_lane_p16(a, b, 7); 305 } 306 307 float32x4_t test_vsetq_lane_f32(float32_t a, float32x4_t b) { 308 // CHECK-LABEL: test_vsetq_lane_f32: 309 // CHECK-NEXT: ins.s v1[3], v0[0] 310 // CHECK-NEXT: mov.16b v0, v1 311 // CHECK-NEXT: ret 312 return vsetq_lane_f32(a, b, 3); 313 } 314 315 float16x8_t test_vsetq_lane_f16(float16_t *a, float16x8_t b) { 316 // CHECK-LABEL: test_vsetq_lane_f16: 317 // CHECK-NEXT: ld1.h { v0 }[7], [x0] 318 // CHECK-NEXT: ret 319 return vsetq_lane_f16(*a, b, 7); 320 } 321 322 int64x1_t test_vset_lane_s64(int64_t a, int64x1_t b) { 323 // CHECK-LABEL: test_vset_lane_s64: 324 // CHECK-NEXT: fmov d0, x0 325 // CHECK-NEXT: ret 326 return vset_lane_s64(a, b, 0); 327 } 328 329 uint64x1_t test_vset_lane_u64(uint64_t a, uint64x1_t b) { 330 // CHECK-LABEL: test_vset_lane_u64: 331 // CHECK-NEXT: fmov d0, x0 332 // CHECK-NEXT: ret 333 return vset_lane_u64(a, b, 0); 334 } 335 336 int64x2_t test_vsetq_lane_s64(int64_t a, int64x2_t b) { 337 // CHECK-LABEL: test_vsetq_lane_s64: 338 // CHECK-NEXT: ins.d v0[1], x0 339 // CHECK-NEXT: ret 340 return vsetq_lane_s64(a, b, 1); 341 } 342 343 uint64x2_t test_vsetq_lane_u64(uint64_t a, uint64x2_t b) { 344 // CHECK-LABEL: test_vsetq_lane_u64: 345 // CHECK-NEXT: ins.d v0[1], x0 346 // CHECK-NEXT: ret 347 return vsetq_lane_u64(a, b, 1); 348 } 349