Home | History | Annotate | Download | only in AArch64
      1 ; RUN: llc < %s -verify-machineinstrs -mtriple=arm64-none-linux-gnu -mattr=+neon -fp-contract=fast | FileCheck %s
      2 
      3 define float @test_fmul_lane_ss2S(float %a, <2 x float> %v) {
      4   ; CHECK-LABEL: test_fmul_lane_ss2S
      5   ; CHECK: fmul {{s[0-9]+}}, {{s[0-9]+}}, {{v[0-9]+}}.s[1]
      6   %tmp1 = extractelement <2 x float> %v, i32 1
      7   %tmp2 = fmul float %a, %tmp1;
      8   ret float %tmp2;
      9 }
     10 
     11 define float @test_fmul_lane_ss2S_swap(float %a, <2 x float> %v) {
     12   ; CHECK-LABEL: test_fmul_lane_ss2S_swap
     13   ; CHECK: fmul {{s[0-9]+}}, {{s[0-9]+}}, {{v[0-9]+}}.s[1]
     14   %tmp1 = extractelement <2 x float> %v, i32 1
     15   %tmp2 = fmul float %tmp1, %a;
     16   ret float %tmp2;
     17 }
     18 
     19 
     20 define float @test_fmul_lane_ss4S(float %a, <4 x float> %v) {
     21   ; CHECK-LABEL: test_fmul_lane_ss4S
     22   ; CHECK: fmul {{s[0-9]+}}, {{s[0-9]+}}, {{v[0-9]+}}.s[3]
     23   %tmp1 = extractelement <4 x float> %v, i32 3
     24   %tmp2 = fmul float %a, %tmp1;
     25   ret float %tmp2;
     26 }
     27 
     28 define float @test_fmul_lane_ss4S_swap(float %a, <4 x float> %v) {
     29   ; CHECK-LABEL: test_fmul_lane_ss4S_swap
     30   ; CHECK: fmul {{s[0-9]+}}, {{s[0-9]+}}, {{v[0-9]+}}.s[3]
     31   %tmp1 = extractelement <4 x float> %v, i32 3
     32   %tmp2 = fmul float %tmp1, %a;
     33   ret float %tmp2;
     34 }
     35 
     36 
     37 define double @test_fmul_lane_ddD(double %a, <1 x double> %v) {
     38   ; CHECK-LABEL: test_fmul_lane_ddD
     39   ; CHECK: fmul {{d[0-9]+}}, {{d[0-9]+}}, {{v[0-9]+.d\[0]|d[0-9]+}}
     40   %tmp1 = extractelement <1 x double> %v, i32 0
     41   %tmp2 = fmul double %a, %tmp1;
     42   ret double %tmp2;
     43 }
     44 
     45 
     46 
     47 define double @test_fmul_lane_dd2D(double %a, <2 x double> %v) {
     48   ; CHECK-LABEL: test_fmul_lane_dd2D
     49   ; CHECK: fmul {{d[0-9]+}}, {{d[0-9]+}}, {{v[0-9]+}}.d[1]
     50   %tmp1 = extractelement <2 x double> %v, i32 1
     51   %tmp2 = fmul double %a, %tmp1;
     52   ret double %tmp2;
     53 }
     54 
     55 
     56 define double @test_fmul_lane_dd2D_swap(double %a, <2 x double> %v) {
     57   ; CHECK-LABEL: test_fmul_lane_dd2D_swap
     58   ; CHECK: fmul {{d[0-9]+}}, {{d[0-9]+}}, {{v[0-9]+}}.d[1]
     59   %tmp1 = extractelement <2 x double> %v, i32 1
     60   %tmp2 = fmul double %tmp1, %a;
     61   ret double %tmp2;
     62 }
     63 
     64 declare float @llvm.aarch64.neon.fmulx.f32(float, float)
     65 
     66 define float @test_fmulx_lane_f32(float %a, <2 x float> %v) {
     67   ; CHECK-LABEL: test_fmulx_lane_f32
     68   ; CHECK: fmulx {{s[0-9]+}}, {{s[0-9]+}}, {{v[0-9]+}}.s[1]
     69   %tmp1 = extractelement <2 x float> %v, i32 1
     70   %tmp2 = call float @llvm.aarch64.neon.fmulx.f32(float %a, float %tmp1)
     71   ret float %tmp2;
     72 }
     73 
     74 define float @test_fmulx_laneq_f32(float %a, <4 x float> %v) {
     75   ; CHECK-LABEL: test_fmulx_laneq_f32
     76   ; CHECK: fmulx {{s[0-9]+}}, {{s[0-9]+}}, {{v[0-9]+}}.s[3]
     77   %tmp1 = extractelement <4 x float> %v, i32 3
     78   %tmp2 = call float @llvm.aarch64.neon.fmulx.f32(float %a, float %tmp1)
     79   ret float %tmp2;
     80 }
     81 
     82 define float @test_fmulx_laneq_f32_swap(float %a, <4 x float> %v) {
     83   ; CHECK-LABEL: test_fmulx_laneq_f32_swap
     84   ; CHECK: fmulx {{s[0-9]+}}, {{s[0-9]+}}, {{v[0-9]+}}.s[3]
     85   %tmp1 = extractelement <4 x float> %v, i32 3
     86   %tmp2 = call float @llvm.aarch64.neon.fmulx.f32(float %tmp1, float %a)
     87   ret float %tmp2;
     88 }
     89 
     90 declare double @llvm.aarch64.neon.fmulx.f64(double, double)
     91 
     92 define double @test_fmulx_lane_f64(double %a, <1 x double> %v) {
     93   ; CHECK-LABEL: test_fmulx_lane_f64
     94   ; CHECK: fmulx {{d[0-9]+}}, {{d[0-9]+}}, {{v[0-9]+.d\[0]|d[0-9]+}}
     95   %tmp1 = extractelement <1 x double> %v, i32 0
     96   %tmp2 = call double @llvm.aarch64.neon.fmulx.f64(double %a, double %tmp1)
     97   ret double %tmp2;
     98 }
     99 
    100 define double @test_fmulx_laneq_f64_0(double %a, <2 x double> %v) {
    101   ; CHECK-LABEL: test_fmulx_laneq_f64_0
    102   ; CHECK: fmulx {{d[0-9]+}}, {{d[0-9]+}}, {{v[0-9]+}}.d[0]
    103   %tmp1 = extractelement <2 x double> %v, i32 0
    104   %tmp2 = call double @llvm.aarch64.neon.fmulx.f64(double %a, double %tmp1)
    105   ret double %tmp2;
    106 }
    107 
    108 
    109 define double @test_fmulx_laneq_f64_1(double %a, <2 x double> %v) {
    110   ; CHECK-LABEL: test_fmulx_laneq_f64_1
    111   ; CHECK: fmulx {{d[0-9]+}}, {{d[0-9]+}}, {{v[0-9]+}}.d[1]
    112   %tmp1 = extractelement <2 x double> %v, i32 1
    113   %tmp2 = call double @llvm.aarch64.neon.fmulx.f64(double %a, double %tmp1)
    114   ret double %tmp2;
    115 }
    116 
    117 define double @test_fmulx_laneq_f64_1_swap(double %a, <2 x double> %v) {
    118   ; CHECK-LABEL: test_fmulx_laneq_f64_1_swap
    119   ; CHECK: fmulx {{d[0-9]+}}, {{d[0-9]+}}, {{v[0-9]+}}.d[1]
    120   %tmp1 = extractelement <2 x double> %v, i32 1
    121   %tmp2 = call double @llvm.aarch64.neon.fmulx.f64(double %tmp1, double %a)
    122   ret double %tmp2;
    123 }
    124 
    125