mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-08-09 11:25:55 +00:00
Add 64-bit multiply and divide instructions for SPARC v9.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@179582 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@@ -147,6 +147,9 @@ SDNode *SparcDAGToDAGISel::Select(SDNode *N) {
|
|||||||
|
|
||||||
case ISD::SDIV:
|
case ISD::SDIV:
|
||||||
case ISD::UDIV: {
|
case ISD::UDIV: {
|
||||||
|
// sdivx / udivx handle 64-bit divides.
|
||||||
|
if (N->getValueType(0) == MVT::i64)
|
||||||
|
break;
|
||||||
// FIXME: should use a custom expander to expose the SRA to the dag.
|
// FIXME: should use a custom expander to expose the SRA to the dag.
|
||||||
SDValue DivLHS = N->getOperand(0);
|
SDValue DivLHS = N->getOperand(0);
|
||||||
SDValue DivRHS = N->getOperand(1);
|
SDValue DivRHS = N->getOperand(1);
|
||||||
|
@@ -180,6 +180,45 @@ def : Pat<(SPcmpicc i64:$a, (i64 simm13:$b)), (SUBCCri $a, (as_i32imm $b))>;
|
|||||||
} // Predicates = [Is64Bit]
|
} // Predicates = [Is64Bit]
|
||||||
|
|
||||||
|
|
||||||
|
//===----------------------------------------------------------------------===//
|
||||||
|
// 64-bit Integer Multiply and Divide.
|
||||||
|
//===----------------------------------------------------------------------===//
|
||||||
|
|
||||||
|
let Predicates = [Is64Bit] in {
|
||||||
|
|
||||||
|
def MULXrr : F3_1<2, 0b001001,
|
||||||
|
(outs I64Regs:$rd), (ins I64Regs:$rs1, I64Regs:$rs2),
|
||||||
|
"mulx $rs1, $rs2, $rd",
|
||||||
|
[(set i64:$rd, (mul i64:$rs1, i64:$rs2))]>;
|
||||||
|
def MULXri : F3_2<2, 0b001001,
|
||||||
|
(outs IntRegs:$rd), (ins IntRegs:$rs1, i64imm:$i),
|
||||||
|
"mulx $rs1, $i, $rd",
|
||||||
|
[(set i64:$rd, (mul i64:$rs1, (i64 simm13:$i)))]>;
|
||||||
|
|
||||||
|
// Division can trap.
|
||||||
|
let hasSideEffects = 1 in {
|
||||||
|
def SDIVXrr : F3_1<2, 0b101101,
|
||||||
|
(outs I64Regs:$rd), (ins I64Regs:$rs1, I64Regs:$rs2),
|
||||||
|
"sdivx $rs1, $rs2, $rd",
|
||||||
|
[(set i64:$rd, (sdiv i64:$rs1, i64:$rs2))]>;
|
||||||
|
def SDIVXri : F3_2<2, 0b101101,
|
||||||
|
(outs IntRegs:$rd), (ins IntRegs:$rs1, i64imm:$i),
|
||||||
|
"sdivx $rs1, $i, $rd",
|
||||||
|
[(set i64:$rd, (sdiv i64:$rs1, (i64 simm13:$i)))]>;
|
||||||
|
|
||||||
|
def UDIVXrr : F3_1<2, 0b001101,
|
||||||
|
(outs I64Regs:$rd), (ins I64Regs:$rs1, I64Regs:$rs2),
|
||||||
|
"udivx $rs1, $rs2, $rd",
|
||||||
|
[(set i64:$rd, (udiv i64:$rs1, i64:$rs2))]>;
|
||||||
|
def UDIVXri : F3_2<2, 0b001101,
|
||||||
|
(outs IntRegs:$rd), (ins IntRegs:$rs1, i64imm:$i),
|
||||||
|
"udivx $rs1, $i, $rd",
|
||||||
|
[(set i64:$rd, (udiv i64:$rs1, (i64 simm13:$i)))]>;
|
||||||
|
} // hasSideEffects = 1
|
||||||
|
|
||||||
|
} // Predicates = [Is64Bit]
|
||||||
|
|
||||||
|
|
||||||
//===----------------------------------------------------------------------===//
|
//===----------------------------------------------------------------------===//
|
||||||
// 64-bit Loads and Stores.
|
// 64-bit Loads and Stores.
|
||||||
//===----------------------------------------------------------------------===//
|
//===----------------------------------------------------------------------===//
|
||||||
|
@@ -154,3 +154,24 @@ define i8 @promote_shifts(i8* %p) {
|
|||||||
%B36 = shl i8 %L24, %L32
|
%B36 = shl i8 %L24, %L32
|
||||||
ret i8 %B36
|
ret i8 %B36
|
||||||
}
|
}
|
||||||
|
|
||||||
|
; CHECK: multiply
|
||||||
|
; CHECK: mulx %i0, %i1, %i0
|
||||||
|
define i64 @multiply(i64 %a, i64 %b) {
|
||||||
|
%r = mul i64 %a, %b
|
||||||
|
ret i64 %r
|
||||||
|
}
|
||||||
|
|
||||||
|
; CHECK: signed_divide
|
||||||
|
; CHECK: sdivx %i0, %i1, %i0
|
||||||
|
define i64 @signed_divide(i64 %a, i64 %b) {
|
||||||
|
%r = sdiv i64 %a, %b
|
||||||
|
ret i64 %r
|
||||||
|
}
|
||||||
|
|
||||||
|
; CHECK: unsigned_divide
|
||||||
|
; CHECK: udivx %i0, %i1, %i0
|
||||||
|
define i64 @unsigned_divide(i64 %a, i64 %b) {
|
||||||
|
%r = udiv i64 %a, %b
|
||||||
|
ret i64 %r
|
||||||
|
}
|
||||||
|
Reference in New Issue
Block a user