You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
67 lines
2.5 KiB
67 lines
2.5 KiB
6 years ago
|
--- b/backend/src/backend/gen_insn_selection_optimize.cpp
|
||
|
+++ a/backend/src/backend/gen_insn_selection_optimize.cpp
|
||
|
@@ -74,7 +74,8 @@ namespace gbe
|
||
|
const GenRegister& replacement) :
|
||
|
insn(insn), intermedia(intermedia), replacement(replacement)
|
||
|
{
|
||
|
- assert(insn.opcode == SEL_OP_MOV || insn.opcode == SEL_OP_ADD);
|
||
|
+ assert(insn.opcode == SEL_OP_MOV);
|
||
|
+ assert(&(insn.src(0)) == &replacement);
|
||
|
assert(&(insn.dst(0)) == &intermedia);
|
||
|
this->elements = CalculateElements(intermedia, insn.state.execWidth);
|
||
|
replacementOverwritten = false;
|
||
|
@@ -101,7 +102,6 @@ namespace gbe
|
||
|
void doReplacement(ReplaceInfo* info);
|
||
|
bool CanBeReplaced(const ReplaceInfo* info, const SelectionInstruction& insn, const GenRegister& var);
|
||
|
void cleanReplaceInfoMap();
|
||
|
- void doNegAddOptimization(SelectionInstruction &insn);
|
||
|
|
||
|
SelectionBlock &bb;
|
||
|
const ir::Liveness::LiveOut& liveout;
|
||
|
@@ -159,13 +159,8 @@ namespace gbe
|
||
|
|
||
|
void SelBasicBlockOptimizer::addToReplaceInfoMap(SelectionInstruction& insn)
|
||
|
{
|
||
|
- assert(insn.opcode == SEL_OP_MOV || insn.opcode == SEL_OP_ADD);
|
||
|
- GenRegister &src = insn.src(0);
|
||
|
- if (insn.opcode == SEL_OP_ADD) {
|
||
|
- if (src.file == GEN_IMMEDIATE_VALUE)
|
||
|
- src = insn.src(1);
|
||
|
- }
|
||
|
-
|
||
|
+ assert(insn.opcode == SEL_OP_MOV);
|
||
|
+ const GenRegister& src = insn.src(0);
|
||
|
const GenRegister& dst = insn.dst(0);
|
||
|
if (src.type != dst.type || src.file != dst.file)
|
||
|
return;
|
||
|
@@ -254,29 +249,10 @@ namespace gbe
|
||
|
|
||
|
if (insn.opcode == SEL_OP_MOV)
|
||
|
addToReplaceInfoMap(insn);
|
||
|
-
|
||
|
- doNegAddOptimization(insn);
|
||
|
}
|
||
|
cleanReplaceInfoMap();
|
||
|
}
|
||
|
|
||
|
- /* LLVM transform Mad(a, -b, c) to
|
||
|
- Add b, -b, 0
|
||
|
- Mad val, a, b, c
|
||
|
- for Gen support negtive modifier, mad(a, -b, c) is native suppoted.
|
||
|
- Also it can be used for the same like instruction sequence.
|
||
|
- Do it just like a: mov b, -b, so it is a Mov operation like LocalCopyPropagation
|
||
|
- */
|
||
|
- void SelBasicBlockOptimizer::doNegAddOptimization(SelectionInstruction &insn) {
|
||
|
- if (insn.opcode == SEL_OP_ADD) {
|
||
|
- GenRegister src0 = insn.src(0);
|
||
|
- GenRegister src1 = insn.src(1);
|
||
|
- if ((src0.negation && src1.file == GEN_IMMEDIATE_VALUE && src1.value.f == 0.0f) ||
|
||
|
- (src1.negation && src0.file == GEN_IMMEDIATE_VALUE && src0.value.f == 0.0f))
|
||
|
- addToReplaceInfoMap(insn);
|
||
|
- }
|
||
|
- }
|
||
|
-
|
||
|
void SelBasicBlockOptimizer::run()
|
||
|
{
|
||
|
for (size_t i = 0; i < MaxTries; ++i) {
|