[RISCV] Convert LWU to LW if possible in RISCVOptWInstrs (#144703)
After the refactoring in #149710 the logic change is trivial. Motivation for preferring sign-extended 32-bit loads (LW) vs zero-extended (LWU): * LW is compressible while LWU is not. * Helps to minimise the diff vs RV32 (e.g. LWU vs LW) * Helps to minimise distracting diffs vs GCC. I see this come up frequently when comparing GCC code and in these cases it's a red herring. Similar normalisation could be done for LHU and LH, but this is less well motivated as there is a compressed LHU (and if performing the change in RISCVOptWInstrs it wouldn't be done for RV32). There is a compressed LBU but not LB, meaning doing a similar normalisation for byte-sized loads would actually be a regression in terms of code size. Load narrowing when allowed by hasAllNBitUsers isn't explored in this patch. This changes ~20500 instructions in an RVA22 build of the llvm-test-suite including SPEC 2017. As part of the review, the option of doing the change at ISel time was explored but was found to be less effective.
This commit is contained in:
parent
a11c5dd34b
commit
fc69f25a8f
@ -736,7 +736,8 @@ bool RISCVOptWInstrs::canonicalizeWSuffixes(MachineFunction &MF,
|
|||||||
for (MachineInstr &MI : MBB) {
|
for (MachineInstr &MI : MBB) {
|
||||||
std::optional<unsigned> WOpc;
|
std::optional<unsigned> WOpc;
|
||||||
std::optional<unsigned> NonWOpc;
|
std::optional<unsigned> NonWOpc;
|
||||||
switch (MI.getOpcode()) {
|
unsigned OrigOpc = MI.getOpcode();
|
||||||
|
switch (OrigOpc) {
|
||||||
default:
|
default:
|
||||||
continue;
|
continue;
|
||||||
case RISCV::ADDW:
|
case RISCV::ADDW:
|
||||||
@ -786,7 +787,10 @@ bool RISCVOptWInstrs::canonicalizeWSuffixes(MachineFunction &MF,
|
|||||||
MadeChange = true;
|
MadeChange = true;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
if (ShouldPreferW && WOpc.has_value() && hasAllWUsers(MI, ST, MRI)) {
|
// LWU is always converted to LW when possible as 1) LW is compressible
|
||||||
|
// and 2) it helps minimise differences vs RV32.
|
||||||
|
if ((ShouldPreferW || OrigOpc == RISCV::LWU) && WOpc.has_value() &&
|
||||||
|
hasAllWUsers(MI, ST, MRI)) {
|
||||||
LLVM_DEBUG(dbgs() << "Replacing " << MI);
|
LLVM_DEBUG(dbgs() << "Replacing " << MI);
|
||||||
MI.setDesc(TII.get(WOpc.value()));
|
MI.setDesc(TII.get(WOpc.value()));
|
||||||
MI.clearFlag(MachineInstr::MIFlag::NoSWrap);
|
MI.clearFlag(MachineInstr::MIFlag::NoSWrap);
|
||||||
|
@ -246,17 +246,11 @@ define double @fcvt_d_wu(i32 %a) nounwind {
|
|||||||
}
|
}
|
||||||
|
|
||||||
define double @fcvt_d_wu_load(ptr %p) nounwind {
|
define double @fcvt_d_wu_load(ptr %p) nounwind {
|
||||||
; RV32IFD-LABEL: fcvt_d_wu_load:
|
; CHECKIFD-LABEL: fcvt_d_wu_load:
|
||||||
; RV32IFD: # %bb.0:
|
; CHECKIFD: # %bb.0:
|
||||||
; RV32IFD-NEXT: lw a0, 0(a0)
|
; CHECKIFD-NEXT: lw a0, 0(a0)
|
||||||
; RV32IFD-NEXT: fcvt.d.wu fa0, a0
|
; CHECKIFD-NEXT: fcvt.d.wu fa0, a0
|
||||||
; RV32IFD-NEXT: ret
|
; CHECKIFD-NEXT: ret
|
||||||
;
|
|
||||||
; RV64IFD-LABEL: fcvt_d_wu_load:
|
|
||||||
; RV64IFD: # %bb.0:
|
|
||||||
; RV64IFD-NEXT: lwu a0, 0(a0)
|
|
||||||
; RV64IFD-NEXT: fcvt.d.wu fa0, a0
|
|
||||||
; RV64IFD-NEXT: ret
|
|
||||||
;
|
;
|
||||||
; RV32I-LABEL: fcvt_d_wu_load:
|
; RV32I-LABEL: fcvt_d_wu_load:
|
||||||
; RV32I: # %bb.0:
|
; RV32I: # %bb.0:
|
||||||
|
@ -232,17 +232,11 @@ define float @fcvt_s_wu(i32 %a) nounwind {
|
|||||||
}
|
}
|
||||||
|
|
||||||
define float @fcvt_s_wu_load(ptr %p) nounwind {
|
define float @fcvt_s_wu_load(ptr %p) nounwind {
|
||||||
; RV32IF-LABEL: fcvt_s_wu_load:
|
; CHECKIF-LABEL: fcvt_s_wu_load:
|
||||||
; RV32IF: # %bb.0:
|
; CHECKIF: # %bb.0:
|
||||||
; RV32IF-NEXT: lw a0, 0(a0)
|
; CHECKIF-NEXT: lw a0, 0(a0)
|
||||||
; RV32IF-NEXT: fcvt.s.wu fa0, a0
|
; CHECKIF-NEXT: fcvt.s.wu fa0, a0
|
||||||
; RV32IF-NEXT: ret
|
; CHECKIF-NEXT: ret
|
||||||
;
|
|
||||||
; RV64IF-LABEL: fcvt_s_wu_load:
|
|
||||||
; RV64IF: # %bb.0:
|
|
||||||
; RV64IF-NEXT: lwu a0, 0(a0)
|
|
||||||
; RV64IF-NEXT: fcvt.s.wu fa0, a0
|
|
||||||
; RV64IF-NEXT: ret
|
|
||||||
;
|
;
|
||||||
; RV32I-LABEL: fcvt_s_wu_load:
|
; RV32I-LABEL: fcvt_s_wu_load:
|
||||||
; RV32I: # %bb.0:
|
; RV32I: # %bb.0:
|
||||||
|
@ -748,7 +748,7 @@ define signext i32 @ctpop_i32_load(ptr %p) nounwind {
|
|||||||
;
|
;
|
||||||
; RV64ZBB-LABEL: ctpop_i32_load:
|
; RV64ZBB-LABEL: ctpop_i32_load:
|
||||||
; RV64ZBB: # %bb.0:
|
; RV64ZBB: # %bb.0:
|
||||||
; RV64ZBB-NEXT: lwu a0, 0(a0)
|
; RV64ZBB-NEXT: lw a0, 0(a0)
|
||||||
; RV64ZBB-NEXT: cpopw a0, a0
|
; RV64ZBB-NEXT: cpopw a0, a0
|
||||||
; RV64ZBB-NEXT: ret
|
; RV64ZBB-NEXT: ret
|
||||||
%a = load i32, ptr %p
|
%a = load i32, ptr %p
|
||||||
|
@ -114,7 +114,7 @@ define i64 @pack_i64_2(i32 signext %a, i32 signext %b) nounwind {
|
|||||||
define i64 @pack_i64_3(ptr %0, ptr %1) {
|
define i64 @pack_i64_3(ptr %0, ptr %1) {
|
||||||
; RV64I-LABEL: pack_i64_3:
|
; RV64I-LABEL: pack_i64_3:
|
||||||
; RV64I: # %bb.0:
|
; RV64I: # %bb.0:
|
||||||
; RV64I-NEXT: lwu a0, 0(a0)
|
; RV64I-NEXT: lw a0, 0(a0)
|
||||||
; RV64I-NEXT: lwu a1, 0(a1)
|
; RV64I-NEXT: lwu a1, 0(a1)
|
||||||
; RV64I-NEXT: slli a0, a0, 32
|
; RV64I-NEXT: slli a0, a0, 32
|
||||||
; RV64I-NEXT: or a0, a0, a1
|
; RV64I-NEXT: or a0, a0, a1
|
||||||
@ -122,8 +122,8 @@ define i64 @pack_i64_3(ptr %0, ptr %1) {
|
|||||||
;
|
;
|
||||||
; RV64ZBKB-LABEL: pack_i64_3:
|
; RV64ZBKB-LABEL: pack_i64_3:
|
||||||
; RV64ZBKB: # %bb.0:
|
; RV64ZBKB: # %bb.0:
|
||||||
; RV64ZBKB-NEXT: lwu a0, 0(a0)
|
; RV64ZBKB-NEXT: lw a0, 0(a0)
|
||||||
; RV64ZBKB-NEXT: lwu a1, 0(a1)
|
; RV64ZBKB-NEXT: lw a1, 0(a1)
|
||||||
; RV64ZBKB-NEXT: pack a0, a1, a0
|
; RV64ZBKB-NEXT: pack a0, a1, a0
|
||||||
; RV64ZBKB-NEXT: ret
|
; RV64ZBKB-NEXT: ret
|
||||||
%3 = load i32, ptr %0, align 4
|
%3 = load i32, ptr %0, align 4
|
||||||
|
@ -4582,7 +4582,7 @@ define signext i32 @atomicrmw_and_i32_monotonic_crossbb(ptr %a, i1 %c) nounwind
|
|||||||
; RV64I-NEXT: sext.w a0, a0
|
; RV64I-NEXT: sext.w a0, a0
|
||||||
; RV64I-NEXT: ret
|
; RV64I-NEXT: ret
|
||||||
; RV64I-NEXT: .LBB56_2: # %else
|
; RV64I-NEXT: .LBB56_2: # %else
|
||||||
; RV64I-NEXT: lwu a1, 0(a0)
|
; RV64I-NEXT: lw a1, 0(a0)
|
||||||
; RV64I-NEXT: andi a2, a1, 1
|
; RV64I-NEXT: andi a2, a1, 1
|
||||||
; RV64I-NEXT: sw a2, 0(a0)
|
; RV64I-NEXT: sw a2, 0(a0)
|
||||||
; RV64I-NEXT: sext.w a0, a1
|
; RV64I-NEXT: sext.w a0, a1
|
||||||
@ -4700,7 +4700,7 @@ define signext i32 @atomicrmw_nand_i32_monotonic_crossbb(ptr %a, i1 %c) nounwind
|
|||||||
; RV64I-NEXT: sext.w a0, a0
|
; RV64I-NEXT: sext.w a0, a0
|
||||||
; RV64I-NEXT: ret
|
; RV64I-NEXT: ret
|
||||||
; RV64I-NEXT: .LBB57_2: # %else
|
; RV64I-NEXT: .LBB57_2: # %else
|
||||||
; RV64I-NEXT: lwu a1, 0(a0)
|
; RV64I-NEXT: lw a1, 0(a0)
|
||||||
; RV64I-NEXT: andi a2, a1, 1
|
; RV64I-NEXT: andi a2, a1, 1
|
||||||
; RV64I-NEXT: sw a2, 0(a0)
|
; RV64I-NEXT: sw a2, 0(a0)
|
||||||
; RV64I-NEXT: sext.w a0, a1
|
; RV64I-NEXT: sext.w a0, a1
|
||||||
|
@ -1074,7 +1074,7 @@ define bfloat @fcvt_bf16_wu_load(ptr %p) nounwind {
|
|||||||
;
|
;
|
||||||
; CHECK64ZFBFMIN-LABEL: fcvt_bf16_wu_load:
|
; CHECK64ZFBFMIN-LABEL: fcvt_bf16_wu_load:
|
||||||
; CHECK64ZFBFMIN: # %bb.0:
|
; CHECK64ZFBFMIN: # %bb.0:
|
||||||
; CHECK64ZFBFMIN-NEXT: lwu a0, 0(a0)
|
; CHECK64ZFBFMIN-NEXT: lw a0, 0(a0)
|
||||||
; CHECK64ZFBFMIN-NEXT: fcvt.s.wu fa5, a0
|
; CHECK64ZFBFMIN-NEXT: fcvt.s.wu fa5, a0
|
||||||
; CHECK64ZFBFMIN-NEXT: fcvt.bf16.s fa0, fa5
|
; CHECK64ZFBFMIN-NEXT: fcvt.bf16.s fa0, fa5
|
||||||
; CHECK64ZFBFMIN-NEXT: ret
|
; CHECK64ZFBFMIN-NEXT: ret
|
||||||
@ -1083,7 +1083,7 @@ define bfloat @fcvt_bf16_wu_load(ptr %p) nounwind {
|
|||||||
; RV64ID: # %bb.0:
|
; RV64ID: # %bb.0:
|
||||||
; RV64ID-NEXT: addi sp, sp, -16
|
; RV64ID-NEXT: addi sp, sp, -16
|
||||||
; RV64ID-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
|
; RV64ID-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
|
||||||
; RV64ID-NEXT: lwu a0, 0(a0)
|
; RV64ID-NEXT: lw a0, 0(a0)
|
||||||
; RV64ID-NEXT: fcvt.s.wu fa0, a0
|
; RV64ID-NEXT: fcvt.s.wu fa0, a0
|
||||||
; RV64ID-NEXT: call __truncsfbf2
|
; RV64ID-NEXT: call __truncsfbf2
|
||||||
; RV64ID-NEXT: fmv.x.w a0, fa0
|
; RV64ID-NEXT: fmv.x.w a0, fa0
|
||||||
|
@ -347,17 +347,11 @@ define double @fcvt_d_wu(i32 %a) nounwind strictfp {
|
|||||||
declare double @llvm.experimental.constrained.uitofp.f64.i32(i32, metadata, metadata)
|
declare double @llvm.experimental.constrained.uitofp.f64.i32(i32, metadata, metadata)
|
||||||
|
|
||||||
define double @fcvt_d_wu_load(ptr %p) nounwind strictfp {
|
define double @fcvt_d_wu_load(ptr %p) nounwind strictfp {
|
||||||
; RV32IFD-LABEL: fcvt_d_wu_load:
|
; CHECKIFD-LABEL: fcvt_d_wu_load:
|
||||||
; RV32IFD: # %bb.0:
|
; CHECKIFD: # %bb.0:
|
||||||
; RV32IFD-NEXT: lw a0, 0(a0)
|
; CHECKIFD-NEXT: lw a0, 0(a0)
|
||||||
; RV32IFD-NEXT: fcvt.d.wu fa0, a0
|
; CHECKIFD-NEXT: fcvt.d.wu fa0, a0
|
||||||
; RV32IFD-NEXT: ret
|
; CHECKIFD-NEXT: ret
|
||||||
;
|
|
||||||
; RV64IFD-LABEL: fcvt_d_wu_load:
|
|
||||||
; RV64IFD: # %bb.0:
|
|
||||||
; RV64IFD-NEXT: lwu a0, 0(a0)
|
|
||||||
; RV64IFD-NEXT: fcvt.d.wu fa0, a0
|
|
||||||
; RV64IFD-NEXT: ret
|
|
||||||
;
|
;
|
||||||
; RV32IZFINXZDINX-LABEL: fcvt_d_wu_load:
|
; RV32IZFINXZDINX-LABEL: fcvt_d_wu_load:
|
||||||
; RV32IZFINXZDINX: # %bb.0:
|
; RV32IZFINXZDINX: # %bb.0:
|
||||||
@ -367,7 +361,7 @@ define double @fcvt_d_wu_load(ptr %p) nounwind strictfp {
|
|||||||
;
|
;
|
||||||
; RV64IZFINXZDINX-LABEL: fcvt_d_wu_load:
|
; RV64IZFINXZDINX-LABEL: fcvt_d_wu_load:
|
||||||
; RV64IZFINXZDINX: # %bb.0:
|
; RV64IZFINXZDINX: # %bb.0:
|
||||||
; RV64IZFINXZDINX-NEXT: lwu a0, 0(a0)
|
; RV64IZFINXZDINX-NEXT: lw a0, 0(a0)
|
||||||
; RV64IZFINXZDINX-NEXT: fcvt.d.wu a0, a0
|
; RV64IZFINXZDINX-NEXT: fcvt.d.wu a0, a0
|
||||||
; RV64IZFINXZDINX-NEXT: ret
|
; RV64IZFINXZDINX-NEXT: ret
|
||||||
;
|
;
|
||||||
|
@ -582,17 +582,11 @@ define double @fcvt_d_wu(i32 %a) nounwind {
|
|||||||
}
|
}
|
||||||
|
|
||||||
define double @fcvt_d_wu_load(ptr %p) nounwind {
|
define double @fcvt_d_wu_load(ptr %p) nounwind {
|
||||||
; RV32IFD-LABEL: fcvt_d_wu_load:
|
; CHECKIFD-LABEL: fcvt_d_wu_load:
|
||||||
; RV32IFD: # %bb.0:
|
; CHECKIFD: # %bb.0:
|
||||||
; RV32IFD-NEXT: lw a0, 0(a0)
|
; CHECKIFD-NEXT: lw a0, 0(a0)
|
||||||
; RV32IFD-NEXT: fcvt.d.wu fa0, a0
|
; CHECKIFD-NEXT: fcvt.d.wu fa0, a0
|
||||||
; RV32IFD-NEXT: ret
|
; CHECKIFD-NEXT: ret
|
||||||
;
|
|
||||||
; RV64IFD-LABEL: fcvt_d_wu_load:
|
|
||||||
; RV64IFD: # %bb.0:
|
|
||||||
; RV64IFD-NEXT: lwu a0, 0(a0)
|
|
||||||
; RV64IFD-NEXT: fcvt.d.wu fa0, a0
|
|
||||||
; RV64IFD-NEXT: ret
|
|
||||||
;
|
;
|
||||||
; RV32IZFINXZDINX-LABEL: fcvt_d_wu_load:
|
; RV32IZFINXZDINX-LABEL: fcvt_d_wu_load:
|
||||||
; RV32IZFINXZDINX: # %bb.0:
|
; RV32IZFINXZDINX: # %bb.0:
|
||||||
@ -602,7 +596,7 @@ define double @fcvt_d_wu_load(ptr %p) nounwind {
|
|||||||
;
|
;
|
||||||
; RV64IZFINXZDINX-LABEL: fcvt_d_wu_load:
|
; RV64IZFINXZDINX-LABEL: fcvt_d_wu_load:
|
||||||
; RV64IZFINXZDINX: # %bb.0:
|
; RV64IZFINXZDINX: # %bb.0:
|
||||||
; RV64IZFINXZDINX-NEXT: lwu a0, 0(a0)
|
; RV64IZFINXZDINX-NEXT: lw a0, 0(a0)
|
||||||
; RV64IZFINXZDINX-NEXT: fcvt.d.wu a0, a0
|
; RV64IZFINXZDINX-NEXT: fcvt.d.wu a0, a0
|
||||||
; RV64IZFINXZDINX-NEXT: ret
|
; RV64IZFINXZDINX-NEXT: ret
|
||||||
;
|
;
|
||||||
|
@ -236,29 +236,17 @@ define float @fcvt_s_wu(i32 %a) nounwind strictfp {
|
|||||||
declare float @llvm.experimental.constrained.uitofp.f32.i32(i32 %a, metadata, metadata)
|
declare float @llvm.experimental.constrained.uitofp.f32.i32(i32 %a, metadata, metadata)
|
||||||
|
|
||||||
define float @fcvt_s_wu_load(ptr %p) nounwind strictfp {
|
define float @fcvt_s_wu_load(ptr %p) nounwind strictfp {
|
||||||
; RV32IF-LABEL: fcvt_s_wu_load:
|
; CHECKIF-LABEL: fcvt_s_wu_load:
|
||||||
; RV32IF: # %bb.0:
|
; CHECKIF: # %bb.0:
|
||||||
; RV32IF-NEXT: lw a0, 0(a0)
|
; CHECKIF-NEXT: lw a0, 0(a0)
|
||||||
; RV32IF-NEXT: fcvt.s.wu fa0, a0
|
; CHECKIF-NEXT: fcvt.s.wu fa0, a0
|
||||||
; RV32IF-NEXT: ret
|
; CHECKIF-NEXT: ret
|
||||||
;
|
;
|
||||||
; RV64IF-LABEL: fcvt_s_wu_load:
|
; CHECKIZFINX-LABEL: fcvt_s_wu_load:
|
||||||
; RV64IF: # %bb.0:
|
; CHECKIZFINX: # %bb.0:
|
||||||
; RV64IF-NEXT: lwu a0, 0(a0)
|
; CHECKIZFINX-NEXT: lw a0, 0(a0)
|
||||||
; RV64IF-NEXT: fcvt.s.wu fa0, a0
|
; CHECKIZFINX-NEXT: fcvt.s.wu a0, a0
|
||||||
; RV64IF-NEXT: ret
|
; CHECKIZFINX-NEXT: ret
|
||||||
;
|
|
||||||
; RV32IZFINX-LABEL: fcvt_s_wu_load:
|
|
||||||
; RV32IZFINX: # %bb.0:
|
|
||||||
; RV32IZFINX-NEXT: lw a0, 0(a0)
|
|
||||||
; RV32IZFINX-NEXT: fcvt.s.wu a0, a0
|
|
||||||
; RV32IZFINX-NEXT: ret
|
|
||||||
;
|
|
||||||
; RV64IZFINX-LABEL: fcvt_s_wu_load:
|
|
||||||
; RV64IZFINX: # %bb.0:
|
|
||||||
; RV64IZFINX-NEXT: lwu a0, 0(a0)
|
|
||||||
; RV64IZFINX-NEXT: fcvt.s.wu a0, a0
|
|
||||||
; RV64IZFINX-NEXT: ret
|
|
||||||
;
|
;
|
||||||
; RV32I-LABEL: fcvt_s_wu_load:
|
; RV32I-LABEL: fcvt_s_wu_load:
|
||||||
; RV32I: # %bb.0:
|
; RV32I: # %bb.0:
|
||||||
|
@ -482,29 +482,17 @@ define float @fcvt_s_wu(i32 %a) nounwind {
|
|||||||
}
|
}
|
||||||
|
|
||||||
define float @fcvt_s_wu_load(ptr %p) nounwind {
|
define float @fcvt_s_wu_load(ptr %p) nounwind {
|
||||||
; RV32IF-LABEL: fcvt_s_wu_load:
|
; CHECKIF-LABEL: fcvt_s_wu_load:
|
||||||
; RV32IF: # %bb.0:
|
; CHECKIF: # %bb.0:
|
||||||
; RV32IF-NEXT: lw a0, 0(a0)
|
; CHECKIF-NEXT: lw a0, 0(a0)
|
||||||
; RV32IF-NEXT: fcvt.s.wu fa0, a0
|
; CHECKIF-NEXT: fcvt.s.wu fa0, a0
|
||||||
; RV32IF-NEXT: ret
|
; CHECKIF-NEXT: ret
|
||||||
;
|
;
|
||||||
; RV64IF-LABEL: fcvt_s_wu_load:
|
; CHECKIZFINX-LABEL: fcvt_s_wu_load:
|
||||||
; RV64IF: # %bb.0:
|
; CHECKIZFINX: # %bb.0:
|
||||||
; RV64IF-NEXT: lwu a0, 0(a0)
|
; CHECKIZFINX-NEXT: lw a0, 0(a0)
|
||||||
; RV64IF-NEXT: fcvt.s.wu fa0, a0
|
; CHECKIZFINX-NEXT: fcvt.s.wu a0, a0
|
||||||
; RV64IF-NEXT: ret
|
; CHECKIZFINX-NEXT: ret
|
||||||
;
|
|
||||||
; RV32IZFINX-LABEL: fcvt_s_wu_load:
|
|
||||||
; RV32IZFINX: # %bb.0:
|
|
||||||
; RV32IZFINX-NEXT: lw a0, 0(a0)
|
|
||||||
; RV32IZFINX-NEXT: fcvt.s.wu a0, a0
|
|
||||||
; RV32IZFINX-NEXT: ret
|
|
||||||
;
|
|
||||||
; RV64IZFINX-LABEL: fcvt_s_wu_load:
|
|
||||||
; RV64IZFINX: # %bb.0:
|
|
||||||
; RV64IZFINX-NEXT: lwu a0, 0(a0)
|
|
||||||
; RV64IZFINX-NEXT: fcvt.s.wu a0, a0
|
|
||||||
; RV64IZFINX-NEXT: ret
|
|
||||||
;
|
;
|
||||||
; RV32I-LABEL: fcvt_s_wu_load:
|
; RV32I-LABEL: fcvt_s_wu_load:
|
||||||
; RV32I: # %bb.0:
|
; RV32I: # %bb.0:
|
||||||
|
@ -1461,29 +1461,17 @@ define half @fcvt_h_wu(i32 %a) nounwind strictfp {
|
|||||||
declare half @llvm.experimental.constrained.uitofp.f16.i32(i32, metadata, metadata)
|
declare half @llvm.experimental.constrained.uitofp.f16.i32(i32, metadata, metadata)
|
||||||
|
|
||||||
define half @fcvt_h_wu_load(ptr %p) nounwind strictfp {
|
define half @fcvt_h_wu_load(ptr %p) nounwind strictfp {
|
||||||
; RV32IZFH-LABEL: fcvt_h_wu_load:
|
; CHECKIZFH-LABEL: fcvt_h_wu_load:
|
||||||
; RV32IZFH: # %bb.0:
|
; CHECKIZFH: # %bb.0:
|
||||||
; RV32IZFH-NEXT: lw a0, 0(a0)
|
; CHECKIZFH-NEXT: lw a0, 0(a0)
|
||||||
; RV32IZFH-NEXT: fcvt.h.wu fa0, a0
|
; CHECKIZFH-NEXT: fcvt.h.wu fa0, a0
|
||||||
; RV32IZFH-NEXT: ret
|
; CHECKIZFH-NEXT: ret
|
||||||
;
|
;
|
||||||
; RV64IZFH-LABEL: fcvt_h_wu_load:
|
; CHECKIZHINX-LABEL: fcvt_h_wu_load:
|
||||||
; RV64IZFH: # %bb.0:
|
; CHECKIZHINX: # %bb.0:
|
||||||
; RV64IZFH-NEXT: lwu a0, 0(a0)
|
; CHECKIZHINX-NEXT: lw a0, 0(a0)
|
||||||
; RV64IZFH-NEXT: fcvt.h.wu fa0, a0
|
; CHECKIZHINX-NEXT: fcvt.h.wu a0, a0
|
||||||
; RV64IZFH-NEXT: ret
|
; CHECKIZHINX-NEXT: ret
|
||||||
;
|
|
||||||
; RV32IZHINX-LABEL: fcvt_h_wu_load:
|
|
||||||
; RV32IZHINX: # %bb.0:
|
|
||||||
; RV32IZHINX-NEXT: lw a0, 0(a0)
|
|
||||||
; RV32IZHINX-NEXT: fcvt.h.wu a0, a0
|
|
||||||
; RV32IZHINX-NEXT: ret
|
|
||||||
;
|
|
||||||
; RV64IZHINX-LABEL: fcvt_h_wu_load:
|
|
||||||
; RV64IZHINX: # %bb.0:
|
|
||||||
; RV64IZHINX-NEXT: lwu a0, 0(a0)
|
|
||||||
; RV64IZHINX-NEXT: fcvt.h.wu a0, a0
|
|
||||||
; RV64IZHINX-NEXT: ret
|
|
||||||
;
|
;
|
||||||
; RV32IDZFH-LABEL: fcvt_h_wu_load:
|
; RV32IDZFH-LABEL: fcvt_h_wu_load:
|
||||||
; RV32IDZFH: # %bb.0:
|
; RV32IDZFH: # %bb.0:
|
||||||
@ -1493,7 +1481,7 @@ define half @fcvt_h_wu_load(ptr %p) nounwind strictfp {
|
|||||||
;
|
;
|
||||||
; RV64IDZFH-LABEL: fcvt_h_wu_load:
|
; RV64IDZFH-LABEL: fcvt_h_wu_load:
|
||||||
; RV64IDZFH: # %bb.0:
|
; RV64IDZFH: # %bb.0:
|
||||||
; RV64IDZFH-NEXT: lwu a0, 0(a0)
|
; RV64IDZFH-NEXT: lw a0, 0(a0)
|
||||||
; RV64IDZFH-NEXT: fcvt.h.wu fa0, a0
|
; RV64IDZFH-NEXT: fcvt.h.wu fa0, a0
|
||||||
; RV64IDZFH-NEXT: ret
|
; RV64IDZFH-NEXT: ret
|
||||||
;
|
;
|
||||||
@ -1505,7 +1493,7 @@ define half @fcvt_h_wu_load(ptr %p) nounwind strictfp {
|
|||||||
;
|
;
|
||||||
; RV64IZDINXZHINX-LABEL: fcvt_h_wu_load:
|
; RV64IZDINXZHINX-LABEL: fcvt_h_wu_load:
|
||||||
; RV64IZDINXZHINX: # %bb.0:
|
; RV64IZDINXZHINX: # %bb.0:
|
||||||
; RV64IZDINXZHINX-NEXT: lwu a0, 0(a0)
|
; RV64IZDINXZHINX-NEXT: lw a0, 0(a0)
|
||||||
; RV64IZDINXZHINX-NEXT: fcvt.h.wu a0, a0
|
; RV64IZDINXZHINX-NEXT: fcvt.h.wu a0, a0
|
||||||
; RV64IZDINXZHINX-NEXT: ret
|
; RV64IZDINXZHINX-NEXT: ret
|
||||||
;
|
;
|
||||||
@ -1518,7 +1506,7 @@ define half @fcvt_h_wu_load(ptr %p) nounwind strictfp {
|
|||||||
;
|
;
|
||||||
; CHECK64-IZFHMIN-LABEL: fcvt_h_wu_load:
|
; CHECK64-IZFHMIN-LABEL: fcvt_h_wu_load:
|
||||||
; CHECK64-IZFHMIN: # %bb.0:
|
; CHECK64-IZFHMIN: # %bb.0:
|
||||||
; CHECK64-IZFHMIN-NEXT: lwu a0, 0(a0)
|
; CHECK64-IZFHMIN-NEXT: lw a0, 0(a0)
|
||||||
; CHECK64-IZFHMIN-NEXT: fcvt.s.wu fa5, a0
|
; CHECK64-IZFHMIN-NEXT: fcvt.s.wu fa5, a0
|
||||||
; CHECK64-IZFHMIN-NEXT: fcvt.h.s fa0, fa5
|
; CHECK64-IZFHMIN-NEXT: fcvt.h.s fa0, fa5
|
||||||
; CHECK64-IZFHMIN-NEXT: ret
|
; CHECK64-IZFHMIN-NEXT: ret
|
||||||
@ -1532,7 +1520,7 @@ define half @fcvt_h_wu_load(ptr %p) nounwind strictfp {
|
|||||||
;
|
;
|
||||||
; CHECK64-IZHINXMIN-LABEL: fcvt_h_wu_load:
|
; CHECK64-IZHINXMIN-LABEL: fcvt_h_wu_load:
|
||||||
; CHECK64-IZHINXMIN: # %bb.0:
|
; CHECK64-IZHINXMIN: # %bb.0:
|
||||||
; CHECK64-IZHINXMIN-NEXT: lwu a0, 0(a0)
|
; CHECK64-IZHINXMIN-NEXT: lw a0, 0(a0)
|
||||||
; CHECK64-IZHINXMIN-NEXT: fcvt.s.wu a0, a0
|
; CHECK64-IZHINXMIN-NEXT: fcvt.s.wu a0, a0
|
||||||
; CHECK64-IZHINXMIN-NEXT: fcvt.h.s a0, a0
|
; CHECK64-IZHINXMIN-NEXT: fcvt.h.s a0, a0
|
||||||
; CHECK64-IZHINXMIN-NEXT: ret
|
; CHECK64-IZHINXMIN-NEXT: ret
|
||||||
@ -1546,7 +1534,7 @@ define half @fcvt_h_wu_load(ptr %p) nounwind strictfp {
|
|||||||
;
|
;
|
||||||
; CHECK64-IZDINXZHINXMIN-LABEL: fcvt_h_wu_load:
|
; CHECK64-IZDINXZHINXMIN-LABEL: fcvt_h_wu_load:
|
||||||
; CHECK64-IZDINXZHINXMIN: # %bb.0:
|
; CHECK64-IZDINXZHINXMIN: # %bb.0:
|
||||||
; CHECK64-IZDINXZHINXMIN-NEXT: lwu a0, 0(a0)
|
; CHECK64-IZDINXZHINXMIN-NEXT: lw a0, 0(a0)
|
||||||
; CHECK64-IZDINXZHINXMIN-NEXT: fcvt.s.wu a0, a0
|
; CHECK64-IZDINXZHINXMIN-NEXT: fcvt.s.wu a0, a0
|
||||||
; CHECK64-IZDINXZHINXMIN-NEXT: fcvt.h.s a0, a0
|
; CHECK64-IZDINXZHINXMIN-NEXT: fcvt.h.s a0, a0
|
||||||
; CHECK64-IZDINXZHINXMIN-NEXT: ret
|
; CHECK64-IZDINXZHINXMIN-NEXT: ret
|
||||||
|
@ -4388,17 +4388,11 @@ define half @fcvt_h_wu(i32 %a) nounwind {
|
|||||||
}
|
}
|
||||||
|
|
||||||
define half @fcvt_h_wu_load(ptr %p) nounwind {
|
define half @fcvt_h_wu_load(ptr %p) nounwind {
|
||||||
; RV32IZFH-LABEL: fcvt_h_wu_load:
|
; CHECKIZFH-LABEL: fcvt_h_wu_load:
|
||||||
; RV32IZFH: # %bb.0:
|
; CHECKIZFH: # %bb.0:
|
||||||
; RV32IZFH-NEXT: lw a0, 0(a0)
|
; CHECKIZFH-NEXT: lw a0, 0(a0)
|
||||||
; RV32IZFH-NEXT: fcvt.h.wu fa0, a0
|
; CHECKIZFH-NEXT: fcvt.h.wu fa0, a0
|
||||||
; RV32IZFH-NEXT: ret
|
; CHECKIZFH-NEXT: ret
|
||||||
;
|
|
||||||
; RV64IZFH-LABEL: fcvt_h_wu_load:
|
|
||||||
; RV64IZFH: # %bb.0:
|
|
||||||
; RV64IZFH-NEXT: lwu a0, 0(a0)
|
|
||||||
; RV64IZFH-NEXT: fcvt.h.wu fa0, a0
|
|
||||||
; RV64IZFH-NEXT: ret
|
|
||||||
;
|
;
|
||||||
; RV32IDZFH-LABEL: fcvt_h_wu_load:
|
; RV32IDZFH-LABEL: fcvt_h_wu_load:
|
||||||
; RV32IDZFH: # %bb.0:
|
; RV32IDZFH: # %bb.0:
|
||||||
@ -4408,33 +4402,21 @@ define half @fcvt_h_wu_load(ptr %p) nounwind {
|
|||||||
;
|
;
|
||||||
; RV64IDZFH-LABEL: fcvt_h_wu_load:
|
; RV64IDZFH-LABEL: fcvt_h_wu_load:
|
||||||
; RV64IDZFH: # %bb.0:
|
; RV64IDZFH: # %bb.0:
|
||||||
; RV64IDZFH-NEXT: lwu a0, 0(a0)
|
; RV64IDZFH-NEXT: lw a0, 0(a0)
|
||||||
; RV64IDZFH-NEXT: fcvt.h.wu fa0, a0
|
; RV64IDZFH-NEXT: fcvt.h.wu fa0, a0
|
||||||
; RV64IDZFH-NEXT: ret
|
; RV64IDZFH-NEXT: ret
|
||||||
;
|
;
|
||||||
; RV32IZHINX-LABEL: fcvt_h_wu_load:
|
; CHECKIZHINX-LABEL: fcvt_h_wu_load:
|
||||||
; RV32IZHINX: # %bb.0:
|
; CHECKIZHINX: # %bb.0:
|
||||||
; RV32IZHINX-NEXT: lw a0, 0(a0)
|
; CHECKIZHINX-NEXT: lw a0, 0(a0)
|
||||||
; RV32IZHINX-NEXT: fcvt.h.wu a0, a0
|
; CHECKIZHINX-NEXT: fcvt.h.wu a0, a0
|
||||||
; RV32IZHINX-NEXT: ret
|
; CHECKIZHINX-NEXT: ret
|
||||||
;
|
;
|
||||||
; RV64IZHINX-LABEL: fcvt_h_wu_load:
|
; CHECKIZDINXZHINX-LABEL: fcvt_h_wu_load:
|
||||||
; RV64IZHINX: # %bb.0:
|
; CHECKIZDINXZHINX: # %bb.0:
|
||||||
; RV64IZHINX-NEXT: lwu a0, 0(a0)
|
; CHECKIZDINXZHINX-NEXT: lw a0, 0(a0)
|
||||||
; RV64IZHINX-NEXT: fcvt.h.wu a0, a0
|
; CHECKIZDINXZHINX-NEXT: fcvt.h.wu a0, a0
|
||||||
; RV64IZHINX-NEXT: ret
|
; CHECKIZDINXZHINX-NEXT: ret
|
||||||
;
|
|
||||||
; RV32IZDINXZHINX-LABEL: fcvt_h_wu_load:
|
|
||||||
; RV32IZDINXZHINX: # %bb.0:
|
|
||||||
; RV32IZDINXZHINX-NEXT: lw a0, 0(a0)
|
|
||||||
; RV32IZDINXZHINX-NEXT: fcvt.h.wu a0, a0
|
|
||||||
; RV32IZDINXZHINX-NEXT: ret
|
|
||||||
;
|
|
||||||
; RV64IZDINXZHINX-LABEL: fcvt_h_wu_load:
|
|
||||||
; RV64IZDINXZHINX: # %bb.0:
|
|
||||||
; RV64IZDINXZHINX-NEXT: lwu a0, 0(a0)
|
|
||||||
; RV64IZDINXZHINX-NEXT: fcvt.h.wu a0, a0
|
|
||||||
; RV64IZDINXZHINX-NEXT: ret
|
|
||||||
;
|
;
|
||||||
; RV32I-LABEL: fcvt_h_wu_load:
|
; RV32I-LABEL: fcvt_h_wu_load:
|
||||||
; RV32I: # %bb.0:
|
; RV32I: # %bb.0:
|
||||||
@ -4476,7 +4458,7 @@ define half @fcvt_h_wu_load(ptr %p) nounwind {
|
|||||||
; RV64ID-LP64: # %bb.0:
|
; RV64ID-LP64: # %bb.0:
|
||||||
; RV64ID-LP64-NEXT: addi sp, sp, -16
|
; RV64ID-LP64-NEXT: addi sp, sp, -16
|
||||||
; RV64ID-LP64-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
|
; RV64ID-LP64-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
|
||||||
; RV64ID-LP64-NEXT: lwu a0, 0(a0)
|
; RV64ID-LP64-NEXT: lw a0, 0(a0)
|
||||||
; RV64ID-LP64-NEXT: fcvt.s.wu fa5, a0
|
; RV64ID-LP64-NEXT: fcvt.s.wu fa5, a0
|
||||||
; RV64ID-LP64-NEXT: fmv.x.w a0, fa5
|
; RV64ID-LP64-NEXT: fmv.x.w a0, fa5
|
||||||
; RV64ID-LP64-NEXT: call __truncsfhf2
|
; RV64ID-LP64-NEXT: call __truncsfhf2
|
||||||
@ -4505,7 +4487,7 @@ define half @fcvt_h_wu_load(ptr %p) nounwind {
|
|||||||
; RV64ID: # %bb.0:
|
; RV64ID: # %bb.0:
|
||||||
; RV64ID-NEXT: addi sp, sp, -16
|
; RV64ID-NEXT: addi sp, sp, -16
|
||||||
; RV64ID-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
|
; RV64ID-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
|
||||||
; RV64ID-NEXT: lwu a0, 0(a0)
|
; RV64ID-NEXT: lw a0, 0(a0)
|
||||||
; RV64ID-NEXT: fcvt.s.wu fa0, a0
|
; RV64ID-NEXT: fcvt.s.wu fa0, a0
|
||||||
; RV64ID-NEXT: call __truncsfhf2
|
; RV64ID-NEXT: call __truncsfhf2
|
||||||
; RV64ID-NEXT: fmv.x.w a0, fa0
|
; RV64ID-NEXT: fmv.x.w a0, fa0
|
||||||
@ -4525,7 +4507,7 @@ define half @fcvt_h_wu_load(ptr %p) nounwind {
|
|||||||
;
|
;
|
||||||
; CHECK64-IZFHMIN-LABEL: fcvt_h_wu_load:
|
; CHECK64-IZFHMIN-LABEL: fcvt_h_wu_load:
|
||||||
; CHECK64-IZFHMIN: # %bb.0:
|
; CHECK64-IZFHMIN: # %bb.0:
|
||||||
; CHECK64-IZFHMIN-NEXT: lwu a0, 0(a0)
|
; CHECK64-IZFHMIN-NEXT: lw a0, 0(a0)
|
||||||
; CHECK64-IZFHMIN-NEXT: fcvt.s.wu fa5, a0
|
; CHECK64-IZFHMIN-NEXT: fcvt.s.wu fa5, a0
|
||||||
; CHECK64-IZFHMIN-NEXT: fcvt.h.s fa0, fa5
|
; CHECK64-IZFHMIN-NEXT: fcvt.h.s fa0, fa5
|
||||||
; CHECK64-IZFHMIN-NEXT: ret
|
; CHECK64-IZFHMIN-NEXT: ret
|
||||||
@ -4539,7 +4521,7 @@ define half @fcvt_h_wu_load(ptr %p) nounwind {
|
|||||||
;
|
;
|
||||||
; CHECK64-IZHINXMIN-LABEL: fcvt_h_wu_load:
|
; CHECK64-IZHINXMIN-LABEL: fcvt_h_wu_load:
|
||||||
; CHECK64-IZHINXMIN: # %bb.0:
|
; CHECK64-IZHINXMIN: # %bb.0:
|
||||||
; CHECK64-IZHINXMIN-NEXT: lwu a0, 0(a0)
|
; CHECK64-IZHINXMIN-NEXT: lw a0, 0(a0)
|
||||||
; CHECK64-IZHINXMIN-NEXT: fcvt.s.wu a0, a0
|
; CHECK64-IZHINXMIN-NEXT: fcvt.s.wu a0, a0
|
||||||
; CHECK64-IZHINXMIN-NEXT: fcvt.h.s a0, a0
|
; CHECK64-IZHINXMIN-NEXT: fcvt.h.s a0, a0
|
||||||
; CHECK64-IZHINXMIN-NEXT: ret
|
; CHECK64-IZHINXMIN-NEXT: ret
|
||||||
@ -4553,7 +4535,7 @@ define half @fcvt_h_wu_load(ptr %p) nounwind {
|
|||||||
;
|
;
|
||||||
; CHECK64-IZDINXZHINXMIN-LABEL: fcvt_h_wu_load:
|
; CHECK64-IZDINXZHINXMIN-LABEL: fcvt_h_wu_load:
|
||||||
; CHECK64-IZDINXZHINXMIN: # %bb.0:
|
; CHECK64-IZDINXZHINXMIN: # %bb.0:
|
||||||
; CHECK64-IZDINXZHINXMIN-NEXT: lwu a0, 0(a0)
|
; CHECK64-IZDINXZHINXMIN-NEXT: lw a0, 0(a0)
|
||||||
; CHECK64-IZDINXZHINXMIN-NEXT: fcvt.s.wu a0, a0
|
; CHECK64-IZDINXZHINXMIN-NEXT: fcvt.s.wu a0, a0
|
||||||
; CHECK64-IZDINXZHINXMIN-NEXT: fcvt.h.s a0, a0
|
; CHECK64-IZDINXZHINXMIN-NEXT: fcvt.h.s a0, a0
|
||||||
; CHECK64-IZDINXZHINXMIN-NEXT: ret
|
; CHECK64-IZDINXZHINXMIN-NEXT: ret
|
||||||
|
@ -3780,9 +3780,9 @@ define i32 @memcmp_size_5(ptr %s1, ptr %s2) nounwind optsize {
|
|||||||
;
|
;
|
||||||
; CHECK-UNALIGNED-RV64-ZBKB-LABEL: memcmp_size_5:
|
; CHECK-UNALIGNED-RV64-ZBKB-LABEL: memcmp_size_5:
|
||||||
; CHECK-UNALIGNED-RV64-ZBKB: # %bb.0: # %entry
|
; CHECK-UNALIGNED-RV64-ZBKB: # %bb.0: # %entry
|
||||||
; CHECK-UNALIGNED-RV64-ZBKB-NEXT: lwu a2, 0(a0)
|
; CHECK-UNALIGNED-RV64-ZBKB-NEXT: lw a2, 0(a0)
|
||||||
; CHECK-UNALIGNED-RV64-ZBKB-NEXT: lbu a0, 4(a0)
|
; CHECK-UNALIGNED-RV64-ZBKB-NEXT: lbu a0, 4(a0)
|
||||||
; CHECK-UNALIGNED-RV64-ZBKB-NEXT: lwu a3, 0(a1)
|
; CHECK-UNALIGNED-RV64-ZBKB-NEXT: lw a3, 0(a1)
|
||||||
; CHECK-UNALIGNED-RV64-ZBKB-NEXT: lbu a1, 4(a1)
|
; CHECK-UNALIGNED-RV64-ZBKB-NEXT: lbu a1, 4(a1)
|
||||||
; CHECK-UNALIGNED-RV64-ZBKB-NEXT: pack a0, a2, a0
|
; CHECK-UNALIGNED-RV64-ZBKB-NEXT: pack a0, a2, a0
|
||||||
; CHECK-UNALIGNED-RV64-ZBKB-NEXT: pack a1, a3, a1
|
; CHECK-UNALIGNED-RV64-ZBKB-NEXT: pack a1, a3, a1
|
||||||
@ -3985,9 +3985,9 @@ define i32 @memcmp_size_6(ptr %s1, ptr %s2) nounwind optsize {
|
|||||||
;
|
;
|
||||||
; CHECK-UNALIGNED-RV64-ZBKB-LABEL: memcmp_size_6:
|
; CHECK-UNALIGNED-RV64-ZBKB-LABEL: memcmp_size_6:
|
||||||
; CHECK-UNALIGNED-RV64-ZBKB: # %bb.0: # %entry
|
; CHECK-UNALIGNED-RV64-ZBKB: # %bb.0: # %entry
|
||||||
; CHECK-UNALIGNED-RV64-ZBKB-NEXT: lwu a2, 0(a0)
|
; CHECK-UNALIGNED-RV64-ZBKB-NEXT: lw a2, 0(a0)
|
||||||
; CHECK-UNALIGNED-RV64-ZBKB-NEXT: lhu a0, 4(a0)
|
; CHECK-UNALIGNED-RV64-ZBKB-NEXT: lhu a0, 4(a0)
|
||||||
; CHECK-UNALIGNED-RV64-ZBKB-NEXT: lwu a3, 0(a1)
|
; CHECK-UNALIGNED-RV64-ZBKB-NEXT: lw a3, 0(a1)
|
||||||
; CHECK-UNALIGNED-RV64-ZBKB-NEXT: lhu a1, 4(a1)
|
; CHECK-UNALIGNED-RV64-ZBKB-NEXT: lhu a1, 4(a1)
|
||||||
; CHECK-UNALIGNED-RV64-ZBKB-NEXT: pack a0, a2, a0
|
; CHECK-UNALIGNED-RV64-ZBKB-NEXT: pack a0, a2, a0
|
||||||
; CHECK-UNALIGNED-RV64-ZBKB-NEXT: pack a1, a3, a1
|
; CHECK-UNALIGNED-RV64-ZBKB-NEXT: pack a1, a3, a1
|
||||||
|
@ -4410,9 +4410,9 @@ define i32 @memcmp_size_5(ptr %s1, ptr %s2) nounwind {
|
|||||||
;
|
;
|
||||||
; CHECK-UNALIGNED-RV64-ZBKB-LABEL: memcmp_size_5:
|
; CHECK-UNALIGNED-RV64-ZBKB-LABEL: memcmp_size_5:
|
||||||
; CHECK-UNALIGNED-RV64-ZBKB: # %bb.0: # %entry
|
; CHECK-UNALIGNED-RV64-ZBKB: # %bb.0: # %entry
|
||||||
; CHECK-UNALIGNED-RV64-ZBKB-NEXT: lwu a2, 0(a0)
|
; CHECK-UNALIGNED-RV64-ZBKB-NEXT: lw a2, 0(a0)
|
||||||
; CHECK-UNALIGNED-RV64-ZBKB-NEXT: lbu a0, 4(a0)
|
; CHECK-UNALIGNED-RV64-ZBKB-NEXT: lbu a0, 4(a0)
|
||||||
; CHECK-UNALIGNED-RV64-ZBKB-NEXT: lwu a3, 0(a1)
|
; CHECK-UNALIGNED-RV64-ZBKB-NEXT: lw a3, 0(a1)
|
||||||
; CHECK-UNALIGNED-RV64-ZBKB-NEXT: lbu a1, 4(a1)
|
; CHECK-UNALIGNED-RV64-ZBKB-NEXT: lbu a1, 4(a1)
|
||||||
; CHECK-UNALIGNED-RV64-ZBKB-NEXT: pack a0, a2, a0
|
; CHECK-UNALIGNED-RV64-ZBKB-NEXT: pack a0, a2, a0
|
||||||
; CHECK-UNALIGNED-RV64-ZBKB-NEXT: pack a1, a3, a1
|
; CHECK-UNALIGNED-RV64-ZBKB-NEXT: pack a1, a3, a1
|
||||||
@ -4615,9 +4615,9 @@ define i32 @memcmp_size_6(ptr %s1, ptr %s2) nounwind {
|
|||||||
;
|
;
|
||||||
; CHECK-UNALIGNED-RV64-ZBKB-LABEL: memcmp_size_6:
|
; CHECK-UNALIGNED-RV64-ZBKB-LABEL: memcmp_size_6:
|
||||||
; CHECK-UNALIGNED-RV64-ZBKB: # %bb.0: # %entry
|
; CHECK-UNALIGNED-RV64-ZBKB: # %bb.0: # %entry
|
||||||
; CHECK-UNALIGNED-RV64-ZBKB-NEXT: lwu a2, 0(a0)
|
; CHECK-UNALIGNED-RV64-ZBKB-NEXT: lw a2, 0(a0)
|
||||||
; CHECK-UNALIGNED-RV64-ZBKB-NEXT: lhu a0, 4(a0)
|
; CHECK-UNALIGNED-RV64-ZBKB-NEXT: lhu a0, 4(a0)
|
||||||
; CHECK-UNALIGNED-RV64-ZBKB-NEXT: lwu a3, 0(a1)
|
; CHECK-UNALIGNED-RV64-ZBKB-NEXT: lw a3, 0(a1)
|
||||||
; CHECK-UNALIGNED-RV64-ZBKB-NEXT: lhu a1, 4(a1)
|
; CHECK-UNALIGNED-RV64-ZBKB-NEXT: lhu a1, 4(a1)
|
||||||
; CHECK-UNALIGNED-RV64-ZBKB-NEXT: pack a0, a2, a0
|
; CHECK-UNALIGNED-RV64-ZBKB-NEXT: pack a0, a2, a0
|
||||||
; CHECK-UNALIGNED-RV64-ZBKB-NEXT: pack a1, a3, a1
|
; CHECK-UNALIGNED-RV64-ZBKB-NEXT: pack a1, a3, a1
|
||||||
|
@ -239,8 +239,8 @@ body: |
|
|||||||
; NO-PREFER-W-INST-NEXT: {{ $}}
|
; NO-PREFER-W-INST-NEXT: {{ $}}
|
||||||
; NO-PREFER-W-INST-NEXT: [[COPY:%[0-9]+]]:gpr = COPY $x10
|
; NO-PREFER-W-INST-NEXT: [[COPY:%[0-9]+]]:gpr = COPY $x10
|
||||||
; NO-PREFER-W-INST-NEXT: [[COPY1:%[0-9]+]]:gpr = COPY $x11
|
; NO-PREFER-W-INST-NEXT: [[COPY1:%[0-9]+]]:gpr = COPY $x11
|
||||||
; NO-PREFER-W-INST-NEXT: [[LWU:%[0-9]+]]:gpr = LWU [[COPY]], 0
|
; NO-PREFER-W-INST-NEXT: [[LW:%[0-9]+]]:gpr = LW [[COPY]], 0
|
||||||
; NO-PREFER-W-INST-NEXT: [[ADDIW:%[0-9]+]]:gpr = ADDIW [[LWU]], 1
|
; NO-PREFER-W-INST-NEXT: [[ADDIW:%[0-9]+]]:gpr = ADDIW [[LW]], 1
|
||||||
; NO-PREFER-W-INST-NEXT: $x10 = COPY [[ADDIW]]
|
; NO-PREFER-W-INST-NEXT: $x10 = COPY [[ADDIW]]
|
||||||
; NO-PREFER-W-INST-NEXT: PseudoRET
|
; NO-PREFER-W-INST-NEXT: PseudoRET
|
||||||
;
|
;
|
||||||
|
@ -701,7 +701,7 @@ define signext i32 @ctpop_i32_load(ptr %p) nounwind {
|
|||||||
;
|
;
|
||||||
; RV64ZBB-LABEL: ctpop_i32_load:
|
; RV64ZBB-LABEL: ctpop_i32_load:
|
||||||
; RV64ZBB: # %bb.0:
|
; RV64ZBB: # %bb.0:
|
||||||
; RV64ZBB-NEXT: lwu a0, 0(a0)
|
; RV64ZBB-NEXT: lw a0, 0(a0)
|
||||||
; RV64ZBB-NEXT: cpopw a0, a0
|
; RV64ZBB-NEXT: cpopw a0, a0
|
||||||
; RV64ZBB-NEXT: ret
|
; RV64ZBB-NEXT: ret
|
||||||
%a = load i32, ptr %p
|
%a = load i32, ptr %p
|
||||||
|
@ -114,7 +114,7 @@ define i64 @pack_i64_3(ptr %0, ptr %1) {
|
|||||||
; RV64ZBKB-LABEL: pack_i64_3:
|
; RV64ZBKB-LABEL: pack_i64_3:
|
||||||
; RV64ZBKB: # %bb.0:
|
; RV64ZBKB: # %bb.0:
|
||||||
; RV64ZBKB-NEXT: lw a0, 0(a0)
|
; RV64ZBKB-NEXT: lw a0, 0(a0)
|
||||||
; RV64ZBKB-NEXT: lwu a1, 0(a1)
|
; RV64ZBKB-NEXT: lw a1, 0(a1)
|
||||||
; RV64ZBKB-NEXT: pack a0, a1, a0
|
; RV64ZBKB-NEXT: pack a0, a1, a0
|
||||||
; RV64ZBKB-NEXT: ret
|
; RV64ZBKB-NEXT: ret
|
||||||
%3 = load i32, ptr %0, align 4
|
%3 = load i32, ptr %0, align 4
|
||||||
|
@ -204,7 +204,7 @@ define <2 x i64> @mgather_v2i64_align4(<2 x ptr> %ptrs, <2 x i1> %m, <2 x i64> %
|
|||||||
; RV64-SLOW-NEXT: # %bb.1: # %cond.load
|
; RV64-SLOW-NEXT: # %bb.1: # %cond.load
|
||||||
; RV64-SLOW-NEXT: vsetvli zero, zero, e64, m8, tu, ma
|
; RV64-SLOW-NEXT: vsetvli zero, zero, e64, m8, tu, ma
|
||||||
; RV64-SLOW-NEXT: vmv.x.s a1, v8
|
; RV64-SLOW-NEXT: vmv.x.s a1, v8
|
||||||
; RV64-SLOW-NEXT: lwu a2, 4(a1)
|
; RV64-SLOW-NEXT: lw a2, 4(a1)
|
||||||
; RV64-SLOW-NEXT: lwu a1, 0(a1)
|
; RV64-SLOW-NEXT: lwu a1, 0(a1)
|
||||||
; RV64-SLOW-NEXT: slli a2, a2, 32
|
; RV64-SLOW-NEXT: slli a2, a2, 32
|
||||||
; RV64-SLOW-NEXT: or a1, a2, a1
|
; RV64-SLOW-NEXT: or a1, a2, a1
|
||||||
@ -216,7 +216,7 @@ define <2 x i64> @mgather_v2i64_align4(<2 x ptr> %ptrs, <2 x i1> %m, <2 x i64> %
|
|||||||
; RV64-SLOW-NEXT: vsetivli zero, 2, e64, m1, ta, ma
|
; RV64-SLOW-NEXT: vsetivli zero, 2, e64, m1, ta, ma
|
||||||
; RV64-SLOW-NEXT: vslidedown.vi v8, v8, 1
|
; RV64-SLOW-NEXT: vslidedown.vi v8, v8, 1
|
||||||
; RV64-SLOW-NEXT: vmv.x.s a0, v8
|
; RV64-SLOW-NEXT: vmv.x.s a0, v8
|
||||||
; RV64-SLOW-NEXT: lwu a1, 4(a0)
|
; RV64-SLOW-NEXT: lw a1, 4(a0)
|
||||||
; RV64-SLOW-NEXT: lwu a0, 0(a0)
|
; RV64-SLOW-NEXT: lwu a0, 0(a0)
|
||||||
; RV64-SLOW-NEXT: slli a1, a1, 32
|
; RV64-SLOW-NEXT: slli a1, a1, 32
|
||||||
; RV64-SLOW-NEXT: or a0, a1, a0
|
; RV64-SLOW-NEXT: or a0, a1, a0
|
||||||
|
@ -818,7 +818,7 @@ define <2 x i64> @vwaddu_vx_v2i64_i32(ptr %x, ptr %y) nounwind {
|
|||||||
; RV64: # %bb.0:
|
; RV64: # %bb.0:
|
||||||
; RV64-NEXT: vsetivli zero, 2, e32, mf2, ta, ma
|
; RV64-NEXT: vsetivli zero, 2, e32, mf2, ta, ma
|
||||||
; RV64-NEXT: vle32.v v9, (a0)
|
; RV64-NEXT: vle32.v v9, (a0)
|
||||||
; RV64-NEXT: lwu a0, 0(a1)
|
; RV64-NEXT: lw a0, 0(a1)
|
||||||
; RV64-NEXT: vwaddu.vx v8, v9, a0
|
; RV64-NEXT: vwaddu.vx v8, v9, a0
|
||||||
; RV64-NEXT: ret
|
; RV64-NEXT: ret
|
||||||
%a = load <2 x i32>, ptr %x
|
%a = load <2 x i32>, ptr %x
|
||||||
|
@ -853,7 +853,7 @@ define <2 x i64> @vwmulsu_vx_v2i64_i32(ptr %x, ptr %y) {
|
|||||||
; RV64: # %bb.0:
|
; RV64: # %bb.0:
|
||||||
; RV64-NEXT: vsetivli zero, 2, e32, mf2, ta, ma
|
; RV64-NEXT: vsetivli zero, 2, e32, mf2, ta, ma
|
||||||
; RV64-NEXT: vle32.v v9, (a0)
|
; RV64-NEXT: vle32.v v9, (a0)
|
||||||
; RV64-NEXT: lwu a0, 0(a1)
|
; RV64-NEXT: lw a0, 0(a1)
|
||||||
; RV64-NEXT: vwmulsu.vx v8, v9, a0
|
; RV64-NEXT: vwmulsu.vx v8, v9, a0
|
||||||
; RV64-NEXT: ret
|
; RV64-NEXT: ret
|
||||||
%a = load <2 x i32>, ptr %x
|
%a = load <2 x i32>, ptr %x
|
||||||
|
@ -710,13 +710,6 @@ define <4 x i32> @vwmulu_vx_v4i32_i8(ptr %x, ptr %y) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
define <4 x i32> @vwmulu_vx_v4i32_i16(ptr %x, ptr %y) {
|
define <4 x i32> @vwmulu_vx_v4i32_i16(ptr %x, ptr %y) {
|
||||||
; CHECK-LABEL: vwmulu_vx_v4i32_i16:
|
|
||||||
; CHECK: # %bb.0:
|
|
||||||
; CHECK-NEXT: vsetivli zero, 4, e16, mf2, ta, ma
|
|
||||||
; CHECK-NEXT: vle16.v v9, (a0)
|
|
||||||
; CHECK-NEXT: lhu a0, 0(a1)
|
|
||||||
; CHECK-NEXT: vwmulu.vx v8, v9, a0
|
|
||||||
; CHECK-NEXT: ret
|
|
||||||
%a = load <4 x i16>, ptr %x
|
%a = load <4 x i16>, ptr %x
|
||||||
%b = load i16, ptr %y
|
%b = load i16, ptr %y
|
||||||
%c = zext i16 %b to i32
|
%c = zext i16 %b to i32
|
||||||
|
@ -821,7 +821,7 @@ define <2 x i64> @vwsubu_vx_v2i64_i32(ptr %x, ptr %y) nounwind {
|
|||||||
;
|
;
|
||||||
; RV64-LABEL: vwsubu_vx_v2i64_i32:
|
; RV64-LABEL: vwsubu_vx_v2i64_i32:
|
||||||
; RV64: # %bb.0:
|
; RV64: # %bb.0:
|
||||||
; RV64-NEXT: lwu a1, 0(a1)
|
; RV64-NEXT: lw a1, 0(a1)
|
||||||
; RV64-NEXT: vsetivli zero, 2, e32, mf2, ta, ma
|
; RV64-NEXT: vsetivli zero, 2, e32, mf2, ta, ma
|
||||||
; RV64-NEXT: vle32.v v9, (a0)
|
; RV64-NEXT: vle32.v v9, (a0)
|
||||||
; RV64-NEXT: vmv.v.x v10, a1
|
; RV64-NEXT: vmv.v.x v10, a1
|
||||||
|
@ -242,7 +242,7 @@ define void @foo7(ptr nocapture %p) nounwind {
|
|||||||
; RV64ZDINX: # %bb.0: # %entry
|
; RV64ZDINX: # %bb.0: # %entry
|
||||||
; RV64ZDINX-NEXT: lui a1, %hi(d)
|
; RV64ZDINX-NEXT: lui a1, %hi(d)
|
||||||
; RV64ZDINX-NEXT: addi a2, a1, %lo(d)
|
; RV64ZDINX-NEXT: addi a2, a1, %lo(d)
|
||||||
; RV64ZDINX-NEXT: lwu a2, 8(a2)
|
; RV64ZDINX-NEXT: lw a2, 8(a2)
|
||||||
; RV64ZDINX-NEXT: lwu a1, %lo(d+4)(a1)
|
; RV64ZDINX-NEXT: lwu a1, %lo(d+4)(a1)
|
||||||
; RV64ZDINX-NEXT: slli a2, a2, 32
|
; RV64ZDINX-NEXT: slli a2, a2, 32
|
||||||
; RV64ZDINX-NEXT: or a1, a2, a1
|
; RV64ZDINX-NEXT: or a1, a2, a1
|
||||||
@ -337,7 +337,7 @@ define void @foo9(ptr nocapture %p) nounwind {
|
|||||||
; RV64ZDINX: # %bb.0: # %entry
|
; RV64ZDINX: # %bb.0: # %entry
|
||||||
; RV64ZDINX-NEXT: lui a1, %hi(e)
|
; RV64ZDINX-NEXT: lui a1, %hi(e)
|
||||||
; RV64ZDINX-NEXT: addi a2, a1, %lo(e)
|
; RV64ZDINX-NEXT: addi a2, a1, %lo(e)
|
||||||
; RV64ZDINX-NEXT: lwu a2, 4(a2)
|
; RV64ZDINX-NEXT: lw a2, 4(a2)
|
||||||
; RV64ZDINX-NEXT: lwu a1, %lo(e)(a1)
|
; RV64ZDINX-NEXT: lwu a1, %lo(e)(a1)
|
||||||
; RV64ZDINX-NEXT: slli a2, a2, 32
|
; RV64ZDINX-NEXT: slli a2, a2, 32
|
||||||
; RV64ZDINX-NEXT: or a1, a2, a1
|
; RV64ZDINX-NEXT: or a1, a2, a1
|
||||||
@ -480,7 +480,7 @@ define double @foo13(ptr nocapture %p) nounwind {
|
|||||||
; RV64ZDINX-LABEL: foo13:
|
; RV64ZDINX-LABEL: foo13:
|
||||||
; RV64ZDINX: # %bb.0: # %entry
|
; RV64ZDINX: # %bb.0: # %entry
|
||||||
; RV64ZDINX-NEXT: lui a0, %hi(f)
|
; RV64ZDINX-NEXT: lui a0, %hi(f)
|
||||||
; RV64ZDINX-NEXT: lwu a1, %lo(f+8)(a0)
|
; RV64ZDINX-NEXT: lw a1, %lo(f+8)(a0)
|
||||||
; RV64ZDINX-NEXT: lwu a0, %lo(f+4)(a0)
|
; RV64ZDINX-NEXT: lwu a0, %lo(f+4)(a0)
|
||||||
; RV64ZDINX-NEXT: slli a1, a1, 32
|
; RV64ZDINX-NEXT: slli a1, a1, 32
|
||||||
; RV64ZDINX-NEXT: or a0, a1, a0
|
; RV64ZDINX-NEXT: or a0, a1, a0
|
||||||
|
Loading…
x
Reference in New Issue
Block a user