Index: llvm/test/CodeGen/LoongArch/ir-instruction/mul.ll =================================================================== --- llvm/test/CodeGen/LoongArch/ir-instruction/mul.ll +++ llvm/test/CodeGen/LoongArch/ir-instruction/mul.ll @@ -284,3 +284,507 @@ %3 = mul i64 %1, %2 ret i64 %3 } + +define signext i32 @mul_i32_11(i32 %a) { +; LA32-LABEL: mul_i32_11: +; LA32: # %bb.0: +; LA32-NEXT: ori $a1, $zero, 11 +; LA32-NEXT: mul.w $a0, $a0, $a1 +; LA32-NEXT: ret +; +; LA64-LABEL: mul_i32_11: +; LA64: # %bb.0: +; LA64-NEXT: ori $a1, $zero, 11 +; LA64-NEXT: mul.d $a0, $a0, $a1 +; LA64-NEXT: addi.w $a0, $a0, 0 +; LA64-NEXT: ret + %b = mul i32 %a, 11 + ret i32 %b +} + +define signext i32 @mul_i32_13(i32 %a) { +; LA32-LABEL: mul_i32_13: +; LA32: # %bb.0: +; LA32-NEXT: ori $a1, $zero, 13 +; LA32-NEXT: mul.w $a0, $a0, $a1 +; LA32-NEXT: ret +; +; LA64-LABEL: mul_i32_13: +; LA64: # %bb.0: +; LA64-NEXT: ori $a1, $zero, 13 +; LA64-NEXT: mul.d $a0, $a0, $a1 +; LA64-NEXT: addi.w $a0, $a0, 0 +; LA64-NEXT: ret + %b = mul i32 %a, 13 + ret i32 %b +} + +define signext i32 @mul_i32_19(i32 %a) { +; LA32-LABEL: mul_i32_19: +; LA32: # %bb.0: +; LA32-NEXT: ori $a1, $zero, 19 +; LA32-NEXT: mul.w $a0, $a0, $a1 +; LA32-NEXT: ret +; +; LA64-LABEL: mul_i32_19: +; LA64: # %bb.0: +; LA64-NEXT: ori $a1, $zero, 19 +; LA64-NEXT: mul.d $a0, $a0, $a1 +; LA64-NEXT: addi.w $a0, $a0, 0 +; LA64-NEXT: ret + %b = mul i32 %a, 19 + ret i32 %b +} + +define signext i32 @mul_i32_21(i32 %a) { +; LA32-LABEL: mul_i32_21: +; LA32: # %bb.0: +; LA32-NEXT: ori $a1, $zero, 21 +; LA32-NEXT: mul.w $a0, $a0, $a1 +; LA32-NEXT: ret +; +; LA64-LABEL: mul_i32_21: +; LA64: # %bb.0: +; LA64-NEXT: ori $a1, $zero, 21 +; LA64-NEXT: mul.d $a0, $a0, $a1 +; LA64-NEXT: addi.w $a0, $a0, 0 +; LA64-NEXT: ret + %b = mul i32 %a, 21 + ret i32 %b +} + +define signext i32 @mul_i32_25(i32 %a) { +; LA32-LABEL: mul_i32_25: +; LA32: # %bb.0: +; LA32-NEXT: ori $a1, $zero, 25 +; LA32-NEXT: mul.w $a0, $a0, $a1 +; LA32-NEXT: ret +; +; LA64-LABEL: mul_i32_25: +; LA64: # %bb.0: +; LA64-NEXT: ori $a1, $zero, 25 +; LA64-NEXT: mul.d $a0, $a0, $a1 +; LA64-NEXT: addi.w $a0, $a0, 0 +; LA64-NEXT: ret + %b = mul i32 %a, 25 + ret i32 %b +} + +define signext i32 @mul_i32_35(i32 %a) { +; LA32-LABEL: mul_i32_35: +; LA32: # %bb.0: +; LA32-NEXT: ori $a1, $zero, 35 +; LA32-NEXT: mul.w $a0, $a0, $a1 +; LA32-NEXT: ret +; +; LA64-LABEL: mul_i32_35: +; LA64: # %bb.0: +; LA64-NEXT: ori $a1, $zero, 35 +; LA64-NEXT: mul.d $a0, $a0, $a1 +; LA64-NEXT: addi.w $a0, $a0, 0 +; LA64-NEXT: ret + %b = mul i32 %a, 35 + ret i32 %b +} + +define signext i32 @mul_i32_37(i32 %a) { +; LA32-LABEL: mul_i32_37: +; LA32: # %bb.0: +; LA32-NEXT: ori $a1, $zero, 37 +; LA32-NEXT: mul.w $a0, $a0, $a1 +; LA32-NEXT: ret +; +; LA64-LABEL: mul_i32_37: +; LA64: # %bb.0: +; LA64-NEXT: ori $a1, $zero, 37 +; LA64-NEXT: mul.d $a0, $a0, $a1 +; LA64-NEXT: addi.w $a0, $a0, 0 +; LA64-NEXT: ret + %b = mul i32 %a, 37 + ret i32 %b +} + +define signext i32 @mul_i32_41(i32 %a) { +; LA32-LABEL: mul_i32_41: +; LA32: # %bb.0: +; LA32-NEXT: ori $a1, $zero, 41 +; LA32-NEXT: mul.w $a0, $a0, $a1 +; LA32-NEXT: ret +; +; LA64-LABEL: mul_i32_41: +; LA64: # %bb.0: +; LA64-NEXT: ori $a1, $zero, 41 +; LA64-NEXT: mul.d $a0, $a0, $a1 +; LA64-NEXT: addi.w $a0, $a0, 0 +; LA64-NEXT: ret + %b = mul i32 %a, 41 + ret i32 %b +} + +define signext i32 @mul_i32_49(i32 %a) { +; LA32-LABEL: mul_i32_49: +; LA32: # %bb.0: +; LA32-NEXT: ori $a1, $zero, 49 +; LA32-NEXT: mul.w $a0, $a0, $a1 +; LA32-NEXT: ret +; +; LA64-LABEL: mul_i32_49: +; LA64: # %bb.0: +; LA64-NEXT: ori $a1, $zero, 49 +; LA64-NEXT: mul.d $a0, $a0, $a1 +; LA64-NEXT: addi.w $a0, $a0, 0 +; LA64-NEXT: ret + %b = mul i32 %a, 49 + ret i32 %b +} + +define signext i32 @mul_i32_69(i32 %a) { +; LA32-LABEL: mul_i32_69: +; LA32: # %bb.0: +; LA32-NEXT: ori $a1, $zero, 69 +; LA32-NEXT: mul.w $a0, $a0, $a1 +; LA32-NEXT: ret +; +; LA64-LABEL: mul_i32_69: +; LA64: # %bb.0: +; LA64-NEXT: ori $a1, $zero, 69 +; LA64-NEXT: mul.d $a0, $a0, $a1 +; LA64-NEXT: addi.w $a0, $a0, 0 +; LA64-NEXT: ret + %b = mul i32 %a, 69 + ret i32 %b +} + +define signext i32 @mul_i32_73(i32 %a) { +; LA32-LABEL: mul_i32_73: +; LA32: # %bb.0: +; LA32-NEXT: ori $a1, $zero, 73 +; LA32-NEXT: mul.w $a0, $a0, $a1 +; LA32-NEXT: ret +; +; LA64-LABEL: mul_i32_73: +; LA64: # %bb.0: +; LA64-NEXT: ori $a1, $zero, 73 +; LA64-NEXT: mul.d $a0, $a0, $a1 +; LA64-NEXT: addi.w $a0, $a0, 0 +; LA64-NEXT: ret + %b = mul i32 %a, 73 + ret i32 %b +} + +define signext i32 @mul_i32_137(i32 %a) { +; LA32-LABEL: mul_i32_137: +; LA32: # %bb.0: +; LA32-NEXT: ori $a1, $zero, 137 +; LA32-NEXT: mul.w $a0, $a0, $a1 +; LA32-NEXT: ret +; +; LA64-LABEL: mul_i32_137: +; LA64: # %bb.0: +; LA64-NEXT: ori $a1, $zero, 137 +; LA64-NEXT: mul.d $a0, $a0, $a1 +; LA64-NEXT: addi.w $a0, $a0, 0 +; LA64-NEXT: ret + %b = mul i32 %a, 137 + ret i32 %b +} + +define signext i32 @mul_i32_145(i32 %a) { +; LA32-LABEL: mul_i32_145: +; LA32: # %bb.0: +; LA32-NEXT: ori $a1, $zero, 145 +; LA32-NEXT: mul.w $a0, $a0, $a1 +; LA32-NEXT: ret +; +; LA64-LABEL: mul_i32_145: +; LA64: # %bb.0: +; LA64-NEXT: ori $a1, $zero, 145 +; LA64-NEXT: mul.d $a0, $a0, $a1 +; LA64-NEXT: addi.w $a0, $a0, 0 +; LA64-NEXT: ret + %b = mul i32 %a, 145 + ret i32 %b +} + +define signext i32 @mul_i32_273(i32 %a) { +; LA32-LABEL: mul_i32_273: +; LA32: # %bb.0: +; LA32-NEXT: ori $a1, $zero, 273 +; LA32-NEXT: mul.w $a0, $a0, $a1 +; LA32-NEXT: ret +; +; LA64-LABEL: mul_i32_273: +; LA64: # %bb.0: +; LA64-NEXT: ori $a1, $zero, 273 +; LA64-NEXT: mul.d $a0, $a0, $a1 +; LA64-NEXT: addi.w $a0, $a0, 0 +; LA64-NEXT: ret + %b = mul i32 %a, 273 + ret i32 %b +} + +define i64 @mul_i64_11(i64 %a) { +; LA32-LABEL: mul_i64_11: +; LA32: # %bb.0: +; LA32-NEXT: ori $a2, $zero, 11 +; LA32-NEXT: mul.w $a1, $a1, $a2 +; LA32-NEXT: mulh.wu $a3, $a0, $a2 +; LA32-NEXT: add.w $a1, $a3, $a1 +; LA32-NEXT: mul.w $a0, $a0, $a2 +; LA32-NEXT: ret +; +; LA64-LABEL: mul_i64_11: +; LA64: # %bb.0: +; LA64-NEXT: ori $a1, $zero, 11 +; LA64-NEXT: mul.d $a0, $a0, $a1 +; LA64-NEXT: ret + %b = mul i64 %a, 11 + ret i64 %b +} + +define i64 @mul_i64_13(i64 %a) { +; LA32-LABEL: mul_i64_13: +; LA32: # %bb.0: +; LA32-NEXT: ori $a2, $zero, 13 +; LA32-NEXT: mul.w $a1, $a1, $a2 +; LA32-NEXT: mulh.wu $a3, $a0, $a2 +; LA32-NEXT: add.w $a1, $a3, $a1 +; LA32-NEXT: mul.w $a0, $a0, $a2 +; LA32-NEXT: ret +; +; LA64-LABEL: mul_i64_13: +; LA64: # %bb.0: +; LA64-NEXT: ori $a1, $zero, 13 +; LA64-NEXT: mul.d $a0, $a0, $a1 +; LA64-NEXT: ret + %b = mul i64 %a, 13 + ret i64 %b +} + +define i64 @mul_i64_19(i64 %a) { +; LA32-LABEL: mul_i64_19: +; LA32: # %bb.0: +; LA32-NEXT: ori $a2, $zero, 19 +; LA32-NEXT: mul.w $a1, $a1, $a2 +; LA32-NEXT: mulh.wu $a3, $a0, $a2 +; LA32-NEXT: add.w $a1, $a3, $a1 +; LA32-NEXT: mul.w $a0, $a0, $a2 +; LA32-NEXT: ret +; +; LA64-LABEL: mul_i64_19: +; LA64: # %bb.0: +; LA64-NEXT: ori $a1, $zero, 19 +; LA64-NEXT: mul.d $a0, $a0, $a1 +; LA64-NEXT: ret + %b = mul i64 %a, 19 + ret i64 %b +} + +define i64 @mul_i64_21(i64 %a) { +; LA32-LABEL: mul_i64_21: +; LA32: # %bb.0: +; LA32-NEXT: ori $a2, $zero, 21 +; LA32-NEXT: mul.w $a1, $a1, $a2 +; LA32-NEXT: mulh.wu $a3, $a0, $a2 +; LA32-NEXT: add.w $a1, $a3, $a1 +; LA32-NEXT: mul.w $a0, $a0, $a2 +; LA32-NEXT: ret +; +; LA64-LABEL: mul_i64_21: +; LA64: # %bb.0: +; LA64-NEXT: ori $a1, $zero, 21 +; LA64-NEXT: mul.d $a0, $a0, $a1 +; LA64-NEXT: ret + %b = mul i64 %a, 21 + ret i64 %b +} + +define i64 @mul_i64_25(i64 %a) { +; LA32-LABEL: mul_i64_25: +; LA32: # %bb.0: +; LA32-NEXT: ori $a2, $zero, 25 +; LA32-NEXT: mul.w $a1, $a1, $a2 +; LA32-NEXT: mulh.wu $a3, $a0, $a2 +; LA32-NEXT: add.w $a1, $a3, $a1 +; LA32-NEXT: mul.w $a0, $a0, $a2 +; LA32-NEXT: ret +; +; LA64-LABEL: mul_i64_25: +; LA64: # %bb.0: +; LA64-NEXT: ori $a1, $zero, 25 +; LA64-NEXT: mul.d $a0, $a0, $a1 +; LA64-NEXT: ret + %b = mul i64 %a, 25 + ret i64 %b +} + +define i64 @mul_i64_35(i64 %a) { +; LA32-LABEL: mul_i64_35: +; LA32: # %bb.0: +; LA32-NEXT: ori $a2, $zero, 35 +; LA32-NEXT: mul.w $a1, $a1, $a2 +; LA32-NEXT: mulh.wu $a3, $a0, $a2 +; LA32-NEXT: add.w $a1, $a3, $a1 +; LA32-NEXT: mul.w $a0, $a0, $a2 +; LA32-NEXT: ret +; +; LA64-LABEL: mul_i64_35: +; LA64: # %bb.0: +; LA64-NEXT: ori $a1, $zero, 35 +; LA64-NEXT: mul.d $a0, $a0, $a1 +; LA64-NEXT: ret + %b = mul i64 %a, 35 + ret i64 %b +} + +define i64 @mul_i64_37(i64 %a) { +; LA32-LABEL: mul_i64_37: +; LA32: # %bb.0: +; LA32-NEXT: ori $a2, $zero, 37 +; LA32-NEXT: mul.w $a1, $a1, $a2 +; LA32-NEXT: mulh.wu $a3, $a0, $a2 +; LA32-NEXT: add.w $a1, $a3, $a1 +; LA32-NEXT: mul.w $a0, $a0, $a2 +; LA32-NEXT: ret +; +; LA64-LABEL: mul_i64_37: +; LA64: # %bb.0: +; LA64-NEXT: ori $a1, $zero, 37 +; LA64-NEXT: mul.d $a0, $a0, $a1 +; LA64-NEXT: ret + %b = mul i64 %a, 37 + ret i64 %b +} + +define i64 @mul_i64_41(i64 %a) { +; LA32-LABEL: mul_i64_41: +; LA32: # %bb.0: +; LA32-NEXT: ori $a2, $zero, 41 +; LA32-NEXT: mul.w $a1, $a1, $a2 +; LA32-NEXT: mulh.wu $a3, $a0, $a2 +; LA32-NEXT: add.w $a1, $a3, $a1 +; LA32-NEXT: mul.w $a0, $a0, $a2 +; LA32-NEXT: ret +; +; LA64-LABEL: mul_i64_41: +; LA64: # %bb.0: +; LA64-NEXT: ori $a1, $zero, 41 +; LA64-NEXT: mul.d $a0, $a0, $a1 +; LA64-NEXT: ret + %b = mul i64 %a, 41 + ret i64 %b +} + +define i64 @mul_i64_49(i64 %a) { +; LA32-LABEL: mul_i64_49: +; LA32: # %bb.0: +; LA32-NEXT: ori $a2, $zero, 49 +; LA32-NEXT: mul.w $a1, $a1, $a2 +; LA32-NEXT: mulh.wu $a3, $a0, $a2 +; LA32-NEXT: add.w $a1, $a3, $a1 +; LA32-NEXT: mul.w $a0, $a0, $a2 +; LA32-NEXT: ret +; +; LA64-LABEL: mul_i64_49: +; LA64: # %bb.0: +; LA64-NEXT: ori $a1, $zero, 49 +; LA64-NEXT: mul.d $a0, $a0, $a1 +; LA64-NEXT: ret + %b = mul i64 %a, 49 + ret i64 %b +} + +define i64 @mul_i64_69(i64 %a) { +; LA32-LABEL: mul_i64_69: +; LA32: # %bb.0: +; LA32-NEXT: ori $a2, $zero, 69 +; LA32-NEXT: mul.w $a1, $a1, $a2 +; LA32-NEXT: mulh.wu $a3, $a0, $a2 +; LA32-NEXT: add.w $a1, $a3, $a1 +; LA32-NEXT: mul.w $a0, $a0, $a2 +; LA32-NEXT: ret +; +; LA64-LABEL: mul_i64_69: +; LA64: # %bb.0: +; LA64-NEXT: ori $a1, $zero, 69 +; LA64-NEXT: mul.d $a0, $a0, $a1 +; LA64-NEXT: ret + %b = mul i64 %a, 69 + ret i64 %b +} + +define i64 @mul_i64_73(i64 %a) { +; LA32-LABEL: mul_i64_73: +; LA32: # %bb.0: +; LA32-NEXT: ori $a2, $zero, 73 +; LA32-NEXT: mul.w $a1, $a1, $a2 +; LA32-NEXT: mulh.wu $a3, $a0, $a2 +; LA32-NEXT: add.w $a1, $a3, $a1 +; LA32-NEXT: mul.w $a0, $a0, $a2 +; LA32-NEXT: ret +; +; LA64-LABEL: mul_i64_73: +; LA64: # %bb.0: +; LA64-NEXT: ori $a1, $zero, 73 +; LA64-NEXT: mul.d $a0, $a0, $a1 +; LA64-NEXT: ret + %b = mul i64 %a, 73 + ret i64 %b +} + +define i64 @mul_i64_137(i64 %a) { +; LA32-LABEL: mul_i64_137: +; LA32: # %bb.0: +; LA32-NEXT: ori $a2, $zero, 137 +; LA32-NEXT: mul.w $a1, $a1, $a2 +; LA32-NEXT: mulh.wu $a3, $a0, $a2 +; LA32-NEXT: add.w $a1, $a3, $a1 +; LA32-NEXT: mul.w $a0, $a0, $a2 +; LA32-NEXT: ret +; +; LA64-LABEL: mul_i64_137: +; LA64: # %bb.0: +; LA64-NEXT: ori $a1, $zero, 137 +; LA64-NEXT: mul.d $a0, $a0, $a1 +; LA64-NEXT: ret + %b = mul i64 %a, 137 + ret i64 %b +} + +define i64 @mul_i64_145(i64 %a) { +; LA32-LABEL: mul_i64_145: +; LA32: # %bb.0: +; LA32-NEXT: ori $a2, $zero, 145 +; LA32-NEXT: mul.w $a1, $a1, $a2 +; LA32-NEXT: mulh.wu $a3, $a0, $a2 +; LA32-NEXT: add.w $a1, $a3, $a1 +; LA32-NEXT: mul.w $a0, $a0, $a2 +; LA32-NEXT: ret +; +; LA64-LABEL: mul_i64_145: +; LA64: # %bb.0: +; LA64-NEXT: ori $a1, $zero, 145 +; LA64-NEXT: mul.d $a0, $a0, $a1 +; LA64-NEXT: ret + %b = mul i64 %a, 145 + ret i64 %b +} + +define i64 @mul_i64_273(i64 %a) { +; LA32-LABEL: mul_i64_273: +; LA32: # %bb.0: +; LA32-NEXT: ori $a2, $zero, 273 +; LA32-NEXT: mul.w $a1, $a1, $a2 +; LA32-NEXT: mulh.wu $a3, $a0, $a2 +; LA32-NEXT: add.w $a1, $a3, $a1 +; LA32-NEXT: mul.w $a0, $a0, $a2 +; LA32-NEXT: ret +; +; LA64-LABEL: mul_i64_273: +; LA64: # %bb.0: +; LA64-NEXT: ori $a1, $zero, 273 +; LA64-NEXT: mul.d $a0, $a0, $a1 +; LA64-NEXT: ret + %b = mul i64 %a, 273 + ret i64 %b +}