[PATCH] D39117: [mips] Match 'ins' and its' variants with C++ code
Simon Atanasyan via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Tue Oct 24 04:33:02 PDT 2017
atanasyan added inline comments.
================
Comment at: lib/Target/Mips/MipsSEISelDAGToDAG.cpp:927
+
+ uint64_t Pos = Node->getConstantOperandVal(1);
+ uint64_t Size = Node->getConstantOperandVal(2);
----------------
Now the code below is okay, but i think we can write it a bit more clear. I think the following variant is logically equal to the original one. But I do not force to use it.
```
uint64_t MVT = Node->getConstantOperandVal(0);
uint64_t Pos = Node->getConstantOperandVal(1);
uint64_t Size = Node->getConstantOperandVal(2);
// Size has to be >0 for 'ins', 'dins' and 'dinsu'.
if (!Size)
return false;
if (Size + Pos > 64)
return false;
unsigned Opcode = 0;
if (MVT == MVT::i32) {
if (Pos + Size <= 32)
Opcode = Mips::INS;
} else {
if (Pos + Size <= 32)
Opcode = Mips::DINS;
else if (Pos < 32)
Opcode = Mips::DINSM;
else
Opcode = Mips::DINSU;
}
if (Opcode) {
SDValue Ops[4] = {
MVT, CurDAG->getTargetConstant(Pos, DL, MVT::i32),
CurDAG->getTargetConstant(Size, DL, MVT::i32), Node->getOperand(3)};
ReplaceNode(Node, CurDAG->getMachineNode(Opcode, DL, MVT, Ops));
return true;
}
return false;
```
https://reviews.llvm.org/D39117
More information about the llvm-commits
mailing list