1*228f88fdSSam Elliott; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2*228f88fdSSam Elliott; RUN: llc -mtriple=riscv32 -mattr=zfh -verify-machineinstrs -no-integrated-as < %s \ 3*228f88fdSSam Elliott; RUN: -target-abi=ilp32f | FileCheck -check-prefix=RV32ZFH %s 4*228f88fdSSam Elliott; RUN: llc -mtriple=riscv64 -mattr=zfh -verify-machineinstrs -no-integrated-as < %s \ 5*228f88fdSSam Elliott; RUN: -target-abi=lp64f | FileCheck -check-prefix=RV64ZFH %s 6*228f88fdSSam Elliott; RUN: llc -mtriple=riscv32 -mattr=zfh,+d -verify-machineinstrs -no-integrated-as < %s \ 7*228f88fdSSam Elliott; RUN: -target-abi=ilp32d | FileCheck -check-prefix=RV32DZFH %s 8*228f88fdSSam Elliott; RUN: llc -mtriple=riscv64 -mattr=zfh,+d -verify-machineinstrs -no-integrated-as < %s \ 9*228f88fdSSam Elliott; RUN: -target-abi=lp64d | FileCheck -check-prefix=RV64DZFH %s 10*228f88fdSSam Elliott 11*228f88fdSSam Elliott;; `.insn 0x4, 0x04000053 | (${0:N} << 7) | (${1:N} << 15) | (${2:N} << 20)` is 12*228f88fdSSam Elliott;; the raw encoding for `fadd.h` 13*228f88fdSSam Elliott 14*228f88fdSSam Elliott@gh = external global half 15*228f88fdSSam Elliott 16*228f88fdSSam Elliottdefine half @constraint_f_half(half %a) nounwind { 17*228f88fdSSam Elliott; RV32ZFH-LABEL: constraint_f_half: 18*228f88fdSSam Elliott; RV32ZFH: # %bb.0: 19*228f88fdSSam Elliott; RV32ZFH-NEXT: lui a0, %hi(gh) 20*228f88fdSSam Elliott; RV32ZFH-NEXT: flh fa5, %lo(gh)(a0) 21*228f88fdSSam Elliott; RV32ZFH-NEXT: #APP 22*228f88fdSSam Elliott; RV32ZFH-NEXT: .insn 0x4, 0x04000053 | (10 << 7) | (10 << 15) | (15 << 20) 23*228f88fdSSam Elliott; RV32ZFH-NEXT: #NO_APP 24*228f88fdSSam Elliott; RV32ZFH-NEXT: ret 25*228f88fdSSam Elliott; 26*228f88fdSSam Elliott; RV64ZFH-LABEL: constraint_f_half: 27*228f88fdSSam Elliott; RV64ZFH: # %bb.0: 28*228f88fdSSam Elliott; RV64ZFH-NEXT: lui a0, %hi(gh) 29*228f88fdSSam Elliott; RV64ZFH-NEXT: flh fa5, %lo(gh)(a0) 30*228f88fdSSam Elliott; RV64ZFH-NEXT: #APP 31*228f88fdSSam Elliott; RV64ZFH-NEXT: .insn 0x4, 0x04000053 | (10 << 7) | (10 << 15) | (15 << 20) 32*228f88fdSSam Elliott; RV64ZFH-NEXT: #NO_APP 33*228f88fdSSam Elliott; RV64ZFH-NEXT: ret 34*228f88fdSSam Elliott; 35*228f88fdSSam Elliott; RV32DZFH-LABEL: constraint_f_half: 36*228f88fdSSam Elliott; RV32DZFH: # %bb.0: 37*228f88fdSSam Elliott; RV32DZFH-NEXT: lui a0, %hi(gh) 38*228f88fdSSam Elliott; RV32DZFH-NEXT: flh fa5, %lo(gh)(a0) 39*228f88fdSSam Elliott; RV32DZFH-NEXT: #APP 40*228f88fdSSam Elliott; RV32DZFH-NEXT: .insn 0x4, 0x04000053 | (10 << 7) | (10 << 15) | (15 << 20) 41*228f88fdSSam Elliott; RV32DZFH-NEXT: #NO_APP 42*228f88fdSSam Elliott; RV32DZFH-NEXT: ret 43*228f88fdSSam Elliott; 44*228f88fdSSam Elliott; RV64DZFH-LABEL: constraint_f_half: 45*228f88fdSSam Elliott; RV64DZFH: # %bb.0: 46*228f88fdSSam Elliott; RV64DZFH-NEXT: lui a0, %hi(gh) 47*228f88fdSSam Elliott; RV64DZFH-NEXT: flh fa5, %lo(gh)(a0) 48*228f88fdSSam Elliott; RV64DZFH-NEXT: #APP 49*228f88fdSSam Elliott; RV64DZFH-NEXT: .insn 0x4, 0x04000053 | (10 << 7) | (10 << 15) | (15 << 20) 50*228f88fdSSam Elliott; RV64DZFH-NEXT: #NO_APP 51*228f88fdSSam Elliott; RV64DZFH-NEXT: ret 52*228f88fdSSam Elliott %1 = load half, ptr @gh 53*228f88fdSSam Elliott %2 = tail call half asm ".insn 0x4, 0x04000053 | (${0:N} << 7) | (${1:N} << 15) | (${2:N} << 20)", "=f,f,f"(half %a, half %1) 54*228f88fdSSam Elliott ret half %2 55*228f88fdSSam Elliott} 56*228f88fdSSam Elliott 57*228f88fdSSam Elliottdefine half @constraint_cf_half(half %a) nounwind { 58*228f88fdSSam Elliott; RV32ZFH-LABEL: constraint_cf_half: 59*228f88fdSSam Elliott; RV32ZFH: # %bb.0: 60*228f88fdSSam Elliott; RV32ZFH-NEXT: lui a0, %hi(gh) 61*228f88fdSSam Elliott; RV32ZFH-NEXT: flh fa5, %lo(gh)(a0) 62*228f88fdSSam Elliott; RV32ZFH-NEXT: #APP 63*228f88fdSSam Elliott; RV32ZFH-NEXT: .insn 0x4, 0x04000053 | (10 << 7) | (10 << 15) | (15 << 20) 64*228f88fdSSam Elliott; RV32ZFH-NEXT: #NO_APP 65*228f88fdSSam Elliott; RV32ZFH-NEXT: ret 66*228f88fdSSam Elliott; 67*228f88fdSSam Elliott; RV64ZFH-LABEL: constraint_cf_half: 68*228f88fdSSam Elliott; RV64ZFH: # %bb.0: 69*228f88fdSSam Elliott; RV64ZFH-NEXT: lui a0, %hi(gh) 70*228f88fdSSam Elliott; RV64ZFH-NEXT: flh fa5, %lo(gh)(a0) 71*228f88fdSSam Elliott; RV64ZFH-NEXT: #APP 72*228f88fdSSam Elliott; RV64ZFH-NEXT: .insn 0x4, 0x04000053 | (10 << 7) | (10 << 15) | (15 << 20) 73*228f88fdSSam Elliott; RV64ZFH-NEXT: #NO_APP 74*228f88fdSSam Elliott; RV64ZFH-NEXT: ret 75*228f88fdSSam Elliott; 76*228f88fdSSam Elliott; RV32DZFH-LABEL: constraint_cf_half: 77*228f88fdSSam Elliott; RV32DZFH: # %bb.0: 78*228f88fdSSam Elliott; RV32DZFH-NEXT: lui a0, %hi(gh) 79*228f88fdSSam Elliott; RV32DZFH-NEXT: flh fa5, %lo(gh)(a0) 80*228f88fdSSam Elliott; RV32DZFH-NEXT: #APP 81*228f88fdSSam Elliott; RV32DZFH-NEXT: .insn 0x4, 0x04000053 | (10 << 7) | (10 << 15) | (15 << 20) 82*228f88fdSSam Elliott; RV32DZFH-NEXT: #NO_APP 83*228f88fdSSam Elliott; RV32DZFH-NEXT: ret 84*228f88fdSSam Elliott; 85*228f88fdSSam Elliott; RV64DZFH-LABEL: constraint_cf_half: 86*228f88fdSSam Elliott; RV64DZFH: # %bb.0: 87*228f88fdSSam Elliott; RV64DZFH-NEXT: lui a0, %hi(gh) 88*228f88fdSSam Elliott; RV64DZFH-NEXT: flh fa5, %lo(gh)(a0) 89*228f88fdSSam Elliott; RV64DZFH-NEXT: #APP 90*228f88fdSSam Elliott; RV64DZFH-NEXT: .insn 0x4, 0x04000053 | (10 << 7) | (10 << 15) | (15 << 20) 91*228f88fdSSam Elliott; RV64DZFH-NEXT: #NO_APP 92*228f88fdSSam Elliott; RV64DZFH-NEXT: ret 93*228f88fdSSam Elliott %1 = load half, ptr @gh 94*228f88fdSSam Elliott %2 = tail call half asm ".insn 0x4, 0x04000053 | (${0:N} << 7) | (${1:N} << 15) | (${2:N} << 20)", "=^cf,^cf,^cf"(half %a, half %1) 95*228f88fdSSam Elliott ret half %2 96*228f88fdSSam Elliott} 97*228f88fdSSam Elliott 98*228f88fdSSam Elliottdefine half @constraint_f_half_abi_name(half %a) nounwind { 99*228f88fdSSam Elliott; RV32ZFH-LABEL: constraint_f_half_abi_name: 100*228f88fdSSam Elliott; RV32ZFH: # %bb.0: 101*228f88fdSSam Elliott; RV32ZFH-NEXT: addi sp, sp, -16 102*228f88fdSSam Elliott; RV32ZFH-NEXT: fsw fs0, 12(sp) # 4-byte Folded Spill 103*228f88fdSSam Elliott; RV32ZFH-NEXT: lui a0, %hi(gh) 104*228f88fdSSam Elliott; RV32ZFH-NEXT: flh fs0, %lo(gh)(a0) 105*228f88fdSSam Elliott; RV32ZFH-NEXT: #APP 106*228f88fdSSam Elliott; RV32ZFH-NEXT: .insn 0x4, 0x04000053 | (0 << 7) | (10 << 15) | (8 << 20) 107*228f88fdSSam Elliott; RV32ZFH-NEXT: #NO_APP 108*228f88fdSSam Elliott; RV32ZFH-NEXT: fmv.h fa0, ft0 109*228f88fdSSam Elliott; RV32ZFH-NEXT: flw fs0, 12(sp) # 4-byte Folded Reload 110*228f88fdSSam Elliott; RV32ZFH-NEXT: addi sp, sp, 16 111*228f88fdSSam Elliott; RV32ZFH-NEXT: ret 112*228f88fdSSam Elliott; 113*228f88fdSSam Elliott; RV64ZFH-LABEL: constraint_f_half_abi_name: 114*228f88fdSSam Elliott; RV64ZFH: # %bb.0: 115*228f88fdSSam Elliott; RV64ZFH-NEXT: addi sp, sp, -16 116*228f88fdSSam Elliott; RV64ZFH-NEXT: fsw fs0, 12(sp) # 4-byte Folded Spill 117*228f88fdSSam Elliott; RV64ZFH-NEXT: lui a0, %hi(gh) 118*228f88fdSSam Elliott; RV64ZFH-NEXT: flh fs0, %lo(gh)(a0) 119*228f88fdSSam Elliott; RV64ZFH-NEXT: #APP 120*228f88fdSSam Elliott; RV64ZFH-NEXT: .insn 0x4, 0x04000053 | (0 << 7) | (10 << 15) | (8 << 20) 121*228f88fdSSam Elliott; RV64ZFH-NEXT: #NO_APP 122*228f88fdSSam Elliott; RV64ZFH-NEXT: fmv.h fa0, ft0 123*228f88fdSSam Elliott; RV64ZFH-NEXT: flw fs0, 12(sp) # 4-byte Folded Reload 124*228f88fdSSam Elliott; RV64ZFH-NEXT: addi sp, sp, 16 125*228f88fdSSam Elliott; RV64ZFH-NEXT: ret 126*228f88fdSSam Elliott; 127*228f88fdSSam Elliott; RV32DZFH-LABEL: constraint_f_half_abi_name: 128*228f88fdSSam Elliott; RV32DZFH: # %bb.0: 129*228f88fdSSam Elliott; RV32DZFH-NEXT: addi sp, sp, -16 130*228f88fdSSam Elliott; RV32DZFH-NEXT: fsd fs0, 8(sp) # 8-byte Folded Spill 131*228f88fdSSam Elliott; RV32DZFH-NEXT: lui a0, %hi(gh) 132*228f88fdSSam Elliott; RV32DZFH-NEXT: flh fs0, %lo(gh)(a0) 133*228f88fdSSam Elliott; RV32DZFH-NEXT: #APP 134*228f88fdSSam Elliott; RV32DZFH-NEXT: .insn 0x4, 0x04000053 | (0 << 7) | (10 << 15) | (8 << 20) 135*228f88fdSSam Elliott; RV32DZFH-NEXT: #NO_APP 136*228f88fdSSam Elliott; RV32DZFH-NEXT: fmv.h fa0, ft0 137*228f88fdSSam Elliott; RV32DZFH-NEXT: fld fs0, 8(sp) # 8-byte Folded Reload 138*228f88fdSSam Elliott; RV32DZFH-NEXT: addi sp, sp, 16 139*228f88fdSSam Elliott; RV32DZFH-NEXT: ret 140*228f88fdSSam Elliott; 141*228f88fdSSam Elliott; RV64DZFH-LABEL: constraint_f_half_abi_name: 142*228f88fdSSam Elliott; RV64DZFH: # %bb.0: 143*228f88fdSSam Elliott; RV64DZFH-NEXT: addi sp, sp, -16 144*228f88fdSSam Elliott; RV64DZFH-NEXT: fsd fs0, 8(sp) # 8-byte Folded Spill 145*228f88fdSSam Elliott; RV64DZFH-NEXT: lui a0, %hi(gh) 146*228f88fdSSam Elliott; RV64DZFH-NEXT: flh fs0, %lo(gh)(a0) 147*228f88fdSSam Elliott; RV64DZFH-NEXT: #APP 148*228f88fdSSam Elliott; RV64DZFH-NEXT: .insn 0x4, 0x04000053 | (0 << 7) | (10 << 15) | (8 << 20) 149*228f88fdSSam Elliott; RV64DZFH-NEXT: #NO_APP 150*228f88fdSSam Elliott; RV64DZFH-NEXT: fmv.h fa0, ft0 151*228f88fdSSam Elliott; RV64DZFH-NEXT: fld fs0, 8(sp) # 8-byte Folded Reload 152*228f88fdSSam Elliott; RV64DZFH-NEXT: addi sp, sp, 16 153*228f88fdSSam Elliott; RV64DZFH-NEXT: ret 154*228f88fdSSam Elliott %1 = load half, ptr @gh 155*228f88fdSSam Elliott %2 = tail call half asm ".insn 0x4, 0x04000053 | (${0:N} << 7) | (${1:N} << 15) | (${2:N} << 20)", "={ft0},{fa0},{fs0}"(half %a, half %1) 156*228f88fdSSam Elliott ret half %2 157*228f88fdSSam Elliott} 158