214 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 32; RUN: llc -mtriple=riscv32 -mattr=+zdinx -verify-machineinstrs < %s \3; RUN: -target-abi=ilp32 -mattr=+zhinx | FileCheck %s4 5;; These tests cover the use of `r`, `R`, and `cr` constraints for floating point values on rv32.6;;7;; In particular, there is significant complexity around using paired GPRs for double values on rv32.8 9define dso_local void @zdinx_asm(ptr nocapture noundef writeonly %a, double noundef %b, double noundef %c) nounwind {10; CHECK-LABEL: zdinx_asm:11; CHECK: # %bb.0: # %entry12; CHECK-NEXT: mv a5, a413; CHECK-NEXT: mv a7, a214; CHECK-NEXT: mv a4, a315; CHECK-NEXT: mv a6, a116; CHECK-NEXT: #APP17; CHECK-NEXT: fsgnjx.d a2, a6, a418; CHECK-NEXT: #NO_APP19; CHECK-NEXT: sw a2, 8(a0)20; CHECK-NEXT: sw a3, 12(a0)21; CHECK-NEXT: ret22entry:23 %arrayidx = getelementptr inbounds double, ptr %a, i32 124 %0 = tail call double asm "fsgnjx.d $0, $1, $2", "=r,r,r"(double %b, double %c)25 store double %0, ptr %arrayidx, align 826 ret void27}28 29define dso_local void @zdinx_asm_R(ptr nocapture noundef writeonly %a, double noundef %b, double noundef %c) nounwind {30; CHECK-LABEL: zdinx_asm_R:31; CHECK: # %bb.0: # %entry32; CHECK-NEXT: mv a5, a433; CHECK-NEXT: mv a7, a234; CHECK-NEXT: mv a4, a335; CHECK-NEXT: mv a6, a136; CHECK-NEXT: #APP37; CHECK-NEXT: fsgnjx.d a2, a6, a438; CHECK-NEXT: #NO_APP39; CHECK-NEXT: sw a2, 8(a0)40; CHECK-NEXT: sw a3, 12(a0)41; CHECK-NEXT: ret42entry:43 %arrayidx = getelementptr inbounds double, ptr %a, i32 144 %0 = tail call double asm "fsgnjx.d $0, $1, $2", "=R,R,R"(double %b, double %c)45 store double %0, ptr %arrayidx, align 846 ret void47}48 49define dso_local void @zdinx_asm_inout(ptr nocapture noundef writeonly %a, double noundef %b) nounwind {50; CHECK-LABEL: zdinx_asm_inout:51; CHECK: # %bb.0: # %entry52; CHECK-NEXT: mv a3, a253; CHECK-NEXT: mv a2, a154; CHECK-NEXT: #APP55; CHECK-NEXT: fmv.d a2, a256; CHECK-NEXT: #NO_APP57; CHECK-NEXT: sw a2, 8(a0)58; CHECK-NEXT: sw a3, 12(a0)59; CHECK-NEXT: ret60entry:61 %arrayidx = getelementptr inbounds double, ptr %a, i32 162 %0 = tail call double asm "fsgnj.d $0, $1, $1", "=r,0"(double %b)63 store double %0, ptr %arrayidx, align 864 ret void65}66 67define dso_local void @zdinx_asm_Pr_inout(ptr nocapture noundef writeonly %a, double noundef %b) nounwind {68; CHECK-LABEL: zdinx_asm_Pr_inout:69; CHECK: # %bb.0: # %entry70; CHECK-NEXT: mv a3, a271; CHECK-NEXT: mv a2, a172; CHECK-NEXT: #APP73; CHECK-NEXT: fabs.d a2, a274; CHECK-NEXT: #NO_APP75; CHECK-NEXT: sw a2, 8(a0)76; CHECK-NEXT: sw a3, 12(a0)77; CHECK-NEXT: ret78entry:79 %arrayidx = getelementptr inbounds double, ptr %a, i32 180 %0 = tail call double asm "fsgnjx.d $0, $1, $1", "=R,0"(double %b)81 store double %0, ptr %arrayidx, align 882 ret void83}84 85define dso_local void @zdinx_asm_cR_inout(ptr nocapture noundef writeonly %a, double noundef %b) nounwind {86; CHECK-LABEL: zdinx_asm_cR_inout:87; CHECK: # %bb.0: # %entry88; CHECK-NEXT: mv a3, a289; CHECK-NEXT: mv a2, a190; CHECK-NEXT: #APP91; CHECK-NEXT: fabs.d a2, a292; CHECK-NEXT: #NO_APP93; CHECK-NEXT: sw a2, 8(a0)94; CHECK-NEXT: sw a3, 12(a0)95; CHECK-NEXT: ret96entry:97 %arrayidx = getelementptr inbounds double, ptr %a, i32 198 %0 = tail call double asm "fsgnjx.d $0, $1, $1", "=^cR,0"(double %b)99 store double %0, ptr %arrayidx, align 8100 ret void101}102 103define dso_local void @zfinx_asm(ptr nocapture noundef writeonly %a, float noundef %b, float noundef %c) nounwind {104; CHECK-LABEL: zfinx_asm:105; CHECK: # %bb.0: # %entry106; CHECK-NEXT: #APP107; CHECK-NEXT: fsgnjx.s a1, a1, a2108; CHECK-NEXT: #NO_APP109; CHECK-NEXT: sw a1, 4(a0)110; CHECK-NEXT: ret111entry:112 %arrayidx = getelementptr inbounds float, ptr %a, i32 1113 %0 = tail call float asm "fsgnjx.s $0, $1, $2", "=r,r,r"(float %b, float %c)114 store float %0, ptr %arrayidx, align 8115 ret void116}117 118define dso_local void @zhinx_asm(ptr nocapture noundef writeonly %a, half noundef %b, half noundef %c) nounwind {119; CHECK-LABEL: zhinx_asm:120; CHECK: # %bb.0: # %entry121; CHECK-NEXT: #APP122; CHECK-NEXT: fsgnjx.h a1, a1, a2123; CHECK-NEXT: #NO_APP124; CHECK-NEXT: sh a1, 2(a0)125; CHECK-NEXT: ret126entry:127 %arrayidx = getelementptr inbounds half, ptr %a, i32 1128 %0 = tail call half asm "fsgnjx.h $0, $1, $2", "=r,r,r"(half %b, half %c)129 store half %0, ptr %arrayidx, align 8130 ret void131}132 133define dso_local void @zdinx_asm_cr(ptr nocapture noundef writeonly %a, double noundef %b, double noundef %c) nounwind {134; CHECK-LABEL: zdinx_asm_cr:135; CHECK: # %bb.0: # %entry136; CHECK-NEXT: addi sp, sp, -16137; CHECK-NEXT: sw s0, 12(sp) # 4-byte Folded Spill138; CHECK-NEXT: sw s1, 8(sp) # 4-byte Folded Spill139; CHECK-NEXT: mv a5, a4140; CHECK-NEXT: mv s1, a2141; CHECK-NEXT: mv a4, a3142; CHECK-NEXT: mv s0, a1143; CHECK-NEXT: #APP144; CHECK-NEXT: fsgnjx.d a2, s0, a4145; CHECK-NEXT: #NO_APP146; CHECK-NEXT: sw a2, 8(a0)147; CHECK-NEXT: sw a3, 12(a0)148; CHECK-NEXT: lw s0, 12(sp) # 4-byte Folded Reload149; CHECK-NEXT: lw s1, 8(sp) # 4-byte Folded Reload150; CHECK-NEXT: addi sp, sp, 16151; CHECK-NEXT: ret152entry:153 %arrayidx = getelementptr inbounds double, ptr %a, i32 1154 %0 = tail call double asm "fsgnjx.d $0, $1, $2", "=^cr,^cr,^cr"(double %b, double %c)155 store double %0, ptr %arrayidx, align 8156 ret void157}158 159define dso_local void @zfinx_asm_cr(ptr nocapture noundef writeonly %a, float noundef %b, float noundef %c) nounwind {160; CHECK-LABEL: zfinx_asm_cr:161; CHECK: # %bb.0: # %entry162; CHECK-NEXT: #APP163; CHECK-NEXT: fsgnjx.s a1, a1, a2164; CHECK-NEXT: #NO_APP165; CHECK-NEXT: sw a1, 4(a0)166; CHECK-NEXT: ret167entry:168 %arrayidx = getelementptr inbounds float, ptr %a, i32 1169 %0 = tail call float asm "fsgnjx.s $0, $1, $2", "=^cr,^cr,^cr"(float %b, float %c)170 store float %0, ptr %arrayidx, align 8171 ret void172}173 174define dso_local void @zhinx_asm_cr(ptr nocapture noundef writeonly %a, half noundef %b, half noundef %c) nounwind {175; CHECK-LABEL: zhinx_asm_cr:176; CHECK: # %bb.0: # %entry177; CHECK-NEXT: #APP178; CHECK-NEXT: fsgnjx.h a1, a1, a2179; CHECK-NEXT: #NO_APP180; CHECK-NEXT: sh a1, 2(a0)181; CHECK-NEXT: ret182entry:183 %arrayidx = getelementptr inbounds half, ptr %a, i32 1184 %0 = tail call half asm "fsgnjx.h $0, $1, $2", "=^cr,^cr,^cr"(half %b, half %c)185 store half %0, ptr %arrayidx, align 8186 ret void187}188 189define dso_local void @zdinx_asm_cR(ptr nocapture noundef writeonly %a, double noundef %b, double noundef %c) nounwind {190; CHECK-LABEL: zdinx_asm_cR:191; CHECK: # %bb.0: # %entry192; CHECK-NEXT: addi sp, sp, -16193; CHECK-NEXT: sw s0, 12(sp) # 4-byte Folded Spill194; CHECK-NEXT: sw s1, 8(sp) # 4-byte Folded Spill195; CHECK-NEXT: mv a5, a4196; CHECK-NEXT: mv s1, a2197; CHECK-NEXT: mv a4, a3198; CHECK-NEXT: mv s0, a1199; CHECK-NEXT: #APP200; CHECK-NEXT: fsgnjx.d a2, s0, a4201; CHECK-NEXT: #NO_APP202; CHECK-NEXT: sw a2, 8(a0)203; CHECK-NEXT: sw a3, 12(a0)204; CHECK-NEXT: lw s0, 12(sp) # 4-byte Folded Reload205; CHECK-NEXT: lw s1, 8(sp) # 4-byte Folded Reload206; CHECK-NEXT: addi sp, sp, 16207; CHECK-NEXT: ret208entry:209 %arrayidx = getelementptr inbounds double, ptr %a, i32 1210 %0 = tail call double asm "fsgnjx.d $0, $1, $2", "=^cR,^cR,^cR"(double %b, double %c)211 store double %0, ptr %arrayidx, align 8212 ret void213}214