((Imm - 2).isPowerOf2() || (Imm - 4).isPowerOf2() ||
(Imm - 8).isPowerOf2()))
return true;
- // Omit the following optimization if the sub target has the M extension
- // and the data size >= XLen.
- if (HasExtMOrZmmul && VT.getSizeInBits() >= Subtarget.getXLen())
- return false;
// Break the MUL to two SLLI instructions and an ADD/SUB, if Imm needs
// a pair of LUI/ADDI.
- if (!Imm.isSignedIntN(12) && Imm.countr_zero() < 12) {
+ if (!Imm.isSignedIntN(12) && Imm.countr_zero() < 12 &&
+ ConstNode->hasOneUse()) {
APInt ImmS = Imm.ashr(Imm.countr_zero());
if ((ImmS + 1).isPowerOf2() || (ImmS - 1).isPowerOf2() ||
(1 - ImmS).isPowerOf2())
;
; RV32IM-LABEL: muli32_p4352:
; RV32IM: # %bb.0:
-; RV32IM-NEXT: li a1, 17
-; RV32IM-NEXT: slli a1, a1, 8
-; RV32IM-NEXT: mul a0, a0, a1
+; RV32IM-NEXT: slli a1, a0, 8
+; RV32IM-NEXT: slli a0, a0, 12
+; RV32IM-NEXT: add a0, a0, a1
; RV32IM-NEXT: ret
;
; RV64I-LABEL: muli32_p4352:
;
; RV32IM-LABEL: muli32_p3840:
; RV32IM: # %bb.0:
-; RV32IM-NEXT: li a1, 15
-; RV32IM-NEXT: slli a1, a1, 8
-; RV32IM-NEXT: mul a0, a0, a1
+; RV32IM-NEXT: slli a1, a0, 8
+; RV32IM-NEXT: slli a0, a0, 12
+; RV32IM-NEXT: sub a0, a0, a1
; RV32IM-NEXT: ret
;
; RV64I-LABEL: muli32_p3840:
;
; RV32IM-LABEL: muli32_m3840:
; RV32IM: # %bb.0:
-; RV32IM-NEXT: li a1, -15
-; RV32IM-NEXT: slli a1, a1, 8
-; RV32IM-NEXT: mul a0, a0, a1
+; RV32IM-NEXT: slli a1, a0, 12
+; RV32IM-NEXT: slli a0, a0, 8
+; RV32IM-NEXT: sub a0, a0, a1
; RV32IM-NEXT: ret
;
; RV64I-LABEL: muli32_m3840:
;
; RV64IM-LABEL: muli64_p4352:
; RV64IM: # %bb.0:
-; RV64IM-NEXT: li a1, 17
-; RV64IM-NEXT: slli a1, a1, 8
-; RV64IM-NEXT: mul a0, a0, a1
+; RV64IM-NEXT: slli a1, a0, 8
+; RV64IM-NEXT: slli a0, a0, 12
+; RV64IM-NEXT: add a0, a0, a1
; RV64IM-NEXT: ret
%1 = mul i64 %a, 4352
ret i64 %1
;
; RV64IM-LABEL: muli64_p3840:
; RV64IM: # %bb.0:
-; RV64IM-NEXT: li a1, 15
-; RV64IM-NEXT: slli a1, a1, 8
-; RV64IM-NEXT: mul a0, a0, a1
+; RV64IM-NEXT: slli a1, a0, 8
+; RV64IM-NEXT: slli a0, a0, 12
+; RV64IM-NEXT: sub a0, a0, a1
; RV64IM-NEXT: ret
%1 = mul i64 %a, 3840
ret i64 %1
;
; RV64IM-LABEL: muli64_m3840:
; RV64IM: # %bb.0:
-; RV64IM-NEXT: li a1, -15
-; RV64IM-NEXT: slli a1, a1, 8
-; RV64IM-NEXT: mul a0, a0, a1
+; RV64IM-NEXT: slli a1, a0, 12
+; RV64IM-NEXT: slli a0, a0, 8
+; RV64IM-NEXT: sub a0, a0, a1
; RV64IM-NEXT: ret
%1 = mul i64 %a, -3840
ret i64 %1
define i32 @mul4098(i32 %a) {
; RV32I-LABEL: mul4098:
; RV32I: # %bb.0:
-; RV32I-NEXT: lui a1, 1
-; RV32I-NEXT: addi a1, a1, 2
-; RV32I-NEXT: mul a0, a0, a1
+; RV32I-NEXT: slli a1, a0, 1
+; RV32I-NEXT: slli a0, a0, 12
+; RV32I-NEXT: add a0, a0, a1
; RV32I-NEXT: ret
;
; RV32ZBA-LABEL: mul4098:
define i32 @mul4100(i32 %a) {
; RV32I-LABEL: mul4100:
; RV32I: # %bb.0:
-; RV32I-NEXT: lui a1, 1
-; RV32I-NEXT: addi a1, a1, 4
-; RV32I-NEXT: mul a0, a0, a1
+; RV32I-NEXT: slli a1, a0, 2
+; RV32I-NEXT: slli a0, a0, 12
+; RV32I-NEXT: add a0, a0, a1
; RV32I-NEXT: ret
;
; RV32ZBA-LABEL: mul4100:
define i32 @mul4104(i32 %a) {
; RV32I-LABEL: mul4104:
; RV32I: # %bb.0:
-; RV32I-NEXT: lui a1, 1
-; RV32I-NEXT: addi a1, a1, 8
-; RV32I-NEXT: mul a0, a0, a1
+; RV32I-NEXT: slli a1, a0, 3
+; RV32I-NEXT: slli a0, a0, 12
+; RV32I-NEXT: add a0, a0, a1
; RV32I-NEXT: ret
;
; RV32ZBA-LABEL: mul4104:
define i64 @mul4098(i64 %a) {
; RV64I-LABEL: mul4098:
; RV64I: # %bb.0:
-; RV64I-NEXT: lui a1, 1
-; RV64I-NEXT: addiw a1, a1, 2
-; RV64I-NEXT: mul a0, a0, a1
+; RV64I-NEXT: slli a1, a0, 1
+; RV64I-NEXT: slli a0, a0, 12
+; RV64I-NEXT: add a0, a0, a1
; RV64I-NEXT: ret
;
; RV64ZBA-LABEL: mul4098:
define i64 @mul4100(i64 %a) {
; RV64I-LABEL: mul4100:
; RV64I: # %bb.0:
-; RV64I-NEXT: lui a1, 1
-; RV64I-NEXT: addiw a1, a1, 4
-; RV64I-NEXT: mul a0, a0, a1
+; RV64I-NEXT: slli a1, a0, 2
+; RV64I-NEXT: slli a0, a0, 12
+; RV64I-NEXT: add a0, a0, a1
; RV64I-NEXT: ret
;
; RV64ZBA-LABEL: mul4100:
define i64 @mul4104(i64 %a) {
; RV64I-LABEL: mul4104:
; RV64I: # %bb.0:
-; RV64I-NEXT: lui a1, 1
-; RV64I-NEXT: addiw a1, a1, 8
-; RV64I-NEXT: mul a0, a0, a1
+; RV64I-NEXT: slli a1, a0, 3
+; RV64I-NEXT: slli a0, a0, 12
+; RV64I-NEXT: add a0, a0, a1
; RV64I-NEXT: ret
;
; RV64ZBA-LABEL: mul4104: