mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-02-21 06:30:16 +00:00
Improve ISD::Constant codegen.
Now for int foo() { return -1; } we generate: _foo: li r3, -1 blr instead of _foo: lis r2, -1 ori r3, r2, 65535 blr git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@22864 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
36b708f057
commit
a694047813
@ -277,15 +277,18 @@ SDOperand PPC32DAGToDAGISel::Select(SDOperand Op) {
|
||||
case ISD::Constant: {
|
||||
assert(N->getValueType(0) == MVT::i32);
|
||||
unsigned v = (unsigned)cast<ConstantSDNode>(N)->getValue();
|
||||
if ((unsigned)(short)v == v) {
|
||||
CurDAG->SelectNodeTo(N, MVT::i32, PPC::LI, getI32Imm(v));
|
||||
break;
|
||||
} else {
|
||||
SDOperand Top = CurDAG->getTargetNode(PPC::LIS, MVT::i32,
|
||||
getI32Imm(unsigned(v) >> 16));
|
||||
unsigned Hi = HA16(v);
|
||||
unsigned Lo = Lo16(v);
|
||||
if (Hi && Lo) {
|
||||
SDOperand Top = CurDAG->getTargetNode(PPC::LIS, MVT::i32,
|
||||
getI32Imm(v >> 16));
|
||||
CurDAG->SelectNodeTo(N, MVT::i32, PPC::ORI, Top, getI32Imm(v & 0xFFFF));
|
||||
break;
|
||||
} else if (Lo) {
|
||||
CurDAG->SelectNodeTo(N, MVT::i32, PPC::LI, getI32Imm(v));
|
||||
} else {
|
||||
CurDAG->SelectNodeTo(N, MVT::i32, PPC::LIS, getI32Imm(v >> 16));
|
||||
}
|
||||
break;
|
||||
}
|
||||
case ISD::SIGN_EXTEND_INREG:
|
||||
switch(cast<VTSDNode>(N->getOperand(1))->getVT()) {
|
||||
@ -412,12 +415,13 @@ SDOperand PPC32DAGToDAGISel::Select(SDOperand Op) {
|
||||
Select(N->getOperand(1)));
|
||||
break;
|
||||
case ISD::AND: {
|
||||
unsigned Imm, SH, MB, ME;
|
||||
unsigned Imm;
|
||||
// If this is an and of a value rotated between 0 and 31 bits and then and'd
|
||||
// with a mask, emit rlwinm
|
||||
if (isIntImmediate(N->getOperand(1), Imm) && (isShiftedMask_32(Imm) ||
|
||||
isShiftedMask_32(~Imm))) {
|
||||
SDOperand Val;
|
||||
unsigned SH, MB, ME;
|
||||
if (isRotateAndMask(N->getOperand(0).Val, Imm, false, SH, MB, ME)) {
|
||||
Val = Select(N->getOperand(0).getOperand(0));
|
||||
} else {
|
||||
|
@ -1736,7 +1736,7 @@ unsigned ISel::SelectExpr(SDOperand N, bool Recording) {
|
||||
assert(N.getValueType() == MVT::i32 &&
|
||||
"Only i32 constants are legal on this target!");
|
||||
int v = (int)cast<ConstantSDNode>(N)->getValue();
|
||||
unsigned Hi = Hi16(v);
|
||||
unsigned Hi = HA16(v);
|
||||
unsigned Lo = Lo16(v);
|
||||
if (Hi && Lo) {
|
||||
Tmp1 = MakeIntReg();
|
||||
|
Loading…
x
Reference in New Issue
Block a user