1 ; RUN: llc < %s -mtriple=powerpc64-unknown-linux-gnu -mcpu=pwr7 -enable-unsafe-fp-math | FileCheck %s 2 ; RUN: llc < %s -mtriple=powerpc64-unknown-linux-gnu -mcpu=pwr7 | FileCheck -check-prefix=CHECK-SAFE %s 3 target datalayout = "E-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-f128:128:128-v128:128:128-n32:64" 4 target triple = "powerpc64-unknown-linux-gnu" 5 6 declare double @llvm.sqrt.f64(double) 7 declare float @llvm.sqrt.f32(float) 8 declare <4 x float> @llvm.sqrt.v4f32(<4 x float>) 9 10 define double @foo(double %a, double %b) nounwind { 11 entry: 12 %x = call double @llvm.sqrt.f64(double %b) 13 %r = fdiv double %a, %x 14 ret double %r 15 16 ; CHECK: @foo 17 ; CHECK-DAG: frsqrte 18 ; CHECK-DAG: fnmsub 19 ; CHECK: fmul 20 ; CHECK: fmadd 21 ; CHECK: fmul 22 ; CHECK: fmul 23 ; CHECK: fmadd 24 ; CHECK: fmul 25 ; CHECK: fmul 26 ; CHECK: blr 27 28 ; CHECK-SAFE: @foo 29 ; CHECK-SAFE: fsqrt 30 ; CHECK-SAFE: fdiv 31 ; CHECK-SAFE: blr 32 } 33 34 define double @foof(double %a, float %b) nounwind { 35 entry: 36 %x = call float @llvm.sqrt.f32(float %b) 37 %y = fpext float %x to double 38 %r = fdiv double %a, %y 39 ret double %r 40 41 ; CHECK: @foof 42 ; CHECK-DAG: frsqrtes 43 ; CHECK-DAG: fnmsubs 44 ; CHECK: fmuls 45 ; CHECK: fmadds 46 ; CHECK: fmuls 47 ; CHECK: fmul 48 ; CHECK: blr 49 50 ; CHECK-SAFE: @foof 51 ; CHECK-SAFE: fsqrts 52 ; CHECK-SAFE: fdiv 53 ; CHECK-SAFE: blr 54 } 55 56 define float @food(float %a, double %b) nounwind { 57 entry: 58 %x = call double @llvm.sqrt.f64(double %b) 59 %y = fptrunc double %x to float 60 %r = fdiv float %a, %y 61 ret float %r 62 63 ; CHECK: @foo 64 ; CHECK-DAG: frsqrte 65 ; CHECK-DAG: fnmsub 66 ; CHECK: fmul 67 ; CHECK: fmadd 68 ; CHECK: fmul 69 ; CHECK: fmul 70 ; CHECK: fmadd 71 ; CHECK: fmul 72 ; CHECK: frsp 73 ; CHECK: fmuls 74 ; CHECK: blr 75 76 ; CHECK-SAFE: @foo 77 ; CHECK-SAFE: fsqrt 78 ; CHECK-SAFE: fdivs 79 ; CHECK-SAFE: blr 80 } 81 82 define float @goo(float %a, float %b) nounwind { 83 entry: 84 %x = call float @llvm.sqrt.f32(float %b) 85 %r = fdiv float %a, %x 86 ret float %r 87 88 ; CHECK: @goo 89 ; CHECK-DAG: frsqrtes 90 ; CHECK-DAG: fnmsubs 91 ; CHECK: fmuls 92 ; CHECK: fmadds 93 ; CHECK: fmuls 94 ; CHECK: fmuls 95 ; CHECK: blr 96 97 ; CHECK-SAFE: @goo 98 ; CHECK-SAFE: fsqrts 99 ; CHECK-SAFE: fdivs 100 ; CHECK-SAFE: blr 101 } 102 103 define <4 x float> @hoo(<4 x float> %a, <4 x float> %b) nounwind { 104 entry: 105 %x = call <4 x float> @llvm.sqrt.v4f32(<4 x float> %b) 106 %r = fdiv <4 x float> %a, %x 107 ret <4 x float> %r 108 109 ; CHECK: @hoo 110 ; CHECK: vrsqrtefp 111 112 ; CHECK-SAFE: @hoo 113 ; CHECK-SAFE-NOT: vrsqrtefp 114 ; CHECK-SAFE: blr 115 } 116 117 define double @foo2(double %a, double %b) nounwind { 118 entry: 119 %r = fdiv double %a, %b 120 ret double %r 121 122 ; CHECK: @foo2 123 ; CHECK-DAG: fre 124 ; CHECK-DAG: fnmsub 125 ; CHECK: fmadd 126 ; CHECK: fnmsub 127 ; CHECK: fmadd 128 ; CHECK: fmul 129 ; CHECK: blr 130 131 ; CHECK-SAFE: @foo2 132 ; CHECK-SAFE: fdiv 133 ; CHECK-SAFE: blr 134 } 135 136 define float @goo2(float %a, float %b) nounwind { 137 entry: 138 %r = fdiv float %a, %b 139 ret float %r 140 141 ; CHECK: @goo2 142 ; CHECK-DAG: fres 143 ; CHECK-DAG: fnmsubs 144 ; CHECK: fmadds 145 ; CHECK: fmuls 146 ; CHECK: blr 147 148 ; CHECK-SAFE: @goo2 149 ; CHECK-SAFE: fdivs 150 ; CHECK-SAFE: blr 151 } 152 153 define <4 x float> @hoo2(<4 x float> %a, <4 x float> %b) nounwind { 154 entry: 155 %r = fdiv <4 x float> %a, %b 156 ret <4 x float> %r 157 158 ; CHECK: @hoo2 159 ; CHECK: vrefp 160 161 ; CHECK-SAFE: @hoo2 162 ; CHECK-SAFE-NOT: vrefp 163 ; CHECK-SAFE: blr 164 } 165 166 define double @foo3(double %a) nounwind { 167 entry: 168 %r = call double @llvm.sqrt.f64(double %a) 169 ret double %r 170 171 ; CHECK: @foo3 172 ; CHECK-DAG: frsqrte 173 ; CHECK-DAG: fnmsub 174 ; CHECK: fmul 175 ; CHECK: fmadd 176 ; CHECK: fmul 177 ; CHECK: fmul 178 ; CHECK: fmadd 179 ; CHECK: fmul 180 ; CHECK: fre 181 ; CHECK: fnmsub 182 ; CHECK: fmadd 183 ; CHECK: fnmsub 184 ; CHECK: fmadd 185 ; CHECK: blr 186 187 ; CHECK-SAFE: @foo3 188 ; CHECK-SAFE: fsqrt 189 ; CHECK-SAFE: blr 190 } 191 192 define float @goo3(float %a) nounwind { 193 entry: 194 %r = call float @llvm.sqrt.f32(float %a) 195 ret float %r 196 197 ; CHECK: @goo3 198 ; CHECK-DAG: frsqrtes 199 ; CHECK-DAG: fnmsubs 200 ; CHECK: fmuls 201 ; CHECK: fmadds 202 ; CHECK: fmuls 203 ; CHECK: fres 204 ; CHECK: fnmsubs 205 ; CHECK: fmadds 206 ; CHECK: blr 207 208 ; CHECK-SAFE: @goo3 209 ; CHECK-SAFE: fsqrts 210 ; CHECK-SAFE: blr 211 } 212 213 define <4 x float> @hoo3(<4 x float> %a) nounwind { 214 entry: 215 %r = call <4 x float> @llvm.sqrt.v4f32(<4 x float> %a) 216 ret <4 x float> %r 217 218 ; CHECK: @hoo3 219 ; CHECK: vrsqrtefp 220 ; CHECK: vrefp 221 222 ; CHECK-SAFE: @hoo3 223 ; CHECK-SAFE-NOT: vrsqrtefp 224 ; CHECK-SAFE: blr 225 } 226 227