mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-04-13 15:37:24 +00:00
[Hexagon] Use pseudo-instructions for true/false predicate values
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@232657 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
81f2a5d62b
commit
83d2dd132d
@ -997,30 +997,14 @@ SDNode *HexagonDAGToDAGISel::SelectConstantFP(SDNode *N) {
|
||||
SDNode *HexagonDAGToDAGISel::SelectConstant(SDNode *N) {
|
||||
SDLoc dl(N);
|
||||
if (N->getValueType(0) == MVT::i1) {
|
||||
SDNode* Result;
|
||||
SDNode* Result = 0;
|
||||
int32_t Val = cast<ConstantSDNode>(N)->getSExtValue();
|
||||
if (Val == -1) {
|
||||
// Create the IntReg = 1 node.
|
||||
SDNode* IntRegTFR =
|
||||
CurDAG->getMachineNode(Hexagon::A2_tfrsi, dl, MVT::i32,
|
||||
CurDAG->getTargetConstant(0, MVT::i32));
|
||||
|
||||
// Pd = IntReg
|
||||
SDNode* Pd = CurDAG->getMachineNode(Hexagon::C2_tfrrp, dl, MVT::i1,
|
||||
SDValue(IntRegTFR, 0));
|
||||
|
||||
// not(Pd)
|
||||
SDNode* NotPd = CurDAG->getMachineNode(Hexagon::C2_not, dl, MVT::i1,
|
||||
SDValue(Pd, 0));
|
||||
|
||||
// xor(not(Pd))
|
||||
Result = CurDAG->getMachineNode(Hexagon::C2_xor, dl, MVT::i1,
|
||||
SDValue(Pd, 0), SDValue(NotPd, 0));
|
||||
|
||||
// We have just built:
|
||||
// Rs = Pd
|
||||
// Pd = xor(not(Pd), Pd)
|
||||
|
||||
Result = CurDAG->getMachineNode(Hexagon::TFR_PdTrue, dl, MVT::i1);
|
||||
} else if (Val == 0) {
|
||||
Result = CurDAG->getMachineNode(Hexagon::TFR_PdFalse, dl, MVT::i1);
|
||||
}
|
||||
if (Result) {
|
||||
ReplaceUses(N, Result);
|
||||
return Result;
|
||||
}
|
||||
|
@ -566,9 +566,27 @@ void HexagonInstrInfo::loadRegFromAddr(MachineFunction &MF, unsigned DestReg,
|
||||
}
|
||||
bool
|
||||
HexagonInstrInfo::expandPostRAPseudo(MachineBasicBlock::iterator MI) const {
|
||||
MachineBasicBlock &MBB = *MI->getParent();
|
||||
DebugLoc DL = MI->getDebugLoc();
|
||||
unsigned Opc = MI->getOpcode();
|
||||
|
||||
switch (Opc) {
|
||||
case Hexagon::TFR_PdTrue: {
|
||||
unsigned Reg = MI->getOperand(0).getReg();
|
||||
BuildMI(MBB, MI, DL, get(Hexagon::C2_orn), Reg)
|
||||
.addReg(Reg, RegState::Undef)
|
||||
.addReg(Reg, RegState::Undef);
|
||||
MBB.erase(MI);
|
||||
return true;
|
||||
}
|
||||
case Hexagon::TFR_PdFalse: {
|
||||
unsigned Reg = MI->getOperand(0).getReg();
|
||||
BuildMI(MBB, MI, DL, get(Hexagon::C2_andn), Reg)
|
||||
.addReg(Reg, RegState::Undef)
|
||||
.addReg(Reg, RegState::Undef);
|
||||
MBB.erase(MI);
|
||||
return true;
|
||||
}
|
||||
case Hexagon::TCRETURNi:
|
||||
MI->setDesc(get(Hexagon::J2_jump));
|
||||
return true;
|
||||
|
Loading…
x
Reference in New Issue
Block a user