1*9880d681SAndroid Build Coastguard Worker; RUN: llc -mtriple=aarch64-unknown-unknown < %s | FileCheck %s 2*9880d681SAndroid Build Coastguard Worker 3*9880d681SAndroid Build Coastguard Worker; Following test cases check: 4*9880d681SAndroid Build Coastguard Worker; a / D; b / D; c / D; 5*9880d681SAndroid Build Coastguard Worker; => 6*9880d681SAndroid Build Coastguard Worker; recip = 1.0 / D; a * recip; b * recip; c * recip; 7*9880d681SAndroid Build Coastguard Workerdefine void @three_fdiv_float(float %D, float %a, float %b, float %c) #0 { 8*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: three_fdiv_float: 9*9880d681SAndroid Build Coastguard Worker; CHECK: fdiv s 10*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: fdiv 11*9880d681SAndroid Build Coastguard Worker; CHECK: fmul 12*9880d681SAndroid Build Coastguard Worker; CHECK: fmul 13*9880d681SAndroid Build Coastguard Worker; CHECK: fmul 14*9880d681SAndroid Build Coastguard Worker %div = fdiv float %a, %D 15*9880d681SAndroid Build Coastguard Worker %div1 = fdiv float %b, %D 16*9880d681SAndroid Build Coastguard Worker %div2 = fdiv float %c, %D 17*9880d681SAndroid Build Coastguard Worker tail call void @foo_3f(float %div, float %div1, float %div2) 18*9880d681SAndroid Build Coastguard Worker ret void 19*9880d681SAndroid Build Coastguard Worker} 20*9880d681SAndroid Build Coastguard Worker 21*9880d681SAndroid Build Coastguard Workerdefine void @three_fdiv_double(double %D, double %a, double %b, double %c) #0 { 22*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: three_fdiv_double: 23*9880d681SAndroid Build Coastguard Worker; CHECK: fdiv d 24*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: fdiv 25*9880d681SAndroid Build Coastguard Worker; CHECK: fmul 26*9880d681SAndroid Build Coastguard Worker; CHECK: fmul 27*9880d681SAndroid Build Coastguard Worker; CHECK: fmul 28*9880d681SAndroid Build Coastguard Worker %div = fdiv double %a, %D 29*9880d681SAndroid Build Coastguard Worker %div1 = fdiv double %b, %D 30*9880d681SAndroid Build Coastguard Worker %div2 = fdiv double %c, %D 31*9880d681SAndroid Build Coastguard Worker tail call void @foo_3d(double %div, double %div1, double %div2) 32*9880d681SAndroid Build Coastguard Worker ret void 33*9880d681SAndroid Build Coastguard Worker} 34*9880d681SAndroid Build Coastguard Worker 35*9880d681SAndroid Build Coastguard Workerdefine void @three_fdiv_4xfloat(<4 x float> %D, <4 x float> %a, <4 x float> %b, <4 x float> %c) #0 { 36*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: three_fdiv_4xfloat: 37*9880d681SAndroid Build Coastguard Worker; CHECK: fdiv v 38*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: fdiv 39*9880d681SAndroid Build Coastguard Worker; CHECK: fmul 40*9880d681SAndroid Build Coastguard Worker; CHECK: fmul 41*9880d681SAndroid Build Coastguard Worker; CHECK: fmul 42*9880d681SAndroid Build Coastguard Worker %div = fdiv <4 x float> %a, %D 43*9880d681SAndroid Build Coastguard Worker %div1 = fdiv <4 x float> %b, %D 44*9880d681SAndroid Build Coastguard Worker %div2 = fdiv <4 x float> %c, %D 45*9880d681SAndroid Build Coastguard Worker tail call void @foo_3_4xf(<4 x float> %div, <4 x float> %div1, <4 x float> %div2) 46*9880d681SAndroid Build Coastguard Worker ret void 47*9880d681SAndroid Build Coastguard Worker} 48*9880d681SAndroid Build Coastguard Worker 49*9880d681SAndroid Build Coastguard Workerdefine void @three_fdiv_2xdouble(<2 x double> %D, <2 x double> %a, <2 x double> %b, <2 x double> %c) #0 { 50*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: three_fdiv_2xdouble: 51*9880d681SAndroid Build Coastguard Worker; CHECK: fdiv v 52*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: fdiv 53*9880d681SAndroid Build Coastguard Worker; CHECK: fmul 54*9880d681SAndroid Build Coastguard Worker; CHECK: fmul 55*9880d681SAndroid Build Coastguard Worker; CHECK: fmul 56*9880d681SAndroid Build Coastguard Worker %div = fdiv <2 x double> %a, %D 57*9880d681SAndroid Build Coastguard Worker %div1 = fdiv <2 x double> %b, %D 58*9880d681SAndroid Build Coastguard Worker %div2 = fdiv <2 x double> %c, %D 59*9880d681SAndroid Build Coastguard Worker tail call void @foo_3_2xd(<2 x double> %div, <2 x double> %div1, <2 x double> %div2) 60*9880d681SAndroid Build Coastguard Worker ret void 61*9880d681SAndroid Build Coastguard Worker} 62*9880d681SAndroid Build Coastguard Worker 63*9880d681SAndroid Build Coastguard Worker; Following test cases check we never combine two FDIVs if neither of them 64*9880d681SAndroid Build Coastguard Worker; calculates a reciprocal. 65*9880d681SAndroid Build Coastguard Workerdefine void @two_fdiv_float(float %D, float %a, float %b) #0 { 66*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: two_fdiv_float: 67*9880d681SAndroid Build Coastguard Worker; CHECK: fdiv s 68*9880d681SAndroid Build Coastguard Worker; CHECK: fdiv s 69*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: fmul 70*9880d681SAndroid Build Coastguard Worker %div = fdiv float %a, %D 71*9880d681SAndroid Build Coastguard Worker %div1 = fdiv float %b, %D 72*9880d681SAndroid Build Coastguard Worker tail call void @foo_2f(float %div, float %div1) 73*9880d681SAndroid Build Coastguard Worker ret void 74*9880d681SAndroid Build Coastguard Worker} 75*9880d681SAndroid Build Coastguard Worker 76*9880d681SAndroid Build Coastguard Workerdefine void @two_fdiv_double(double %D, double %a, double %b) #0 { 77*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: two_fdiv_double: 78*9880d681SAndroid Build Coastguard Worker; CHECK: fdiv d 79*9880d681SAndroid Build Coastguard Worker; CHECK: fdiv d 80*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: fmul 81*9880d681SAndroid Build Coastguard Worker %div = fdiv double %a, %D 82*9880d681SAndroid Build Coastguard Worker %div1 = fdiv double %b, %D 83*9880d681SAndroid Build Coastguard Worker tail call void @foo_2d(double %div, double %div1) 84*9880d681SAndroid Build Coastguard Worker ret void 85*9880d681SAndroid Build Coastguard Worker} 86*9880d681SAndroid Build Coastguard Worker 87*9880d681SAndroid Build Coastguard Workerdeclare void @foo_3f(float, float, float) 88*9880d681SAndroid Build Coastguard Workerdeclare void @foo_3d(double, double, double) 89*9880d681SAndroid Build Coastguard Workerdeclare void @foo_3_4xf(<4 x float>, <4 x float>, <4 x float>) 90*9880d681SAndroid Build Coastguard Workerdeclare void @foo_3_2xd(<2 x double>, <2 x double>, <2 x double>) 91*9880d681SAndroid Build Coastguard Workerdeclare void @foo_2f(float, float) 92*9880d681SAndroid Build Coastguard Workerdeclare void @foo_2d(double, double) 93*9880d681SAndroid Build Coastguard Worker 94*9880d681SAndroid Build Coastguard Workerattributes #0 = { "unsafe-fp-math"="true" } 95