brintos

brintos / llvm-project-archived public Read only

0
0
Text · 7.2 KiB · b7d7d4c Raw
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