Home | History | Annotate | Download | only in CodeGen
      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