Home | History | Annotate | Download | only in SystemZ
      1 ; Test vector negative multiply-and-add on z14.
      2 ;
      3 ; RUN: llc < %s -mtriple=s390x-linux-gnu -mcpu=z14 | FileCheck %s
      4 
      5 declare <2 x double> @llvm.fma.v2f64(<2 x double>, <2 x double>, <2 x double>)
      6 declare <4 x float> @llvm.fma.v4f32(<4 x float>, <4 x float>, <4 x float>)
      7 
      8 ; Test a v2f64 negative multiply-and-add.
      9 define <2 x double> @f1(<2 x double> %dummy, <2 x double> %val1,
     10                         <2 x double> %val2, <2 x double> %val3) {
     11 ; CHECK-LABEL: f1:
     12 ; CHECK: vfnmadb %v24, %v26, %v28, %v30
     13 ; CHECK: br %r14
     14   %ret = call <2 x double> @llvm.fma.v2f64 (<2 x double> %val1,
     15                                             <2 x double> %val2,
     16                                             <2 x double> %val3)
     17   %negret = fsub <2 x double> <double -0.0, double -0.0>, %ret
     18   ret <2 x double> %negret
     19 }
     20 
     21 ; Test a v2f64 negative multiply-and-subtract.
     22 define <2 x double> @f2(<2 x double> %dummy, <2 x double> %val1,
     23                         <2 x double> %val2, <2 x double> %val3) {
     24 ; CHECK-LABEL: f2:
     25 ; CHECK: vfnmsdb %v24, %v26, %v28, %v30
     26 ; CHECK: br %r14
     27   %negval3 = fsub <2 x double> <double -0.0, double -0.0>, %val3
     28   %ret = call <2 x double> @llvm.fma.v2f64 (<2 x double> %val1,
     29                                             <2 x double> %val2,
     30                                             <2 x double> %negval3)
     31   %negret = fsub <2 x double> <double -0.0, double -0.0>, %ret
     32   ret <2 x double> %negret
     33 }
     34 
     35 ; Test a v4f32 negative multiply-and-add.
     36 define <4 x float> @f3(<4 x float> %dummy, <4 x float> %val1,
     37                        <4 x float> %val2, <4 x float> %val3) {
     38 ; CHECK-LABEL: f3:
     39 ; CHECK: vfnmasb %v24, %v26, %v28, %v30
     40 ; CHECK: br %r14
     41   %ret = call <4 x float> @llvm.fma.v4f32 (<4 x float> %val1,
     42                                            <4 x float> %val2,
     43                                            <4 x float> %val3)
     44   %negret = fsub <4 x float> <float -0.0, float -0.0,
     45                               float -0.0, float -0.0>, %ret
     46   ret <4 x float> %negret
     47 }
     48 
     49 ; Test a v4f32 negative multiply-and-subtract.
     50 define <4 x float> @f4(<4 x float> %dummy, <4 x float> %val1,
     51                        <4 x float> %val2, <4 x float> %val3) {
     52 ; CHECK-LABEL: f4:
     53 ; CHECK: vfnmssb %v24, %v26, %v28, %v30
     54 ; CHECK: br %r14
     55   %negval3 = fsub <4 x float> <float -0.0, float -0.0,
     56                                float -0.0, float -0.0>, %val3
     57   %ret = call <4 x float> @llvm.fma.v4f32 (<4 x float> %val1,
     58                                            <4 x float> %val2,
     59                                            <4 x float> %negval3)
     60   %negret = fsub <4 x float> <float -0.0, float -0.0,
     61                                float -0.0, float -0.0>, %ret
     62   ret <4 x float> %negret
     63 }
     64