Home | History | Annotate | Download | only in CodeGen
      1 // REQUIRES: aarch64-registered-target
      2 // RUN: %clang_cc1 -triple arm64-none-linux-gnu -target-feature +neon -target-cpu cyclone \
      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 
     10 float32_t test_vmuls_lane_f32(float32_t a, float32x2_t b) {
     11   // CHECK-LABEL: test_vmuls_lane_f32
     12   return vmuls_lane_f32(a, b, 1);
     13   // CHECK: fmul {{s[0-9]+}}, {{s[0-9]+}}, {{v[0-9]+}}.s[1]
     14 }
     15 
     16 float64_t test_vmuld_lane_f64(float64_t a, float64x1_t b) {
     17   // CHECK-LABEL: test_vmuld_lane_f64
     18   return vmuld_lane_f64(a, b, 0);
     19   // CHECK: fmul {{d[0-9]+}}, {{d[0-9]+}}, {{v[0-9]+.d\[0\]|d[0-9]+}}
     20 }
     21 
     22 float32_t test_vmuls_laneq_f32(float32_t a, float32x4_t b) {
     23   // CHECK-LABEL: test_vmuls_laneq_f32
     24   return vmuls_laneq_f32(a, b, 3);
     25   // CHECK: fmul {{s[0-9]+}}, {{s[0-9]+}}, {{v[0-9]+}}.s[3]
     26 }
     27 
     28 float64_t test_vmuld_laneq_f64(float64_t a, float64x2_t b) {
     29   // CHECK-LABEL: test_vmuld_laneq_f64
     30   return vmuld_laneq_f64(a, b, 1);
     31   // CHECK: fmul {{d[0-9]+}}, {{d[0-9]+}}, {{v[0-9]+}}.d[1]
     32 }
     33 
     34 float64x1_t test_vmul_n_f64(float64x1_t a, float64_t b) {
     35   // CHECK-LABEL: test_vmul_n_f64
     36   return vmul_n_f64(a, b);
     37   // CHECK: fmul {{d[0-9]+}}, {{d[0-9]+}}, {{v[0-9]+.d\[0\]|d[0-9]+}}
     38 }
     39 
     40 float32_t test_vmulxs_lane_f32(float32_t a, float32x2_t b) {
     41 // CHECK-LABEL: test_vmulxs_lane_f32
     42   return vmulxs_lane_f32(a, b, 1);
     43 // CHECK: fmulx {{s[0-9]+}}, {{s[0-9]+}}, {{v[0-9]+}}.s[1]
     44 }
     45 
     46 float32_t test_vmulxs_laneq_f32(float32_t a, float32x4_t b) {
     47 // CHECK-LABEL: test_vmulxs_laneq_f32
     48   return vmulxs_laneq_f32(a, b, 3);
     49 // CHECK: fmulx {{s[0-9]+}}, {{s[0-9]+}}, {{v[0-9]+}}.s[3]
     50 }
     51 
     52 float64_t test_vmulxd_lane_f64(float64_t a, float64x1_t b) {
     53 // CHECK-LABEL: test_vmulxd_lane_f64
     54   return vmulxd_lane_f64(a, b, 0);
     55 // CHECK: fmulx {{d[0-9]+}}, {{d[0-9]+}}, {{v[0-9]+.d\[0\]|d[0-9]+}}
     56 }
     57 
     58 float64_t test_vmulxd_laneq_f64(float64_t a, float64x2_t b) {
     59 // CHECK-LABEL: test_vmulxd_laneq_f64
     60   return vmulxd_laneq_f64(a, b, 1);
     61 // CHECK: fmulx {{d[0-9]+}}, {{d[0-9]+}}, {{v[0-9]+}}.d[1]
     62 }
     63 
     64 // CHECK-LABEL: test_vmulx_lane_f64
     65 float64x1_t test_vmulx_lane_f64(float64x1_t a, float64x1_t b) {
     66   return vmulx_lane_f64(a, b, 0);
     67   // CHECK: fmulx {{d[0-9]+}}, {{d[0-9]+}}, {{v[0-9]+.d\[0\]|d[0-9]+}}
     68 }
     69 
     70 
     71 // CHECK-LABEL: test_vmulx_laneq_f64_0
     72 float64x1_t test_vmulx_laneq_f64_0(float64x1_t a, float64x2_t b) {
     73   return vmulx_laneq_f64(a, b, 0);
     74   // CHECK: fmulx {{d[0-9]+}}, {{d[0-9]+}}, {{v[0-9]+}}.d[0]
     75 }
     76 
     77 // CHECK-LABEL: test_vmulx_laneq_f64_1
     78 float64x1_t test_vmulx_laneq_f64_1(float64x1_t a, float64x2_t b) {
     79   return vmulx_laneq_f64(a, b, 1);
     80   // CHECK: fmulx {{d[0-9]+}}, {{d[0-9]+}}, {{v[0-9]+}}.d[1]
     81 }
     82 
     83 
     84 // CHECK-LABEL: test_vfmas_lane_f32
     85 float32_t test_vfmas_lane_f32(float32_t a, float32_t b, float32x2_t c) {
     86   return vfmas_lane_f32(a, b, c, 1);
     87   // CHECK: fmla {{s[0-9]+}}, {{s[0-9]+}}, {{v[0-9]+}}.s[1]
     88 }
     89 
     90 // CHECK-LABEL: test_vfmad_lane_f64
     91 float64_t test_vfmad_lane_f64(float64_t a, float64_t b, float64x1_t c) {
     92   return vfmad_lane_f64(a, b, c, 0);
     93   // CHECK: {{fmla|fmadd}} {{d[0-9]+}}, {{d[0-9]+}}, {{v[0-9]+.d\[0\]|d[0-9]+}}
     94 }
     95 
     96 // CHECK-LABEL: test_vfmad_laneq_f64
     97 float64_t test_vfmad_laneq_f64(float64_t a, float64_t b, float64x2_t c) {
     98   return vfmad_laneq_f64(a, b, c, 1);
     99   // CHECK: fmla {{d[0-9]+}}, {{d[0-9]+}}, {{v[0-9]+}}.d[1]
    100 }
    101 
    102 // CHECK-LABEL: test_vfmss_lane_f32
    103 float32_t test_vfmss_lane_f32(float32_t a, float32_t b, float32x2_t c) {
    104   return vfmss_lane_f32(a, b, c, 1);
    105   // CHECK: fmls {{s[0-9]+}}, {{s[0-9]+}}, {{v[0-9]+}}.s[1]
    106 }
    107 
    108 // CHECK-LABEL: test_vfma_lane_f64
    109 float64x1_t test_vfma_lane_f64(float64x1_t a, float64x1_t b, float64x1_t v) {
    110   return vfma_lane_f64(a, b, v, 0);
    111   // CHECK: {{fmla|fmadd}} {{d[0-9]+}}, {{d[0-9]+}}, {{v[0-9]+.d\[0\]|d[0-9]+}}
    112 }
    113 
    114 // CHECK-LABEL: test_vfms_lane_f64
    115 float64x1_t test_vfms_lane_f64(float64x1_t a, float64x1_t b, float64x1_t v) {
    116   return vfms_lane_f64(a, b, v, 0);
    117   // CHECK: {{fmls|fmsub}} {{d[0-9]+}}, {{d[0-9]+}}, {{v[0-9]+.d\[0\]|d[0-9]+}}
    118 }
    119 
    120 // CHECK-LABEL: test_vfma_laneq_f64
    121 float64x1_t test_vfma_laneq_f64(float64x1_t a, float64x1_t b, float64x2_t v) {
    122   return vfma_laneq_f64(a, b, v, 0);
    123   // CHECK: fmla {{d[0-9]+}}, {{d[0-9]+}}, {{v[0-9]+}}.d[0]
    124 }
    125 
    126 // CHECK-LABEL: test_vfms_laneq_f64
    127 float64x1_t test_vfms_laneq_f64(float64x1_t a, float64x1_t b, float64x2_t v) {
    128   return vfms_laneq_f64(a, b, v, 0);
    129   // CHECK: fmls {{d[0-9]+}}, {{d[0-9]+}}, {{v[0-9]+}}.d[0]
    130 }
    131 
    132 // CHECK-LABEL: test_vqdmullh_lane_s16
    133 int32_t test_vqdmullh_lane_s16(int16_t a, int16x4_t b) {
    134   return vqdmullh_lane_s16(a, b, 3);
    135   // CHECK: sqdmull {{s[0-9]+|v[0-9]+.4s}}, {{h[0-9]+|v[0-9].4h}}, {{v[0-9]+}}.h[3]
    136 }
    137 
    138 // CHECK-LABEL: test_vqdmulls_lane_s32
    139 int64_t test_vqdmulls_lane_s32(int32_t a, int32x2_t b) {
    140   return vqdmulls_lane_s32(a, b, 1);
    141   // CHECK: sqdmull {{d[0-9]+}}, {{s[0-9]+}}, {{v[0-9]+}}.s[1]
    142 }
    143 
    144 // CHECK-LABEL: test_vqdmullh_laneq_s16
    145 int32_t test_vqdmullh_laneq_s16(int16_t a, int16x8_t b) {
    146   return vqdmullh_laneq_s16(a, b, 7);
    147   // CHECK: sqdmull {{s[0-9]+|v[0-9]+.4s}}, {{h[0-9]+|v[0-9]+.4h}}, {{v[0-9]+}}.h[7]
    148 }
    149 
    150 // CHECK-LABEL: test_vqdmulls_laneq_s32
    151 int64_t test_vqdmulls_laneq_s32(int32_t a, int32x4_t b) {
    152   return vqdmulls_laneq_s32(a, b, 3);
    153   // CHECK: sqdmull {{d[0-9]+}}, {{s[0-9]+}}, {{v[0-9]+}}.s[3]
    154 }
    155 
    156 // CHECK-LABEL: test_vqdmulhh_lane_s16
    157 int16_t test_vqdmulhh_lane_s16(int16_t a, int16x4_t b) {
    158   return vqdmulhh_lane_s16(a, b, 3);
    159 // CHECK: sqdmulh {{h[0-9]+|v[0-9]+.4h}}, {{h[0-9]+|v[0-9]+.4h}}, {{v[0-9]+}}.h[3]
    160 }
    161 
    162 // CHECK-LABEL: test_vqdmulhs_lane_s32
    163 int32_t test_vqdmulhs_lane_s32(int32_t a, int32x2_t b) {
    164   return vqdmulhs_lane_s32(a, b, 1);
    165 // CHECK: sqdmulh {{s[0-9]+}}, {{s[0-9]+}}, {{v[0-9]+}}.s[1]
    166 }
    167 
    168 
    169 // CHECK-LABEL: test_vqdmulhh_laneq_s16
    170 int16_t test_vqdmulhh_laneq_s16(int16_t a, int16x8_t b) {
    171   return vqdmulhh_laneq_s16(a, b, 7);
    172 // CHECK: sqdmulh {{h[0-9]+|v[0-9]+.4h}}, {{h[0-9]+|v[0-9]+.4h}}, {{v[0-9]+}}.h[7]
    173 }
    174 
    175 
    176 // CHECK-LABEL: test_vqdmulhs_laneq_s32
    177 int32_t test_vqdmulhs_laneq_s32(int32_t a, int32x4_t b) {
    178   return vqdmulhs_laneq_s32(a, b, 3);
    179 // CHECK: sqdmulh {{s[0-9]+}}, {{s[0-9]+}}, {{v[0-9]+}}.s[3]
    180 }
    181 
    182 // CHECK-LABEL: test_vqrdmulhh_lane_s16
    183 int16_t test_vqrdmulhh_lane_s16(int16_t a, int16x4_t b) {
    184   return vqrdmulhh_lane_s16(a, b, 3);
    185 // CHECK: sqrdmulh {{h[0-9]+|v[0-9]+.4h}}, {{h[0-9]+|v[0-9]+.4h}}, {{v[0-9]+}}.h[3]
    186 }
    187 
    188 // CHECK-LABEL: test_vqrdmulhs_lane_s32
    189 int32_t test_vqrdmulhs_lane_s32(int32_t a, int32x2_t b) {
    190   return vqrdmulhs_lane_s32(a, b, 1);
    191 // CHECK: sqrdmulh {{s[0-9]+}}, {{s[0-9]+}}, {{v[0-9]+}}.s[1]
    192 }
    193 
    194 
    195 // CHECK-LABEL: test_vqrdmulhh_laneq_s16
    196 int16_t test_vqrdmulhh_laneq_s16(int16_t a, int16x8_t b) {
    197   return vqrdmulhh_laneq_s16(a, b, 7);
    198 // CHECK: sqrdmulh {{h[0-9]+|v[0-9]+.4h}}, {{h[0-9]+|v[0-9]+.4h}}, {{v[0-9]+}}.h[7]
    199 }
    200 
    201 
    202 // CHECK-LABEL: test_vqrdmulhs_laneq_s32
    203 int32_t test_vqrdmulhs_laneq_s32(int32_t a, int32x4_t b) {
    204   return vqrdmulhs_laneq_s32(a, b, 3);
    205 // CHECK: sqrdmulh {{s[0-9]+}}, {{s[0-9]+}}, {{v[0-9]+}}.s[3]
    206 }
    207 
    208 // CHECK-LABEL: test_vqdmlalh_lane_s16
    209 int32_t test_vqdmlalh_lane_s16(int32_t a, int16_t b, int16x4_t c) {
    210   return vqdmlalh_lane_s16(a, b, c, 3);
    211 // CHECK: sqdmlal {{s[0-9]+|v[0-9]+.4s}}, {{h[0-9]+|v[0-9]+.4h}}, {{v[0-9]+}}.h[3]
    212 }
    213 
    214 // CHECK-LABEL: test_vqdmlals_lane_s32
    215 int64_t test_vqdmlals_lane_s32(int64_t a, int32_t b, int32x2_t c) {
    216   return vqdmlals_lane_s32(a, b, c, 1);
    217 // CHECK: sqdmlal {{d[0-9]+}}, {{s[0-9]+}}, {{v[0-9]+}}.s[1]
    218 }
    219 
    220 // CHECK-LABEL: test_vqdmlalh_laneq_s16
    221 int32_t test_vqdmlalh_laneq_s16(int32_t a, int16_t b, int16x8_t c) {
    222   return vqdmlalh_laneq_s16(a, b, c, 7);
    223 // CHECK: sqdmlal {{s[0-9]+|v[0-9]+.4s}}, {{h[0-9]+|v[0-9]+.4h}}, {{v[0-9]+}}.h[7]
    224 }
    225 
    226 // CHECK-LABEL: test_vqdmlals_laneq_s32
    227 int64_t test_vqdmlals_laneq_s32(int64_t a, int32_t b, int32x4_t c) {
    228   return vqdmlals_laneq_s32(a, b, c, 3);
    229 // CHECK: sqdmlal {{d[0-9]+}}, {{s[0-9]+}}, {{v[0-9]+}}.s[3]
    230 }
    231 
    232 // CHECK-LABEL: test_vqdmlslh_lane_s16
    233 int32_t test_vqdmlslh_lane_s16(int32_t a, int16_t b, int16x4_t c) {
    234   return vqdmlslh_lane_s16(a, b, c, 3);
    235 // CHECK: sqdmlsl {{s[0-9]+|v[0-9]+.4s}}, {{h[0-9]+|v[0-9]+.4h}}, {{v[0-9]+}}.h[3]
    236 }
    237 
    238 // CHECK-LABEL: test_vqdmlsls_lane_s32
    239 int64_t test_vqdmlsls_lane_s32(int64_t a, int32_t b, int32x2_t c) {
    240   return vqdmlsls_lane_s32(a, b, c, 1);
    241 // CHECK: sqdmlsl {{d[0-9]+}}, {{s[0-9]+}}, {{v[0-9]+}}.s[1]
    242 }
    243 
    244 // CHECK-LABEL: test_vqdmlslh_laneq_s16
    245 int32_t test_vqdmlslh_laneq_s16(int32_t a, int16_t b, int16x8_t c) {
    246   return vqdmlslh_laneq_s16(a, b, c, 7);
    247 // CHECK: sqdmlsl {{s[0-9]+|v[0-9]+.4s}}, {{h[0-9]+|v[0-9]+.4h}}, {{v[0-9]+}}.h[7]
    248 }
    249 
    250 // CHECK-LABEL: test_vqdmlsls_laneq_s32
    251 int64_t test_vqdmlsls_laneq_s32(int64_t a, int32_t b, int32x4_t c) {
    252   return vqdmlsls_laneq_s32(a, b, c, 3);
    253 // CHECK: sqdmlsl {{d[0-9]+}}, {{s[0-9]+}}, {{v[0-9]+}}.s[3]
    254 }
    255 
    256 // CHECK-LABEL: test_vmulx_lane_f64_0:
    257 float64x1_t test_vmulx_lane_f64_0() {
    258       float64x1_t arg1;
    259       float64x1_t arg2;
    260       float64x1_t result;
    261       float64_t sarg1, sarg2, sres;
    262       arg1 = vcreate_f64(UINT64_C(0x3fd6304bc43ab5c2));
    263       arg2 = vcreate_f64(UINT64_C(0x3fee211e215aeef3));
    264       result = vmulx_lane_f64(arg1, arg2, 0);
    265 // CHECK: adrp x[[ADDRLO:[0-9]+]]
    266 // CHECK: ldr d0, [x[[ADDRLO]],
    267 // CHECK: adrp x[[ADDRLO:[0-9]+]]
    268 // CHECK: ldr d1, [x[[ADDRLO]],
    269 // CHECK: fmulx d0, d1, d0
    270       return result;
    271 }
    272 
    273 // CHECK-LABEL: test_vmulx_laneq_f64_2:
    274 float64x1_t test_vmulx_laneq_f64_2() {
    275       float64x1_t arg1;
    276       float64x1_t arg2;
    277       float64x2_t arg3;
    278       float64x1_t result;
    279       float64_t sarg1, sarg2, sres;
    280       arg1 = vcreate_f64(UINT64_C(0x3fd6304bc43ab5c2));
    281       arg2 = vcreate_f64(UINT64_C(0x3fee211e215aeef3));
    282       arg3 = vcombine_f64(arg1, arg2);
    283       result = vmulx_laneq_f64(arg1, arg3, 1);
    284 // CHECK: adrp x[[ADDRLO:[0-9]+]]
    285 // CHECK: ldr d0, [x[[ADDRLO]],
    286 // CHECK: adrp x[[ADDRLO:[0-9]+]]
    287 // CHECK: ldr d1, [x[[ADDRLO]],
    288 // CHECK: fmulx d0, d1, d0
    289       return result;
    290 }
    291