1 ; RUN: llc -mtriple=arm64-none-linux-gnu -verify-machineinstrs < %s | FileCheck %s 2 3 @varfloat = global float 0.0 4 @vardouble = global double 0.0 5 @varfp128 = global fp128 zeroinitializer 6 7 declare float @llvm.cos.f32(float) 8 declare double @llvm.cos.f64(double) 9 declare fp128 @llvm.cos.f128(fp128) 10 11 define void @test_cos(float %float, double %double, fp128 %fp128) { 12 ; CHECK-LABEL: test_cos: 13 14 %cosfloat = call float @llvm.cos.f32(float %float) 15 store float %cosfloat, float* @varfloat 16 ; CHECK: bl cosf 17 18 %cosdouble = call double @llvm.cos.f64(double %double) 19 store double %cosdouble, double* @vardouble 20 ; CHECK: bl cos 21 22 %cosfp128 = call fp128 @llvm.cos.f128(fp128 %fp128) 23 store fp128 %cosfp128, fp128* @varfp128 24 ; CHECK: bl cosl 25 26 ret void 27 } 28 29 declare float @llvm.exp.f32(float) 30 declare double @llvm.exp.f64(double) 31 declare fp128 @llvm.exp.f128(fp128) 32 33 define void @test_exp(float %float, double %double, fp128 %fp128) { 34 ; CHECK-LABEL: test_exp: 35 36 %expfloat = call float @llvm.exp.f32(float %float) 37 store float %expfloat, float* @varfloat 38 ; CHECK: bl expf 39 40 %expdouble = call double @llvm.exp.f64(double %double) 41 store double %expdouble, double* @vardouble 42 ; CHECK: bl exp 43 44 %expfp128 = call fp128 @llvm.exp.f128(fp128 %fp128) 45 store fp128 %expfp128, fp128* @varfp128 46 ; CHECK: bl expl 47 48 ret void 49 } 50 51 declare float @llvm.exp2.f32(float) 52 declare double @llvm.exp2.f64(double) 53 declare fp128 @llvm.exp2.f128(fp128) 54 55 define void @test_exp2(float %float, double %double, fp128 %fp128) { 56 ; CHECK-LABEL: test_exp2: 57 58 %exp2float = call float @llvm.exp2.f32(float %float) 59 store float %exp2float, float* @varfloat 60 ; CHECK: bl exp2f 61 62 %exp2double = call double @llvm.exp2.f64(double %double) 63 store double %exp2double, double* @vardouble 64 ; CHECK: bl exp2 65 66 %exp2fp128 = call fp128 @llvm.exp2.f128(fp128 %fp128) 67 store fp128 %exp2fp128, fp128* @varfp128 68 ; CHECK: bl exp2l 69 ret void 70 71 } 72 73 declare float @llvm.log.f32(float) 74 declare double @llvm.log.f64(double) 75 declare fp128 @llvm.log.f128(fp128) 76 77 define void @test_log(float %float, double %double, fp128 %fp128) { 78 ; CHECK-LABEL: test_log: 79 80 %logfloat = call float @llvm.log.f32(float %float) 81 store float %logfloat, float* @varfloat 82 ; CHECK: bl logf 83 84 %logdouble = call double @llvm.log.f64(double %double) 85 store double %logdouble, double* @vardouble 86 ; CHECK: bl log 87 88 %logfp128 = call fp128 @llvm.log.f128(fp128 %fp128) 89 store fp128 %logfp128, fp128* @varfp128 90 ; CHECK: bl logl 91 92 ret void 93 } 94 95 declare float @llvm.log2.f32(float) 96 declare double @llvm.log2.f64(double) 97 declare fp128 @llvm.log2.f128(fp128) 98 99 define void @test_log2(float %float, double %double, fp128 %fp128) { 100 ; CHECK-LABEL: test_log2: 101 102 %log2float = call float @llvm.log2.f32(float %float) 103 store float %log2float, float* @varfloat 104 ; CHECK: bl log2f 105 106 %log2double = call double @llvm.log2.f64(double %double) 107 store double %log2double, double* @vardouble 108 ; CHECK: bl log2 109 110 %log2fp128 = call fp128 @llvm.log2.f128(fp128 %fp128) 111 store fp128 %log2fp128, fp128* @varfp128 112 ; CHECK: bl log2l 113 ret void 114 115 } 116 117 declare float @llvm.log10.f32(float) 118 declare double @llvm.log10.f64(double) 119 declare fp128 @llvm.log10.f128(fp128) 120 121 define void @test_log10(float %float, double %double, fp128 %fp128) { 122 ; CHECK-LABEL: test_log10: 123 124 %log10float = call float @llvm.log10.f32(float %float) 125 store float %log10float, float* @varfloat 126 ; CHECK: bl log10f 127 128 %log10double = call double @llvm.log10.f64(double %double) 129 store double %log10double, double* @vardouble 130 ; CHECK: bl log10 131 132 %log10fp128 = call fp128 @llvm.log10.f128(fp128 %fp128) 133 store fp128 %log10fp128, fp128* @varfp128 134 ; CHECK: bl log10l 135 136 ret void 137 } 138 139 declare float @llvm.sin.f32(float) 140 declare double @llvm.sin.f64(double) 141 declare fp128 @llvm.sin.f128(fp128) 142 143 define void @test_sin(float %float, double %double, fp128 %fp128) { 144 ; CHECK-LABEL: test_sin: 145 146 %sinfloat = call float @llvm.sin.f32(float %float) 147 store float %sinfloat, float* @varfloat 148 ; CHECK: bl sinf 149 150 %sindouble = call double @llvm.sin.f64(double %double) 151 store double %sindouble, double* @vardouble 152 ; CHECK: bl sin 153 154 %sinfp128 = call fp128 @llvm.sin.f128(fp128 %fp128) 155 store fp128 %sinfp128, fp128* @varfp128 156 ; CHECK: bl sinl 157 ret void 158 159 } 160 161 declare float @llvm.pow.f32(float, float) 162 declare double @llvm.pow.f64(double, double) 163 declare fp128 @llvm.pow.f128(fp128, fp128) 164 165 define void @test_pow(float %float, double %double, fp128 %fp128) { 166 ; CHECK-LABEL: test_pow: 167 168 %powfloat = call float @llvm.pow.f32(float %float, float %float) 169 store float %powfloat, float* @varfloat 170 ; CHECK: bl powf 171 172 %powdouble = call double @llvm.pow.f64(double %double, double %double) 173 store double %powdouble, double* @vardouble 174 ; CHECK: bl pow 175 176 %powfp128 = call fp128 @llvm.pow.f128(fp128 %fp128, fp128 %fp128) 177 store fp128 %powfp128, fp128* @varfp128 178 ; CHECK: bl powl 179 180 ret void 181 } 182 183 declare float @llvm.powi.f32(float, i32) 184 declare double @llvm.powi.f64(double, i32) 185 declare fp128 @llvm.powi.f128(fp128, i32) 186 187 define void @test_powi(float %float, double %double, i32 %exponent, fp128 %fp128) { 188 ; CHECK-LABEL: test_powi: 189 190 %powifloat = call float @llvm.powi.f32(float %float, i32 %exponent) 191 store float %powifloat, float* @varfloat 192 ; CHECK: bl __powisf2 193 194 %powidouble = call double @llvm.powi.f64(double %double, i32 %exponent) 195 store double %powidouble, double* @vardouble 196 ; CHECK: bl __powidf2 197 198 %powifp128 = call fp128 @llvm.powi.f128(fp128 %fp128, i32 %exponent) 199 store fp128 %powifp128, fp128* @varfp128 200 ; CHECK: bl __powitf2 201 ret void 202 203 } 204 205 define void @test_frem(float %float, double %double, fp128 %fp128) { 206 ; CHECK-LABEL: test_frem: 207 208 %fremfloat = frem float %float, %float 209 store float %fremfloat, float* @varfloat 210 ; CHECK: bl fmodf 211 212 %fremdouble = frem double %double, %double 213 store double %fremdouble, double* @vardouble 214 ; CHECK: bl fmod 215 216 %fremfp128 = frem fp128 %fp128, %fp128 217 store fp128 %fremfp128, fp128* @varfp128 218 ; CHECK: bl fmodl 219 220 ret void 221 } 222 223 declare fp128 @llvm.fma.f128(fp128, fp128, fp128) 224 225 define void @test_fma(fp128 %fp128) { 226 ; CHECK-LABEL: test_fma: 227 228 %fmafp128 = call fp128 @llvm.fma.f128(fp128 %fp128, fp128 %fp128, fp128 %fp128) 229 store fp128 %fmafp128, fp128* @varfp128 230 ; CHECK: bl fmal 231 232 ret void 233 } 234 235 declare fp128 @llvm.fmuladd.f128(fp128, fp128, fp128) 236 237 define void @test_fmuladd(fp128 %fp128) { 238 ; CHECK-LABEL: test_fmuladd: 239 240 %fmuladdfp128 = call fp128 @llvm.fmuladd.f128(fp128 %fp128, fp128 %fp128, fp128 %fp128) 241 store fp128 %fmuladdfp128, fp128* @varfp128 242 ; CHECK-NOT: bl fmal 243 ; CHECK: bl __multf3 244 ; CHECK: bl __addtf3 245 246 ret void 247 } 248 249 define i32 @test_fptosi32(fp128 %a) { 250 ; CHECK-LABEL: test_fptosi32: 251 ; CHECK: bl __fixtfsi 252 %conv.i = fptosi fp128 %a to i32 253 %b = add nsw i32 %conv.i, 48 254 ret i32 %b 255 } 256 257 define i64 @test_fptosi64(fp128 %a) { 258 ; CHECK-LABEL: test_fptosi64: 259 ; CHECK: bl __fixtfdi 260 %conv.i = fptosi fp128 %a to i64 261 %b = add nsw i64 %conv.i, 48 262 ret i64 %b 263 } 264 265 define i128 @test_fptosi128(fp128 %a) { 266 ; CHECK-LABEL: test_fptosi128: 267 ; CHECK: bl __fixtfti 268 %conv.i = fptosi fp128 %a to i128 269 %b = add nsw i128 %conv.i, 48 270 ret i128 %b 271 } 272 273 define i32 @test_fptoui32(fp128 %a) { 274 ; CHECK-LABEL: test_fptoui32: 275 ; CHECK: bl __fixunstfsi 276 %conv.i = fptoui fp128 %a to i32 277 %b = add nsw i32 %conv.i, 48 278 ret i32 %b 279 } 280 281 define i64 @test_fptoui64(fp128 %a) { 282 ; CHECK-LABEL: test_fptoui64: 283 ; CHECK: bl __fixunstfdi 284 %conv.i = fptoui fp128 %a to i64 285 %b = add nsw i64 %conv.i, 48 286 ret i64 %b 287 } 288 289 define i128 @test_fptoui128(fp128 %a) { 290 ; CHECK-LABEL: test_fptoui128: 291 ; CHECK: bl __fixunstfti 292 %conv.i = fptoui fp128 %a to i128 293 %b = add nsw i128 %conv.i, 48 294 ret i128 %b 295 } 296