1228f88fdSSam Elliott; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 5 2228f88fdSSam Elliott; RUN: llc -mtriple=riscv32 -mattr=+zhinx -verify-machineinstrs < %s \ 3228f88fdSSam Elliott; RUN: -target-abi=ilp32 | FileCheck -check-prefix=RV32ZHINX %s 4228f88fdSSam Elliott; RUN: llc -mtriple=riscv64 -mattr=+zhinx -verify-machineinstrs < %s \ 5228f88fdSSam Elliott; RUN: -target-abi=lp64 | FileCheck -check-prefix=RV64ZHINX %s 6228f88fdSSam Elliott; RUN: llc -mtriple=riscv32 -mattr=+zdinx,+zhinx -verify-machineinstrs < %s \ 7228f88fdSSam Elliott; RUN: -target-abi=ilp32 | FileCheck -check-prefix=RV32DINXZHINX %s 8228f88fdSSam Elliott; RUN: llc -mtriple=riscv64 -mattr=+zdinx,+zhinx -verify-machineinstrs < %s \ 9228f88fdSSam Elliott; RUN: -target-abi=lp64 | FileCheck -check-prefix=RV64DINXZHINX %s 10228f88fdSSam Elliott 11228f88fdSSam Elliott@gh = external global half 12228f88fdSSam Elliott 13228f88fdSSam Elliottdefine half @constraint_r_half(half %a) nounwind { 14228f88fdSSam Elliott; RV32ZHINX-LABEL: constraint_r_half: 15228f88fdSSam Elliott; RV32ZHINX: # %bb.0: 16228f88fdSSam Elliott; RV32ZHINX-NEXT: lui a1, %hi(gh) 17228f88fdSSam Elliott; RV32ZHINX-NEXT: lh a1, %lo(gh)(a1) 18228f88fdSSam Elliott; RV32ZHINX-NEXT: #APP 19228f88fdSSam Elliott; RV32ZHINX-NEXT: fadd.h a0, a0, a1 20228f88fdSSam Elliott; RV32ZHINX-NEXT: #NO_APP 21228f88fdSSam Elliott; RV32ZHINX-NEXT: ret 22228f88fdSSam Elliott; 23228f88fdSSam Elliott; RV64ZHINX-LABEL: constraint_r_half: 24228f88fdSSam Elliott; RV64ZHINX: # %bb.0: 25228f88fdSSam Elliott; RV64ZHINX-NEXT: lui a1, %hi(gh) 26228f88fdSSam Elliott; RV64ZHINX-NEXT: lh a1, %lo(gh)(a1) 27228f88fdSSam Elliott; RV64ZHINX-NEXT: #APP 28228f88fdSSam Elliott; RV64ZHINX-NEXT: fadd.h a0, a0, a1 29228f88fdSSam Elliott; RV64ZHINX-NEXT: #NO_APP 30228f88fdSSam Elliott; RV64ZHINX-NEXT: ret 31228f88fdSSam Elliott; 32228f88fdSSam Elliott; RV32DINXZHINX-LABEL: constraint_r_half: 33228f88fdSSam Elliott; RV32DINXZHINX: # %bb.0: 34228f88fdSSam Elliott; RV32DINXZHINX-NEXT: lui a1, %hi(gh) 35228f88fdSSam Elliott; RV32DINXZHINX-NEXT: lh a1, %lo(gh)(a1) 36228f88fdSSam Elliott; RV32DINXZHINX-NEXT: #APP 37228f88fdSSam Elliott; RV32DINXZHINX-NEXT: fadd.h a0, a0, a1 38228f88fdSSam Elliott; RV32DINXZHINX-NEXT: #NO_APP 39228f88fdSSam Elliott; RV32DINXZHINX-NEXT: ret 40228f88fdSSam Elliott; 41228f88fdSSam Elliott; RV64DINXZHINX-LABEL: constraint_r_half: 42228f88fdSSam Elliott; RV64DINXZHINX: # %bb.0: 43228f88fdSSam Elliott; RV64DINXZHINX-NEXT: lui a1, %hi(gh) 44228f88fdSSam Elliott; RV64DINXZHINX-NEXT: lh a1, %lo(gh)(a1) 45228f88fdSSam Elliott; RV64DINXZHINX-NEXT: #APP 46228f88fdSSam Elliott; RV64DINXZHINX-NEXT: fadd.h a0, a0, a1 47228f88fdSSam Elliott; RV64DINXZHINX-NEXT: #NO_APP 48228f88fdSSam Elliott; RV64DINXZHINX-NEXT: ret 49228f88fdSSam Elliott %1 = load half, ptr @gh 50228f88fdSSam Elliott %2 = tail call half asm "fadd.h $0, $1, $2", "=r,r,r"(half %a, half %1) 51228f88fdSSam Elliott ret half %2 52228f88fdSSam Elliott} 53228f88fdSSam Elliott 54228f88fdSSam Elliottdefine half @constraint_cr_half(half %a) nounwind { 55228f88fdSSam Elliott; RV32ZHINX-LABEL: constraint_cr_half: 56228f88fdSSam Elliott; RV32ZHINX: # %bb.0: 57228f88fdSSam Elliott; RV32ZHINX-NEXT: lui a1, %hi(gh) 58228f88fdSSam Elliott; RV32ZHINX-NEXT: lh a1, %lo(gh)(a1) 59228f88fdSSam Elliott; RV32ZHINX-NEXT: #APP 60228f88fdSSam Elliott; RV32ZHINX-NEXT: fadd.h a0, a0, a1 61228f88fdSSam Elliott; RV32ZHINX-NEXT: #NO_APP 62228f88fdSSam Elliott; RV32ZHINX-NEXT: ret 63228f88fdSSam Elliott; 64228f88fdSSam Elliott; RV64ZHINX-LABEL: constraint_cr_half: 65228f88fdSSam Elliott; RV64ZHINX: # %bb.0: 66228f88fdSSam Elliott; RV64ZHINX-NEXT: lui a1, %hi(gh) 67228f88fdSSam Elliott; RV64ZHINX-NEXT: lh a1, %lo(gh)(a1) 68228f88fdSSam Elliott; RV64ZHINX-NEXT: #APP 69228f88fdSSam Elliott; RV64ZHINX-NEXT: fadd.h a0, a0, a1 70228f88fdSSam Elliott; RV64ZHINX-NEXT: #NO_APP 71228f88fdSSam Elliott; RV64ZHINX-NEXT: ret 72228f88fdSSam Elliott; 73228f88fdSSam Elliott; RV32DINXZHINX-LABEL: constraint_cr_half: 74228f88fdSSam Elliott; RV32DINXZHINX: # %bb.0: 75228f88fdSSam Elliott; RV32DINXZHINX-NEXT: lui a1, %hi(gh) 76228f88fdSSam Elliott; RV32DINXZHINX-NEXT: lh a1, %lo(gh)(a1) 77228f88fdSSam Elliott; RV32DINXZHINX-NEXT: #APP 78228f88fdSSam Elliott; RV32DINXZHINX-NEXT: fadd.h a0, a0, a1 79228f88fdSSam Elliott; RV32DINXZHINX-NEXT: #NO_APP 80228f88fdSSam Elliott; RV32DINXZHINX-NEXT: ret 81228f88fdSSam Elliott; 82228f88fdSSam Elliott; RV64DINXZHINX-LABEL: constraint_cr_half: 83228f88fdSSam Elliott; RV64DINXZHINX: # %bb.0: 84228f88fdSSam Elliott; RV64DINXZHINX-NEXT: lui a1, %hi(gh) 85228f88fdSSam Elliott; RV64DINXZHINX-NEXT: lh a1, %lo(gh)(a1) 86228f88fdSSam Elliott; RV64DINXZHINX-NEXT: #APP 87228f88fdSSam Elliott; RV64DINXZHINX-NEXT: fadd.h a0, a0, a1 88228f88fdSSam Elliott; RV64DINXZHINX-NEXT: #NO_APP 89228f88fdSSam Elliott; RV64DINXZHINX-NEXT: ret 90228f88fdSSam Elliott %1 = load half, ptr @gh 91228f88fdSSam Elliott %2 = tail call half asm "fadd.h $0, $1, $2", "=^cr,^cr,^cr"(half %a, half %1) 92228f88fdSSam Elliott ret half %2 93228f88fdSSam Elliott} 94228f88fdSSam Elliott 95228f88fdSSam Elliottdefine half @constraint_half_abi_name(half %a) nounwind { 96228f88fdSSam Elliott; RV32ZHINX-LABEL: constraint_half_abi_name: 97228f88fdSSam Elliott; RV32ZHINX: # %bb.0: 98228f88fdSSam Elliott; RV32ZHINX-NEXT: addi sp, sp, -16 99228f88fdSSam Elliott; RV32ZHINX-NEXT: sw s0, 12(sp) # 4-byte Folded Spill 100228f88fdSSam Elliott; RV32ZHINX-NEXT: lui a1, %hi(gh) 101228f88fdSSam Elliott; RV32ZHINX-NEXT: lh s0, %lo(gh)(a1) 102228f88fdSSam Elliott; RV32ZHINX-NEXT: # kill: def $x10_h killed $x10_h def $x10 103228f88fdSSam Elliott; RV32ZHINX-NEXT: #APP 104228f88fdSSam Elliott; RV32ZHINX-NEXT: fadd.s t0, a0, s0 105228f88fdSSam Elliott; RV32ZHINX-NEXT: #NO_APP 106228f88fdSSam Elliott; RV32ZHINX-NEXT: mv a0, t0 107228f88fdSSam Elliott; RV32ZHINX-NEXT: lw s0, 12(sp) # 4-byte Folded Reload 108228f88fdSSam Elliott; RV32ZHINX-NEXT: addi sp, sp, 16 109228f88fdSSam Elliott; RV32ZHINX-NEXT: ret 110228f88fdSSam Elliott; 111228f88fdSSam Elliott; RV64ZHINX-LABEL: constraint_half_abi_name: 112228f88fdSSam Elliott; RV64ZHINX: # %bb.0: 113228f88fdSSam Elliott; RV64ZHINX-NEXT: addi sp, sp, -16 114228f88fdSSam Elliott; RV64ZHINX-NEXT: sd s0, 8(sp) # 8-byte Folded Spill 115228f88fdSSam Elliott; RV64ZHINX-NEXT: lui a1, %hi(gh) 116228f88fdSSam Elliott; RV64ZHINX-NEXT: lh s0, %lo(gh)(a1) 117228f88fdSSam Elliott; RV64ZHINX-NEXT: # kill: def $x10_h killed $x10_h def $x10 118228f88fdSSam Elliott; RV64ZHINX-NEXT: #APP 119228f88fdSSam Elliott; RV64ZHINX-NEXT: fadd.s t0, a0, s0 120228f88fdSSam Elliott; RV64ZHINX-NEXT: #NO_APP 121228f88fdSSam Elliott; RV64ZHINX-NEXT: mv a0, t0 122228f88fdSSam Elliott; RV64ZHINX-NEXT: ld s0, 8(sp) # 8-byte Folded Reload 123228f88fdSSam Elliott; RV64ZHINX-NEXT: addi sp, sp, 16 124228f88fdSSam Elliott; RV64ZHINX-NEXT: ret 125228f88fdSSam Elliott; 126228f88fdSSam Elliott; RV32DINXZHINX-LABEL: constraint_half_abi_name: 127228f88fdSSam Elliott; RV32DINXZHINX: # %bb.0: 128228f88fdSSam Elliott; RV32DINXZHINX-NEXT: addi sp, sp, -16 129228f88fdSSam Elliott; RV32DINXZHINX-NEXT: sw s0, 12(sp) # 4-byte Folded Spill 130228f88fdSSam Elliott; RV32DINXZHINX-NEXT: lui a1, %hi(gh) 131228f88fdSSam Elliott; RV32DINXZHINX-NEXT: lh s0, %lo(gh)(a1) 132228f88fdSSam Elliott; RV32DINXZHINX-NEXT: # kill: def $x10_h killed $x10_h def $x10 133228f88fdSSam Elliott; RV32DINXZHINX-NEXT: #APP 134228f88fdSSam Elliott; RV32DINXZHINX-NEXT: fadd.s t0, a0, s0 135228f88fdSSam Elliott; RV32DINXZHINX-NEXT: #NO_APP 136228f88fdSSam Elliott; RV32DINXZHINX-NEXT: mv a0, t0 137228f88fdSSam Elliott; RV32DINXZHINX-NEXT: lw s0, 12(sp) # 4-byte Folded Reload 138228f88fdSSam Elliott; RV32DINXZHINX-NEXT: addi sp, sp, 16 139228f88fdSSam Elliott; RV32DINXZHINX-NEXT: ret 140228f88fdSSam Elliott; 141228f88fdSSam Elliott; RV64DINXZHINX-LABEL: constraint_half_abi_name: 142228f88fdSSam Elliott; RV64DINXZHINX: # %bb.0: 143228f88fdSSam Elliott; RV64DINXZHINX-NEXT: addi sp, sp, -16 144228f88fdSSam Elliott; RV64DINXZHINX-NEXT: sd s0, 8(sp) # 8-byte Folded Spill 145228f88fdSSam Elliott; RV64DINXZHINX-NEXT: lui a1, %hi(gh) 146228f88fdSSam Elliott; RV64DINXZHINX-NEXT: lh s0, %lo(gh)(a1) 147228f88fdSSam Elliott; RV64DINXZHINX-NEXT: # kill: def $x10_h killed $x10_h def $x10 148228f88fdSSam Elliott; RV64DINXZHINX-NEXT: #APP 149228f88fdSSam Elliott; RV64DINXZHINX-NEXT: fadd.s t0, a0, s0 150228f88fdSSam Elliott; RV64DINXZHINX-NEXT: #NO_APP 151228f88fdSSam Elliott; RV64DINXZHINX-NEXT: mv a0, t0 152228f88fdSSam Elliott; RV64DINXZHINX-NEXT: ld s0, 8(sp) # 8-byte Folded Reload 153228f88fdSSam Elliott; RV64DINXZHINX-NEXT: addi sp, sp, 16 154228f88fdSSam Elliott; RV64DINXZHINX-NEXT: ret 155228f88fdSSam Elliott %1 = load half, ptr @gh 156228f88fdSSam Elliott %2 = tail call half asm "fadd.s $0, $1, $2", "={t0},{a0},{s0}"(half %a, half %1) 157228f88fdSSam Elliott ret half %2 158228f88fdSSam Elliott} 159*1bc1a79aSCraig Topper 160*1bc1a79aSCraig Topperdefine half @constraint_f_half(half %a) nounwind { 161*1bc1a79aSCraig Topper; RV32ZHINX-LABEL: constraint_f_half: 162*1bc1a79aSCraig Topper; RV32ZHINX: # %bb.0: 163*1bc1a79aSCraig Topper; RV32ZHINX-NEXT: lui a1, %hi(gh) 164*1bc1a79aSCraig Topper; RV32ZHINX-NEXT: lh a1, %lo(gh)(a1) 165*1bc1a79aSCraig Topper; RV32ZHINX-NEXT: #APP 166*1bc1a79aSCraig Topper; RV32ZHINX-NEXT: fadd.h a0, a0, a1 167*1bc1a79aSCraig Topper; RV32ZHINX-NEXT: #NO_APP 168*1bc1a79aSCraig Topper; RV32ZHINX-NEXT: ret 169*1bc1a79aSCraig Topper; 170*1bc1a79aSCraig Topper; RV64ZHINX-LABEL: constraint_f_half: 171*1bc1a79aSCraig Topper; RV64ZHINX: # %bb.0: 172*1bc1a79aSCraig Topper; RV64ZHINX-NEXT: lui a1, %hi(gh) 173*1bc1a79aSCraig Topper; RV64ZHINX-NEXT: lh a1, %lo(gh)(a1) 174*1bc1a79aSCraig Topper; RV64ZHINX-NEXT: #APP 175*1bc1a79aSCraig Topper; RV64ZHINX-NEXT: fadd.h a0, a0, a1 176*1bc1a79aSCraig Topper; RV64ZHINX-NEXT: #NO_APP 177*1bc1a79aSCraig Topper; RV64ZHINX-NEXT: ret 178*1bc1a79aSCraig Topper; 179*1bc1a79aSCraig Topper; RV32DINXZHINX-LABEL: constraint_f_half: 180*1bc1a79aSCraig Topper; RV32DINXZHINX: # %bb.0: 181*1bc1a79aSCraig Topper; RV32DINXZHINX-NEXT: lui a1, %hi(gh) 182*1bc1a79aSCraig Topper; RV32DINXZHINX-NEXT: lh a1, %lo(gh)(a1) 183*1bc1a79aSCraig Topper; RV32DINXZHINX-NEXT: #APP 184*1bc1a79aSCraig Topper; RV32DINXZHINX-NEXT: fadd.h a0, a0, a1 185*1bc1a79aSCraig Topper; RV32DINXZHINX-NEXT: #NO_APP 186*1bc1a79aSCraig Topper; RV32DINXZHINX-NEXT: ret 187*1bc1a79aSCraig Topper; 188*1bc1a79aSCraig Topper; RV64DINXZHINX-LABEL: constraint_f_half: 189*1bc1a79aSCraig Topper; RV64DINXZHINX: # %bb.0: 190*1bc1a79aSCraig Topper; RV64DINXZHINX-NEXT: lui a1, %hi(gh) 191*1bc1a79aSCraig Topper; RV64DINXZHINX-NEXT: lh a1, %lo(gh)(a1) 192*1bc1a79aSCraig Topper; RV64DINXZHINX-NEXT: #APP 193*1bc1a79aSCraig Topper; RV64DINXZHINX-NEXT: fadd.h a0, a0, a1 194*1bc1a79aSCraig Topper; RV64DINXZHINX-NEXT: #NO_APP 195*1bc1a79aSCraig Topper; RV64DINXZHINX-NEXT: ret 196*1bc1a79aSCraig Topper %1 = load half, ptr @gh 197*1bc1a79aSCraig Topper %2 = tail call half asm "fadd.h $0, $1, $2", "=f,f,f"(half %a, half %1) 198*1bc1a79aSCraig Topper ret half %2 199*1bc1a79aSCraig Topper} 200*1bc1a79aSCraig Topper 201*1bc1a79aSCraig Topperdefine half @constraint_cf_half(half %a) nounwind { 202*1bc1a79aSCraig Topper; RV32ZHINX-LABEL: constraint_cf_half: 203*1bc1a79aSCraig Topper; RV32ZHINX: # %bb.0: 204*1bc1a79aSCraig Topper; RV32ZHINX-NEXT: lui a1, %hi(gh) 205*1bc1a79aSCraig Topper; RV32ZHINX-NEXT: lh a1, %lo(gh)(a1) 206*1bc1a79aSCraig Topper; RV32ZHINX-NEXT: #APP 207*1bc1a79aSCraig Topper; RV32ZHINX-NEXT: fadd.h a0, a0, a1 208*1bc1a79aSCraig Topper; RV32ZHINX-NEXT: #NO_APP 209*1bc1a79aSCraig Topper; RV32ZHINX-NEXT: ret 210*1bc1a79aSCraig Topper; 211*1bc1a79aSCraig Topper; RV64ZHINX-LABEL: constraint_cf_half: 212*1bc1a79aSCraig Topper; RV64ZHINX: # %bb.0: 213*1bc1a79aSCraig Topper; RV64ZHINX-NEXT: lui a1, %hi(gh) 214*1bc1a79aSCraig Topper; RV64ZHINX-NEXT: lh a1, %lo(gh)(a1) 215*1bc1a79aSCraig Topper; RV64ZHINX-NEXT: #APP 216*1bc1a79aSCraig Topper; RV64ZHINX-NEXT: fadd.h a0, a0, a1 217*1bc1a79aSCraig Topper; RV64ZHINX-NEXT: #NO_APP 218*1bc1a79aSCraig Topper; RV64ZHINX-NEXT: ret 219*1bc1a79aSCraig Topper; 220*1bc1a79aSCraig Topper; RV32DINXZHINX-LABEL: constraint_cf_half: 221*1bc1a79aSCraig Topper; RV32DINXZHINX: # %bb.0: 222*1bc1a79aSCraig Topper; RV32DINXZHINX-NEXT: lui a1, %hi(gh) 223*1bc1a79aSCraig Topper; RV32DINXZHINX-NEXT: lh a1, %lo(gh)(a1) 224*1bc1a79aSCraig Topper; RV32DINXZHINX-NEXT: #APP 225*1bc1a79aSCraig Topper; RV32DINXZHINX-NEXT: fadd.h a0, a0, a1 226*1bc1a79aSCraig Topper; RV32DINXZHINX-NEXT: #NO_APP 227*1bc1a79aSCraig Topper; RV32DINXZHINX-NEXT: ret 228*1bc1a79aSCraig Topper; 229*1bc1a79aSCraig Topper; RV64DINXZHINX-LABEL: constraint_cf_half: 230*1bc1a79aSCraig Topper; RV64DINXZHINX: # %bb.0: 231*1bc1a79aSCraig Topper; RV64DINXZHINX-NEXT: lui a1, %hi(gh) 232*1bc1a79aSCraig Topper; RV64DINXZHINX-NEXT: lh a1, %lo(gh)(a1) 233*1bc1a79aSCraig Topper; RV64DINXZHINX-NEXT: #APP 234*1bc1a79aSCraig Topper; RV64DINXZHINX-NEXT: fadd.h a0, a0, a1 235*1bc1a79aSCraig Topper; RV64DINXZHINX-NEXT: #NO_APP 236*1bc1a79aSCraig Topper; RV64DINXZHINX-NEXT: ret 237*1bc1a79aSCraig Topper %1 = load half, ptr @gh 238*1bc1a79aSCraig Topper %2 = tail call half asm "fadd.h $0, $1, $2", "=^cf,^cf,^cf"(half %a, half %1) 239*1bc1a79aSCraig Topper ret half %2 240*1bc1a79aSCraig Topper} 241