1228f88fdSSam Elliott; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2228f88fdSSam Elliott; RUN: llc -mtriple=riscv32 -mattr=+d -target-abi=ilp32 -verify-machineinstrs -no-integrated-as < %s \ 3228f88fdSSam Elliott; RUN: | FileCheck -check-prefix=RV32F %s 4228f88fdSSam Elliott; RUN: llc -mtriple=riscv64 -mattr=+d -target-abi=lp64 -verify-machineinstrs -no-integrated-as < %s \ 5228f88fdSSam Elliott; RUN: | FileCheck -check-prefix=RV64F %s 6228f88fdSSam Elliott 7228f88fdSSam Elliott;; `.insn 0x4, 0x02000053 | (${0:N} << 7) | (${1:N} << 15) | (${2:N} << 20)` is 8228f88fdSSam Elliott;; the raw encoding for `fadd.d` 9228f88fdSSam Elliott 10228f88fdSSam Elliott@gd = external global double 11228f88fdSSam Elliott 12228f88fdSSam Elliottdefine double @constraint_f_double(double %a) nounwind { 13228f88fdSSam Elliott; RV32F-LABEL: constraint_f_double: 14228f88fdSSam Elliott; RV32F: # %bb.0: 15228f88fdSSam Elliott; RV32F-NEXT: addi sp, sp, -16 16228f88fdSSam Elliott; RV32F-NEXT: sw a0, 8(sp) 17228f88fdSSam Elliott; RV32F-NEXT: sw a1, 12(sp) 18228f88fdSSam Elliott; RV32F-NEXT: lui a0, %hi(gd) 19*9122c523SPengcheng Wang; RV32F-NEXT: fld fa5, 8(sp) 20228f88fdSSam Elliott; RV32F-NEXT: fld fa4, %lo(gd)(a0) 21228f88fdSSam Elliott; RV32F-NEXT: #APP 22228f88fdSSam Elliott; RV32F-NEXT: .insn 0x4, 0x02000053 | (15 << 7) | (15 << 15) | (14 << 20) 23228f88fdSSam Elliott; RV32F-NEXT: #NO_APP 24228f88fdSSam Elliott; RV32F-NEXT: fsd fa5, 8(sp) 25228f88fdSSam Elliott; RV32F-NEXT: lw a0, 8(sp) 26228f88fdSSam Elliott; RV32F-NEXT: lw a1, 12(sp) 27228f88fdSSam Elliott; RV32F-NEXT: addi sp, sp, 16 28228f88fdSSam Elliott; RV32F-NEXT: ret 29228f88fdSSam Elliott; 30228f88fdSSam Elliott; RV64F-LABEL: constraint_f_double: 31228f88fdSSam Elliott; RV64F: # %bb.0: 32228f88fdSSam Elliott; RV64F-NEXT: lui a1, %hi(gd) 33228f88fdSSam Elliott; RV64F-NEXT: fld fa5, %lo(gd)(a1) 34228f88fdSSam Elliott; RV64F-NEXT: fmv.d.x fa4, a0 35228f88fdSSam Elliott; RV64F-NEXT: #APP 36228f88fdSSam Elliott; RV64F-NEXT: .insn 0x4, 0x02000053 | (15 << 7) | (14 << 15) | (15 << 20) 37228f88fdSSam Elliott; RV64F-NEXT: #NO_APP 38228f88fdSSam Elliott; RV64F-NEXT: fmv.x.d a0, fa5 39228f88fdSSam Elliott; RV64F-NEXT: ret 40228f88fdSSam Elliott %1 = load double, ptr @gd 41228f88fdSSam Elliott %2 = tail call double asm ".insn 0x4, 0x02000053 | (${0:N} << 7) | (${1:N} << 15) | (${2:N} << 20)", "=f,f,f"(double %a, double %1) 42228f88fdSSam Elliott ret double %2 43228f88fdSSam Elliott} 44228f88fdSSam Elliott 45228f88fdSSam Elliottdefine double @constraint_cf_double(double %a) nounwind { 46228f88fdSSam Elliott; RV32F-LABEL: constraint_cf_double: 47228f88fdSSam Elliott; RV32F: # %bb.0: 48228f88fdSSam Elliott; RV32F-NEXT: addi sp, sp, -16 49228f88fdSSam Elliott; RV32F-NEXT: sw a0, 8(sp) 50228f88fdSSam Elliott; RV32F-NEXT: sw a1, 12(sp) 51228f88fdSSam Elliott; RV32F-NEXT: lui a0, %hi(gd) 52*9122c523SPengcheng Wang; RV32F-NEXT: fld fa5, 8(sp) 53228f88fdSSam Elliott; RV32F-NEXT: fld fa4, %lo(gd)(a0) 54228f88fdSSam Elliott; RV32F-NEXT: #APP 55228f88fdSSam Elliott; RV32F-NEXT: .insn 0x4, 0x02000053 | (15 << 7) | (15 << 15) | (14 << 20) 56228f88fdSSam Elliott; RV32F-NEXT: #NO_APP 57228f88fdSSam Elliott; RV32F-NEXT: fsd fa5, 8(sp) 58228f88fdSSam Elliott; RV32F-NEXT: lw a0, 8(sp) 59228f88fdSSam Elliott; RV32F-NEXT: lw a1, 12(sp) 60228f88fdSSam Elliott; RV32F-NEXT: addi sp, sp, 16 61228f88fdSSam Elliott; RV32F-NEXT: ret 62228f88fdSSam Elliott; 63228f88fdSSam Elliott; RV64F-LABEL: constraint_cf_double: 64228f88fdSSam Elliott; RV64F: # %bb.0: 65228f88fdSSam Elliott; RV64F-NEXT: lui a1, %hi(gd) 66228f88fdSSam Elliott; RV64F-NEXT: fld fa5, %lo(gd)(a1) 67228f88fdSSam Elliott; RV64F-NEXT: fmv.d.x fa4, a0 68228f88fdSSam Elliott; RV64F-NEXT: #APP 69228f88fdSSam Elliott; RV64F-NEXT: .insn 0x4, 0x02000053 | (15 << 7) | (14 << 15) | (15 << 20) 70228f88fdSSam Elliott; RV64F-NEXT: #NO_APP 71228f88fdSSam Elliott; RV64F-NEXT: fmv.x.d a0, fa5 72228f88fdSSam Elliott; RV64F-NEXT: ret 73228f88fdSSam Elliott %1 = load double, ptr @gd 74228f88fdSSam Elliott %2 = tail call double asm ".insn 0x4, 0x02000053 | (${0:N} << 7) | (${1:N} << 15) | (${2:N} << 20)", "=^cf,^cf,^cf"(double %a, double %1) 75228f88fdSSam Elliott ret double %2 76228f88fdSSam Elliott} 77228f88fdSSam Elliott 78228f88fdSSam Elliottdefine double @constraint_f_double_abi_name(double %a) nounwind { 79228f88fdSSam Elliott; RV32F-LABEL: constraint_f_double_abi_name: 80228f88fdSSam Elliott; RV32F: # %bb.0: 81228f88fdSSam Elliott; RV32F-NEXT: addi sp, sp, -16 82228f88fdSSam Elliott; RV32F-NEXT: sw a0, 8(sp) 83228f88fdSSam Elliott; RV32F-NEXT: sw a1, 12(sp) 84228f88fdSSam Elliott; RV32F-NEXT: lui a0, %hi(gd) 85*9122c523SPengcheng Wang; RV32F-NEXT: fld fa1, 8(sp) 86228f88fdSSam Elliott; RV32F-NEXT: fld fs0, %lo(gd)(a0) 87228f88fdSSam Elliott; RV32F-NEXT: #APP 88228f88fdSSam Elliott; RV32F-NEXT: .insn 0x4, 0x02000053 | (0 << 7) | (11 << 15) | (8 << 20) 89228f88fdSSam Elliott; RV32F-NEXT: #NO_APP 90228f88fdSSam Elliott; RV32F-NEXT: fsd ft0, 8(sp) 91228f88fdSSam Elliott; RV32F-NEXT: lw a0, 8(sp) 92228f88fdSSam Elliott; RV32F-NEXT: lw a1, 12(sp) 93228f88fdSSam Elliott; RV32F-NEXT: addi sp, sp, 16 94228f88fdSSam Elliott; RV32F-NEXT: ret 95228f88fdSSam Elliott; 96228f88fdSSam Elliott; RV64F-LABEL: constraint_f_double_abi_name: 97228f88fdSSam Elliott; RV64F: # %bb.0: 98228f88fdSSam Elliott; RV64F-NEXT: lui a1, %hi(gd) 99228f88fdSSam Elliott; RV64F-NEXT: fld fs0, %lo(gd)(a1) 100228f88fdSSam Elliott; RV64F-NEXT: fmv.d.x fa1, a0 101228f88fdSSam Elliott; RV64F-NEXT: #APP 102228f88fdSSam Elliott; RV64F-NEXT: .insn 0x4, 0x02000053 | (0 << 7) | (11 << 15) | (8 << 20) 103228f88fdSSam Elliott; RV64F-NEXT: #NO_APP 104228f88fdSSam Elliott; RV64F-NEXT: fmv.x.d a0, ft0 105228f88fdSSam Elliott; RV64F-NEXT: ret 106228f88fdSSam Elliott %1 = load double, ptr @gd 107228f88fdSSam Elliott %2 = tail call double asm ".insn 0x4, 0x02000053 | (${0:N} << 7) | (${1:N} << 15) | (${2:N} << 20)", "={ft0},{fa1},{fs0}"(double %a, double %1) 108228f88fdSSam Elliott ret double %2 109228f88fdSSam Elliott} 110