Index: llvm/lib/Target/RISCV/AsmParser/RISCVAsmParser.cpp =================================================================== --- llvm/lib/Target/RISCV/AsmParser/RISCVAsmParser.cpp +++ llvm/lib/Target/RISCV/AsmParser/RISCVAsmParser.cpp @@ -2176,11 +2176,6 @@ if (Inst.Opc == RISCV::LUI) { emitToStreamer( Out, MCInstBuilder(RISCV::LUI).addReg(DestReg).addImm(Inst.Imm)); - } else if (Inst.Opc == RISCV::ADDUW) { - emitToStreamer(Out, MCInstBuilder(RISCV::ADDUW) - .addReg(DestReg) - .addReg(SrcReg) - .addReg(RISCV::X0)); } else if (Inst.Opc == RISCV::SH1ADD || Inst.Opc == RISCV::SH2ADD || Inst.Opc == RISCV::SH3ADD) { emitToStreamer( Index: llvm/lib/Target/RISCV/MCTargetDesc/RISCVMatInt.cpp =================================================================== --- llvm/lib/Target/RISCV/MCTargetDesc/RISCVMatInt.cpp +++ llvm/lib/Target/RISCV/MCTargetDesc/RISCVMatInt.cpp @@ -192,7 +192,7 @@ uint64_t LeadingOnesVal = Val | maskLeadingOnes(LeadingZeros); TmpSeq.clear(); generateInstSeqImpl(LeadingOnesVal, ActiveFeatures, TmpSeq); - TmpSeq.push_back(RISCVMatInt::Inst(RISCV::ADDUW, 0)); + TmpSeq.push_back(RISCVMatInt::Inst(RISCV::SLLIUW, 0)); // Keep the new sequence if it is an improvement. if (TmpSeq.size() < Res.size()) { Index: llvm/lib/Target/RISCV/RISCVISelDAGToDAG.cpp =================================================================== --- llvm/lib/Target/RISCV/RISCVISelDAGToDAG.cpp +++ llvm/lib/Target/RISCV/RISCVISelDAGToDAG.cpp @@ -137,9 +137,6 @@ SDValue SDImm = CurDAG->getTargetConstant(Inst.Imm, DL, XLenVT); if (Inst.Opc == RISCV::LUI) Result = CurDAG->getMachineNode(RISCV::LUI, DL, XLenVT, SDImm); - else if (Inst.Opc == RISCV::ADDUW) - Result = CurDAG->getMachineNode(RISCV::ADDUW, DL, XLenVT, SrcReg, - CurDAG->getRegister(RISCV::X0, XLenVT)); else if (Inst.Opc == RISCV::SH1ADD || Inst.Opc == RISCV::SH2ADD || Inst.Opc == RISCV::SH3ADD) Result = CurDAG->getMachineNode(Inst.Opc, DL, XLenVT, SrcReg, SrcReg); Index: llvm/lib/Target/RISCV/RISCVInstrInfo.cpp =================================================================== --- llvm/lib/Target/RISCV/RISCVInstrInfo.cpp +++ llvm/lib/Target/RISCV/RISCVInstrInfo.cpp @@ -651,11 +651,6 @@ BuildMI(MBB, MBBI, DL, get(RISCV::LUI), Result) .addImm(Inst.Imm) .setMIFlag(Flag); - } else if (Inst.Opc == RISCV::ADDUW) { - BuildMI(MBB, MBBI, DL, get(RISCV::ADDUW), Result) - .addReg(SrcReg, RegState::Kill) - .addReg(RISCV::X0) - .setMIFlag(Flag); } else if (Inst.Opc == RISCV::SH1ADD || Inst.Opc == RISCV::SH2ADD || Inst.Opc == RISCV::SH3ADD) { BuildMI(MBB, MBBI, DL, get(Inst.Opc), Result) Index: llvm/lib/Target/RISCV/RISCVInstrInfoZb.td =================================================================== --- llvm/lib/Target/RISCV/RISCVInstrInfoZb.td +++ llvm/lib/Target/RISCV/RISCVInstrInfoZb.td @@ -606,6 +606,7 @@ let Predicates = [HasStdExtZba, IsRV64] in { def : InstAlias<"zext.w $rd, $rs", (ADDUW GPR:$rd, GPR:$rs, X0)>; +def : InstAlias<"zexti32 $rd, $rs", (SLLIUW GPR:$rd, GPR:$rs, 0)>; } let Predicates = [HasStdExtZbp] in { Index: llvm/test/CodeGen/RISCV/imm.ll =================================================================== --- llvm/test/CodeGen/RISCV/imm.ll +++ llvm/test/CodeGen/RISCV/imm.ll @@ -1412,7 +1412,7 @@ ; RV64IZBA: # %bb.0: ; RV64IZBA-NEXT: lui a0, 699051 ; RV64IZBA-NEXT: addiw a0, a0, -1366 -; RV64IZBA-NEXT: zext.w a0, a0 +; RV64IZBA-NEXT: zexti32 a0, a0 ; RV64IZBA-NEXT: ret ; ; RV64IZBS-LABEL: imm_2863311530: Index: llvm/test/CodeGen/RISCV/rv64zba.ll =================================================================== --- llvm/test/CodeGen/RISCV/rv64zba.ll +++ llvm/test/CodeGen/RISCV/rv64zba.ll @@ -710,7 +710,7 @@ ; RV64ZBA-LABEL: imm_zextw: ; RV64ZBA: # %bb.0: ; RV64ZBA-NEXT: addi a0, zero, -2 -; RV64ZBA-NEXT: zext.w a0, a0 +; RV64ZBA-NEXT: zexti32 a0, a0 ; RV64ZBA-NEXT: ret ret i64 4294967294 ; -2 in 32 bits. } @@ -728,7 +728,7 @@ ; RV64ZBA: # %bb.0: ; RV64ZBA-NEXT: lui a0, 699051 ; RV64ZBA-NEXT: addiw a0, a0, -1366 -; RV64ZBA-NEXT: zext.w a0, a0 +; RV64ZBA-NEXT: zexti32 a0, a0 ; RV64ZBA-NEXT: ret ret i64 2863311530 ; 0xAAAAAAAA } Index: llvm/test/MC/RISCV/rv64zba-aliases-valid.s =================================================================== --- llvm/test/MC/RISCV/rv64zba-aliases-valid.s +++ llvm/test/MC/RISCV/rv64zba-aliases-valid.s @@ -19,18 +19,22 @@ # CHECK-S-OBJ: zext.w t0, t1 zext.w x5, x6 +# CHECK-S-OBJ-NOALIAS: slli.uw t0, t1, 0 +# CHECK-S-OBJ: zexti32 t0, t1 +zexti32 x5, x6 + # CHECK-S-OBJ-NOALIAS: addi t1, zero, -2 -# CHECK-S-OBJ-NOALIAS-NEXT: add.uw t1, t1, zero +# CHECK-S-OBJ-NOALIAS-NEXT: slli.uw t1, t1, 0 # CHECK-S-OBJ: addi t1, zero, -2 -# CHECK-S-OBJ-NEXT: zext.w t1, t1 +# CHECK-S-OBJ-NEXT: zexti32 t1, t1 li x6, 0xfffffffe # CHECK-S-OBJ-NOALIAS: lui t2, 699051 # CHECK-S-OBJ-NOALIAS-NEXT: addiw t2, t2, -1366 -# CHECK-S-OBJ-NOALIAS-NEXT: add.uw t2, t2, zero +# CHECK-S-OBJ-NOALIAS-NEXT: slli.uw t2, t2, 0 # CHECK-S-OBJ: lui t2, 699051 # CHECK-S-OBJ-NEXT: addiw t2, t2, -1366 -# CHECK-S-OBJ-NEXT: zext.w t2, t2 +# CHECK-S-OBJ-NEXT: zexti32 t2, t2 li x7, 0xaaaaaaaa # CHECK-S-OBJ-NOALIAS: lui t0, 768955 Index: llvm/test/MC/RISCV/rv64zba-valid.s =================================================================== --- llvm/test/MC/RISCV/rv64zba-valid.s +++ llvm/test/MC/RISCV/rv64zba-valid.s @@ -5,7 +5,10 @@ # RUN: | llvm-objdump --mattr=+experimental-zba -d -r - \ # RUN: | FileCheck --check-prefix=CHECK-ASM-AND-OBJ %s -# CHECK-ASM-AND-OBJ: slli.uw t0, t1, 0 +# CHECK-ASM-AND-OBJ: slli.uw t0, t1, 1 +# CHECK-ASM: encoding: [0x9b,0x12,0x13,0x08] +slli.uw t0, t1, 1 +# CHECK-ASM-AND-OBJ: zexti32 t0, t1 # CHECK-ASM: encoding: [0x9b,0x12,0x03,0x08] slli.uw t0, t1, 0 # CHECK-ASM-AND-OBJ: add.uw t0, t1, t2