mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-07-25 13:24:46 +00:00
Flags where I think I need them, quick, before the nightly tester starts
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@24560 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@@ -70,6 +70,7 @@ namespace {
|
|||||||
|
|
||||||
private:
|
private:
|
||||||
SDOperand getGlobalBaseReg();
|
SDOperand getGlobalBaseReg();
|
||||||
|
SDOperand getRASaveReg();
|
||||||
SDOperand SelectCALL(SDOperand Op);
|
SDOperand SelectCALL(SDOperand Op);
|
||||||
|
|
||||||
};
|
};
|
||||||
@@ -79,7 +80,17 @@ private:
|
|||||||
/// GOT address into a register.
|
/// GOT address into a register.
|
||||||
///
|
///
|
||||||
SDOperand AlphaDAGToDAGISel::getGlobalBaseReg() {
|
SDOperand AlphaDAGToDAGISel::getGlobalBaseReg() {
|
||||||
return CurDAG->getRegister(AlphaLowering.getVRegGP(), MVT::i64);
|
return CurDAG->getCopyFromReg(CurDAG->getEntryNode(),
|
||||||
|
AlphaLowering.getVRegGP(),
|
||||||
|
MVT::i64);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// getRASaveReg - Grab the return address
|
||||||
|
///
|
||||||
|
SDOperand AlphaDAGToDAGISel::getRASaveReg() {
|
||||||
|
return CurDAG->getCopyFromReg(CurDAG->getEntryNode(),
|
||||||
|
AlphaLowering.getVRegRA(),
|
||||||
|
MVT::i64);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// InstructionSelectBasicBlock - This callback is invoked by
|
/// InstructionSelectBasicBlock - This callback is invoked by
|
||||||
@@ -234,7 +245,7 @@ SDOperand AlphaDAGToDAGISel::Select(SDOperand Op) {
|
|||||||
case ISD::ExternalSymbol:
|
case ISD::ExternalSymbol:
|
||||||
return CurDAG->SelectNodeTo(N, Alpha::LDQl, MVT::i64,
|
return CurDAG->SelectNodeTo(N, Alpha::LDQl, MVT::i64,
|
||||||
CurDAG->getTargetExternalSymbol(cast<ExternalSymbolSDNode>(N)->getSymbol(), MVT::i64),
|
CurDAG->getTargetExternalSymbol(cast<ExternalSymbolSDNode>(N)->getSymbol(), MVT::i64),
|
||||||
CurDAG->getRegister(AlphaLowering.getVRegGP(), MVT::i64));
|
getGlobalBaseReg());
|
||||||
|
|
||||||
case ISD::CALLSEQ_START:
|
case ISD::CALLSEQ_START:
|
||||||
case ISD::CALLSEQ_END: {
|
case ISD::CALLSEQ_END: {
|
||||||
@@ -246,18 +257,20 @@ SDOperand AlphaDAGToDAGISel::Select(SDOperand Op) {
|
|||||||
}
|
}
|
||||||
case ISD::RET: {
|
case ISD::RET: {
|
||||||
SDOperand Chain = Select(N->getOperand(0)); // Token chain.
|
SDOperand Chain = Select(N->getOperand(0)); // Token chain.
|
||||||
|
SDOperand InFlag;
|
||||||
|
|
||||||
if (N->getNumOperands() == 2) {
|
if (N->getNumOperands() == 2) {
|
||||||
SDOperand Val = Select(N->getOperand(1));
|
SDOperand Val = Select(N->getOperand(1));
|
||||||
if (N->getOperand(1).getValueType() == MVT::i64) {
|
if (N->getOperand(1).getValueType() == MVT::i64) {
|
||||||
Chain = CurDAG->getCopyToReg(Chain, Alpha::R0, Val);
|
Chain = CurDAG->getCopyToReg(Chain, Alpha::R0, Val, InFlag);
|
||||||
|
InFlag = Chain.getValue(1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
//BuildMI(BB, Alpha::RET, 2, Alpha::R31).addReg(Alpha::R26).addImm(1);
|
Chain = CurDAG->getCopyToReg(Chain, Alpha::R26, getRASaveReg(), InFlag);
|
||||||
|
InFlag = Chain.getValue(1);
|
||||||
// FIXME: add restoring of the RA to R26 to the chain
|
|
||||||
// Finally, select this to a ret instruction.
|
// Finally, select this to a ret instruction.
|
||||||
return CurDAG->SelectNodeTo(N, Alpha::RETDAG, MVT::Other, Chain);
|
return CurDAG->SelectNodeTo(N, Alpha::RETDAG, MVT::Other, Chain, InFlag);
|
||||||
}
|
}
|
||||||
case ISD::Constant: {
|
case ISD::Constant: {
|
||||||
int64_t val = (int64_t)cast<ConstantSDNode>(N)->getValue();
|
int64_t val = (int64_t)cast<ConstantSDNode>(N)->getValue();
|
||||||
@@ -401,8 +414,8 @@ SDOperand AlphaDAGToDAGISel::SelectCALL(SDOperand Op) {
|
|||||||
SDNode *N = Op.Val;
|
SDNode *N = Op.Val;
|
||||||
SDOperand Chain = Select(N->getOperand(0));
|
SDOperand Chain = Select(N->getOperand(0));
|
||||||
SDOperand Addr = Select(N->getOperand(1));
|
SDOperand Addr = Select(N->getOperand(1));
|
||||||
|
SDOperand InFlag; // Null incoming flag value.
|
||||||
|
|
||||||
// unsigned CallOpcode;
|
|
||||||
std::vector<SDOperand> CallOperands;
|
std::vector<SDOperand> CallOperands;
|
||||||
std::vector<MVT::ValueType> TypeOperands;
|
std::vector<MVT::ValueType> TypeOperands;
|
||||||
|
|
||||||
@@ -418,14 +431,6 @@ SDOperand AlphaDAGToDAGISel::SelectCALL(SDOperand Op) {
|
|||||||
static const unsigned args_float[] = {Alpha::F16, Alpha::F17, Alpha::F18,
|
static const unsigned args_float[] = {Alpha::F16, Alpha::F17, Alpha::F18,
|
||||||
Alpha::F19, Alpha::F20, Alpha::F21};
|
Alpha::F19, Alpha::F20, Alpha::F21};
|
||||||
|
|
||||||
for (int i = 0; i < std::min(6, count); ++i) {
|
|
||||||
if (MVT::isInteger(TypeOperands[i])) {
|
|
||||||
Chain = CurDAG->getCopyToReg(Chain, args_int[i], CallOperands[i]);
|
|
||||||
} else if (TypeOperands[i] == MVT::f32 || TypeOperands[i] == MVT::f64) {
|
|
||||||
Chain = CurDAG->getCopyToReg(Chain, args_float[i], CallOperands[i]);
|
|
||||||
} else
|
|
||||||
assert(0 && "Unknown operand");
|
|
||||||
}
|
|
||||||
for (int i = 6; i < count; ++i) {
|
for (int i = 6; i < count; ++i) {
|
||||||
unsigned Opc = Alpha::WTF;
|
unsigned Opc = Alpha::WTF;
|
||||||
if (MVT::isInteger(TypeOperands[i])) {
|
if (MVT::isInteger(TypeOperands[i])) {
|
||||||
@@ -438,30 +443,44 @@ SDOperand AlphaDAGToDAGISel::SelectCALL(SDOperand Op) {
|
|||||||
assert(0 && "Unknown operand");
|
assert(0 && "Unknown operand");
|
||||||
Chain = CurDAG->getTargetNode(Opc, MVT::Other, CallOperands[i],
|
Chain = CurDAG->getTargetNode(Opc, MVT::Other, CallOperands[i],
|
||||||
getI64Imm((i - 6) * 8),
|
getI64Imm((i - 6) * 8),
|
||||||
CurDAG->getRegister(Alpha::R30, MVT::i64),
|
CurDAG->getCopyFromReg(Chain, Alpha::R30, MVT::i64),
|
||||||
Chain);
|
Chain);
|
||||||
}
|
}
|
||||||
|
for (int i = 0; i < std::min(6, count); ++i) {
|
||||||
|
if (MVT::isInteger(TypeOperands[i])) {
|
||||||
|
Chain = CurDAG->getCopyToReg(Chain, args_int[i], CallOperands[i], InFlag);
|
||||||
|
InFlag = Chain.getValue(1);
|
||||||
|
} else if (TypeOperands[i] == MVT::f32 || TypeOperands[i] == MVT::f64) {
|
||||||
|
Chain = CurDAG->getCopyToReg(Chain, args_float[i], CallOperands[i], InFlag);
|
||||||
|
InFlag = Chain.getValue(1);
|
||||||
|
} else
|
||||||
|
assert(0 && "Unknown operand");
|
||||||
|
}
|
||||||
|
|
||||||
Chain = CurDAG->getCopyToReg(Chain, Alpha::R27, Addr);
|
|
||||||
|
Chain = CurDAG->getCopyToReg(Chain, Alpha::R27, Addr, InFlag);
|
||||||
|
InFlag = Chain.getValue(1);
|
||||||
// Finally, once everything is in registers to pass to the call, emit the
|
// Finally, once everything is in registers to pass to the call, emit the
|
||||||
// call itself.
|
// call itself.
|
||||||
Chain = CurDAG->getTargetNode(Alpha::JSRDAG, MVT::Other, Chain );
|
Chain = CurDAG->getTargetNode(Alpha::JSRDAG, MVT::Other, MVT::Flag,
|
||||||
|
Chain, InFlag );
|
||||||
|
InFlag = Chain.getValue(1);
|
||||||
|
|
||||||
std::vector<SDOperand> CallResults;
|
std::vector<SDOperand> CallResults;
|
||||||
|
|
||||||
switch (N->getValueType(0)) {
|
switch (N->getValueType(0)) {
|
||||||
default: assert(0 && "Unexpected ret value!");
|
default: assert(0 && "Unexpected ret value!");
|
||||||
case MVT::Other: break;
|
case MVT::Other: break;
|
||||||
case MVT::i64:
|
case MVT::i64:
|
||||||
Chain = CurDAG->getCopyFromReg(Chain, Alpha::R0, MVT::i64).getValue(1);
|
Chain = CurDAG->getCopyFromReg(Chain, Alpha::R0, MVT::i64, InFlag).getValue(1);
|
||||||
CallResults.push_back(Chain.getValue(0));
|
CallResults.push_back(Chain.getValue(0));
|
||||||
break;
|
break;
|
||||||
case MVT::f32:
|
case MVT::f32:
|
||||||
Chain = CurDAG->getCopyFromReg(Chain, Alpha::F0, MVT::f32).getValue(1);
|
Chain = CurDAG->getCopyFromReg(Chain, Alpha::F0, MVT::f32, InFlag).getValue(1);
|
||||||
CallResults.push_back(Chain.getValue(0));
|
CallResults.push_back(Chain.getValue(0));
|
||||||
break;
|
break;
|
||||||
case MVT::f64:
|
case MVT::f64:
|
||||||
Chain = CurDAG->getCopyFromReg(Chain, Alpha::F0, MVT::f64).getValue(1);
|
Chain = CurDAG->getCopyFromReg(Chain, Alpha::F0, MVT::f64, InFlag).getValue(1);
|
||||||
CallResults.push_back(Chain.getValue(0));
|
CallResults.push_back(Chain.getValue(0));
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user