1df56b55eSJun Sha (Joshua); NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2eae1e28cSAlex Bradbury; RUN: llc -mtriple=riscv32 -target-abi ilp32d -mattr=+zfa,+d < %s \ 3df56b55eSJun Sha (Joshua); RUN: | FileCheck --check-prefixes=CHECK,RV32IDZFA %s 4eae1e28cSAlex Bradbury; RUN: llc -mtriple=riscv64 -target-abi lp64d -mattr=+zfa,+d < %s \ 5df56b55eSJun Sha (Joshua); RUN: | FileCheck --check-prefixes=CHECK,RV64DZFA %s 6df56b55eSJun Sha (Joshua) 7ada26414SJun Sha (Joshua)define double @loadfpimm1() { 8ada26414SJun Sha (Joshua); CHECK-LABEL: loadfpimm1: 9ada26414SJun Sha (Joshua); CHECK: # %bb.0: 10c2bcb21cSCraig Topper; CHECK-NEXT: fli.d fa0, 0.0625 11ada26414SJun Sha (Joshua); CHECK-NEXT: ret 12ada26414SJun Sha (Joshua) ret double 0.0625 13ada26414SJun Sha (Joshua)} 14ada26414SJun Sha (Joshua) 15ada26414SJun Sha (Joshua)define double @loadfpimm2() { 16ada26414SJun Sha (Joshua); CHECK-LABEL: loadfpimm2: 17ada26414SJun Sha (Joshua); CHECK: # %bb.0: 18c2bcb21cSCraig Topper; CHECK-NEXT: fli.d fa0, 0.75 19ada26414SJun Sha (Joshua); CHECK-NEXT: ret 20ada26414SJun Sha (Joshua) ret double 0.75 21ada26414SJun Sha (Joshua)} 22ada26414SJun Sha (Joshua) 23ada26414SJun Sha (Joshua)define double @loadfpimm3() { 24ada26414SJun Sha (Joshua); CHECK-LABEL: loadfpimm3: 25ada26414SJun Sha (Joshua); CHECK: # %bb.0: 26c2bcb21cSCraig Topper; CHECK-NEXT: fli.d fa0, 1.25 27ada26414SJun Sha (Joshua); CHECK-NEXT: ret 28ada26414SJun Sha (Joshua) ret double 1.25 29ada26414SJun Sha (Joshua)} 30ada26414SJun Sha (Joshua) 31ada26414SJun Sha (Joshua)define double @loadfpimm4() { 32ada26414SJun Sha (Joshua); CHECK-LABEL: loadfpimm4: 33ada26414SJun Sha (Joshua); CHECK: # %bb.0: 34c2bcb21cSCraig Topper; CHECK-NEXT: fli.d fa0, 3.0 35ada26414SJun Sha (Joshua); CHECK-NEXT: ret 36ada26414SJun Sha (Joshua) ret double 3.0 37ada26414SJun Sha (Joshua)} 38ada26414SJun Sha (Joshua) 39ada26414SJun Sha (Joshua)define double @loadfpimm5() { 40ada26414SJun Sha (Joshua); CHECK-LABEL: loadfpimm5: 41ada26414SJun Sha (Joshua); CHECK: # %bb.0: 42c2bcb21cSCraig Topper; CHECK-NEXT: fli.d fa0, 256.0 43ada26414SJun Sha (Joshua); CHECK-NEXT: ret 44ada26414SJun Sha (Joshua) ret double 256.0 45ada26414SJun Sha (Joshua)} 46ada26414SJun Sha (Joshua) 47ada26414SJun Sha (Joshua)define double @loadfpimm6() { 48ada26414SJun Sha (Joshua); CHECK-LABEL: loadfpimm6: 49ada26414SJun Sha (Joshua); CHECK: # %bb.0: 50ada26414SJun Sha (Joshua); CHECK-NEXT: fli.d fa0, inf 51ada26414SJun Sha (Joshua); CHECK-NEXT: ret 52ada26414SJun Sha (Joshua) ret double 0x7FF0000000000000 53ada26414SJun Sha (Joshua)} 54ada26414SJun Sha (Joshua) 55ada26414SJun Sha (Joshua)define double @loadfpimm7() { 56ada26414SJun Sha (Joshua); CHECK-LABEL: loadfpimm7: 57ada26414SJun Sha (Joshua); CHECK: # %bb.0: 58ada26414SJun Sha (Joshua); CHECK-NEXT: fli.d fa0, nan 59ada26414SJun Sha (Joshua); CHECK-NEXT: ret 60ada26414SJun Sha (Joshua) ret double 0x7FF8000000000000 61ada26414SJun Sha (Joshua)} 62ada26414SJun Sha (Joshua) 63ada26414SJun Sha (Joshua)define double @loadfpimm8() { 64ada26414SJun Sha (Joshua); CHECK-LABEL: loadfpimm8: 65ada26414SJun Sha (Joshua); CHECK: # %bb.0: 66ada26414SJun Sha (Joshua); CHECK-NEXT: fli.d fa0, min 67ada26414SJun Sha (Joshua); CHECK-NEXT: ret 68ada26414SJun Sha (Joshua) ret double 0x0010000000000000 69ada26414SJun Sha (Joshua)} 70ada26414SJun Sha (Joshua) 71ada26414SJun Sha (Joshua)define double @loadfpimm9() { 72ada26414SJun Sha (Joshua); CHECK-LABEL: loadfpimm9: 73ada26414SJun Sha (Joshua); CHECK: # %bb.0: 74ada26414SJun Sha (Joshua); CHECK-NEXT: lui a0, %hi(.LCPI8_0) 75ada26414SJun Sha (Joshua); CHECK-NEXT: fld fa0, %lo(.LCPI8_0)(a0) 76ada26414SJun Sha (Joshua); CHECK-NEXT: ret 77ada26414SJun Sha (Joshua) ret double 255.0 78ada26414SJun Sha (Joshua)} 79ada26414SJun Sha (Joshua) 80858451c5SCraig Topper; Negative test. This is 1 * 2^256. 81858451c5SCraig Topperdefine double @loadfpimm10() { 82858451c5SCraig Topper; CHECK-LABEL: loadfpimm10: 83858451c5SCraig Topper; CHECK: # %bb.0: 84bf4b9857SCraig Topper; CHECK-NEXT: lui a0, %hi(.LCPI9_0) 85bf4b9857SCraig Topper; CHECK-NEXT: fld fa0, %lo(.LCPI9_0)(a0) 86858451c5SCraig Topper; CHECK-NEXT: ret 87858451c5SCraig Topper ret double 0x1000000000000000 88858451c5SCraig Topper} 89858451c5SCraig Topper 90c09730c2SCraig Topper; Negative test. This is a qnan with payload of 1. 91c09730c2SCraig Topperdefine double @loadfpimm11() { 92c09730c2SCraig Topper; CHECK-LABEL: loadfpimm11: 93c09730c2SCraig Topper; CHECK: # %bb.0: 94c09730c2SCraig Topper; CHECK-NEXT: lui a0, %hi(.LCPI10_0) 95c09730c2SCraig Topper; CHECK-NEXT: fld fa0, %lo(.LCPI10_0)(a0) 96c09730c2SCraig Topper; CHECK-NEXT: ret 97c09730c2SCraig Topper ret double 0x7ff8000000000001 98c09730c2SCraig Topper} 99c09730c2SCraig Topper 100c09730c2SCraig Topper; Negative test. This is an snan with payload of 1. 101c09730c2SCraig Topperdefine double @loadfpimm12() { 102c09730c2SCraig Topper; CHECK-LABEL: loadfpimm12: 103c09730c2SCraig Topper; CHECK: # %bb.0: 104c09730c2SCraig Topper; CHECK-NEXT: lui a0, %hi(.LCPI11_0) 105c09730c2SCraig Topper; CHECK-NEXT: fld fa0, %lo(.LCPI11_0)(a0) 106c09730c2SCraig Topper; CHECK-NEXT: ret 107c09730c2SCraig Topper ret double 0x7ff0000000000001 108c09730c2SCraig Topper} 109c09730c2SCraig Topper 110c09730c2SCraig Topper; Negative test. This is the smallest denormal. 111c09730c2SCraig Topperdefine double @loadfpimm13() { 112c09730c2SCraig Topper; RV32IDZFA-LABEL: loadfpimm13: 113c09730c2SCraig Topper; RV32IDZFA: # %bb.0: 114c09730c2SCraig Topper; RV32IDZFA-NEXT: lui a0, %hi(.LCPI12_0) 115c09730c2SCraig Topper; RV32IDZFA-NEXT: fld fa0, %lo(.LCPI12_0)(a0) 116c09730c2SCraig Topper; RV32IDZFA-NEXT: ret 117c09730c2SCraig Topper; 118c09730c2SCraig Topper; RV64DZFA-LABEL: loadfpimm13: 119c09730c2SCraig Topper; RV64DZFA: # %bb.0: 120c09730c2SCraig Topper; RV64DZFA-NEXT: li a0, 1 121c09730c2SCraig Topper; RV64DZFA-NEXT: fmv.d.x fa0, a0 122c09730c2SCraig Topper; RV64DZFA-NEXT: ret 123c09730c2SCraig Topper ret double 0x0000000000000001 124c09730c2SCraig Topper} 125c09730c2SCraig Topper 126c09730c2SCraig Topper; Negative test. This is 2^-1023, a denormal. 127c09730c2SCraig Topperdefine double @loadfpimm15() { 128c09730c2SCraig Topper; CHECK-LABEL: loadfpimm15: 129c09730c2SCraig Topper; CHECK: # %bb.0: 130c09730c2SCraig Topper; CHECK-NEXT: lui a0, %hi(.LCPI13_0) 131c09730c2SCraig Topper; CHECK-NEXT: fld fa0, %lo(.LCPI13_0)(a0) 132c09730c2SCraig Topper; CHECK-NEXT: ret 133c09730c2SCraig Topper ret double 0x0008000000000000 134c09730c2SCraig Topper} 135c09730c2SCraig Topper 136451255b2SAlex Bradburydefine double @loadfpimm16() { 137451255b2SAlex Bradbury; CHECK-LABEL: loadfpimm16: 138451255b2SAlex Bradbury; CHECK: # %bb.0: 139451255b2SAlex Bradbury; CHECK-NEXT: fli.d fa0, -1.0 140451255b2SAlex Bradbury; CHECK-NEXT: ret 141451255b2SAlex Bradbury ret double -1.0 142451255b2SAlex Bradbury} 143451255b2SAlex Bradbury 14487f67175SMin-Yih Hsu; Ensure fli isn't directly used for negated versions of numbers in the fli 145451255b2SAlex Bradbury; table. 146451255b2SAlex Bradburydefine double @loadfpimm17() { 147451255b2SAlex Bradbury; CHECK-LABEL: loadfpimm17: 148451255b2SAlex Bradbury; CHECK: # %bb.0: 14987f67175SMin-Yih Hsu; CHECK-NEXT: fli.d fa5, 2.0 15087f67175SMin-Yih Hsu; CHECK-NEXT: fneg.d fa0, fa5 151451255b2SAlex Bradbury; CHECK-NEXT: ret 152451255b2SAlex Bradbury ret double -2.0 153451255b2SAlex Bradbury} 154451255b2SAlex Bradbury 15587f67175SMin-Yih Hsu; Ensure fli isn't directly used for negative min normal value. 156be0cbe91SCraig Topperdefine double @loadfpimm18() { 157be0cbe91SCraig Topper; CHECK-LABEL: loadfpimm18: 158be0cbe91SCraig Topper; CHECK: # %bb.0: 15987f67175SMin-Yih Hsu; CHECK-NEXT: fli.d fa5, min 16087f67175SMin-Yih Hsu; CHECK-NEXT: fneg.d fa0, fa5 161be0cbe91SCraig Topper; CHECK-NEXT: ret 162be0cbe91SCraig Topper ret double 0x8010000000000000 163be0cbe91SCraig Topper} 164be0cbe91SCraig Topper 165df56b55eSJun Sha (Joshua)declare double @llvm.minimum.f64(double, double) 166df56b55eSJun Sha (Joshua) 167df56b55eSJun Sha (Joshua)define double @fminm_d(double %a, double %b) nounwind { 168df56b55eSJun Sha (Joshua); CHECK-LABEL: fminm_d: 169df56b55eSJun Sha (Joshua); CHECK: # %bb.0: 170df56b55eSJun Sha (Joshua); CHECK-NEXT: fminm.d fa0, fa0, fa1 171df56b55eSJun Sha (Joshua); CHECK-NEXT: ret 172df56b55eSJun Sha (Joshua) %1 = call double @llvm.minimum.f64(double %a, double %b) 173df56b55eSJun Sha (Joshua) ret double %1 174df56b55eSJun Sha (Joshua)} 175df56b55eSJun Sha (Joshua) 176df56b55eSJun Sha (Joshua)declare double @llvm.maximum.f64(double, double) 177df56b55eSJun Sha (Joshua) 178df56b55eSJun Sha (Joshua)define double @fmaxm_d(double %a, double %b) nounwind { 179df56b55eSJun Sha (Joshua); CHECK-LABEL: fmaxm_d: 180df56b55eSJun Sha (Joshua); CHECK: # %bb.0: 181df56b55eSJun Sha (Joshua); CHECK-NEXT: fmaxm.d fa0, fa0, fa1 182df56b55eSJun Sha (Joshua); CHECK-NEXT: ret 183df56b55eSJun Sha (Joshua) %1 = call double @llvm.maximum.f64(double %a, double %b) 184df56b55eSJun Sha (Joshua) ret double %1 185df56b55eSJun Sha (Joshua)} 186df56b55eSJun Sha (Joshua) 187df56b55eSJun Sha (Joshua)define double @fround_d_1(double %a) nounwind { 188df56b55eSJun Sha (Joshua); CHECK-LABEL: fround_d_1: 189df56b55eSJun Sha (Joshua); CHECK: # %bb.0: 190df56b55eSJun Sha (Joshua); CHECK-NEXT: fround.d fa0, fa0, rmm 191df56b55eSJun Sha (Joshua); CHECK-NEXT: ret 192df56b55eSJun Sha (Joshua) %call = tail call double @round(double %a) nounwind readnone 193df56b55eSJun Sha (Joshua) ret double %call 194df56b55eSJun Sha (Joshua)} 195df56b55eSJun Sha (Joshua) 196df56b55eSJun Sha (Joshua)declare double @round(double) nounwind readnone 197df56b55eSJun Sha (Joshua) 198df56b55eSJun Sha (Joshua) 199df56b55eSJun Sha (Joshua)define double @fround_d_2(double %a) nounwind { 200df56b55eSJun Sha (Joshua); CHECK-LABEL: fround_d_2: 201df56b55eSJun Sha (Joshua); CHECK: # %bb.0: 2024bbbae61SJun Sha (Joshua); CHECK-NEXT: fround.d fa0, fa0, rdn 203df56b55eSJun Sha (Joshua); CHECK-NEXT: ret 204df56b55eSJun Sha (Joshua) %call = tail call double @floor(double %a) nounwind readnone 205df56b55eSJun Sha (Joshua) ret double %call 206df56b55eSJun Sha (Joshua)} 207df56b55eSJun Sha (Joshua) 208df56b55eSJun Sha (Joshua)declare double @floor(double) nounwind readnone 209df56b55eSJun Sha (Joshua) 210df56b55eSJun Sha (Joshua) 211df56b55eSJun Sha (Joshua)define double @fround_d_3(double %a) nounwind { 212df56b55eSJun Sha (Joshua); CHECK-LABEL: fround_d_3: 213df56b55eSJun Sha (Joshua); CHECK: # %bb.0: 2144bbbae61SJun Sha (Joshua); CHECK-NEXT: fround.d fa0, fa0, rup 215df56b55eSJun Sha (Joshua); CHECK-NEXT: ret 216df56b55eSJun Sha (Joshua) %call = tail call double @ceil(double %a) nounwind readnone 217df56b55eSJun Sha (Joshua) ret double %call 218df56b55eSJun Sha (Joshua)} 219df56b55eSJun Sha (Joshua) 220df56b55eSJun Sha (Joshua)declare double @ceil(double) nounwind readnone 221df56b55eSJun Sha (Joshua) 222df56b55eSJun Sha (Joshua) 223df56b55eSJun Sha (Joshua)define double @fround_d_4(double %a) nounwind { 224df56b55eSJun Sha (Joshua); CHECK-LABEL: fround_d_4: 225df56b55eSJun Sha (Joshua); CHECK: # %bb.0: 226df56b55eSJun Sha (Joshua); CHECK-NEXT: fround.d fa0, fa0, rtz 227df56b55eSJun Sha (Joshua); CHECK-NEXT: ret 228df56b55eSJun Sha (Joshua) %call = tail call double @trunc(double %a) nounwind readnone 229df56b55eSJun Sha (Joshua) ret double %call 230df56b55eSJun Sha (Joshua)} 231df56b55eSJun Sha (Joshua) 232df56b55eSJun Sha (Joshua)declare double @trunc(double) nounwind readnone 233df56b55eSJun Sha (Joshua) 234df56b55eSJun Sha (Joshua) 235df56b55eSJun Sha (Joshua)define double @fround_d_5(double %a) nounwind { 236df56b55eSJun Sha (Joshua); CHECK-LABEL: fround_d_5: 237df56b55eSJun Sha (Joshua); CHECK: # %bb.0: 238df56b55eSJun Sha (Joshua); CHECK-NEXT: fround.d fa0, fa0 239df56b55eSJun Sha (Joshua); CHECK-NEXT: ret 240df56b55eSJun Sha (Joshua) %call = tail call double @nearbyint(double %a) nounwind readnone 241df56b55eSJun Sha (Joshua) ret double %call 242df56b55eSJun Sha (Joshua)} 243df56b55eSJun Sha (Joshua) 244df56b55eSJun Sha (Joshua)declare double @nearbyint(double) nounwind readnone 245df56b55eSJun Sha (Joshua) 246*261d4bbbSLuke Quinndefine double @fround_d_6(double %a) nounwind { 247*261d4bbbSLuke Quinn; CHECK-LABEL: fround_d_6: 248*261d4bbbSLuke Quinn; CHECK: # %bb.0: 249*261d4bbbSLuke Quinn; CHECK-NEXT: fround.d fa0, fa0, rne 250*261d4bbbSLuke Quinn; CHECK-NEXT: ret 251*261d4bbbSLuke Quinn %call = tail call double @llvm.roundeven.f64(double %a) nounwind readnone 252*261d4bbbSLuke Quinn ret double %call 253*261d4bbbSLuke Quinn} 254*261d4bbbSLuke Quinn 255*261d4bbbSLuke Quinndeclare double @llvm.roundeven.f64(double) nounwind readnone 256*261d4bbbSLuke Quinn 257df56b55eSJun Sha (Joshua) 258df56b55eSJun Sha (Joshua)define double @froundnx_d(double %a) nounwind { 259df56b55eSJun Sha (Joshua); CHECK-LABEL: froundnx_d: 260df56b55eSJun Sha (Joshua); CHECK: # %bb.0: 261df56b55eSJun Sha (Joshua); CHECK-NEXT: froundnx.d fa0, fa0 262df56b55eSJun Sha (Joshua); CHECK-NEXT: ret 263df56b55eSJun Sha (Joshua) %call = tail call double @rint(double %a) nounwind readnone 264df56b55eSJun Sha (Joshua) ret double %call 265df56b55eSJun Sha (Joshua)} 266df56b55eSJun Sha (Joshua) 267df56b55eSJun Sha (Joshua)declare double @rint(double) nounwind readnone 268df56b55eSJun Sha (Joshua) 269df56b55eSJun Sha (Joshua)declare i1 @llvm.experimental.constrained.fcmp.f64(double, double, metadata, metadata) 270df56b55eSJun Sha (Joshua) 271df56b55eSJun Sha (Joshua)define i32 @fcmp_olt_q(double %a, double %b) nounwind strictfp { 272df56b55eSJun Sha (Joshua); CHECK-LABEL: fcmp_olt_q: 273df56b55eSJun Sha (Joshua); CHECK: # %bb.0: 274df56b55eSJun Sha (Joshua); CHECK-NEXT: fltq.d a0, fa0, fa1 275df56b55eSJun Sha (Joshua); CHECK-NEXT: ret 276df56b55eSJun Sha (Joshua) %1 = call i1 @llvm.experimental.constrained.fcmp.f64(double %a, double %b, metadata !"olt", metadata !"fpexcept.strict") strictfp 277df56b55eSJun Sha (Joshua) %2 = zext i1 %1 to i32 278df56b55eSJun Sha (Joshua) ret i32 %2 279df56b55eSJun Sha (Joshua)} 280df56b55eSJun Sha (Joshua) 281df56b55eSJun Sha (Joshua)define i32 @fcmp_ole_q(double %a, double %b) nounwind strictfp { 282df56b55eSJun Sha (Joshua); CHECK-LABEL: fcmp_ole_q: 283df56b55eSJun Sha (Joshua); CHECK: # %bb.0: 284df56b55eSJun Sha (Joshua); CHECK-NEXT: fleq.d a0, fa0, fa1 285df56b55eSJun Sha (Joshua); CHECK-NEXT: ret 286df56b55eSJun Sha (Joshua) %1 = call i1 @llvm.experimental.constrained.fcmp.f64(double %a, double %b, metadata !"ole", metadata !"fpexcept.strict") strictfp 287df56b55eSJun Sha (Joshua) %2 = zext i1 %1 to i32 288df56b55eSJun Sha (Joshua) ret i32 %2 289df56b55eSJun Sha (Joshua)} 290df56b55eSJun Sha (Joshua) 2913d0a5bf7SCraig Topperdefine i32 @fcmp_one_q(double %a, double %b) nounwind strictfp { 2923d0a5bf7SCraig Topper; CHECK-LABEL: fcmp_one_q: 2933d0a5bf7SCraig Topper; CHECK: # %bb.0: 2943d0a5bf7SCraig Topper; CHECK-NEXT: fltq.d a0, fa0, fa1 2953d0a5bf7SCraig Topper; CHECK-NEXT: fltq.d a1, fa1, fa0 2963d0a5bf7SCraig Topper; CHECK-NEXT: or a0, a1, a0 2973d0a5bf7SCraig Topper; CHECK-NEXT: ret 2983d0a5bf7SCraig Topper %1 = call i1 @llvm.experimental.constrained.fcmp.f64(double %a, double %b, metadata !"one", metadata !"fpexcept.strict") strictfp 2993d0a5bf7SCraig Topper %2 = zext i1 %1 to i32 3003d0a5bf7SCraig Topper ret i32 %2 3013d0a5bf7SCraig Topper} 3023d0a5bf7SCraig Topper 3033d0a5bf7SCraig Topperdefine i32 @fcmp_ueq_q(double %a, double %b) nounwind strictfp { 3043d0a5bf7SCraig Topper; CHECK-LABEL: fcmp_ueq_q: 3053d0a5bf7SCraig Topper; CHECK: # %bb.0: 3063d0a5bf7SCraig Topper; CHECK-NEXT: fltq.d a0, fa0, fa1 3073d0a5bf7SCraig Topper; CHECK-NEXT: fltq.d a1, fa1, fa0 3083d0a5bf7SCraig Topper; CHECK-NEXT: or a0, a1, a0 3093d0a5bf7SCraig Topper; CHECK-NEXT: xori a0, a0, 1 3103d0a5bf7SCraig Topper; CHECK-NEXT: ret 3113d0a5bf7SCraig Topper %1 = call i1 @llvm.experimental.constrained.fcmp.f64(double %a, double %b, metadata !"ueq", metadata !"fpexcept.strict") strictfp 3123d0a5bf7SCraig Topper %2 = zext i1 %1 to i32 3133d0a5bf7SCraig Topper ret i32 %2 3143d0a5bf7SCraig Topper} 3153d0a5bf7SCraig Topper 316df56b55eSJun Sha (Joshua)define i64 @fmvh_x_d(double %fa) { 317df56b55eSJun Sha (Joshua); RV32IDZFA-LABEL: fmvh_x_d: 318df56b55eSJun Sha (Joshua); RV32IDZFA: # %bb.0: 319df56b55eSJun Sha (Joshua); RV32IDZFA-NEXT: fmv.x.w a0, fa0 320df56b55eSJun Sha (Joshua); RV32IDZFA-NEXT: fmvh.x.d a1, fa0 321df56b55eSJun Sha (Joshua); RV32IDZFA-NEXT: ret 322df56b55eSJun Sha (Joshua); 323df56b55eSJun Sha (Joshua); RV64DZFA-LABEL: fmvh_x_d: 324df56b55eSJun Sha (Joshua); RV64DZFA: # %bb.0: 325df56b55eSJun Sha (Joshua); RV64DZFA-NEXT: fmv.x.d a0, fa0 326df56b55eSJun Sha (Joshua); RV64DZFA-NEXT: ret 327df56b55eSJun Sha (Joshua) %i = bitcast double %fa to i64 328df56b55eSJun Sha (Joshua) ret i64 %i 329df56b55eSJun Sha (Joshua)} 330df56b55eSJun Sha (Joshua) 331df56b55eSJun Sha (Joshua)define double @fmvp_d_x(i64 %a) { 332df56b55eSJun Sha (Joshua); RV32IDZFA-LABEL: fmvp_d_x: 333df56b55eSJun Sha (Joshua); RV32IDZFA: # %bb.0: 334df56b55eSJun Sha (Joshua); RV32IDZFA-NEXT: fmvp.d.x fa0, a0, a1 335df56b55eSJun Sha (Joshua); RV32IDZFA-NEXT: ret 336df56b55eSJun Sha (Joshua); 337df56b55eSJun Sha (Joshua); RV64DZFA-LABEL: fmvp_d_x: 338df56b55eSJun Sha (Joshua); RV64DZFA: # %bb.0: 339df56b55eSJun Sha (Joshua); RV64DZFA-NEXT: fmv.d.x fa0, a0 340df56b55eSJun Sha (Joshua); RV64DZFA-NEXT: ret 341df56b55eSJun Sha (Joshua) %or = bitcast i64 %a to double 342df56b55eSJun Sha (Joshua) ret double %or 343df56b55eSJun Sha (Joshua)} 344de6d7a6cSCraig Topper 345de6d7a6cSCraig Topperdefine double @fadd_neg_0p5(double %x) { 346de6d7a6cSCraig Topper; CHECK-LABEL: fadd_neg_0p5: 347de6d7a6cSCraig Topper; CHECK: # %bb.0: 348de6d7a6cSCraig Topper; CHECK-NEXT: fli.d fa5, 0.5 349de6d7a6cSCraig Topper; CHECK-NEXT: fsub.d fa0, fa0, fa5 350de6d7a6cSCraig Topper; CHECK-NEXT: ret 351de6d7a6cSCraig Topper %a = fadd double %x, -0.5 352de6d7a6cSCraig Topper ret double %a 353de6d7a6cSCraig Topper} 354de6d7a6cSCraig Topper 355de6d7a6cSCraig Topperdefine double @fma_neg_addend(double %x, double %y) nounwind { 356de6d7a6cSCraig Topper; CHECK-LABEL: fma_neg_addend: 357de6d7a6cSCraig Topper; CHECK: # %bb.0: 358de6d7a6cSCraig Topper; CHECK-NEXT: fli.d fa5, 0.5 359de6d7a6cSCraig Topper; CHECK-NEXT: fmsub.d fa0, fa0, fa1, fa5 360de6d7a6cSCraig Topper; CHECK-NEXT: ret 361de6d7a6cSCraig Topper %a = call double @llvm.fma.f32(double %x, double %y, double -0.5) 362de6d7a6cSCraig Topper ret double %a 363de6d7a6cSCraig Topper} 364de6d7a6cSCraig Topper 365de6d7a6cSCraig Topperdefine double @fma_neg_multiplicand(double %x, double %y) nounwind { 366de6d7a6cSCraig Topper; CHECK-LABEL: fma_neg_multiplicand: 367de6d7a6cSCraig Topper; CHECK: # %bb.0: 368de6d7a6cSCraig Topper; CHECK-NEXT: fli.d fa5, 0.125 369de6d7a6cSCraig Topper; CHECK-NEXT: fnmsub.d fa0, fa5, fa0, fa1 370de6d7a6cSCraig Topper; CHECK-NEXT: ret 371de6d7a6cSCraig Topper %a = call double @llvm.fma.f32(double %x, double -0.125, double %y) 372de6d7a6cSCraig Topper ret double %a 373de6d7a6cSCraig Topper} 374de6d7a6cSCraig Topper 375de6d7a6cSCraig Topperdefine double @fma_neg_addend_multiplicand(double %x) nounwind { 376de6d7a6cSCraig Topper; CHECK-LABEL: fma_neg_addend_multiplicand: 377de6d7a6cSCraig Topper; CHECK: # %bb.0: 378de6d7a6cSCraig Topper; CHECK-NEXT: fli.d fa5, 0.25 379de6d7a6cSCraig Topper; CHECK-NEXT: fli.d fa4, 0.5 380de6d7a6cSCraig Topper; CHECK-NEXT: fnmadd.d fa0, fa4, fa0, fa5 381de6d7a6cSCraig Topper; CHECK-NEXT: ret 382de6d7a6cSCraig Topper %a = call double @llvm.fma.f32(double %x, double -0.5, double -0.25) 383de6d7a6cSCraig Topper ret double %a 384de6d7a6cSCraig Topper} 385079f31c1SCraig Topper 386079f31c1SCraig Topperdefine double @select_loadfpimm(double %x) nounwind { 387079f31c1SCraig Topper; RV32IDZFA-LABEL: select_loadfpimm: 388079f31c1SCraig Topper; RV32IDZFA: # %bb.0: # %entry 389079f31c1SCraig Topper; RV32IDZFA-NEXT: fcvt.d.w fa5, zero 390079f31c1SCraig Topper; RV32IDZFA-NEXT: fle.d a0, fa5, fa0 391079f31c1SCraig Topper; RV32IDZFA-NEXT: fli.d fa0, 0.5 392*261d4bbbSLuke Quinn; RV32IDZFA-NEXT: bnez a0, .LBB36_2 393079f31c1SCraig Topper; RV32IDZFA-NEXT: # %bb.1: 394079f31c1SCraig Topper; RV32IDZFA-NEXT: fneg.d fa0, fa0 395*261d4bbbSLuke Quinn; RV32IDZFA-NEXT: .LBB36_2: # %entry 396079f31c1SCraig Topper; RV32IDZFA-NEXT: ret 397079f31c1SCraig Topper; 398079f31c1SCraig Topper; RV64DZFA-LABEL: select_loadfpimm: 399079f31c1SCraig Topper; RV64DZFA: # %bb.0: # %entry 400079f31c1SCraig Topper; RV64DZFA-NEXT: fmv.d.x fa5, zero 401079f31c1SCraig Topper; RV64DZFA-NEXT: fle.d a0, fa5, fa0 402079f31c1SCraig Topper; RV64DZFA-NEXT: fli.d fa0, 0.5 403*261d4bbbSLuke Quinn; RV64DZFA-NEXT: bnez a0, .LBB36_2 404079f31c1SCraig Topper; RV64DZFA-NEXT: # %bb.1: 405079f31c1SCraig Topper; RV64DZFA-NEXT: fneg.d fa0, fa0 406*261d4bbbSLuke Quinn; RV64DZFA-NEXT: .LBB36_2: # %entry 407079f31c1SCraig Topper; RV64DZFA-NEXT: ret 408079f31c1SCraig Topperentry: 409079f31c1SCraig Topper %cmp = fcmp ult double %x, 0.000000e+00 410079f31c1SCraig Topper %sel = select i1 %cmp, double -5.000000e-01, double 5.000000e-01 411079f31c1SCraig Topper ret double %sel 412079f31c1SCraig Topper} 413