Home | History | Annotate | Download | only in CodeGen
      1 // REQUIRES: aarch64-registered-target
      2 // RUN: %clang_cc1 -triple arm64-none-linux-gnu -target-feature +neon \
      3 // RUN:   -ffp-contract=fast -S -O3 -o - %s | FileCheck %s
      4 
      5 // Test new aarch64 intrinsics and types
      6 
      7 #include <arm_neon.h>
      8 
      9 int16_t test_vaddlv_s8(int8x8_t a) {
     10   // CHECK-LABEL: test_vaddlv_s8
     11   return vaddlv_s8(a);
     12   // CHECK: saddlv {{h[0-9]+}}, {{v[0-9]+}}.8b
     13 }
     14 
     15 int32_t test_vaddlv_s16(int16x4_t a) {
     16   // CHECK-LABEL: test_vaddlv_s16
     17   return vaddlv_s16(a);
     18   // CHECK: saddlv {{s[0-9]+}}, {{v[0-9]+}}.4h
     19 }
     20 
     21 uint16_t test_vaddlv_u8(uint8x8_t a) {
     22   // CHECK-LABEL: test_vaddlv_u8
     23   return vaddlv_u8(a);
     24   // CHECK: uaddlv {{h[0-9]+}}, {{v[0-9]+}}.8b
     25 }
     26 
     27 uint32_t test_vaddlv_u16(uint16x4_t a) {
     28   // CHECK-LABEL: test_vaddlv_u16
     29   return vaddlv_u16(a);
     30   // CHECK: uaddlv {{s[0-9]+}}, {{v[0-9]+}}.4h
     31 }
     32 
     33 int16_t test_vaddlvq_s8(int8x16_t a) {
     34   // CHECK-LABEL: test_vaddlvq_s8
     35   return vaddlvq_s8(a);
     36   // CHECK: saddlv {{h[0-9]+}}, {{v[0-9]+}}.16b
     37 }
     38 
     39 int32_t test_vaddlvq_s16(int16x8_t a) {
     40   // CHECK-LABEL: test_vaddlvq_s16
     41   return vaddlvq_s16(a);
     42   // CHECK: saddlv {{s[0-9]+}}, {{v[0-9]+}}.8h
     43 }
     44 
     45 int64_t test_vaddlvq_s32(int32x4_t a) {
     46   // CHECK-LABEL: test_vaddlvq_s32
     47   return vaddlvq_s32(a);
     48   // CHECK: saddlv {{d[0-9]+}}, {{v[0-9]+}}.4s
     49 }
     50 
     51 uint16_t test_vaddlvq_u8(uint8x16_t a) {
     52   // CHECK-LABEL: test_vaddlvq_u8
     53   return vaddlvq_u8(a);
     54   // CHECK: uaddlv {{h[0-9]+}}, {{v[0-9]+}}.16b
     55 }
     56 
     57 uint32_t test_vaddlvq_u16(uint16x8_t a) {
     58   // CHECK-LABEL: test_vaddlvq_u16
     59   return vaddlvq_u16(a);
     60   // CHECK: uaddlv {{s[0-9]+}}, {{v[0-9]+}}.8h
     61 }
     62 
     63 uint64_t test_vaddlvq_u32(uint32x4_t a) {
     64   // CHECK-LABEL: test_vaddlvq_u32
     65   return vaddlvq_u32(a);
     66   // CHECK: uaddlv {{d[0-9]+}}, {{v[0-9]+}}.4s
     67 }
     68 
     69 int8_t test_vmaxv_s8(int8x8_t a) {
     70   // CHECK-LABEL: test_vmaxv_s8
     71   return vmaxv_s8(a);
     72   // CHECK: smaxv {{b[0-9]+}}, {{v[0-9]+}}.8b
     73 }
     74 
     75 int16_t test_vmaxv_s16(int16x4_t a) {
     76   // CHECK-LABEL: test_vmaxv_s16
     77   return vmaxv_s16(a);
     78   // CHECK: smaxv {{h[0-9]+}}, {{v[0-9]+}}.4h
     79 }
     80 
     81 uint8_t test_vmaxv_u8(uint8x8_t a) {
     82   // CHECK-LABEL: test_vmaxv_u8
     83   return vmaxv_u8(a);
     84   // CHECK: umaxv {{b[0-9]+}}, {{v[0-9]+}}.8b
     85 }
     86 
     87 uint16_t test_vmaxv_u16(uint16x4_t a) {
     88   // CHECK-LABEL: test_vmaxv_u16
     89   return vmaxv_u16(a);
     90   // CHECK: umaxv {{h[0-9]+}}, {{v[0-9]+}}.4h
     91 }
     92 
     93 int8_t test_vmaxvq_s8(int8x16_t a) {
     94   // CHECK-LABEL: test_vmaxvq_s8
     95   return vmaxvq_s8(a);
     96   // CHECK: smaxv {{b[0-9]+}}, {{v[0-9]+}}.16b
     97 }
     98 
     99 int16_t test_vmaxvq_s16(int16x8_t a) {
    100   // CHECK-LABEL: test_vmaxvq_s16
    101   return vmaxvq_s16(a);
    102   // CHECK: smaxv {{h[0-9]+}}, {{v[0-9]+}}.8h
    103 }
    104 
    105 int32_t test_vmaxvq_s32(int32x4_t a) {
    106   // CHECK-LABEL: test_vmaxvq_s32
    107   return vmaxvq_s32(a);
    108   // CHECK: smaxv {{s[0-9]+}}, {{v[0-9]+}}.4s
    109 }
    110 
    111 uint8_t test_vmaxvq_u8(uint8x16_t a) {
    112   // CHECK-LABEL: test_vmaxvq_u8
    113   return vmaxvq_u8(a);
    114   // CHECK: umaxv {{b[0-9]+}}, {{v[0-9]+}}.16b
    115 }
    116 
    117 uint16_t test_vmaxvq_u16(uint16x8_t a) {
    118   // CHECK-LABEL: test_vmaxvq_u16
    119   return vmaxvq_u16(a);
    120   // CHECK: umaxv {{h[0-9]+}}, {{v[0-9]+}}.8h
    121 }
    122 
    123 uint32_t test_vmaxvq_u32(uint32x4_t a) {
    124   // CHECK-LABEL: test_vmaxvq_u32
    125   return vmaxvq_u32(a);
    126   // CHECK: umaxv {{s[0-9]+}}, {{v[0-9]+}}.4s
    127 }
    128 
    129 int8_t test_vminv_s8(int8x8_t a) {
    130   // CHECK-LABEL: test_vminv_s8
    131   return vminv_s8(a);
    132   // CHECK: sminv {{b[0-9]+}}, {{v[0-9]+}}.8b
    133 }
    134 
    135 int16_t test_vminv_s16(int16x4_t a) {
    136   // CHECK-LABEL: test_vminv_s16
    137   return vminv_s16(a);
    138   // CHECK: sminv {{h[0-9]+}}, {{v[0-9]+}}.4h
    139 }
    140 
    141 uint8_t test_vminv_u8(uint8x8_t a) {
    142   // CHECK-LABEL: test_vminv_u8
    143   return vminv_u8(a);
    144   // CHECK: uminv {{b[0-9]+}}, {{v[0-9]+}}.8b
    145 }
    146 
    147 uint16_t test_vminv_u16(uint16x4_t a) {
    148   // CHECK-LABEL: test_vminv_u16
    149   return vminv_u16(a);
    150   // CHECK: uminv {{h[0-9]+}}, {{v[0-9]+}}.4h
    151 }
    152 
    153 int8_t test_vminvq_s8(int8x16_t a) {
    154   // CHECK-LABEL: test_vminvq_s8
    155   return vminvq_s8(a);
    156   // CHECK: sminv {{b[0-9]+}}, {{v[0-9]+}}.16b
    157 }
    158 
    159 int16_t test_vminvq_s16(int16x8_t a) {
    160   // CHECK-LABEL: test_vminvq_s16
    161   return vminvq_s16(a);
    162   // CHECK: sminv {{h[0-9]+}}, {{v[0-9]+}}.8h
    163 }
    164 
    165 int32_t test_vminvq_s32(int32x4_t a) {
    166   // CHECK-LABEL: test_vminvq_s32
    167   return vminvq_s32(a);
    168   // CHECK: sminv {{s[0-9]+}}, {{v[0-9]+}}.4s
    169 }
    170 
    171 uint8_t test_vminvq_u8(uint8x16_t a) {
    172   // CHECK-LABEL: test_vminvq_u8
    173   return vminvq_u8(a);
    174   // CHECK: uminv {{b[0-9]+}}, {{v[0-9]+}}.16b
    175 }
    176 
    177 uint16_t test_vminvq_u16(uint16x8_t a) {
    178   // CHECK-LABEL: test_vminvq_u16
    179   return vminvq_u16(a);
    180   // CHECK: uminv {{h[0-9]+}}, {{v[0-9]+}}.8h
    181 }
    182 
    183 uint32_t test_vminvq_u32(uint32x4_t a) {
    184   // CHECK-LABEL: test_vminvq_u32
    185   return vminvq_u32(a);
    186   // CHECK: uminv {{s[0-9]+}}, {{v[0-9]+}}.4s
    187 }
    188 
    189 int8_t test_vaddv_s8(int8x8_t a) {
    190   // CHECK-LABEL: test_vaddv_s8
    191   return vaddv_s8(a);
    192   // CHECK: addv {{b[0-9]+}}, {{v[0-9]+}}.8b
    193 }
    194 
    195 int16_t test_vaddv_s16(int16x4_t a) {
    196   // CHECK-LABEL: test_vaddv_s16
    197   return vaddv_s16(a);
    198   // CHECK: addv {{h[0-9]+}}, {{v[0-9]+}}.4h
    199 }
    200 
    201 uint8_t test_vaddv_u8(uint8x8_t a) {
    202   // CHECK-LABEL: test_vaddv_u8
    203   return vaddv_u8(a);
    204   // CHECK: addv {{b[0-9]+}}, {{v[0-9]+}}.8b
    205 }
    206 
    207 uint16_t test_vaddv_u16(uint16x4_t a) {
    208   // CHECK-LABEL: test_vaddv_u16
    209   return vaddv_u16(a);
    210   // CHECK: addv {{h[0-9]+}}, {{v[0-9]+}}.4h
    211 }
    212 
    213 int8_t test_vaddvq_s8(int8x16_t a) {
    214   // CHECK-LABEL: test_vaddvq_s8
    215   return vaddvq_s8(a);
    216   // CHECK: addv {{b[0-9]+}}, {{v[0-9]+}}.16b
    217 }
    218 
    219 int16_t test_vaddvq_s16(int16x8_t a) {
    220   // CHECK-LABEL: test_vaddvq_s16
    221   return vaddvq_s16(a);
    222   // CHECK: addv {{h[0-9]+}}, {{v[0-9]+}}.8h
    223 }
    224 
    225 int32_t test_vaddvq_s32(int32x4_t a) {
    226   // CHECK-LABEL: test_vaddvq_s32
    227   return vaddvq_s32(a);
    228   // CHECK: addv {{s[0-9]+}}, {{v[0-9]+}}.4s
    229 }
    230 
    231 uint8_t test_vaddvq_u8(uint8x16_t a) {
    232   // CHECK-LABEL: test_vaddvq_u8
    233   return vaddvq_u8(a);
    234   // CHECK: addv {{b[0-9]+}}, {{v[0-9]+}}.16b
    235 }
    236 
    237 uint16_t test_vaddvq_u16(uint16x8_t a) {
    238   // CHECK-LABEL: test_vaddvq_u16
    239   return vaddvq_u16(a);
    240   // CHECK: addv {{h[0-9]+}}, {{v[0-9]+}}.8h
    241 }
    242 
    243 uint32_t test_vaddvq_u32(uint32x4_t a) {
    244   // CHECK-LABEL: test_vaddvq_u32
    245   return vaddvq_u32(a);
    246   // CHECK: addv {{s[0-9]+}}, {{v[0-9]+}}.4s
    247 }
    248 
    249 float32_t test_vmaxvq_f32(float32x4_t a) {
    250   // CHECK-LABEL: test_vmaxvq_f32
    251   return vmaxvq_f32(a);
    252   // CHECK: fmaxv {{s[0-9]+}}, {{v[0-9]+}}.4s
    253 }
    254 
    255 float32_t test_vminvq_f32(float32x4_t a) {
    256   // CHECK-LABEL: test_vminvq_f32
    257   return vminvq_f32(a);
    258   // CHECK: fminv {{s[0-9]+}}, {{v[0-9]+}}.4s
    259 }
    260 
    261 float32_t test_vmaxnmvq_f32(float32x4_t a) {
    262   // CHECK-LABEL: test_vmaxnmvq_f32
    263   return vmaxnmvq_f32(a);
    264   // CHECK: fmaxnmv {{s[0-9]+}}, {{v[0-9]+}}.4s
    265 }
    266 
    267 float32_t test_vminnmvq_f32(float32x4_t a) {
    268   // CHECK-LABEL: test_vminnmvq_f32
    269   return vminnmvq_f32(a);
    270   // CHECK: fminnmv {{s[0-9]+}}, {{v[0-9]+}}.4s
    271 }
    272