mirror of
https://github.com/asmjit/asmjit.git
synced 2025-12-17 04:24:37 +03:00
[Opt] Added a feature to the Compiler to remove dead moves (moves to itself) when it's provable that it's safe
This commit is contained in:
@@ -1786,6 +1786,7 @@ class AdditionalInfoTable extends core.Task {
|
||||
run() {
|
||||
const insts = this.ctx.insts;
|
||||
const rwInfoTable = new IndexedArray();
|
||||
const instFlagsTable = new IndexedArray();
|
||||
const additionaInfoTable = new IndexedArray();
|
||||
|
||||
// If the instruction doesn't read any flags it should point to the first index.
|
||||
@@ -1800,9 +1801,48 @@ class AdditionalInfoTable extends core.Task {
|
||||
var [r, w] = this.rwFlagsOf(dbInsts);
|
||||
const rData = r.map(function(flag) { return `FLAG(${flag})`; }).join(" | ") || "0";
|
||||
const wData = w.map(function(flag) { return `FLAG(${flag})`; }).join(" | ") || "0";
|
||||
const rwDataIndex = rwInfoTable.addIndexed(`{ ${rData}, ${wData} }`);
|
||||
const instFlags = Object.create(null);
|
||||
|
||||
inst.additionalInfoIndex = additionaInfoTable.addIndexed(`{ { ${features} }, ${rwDataIndex}, 0 }`);
|
||||
switch (inst.name) {
|
||||
case "kmovb":
|
||||
case "kmovd":
|
||||
case "kmovq":
|
||||
case "kmovw":
|
||||
case "mov":
|
||||
case "movq":
|
||||
case "movsd":
|
||||
case "movss":
|
||||
case "movapd":
|
||||
case "movaps":
|
||||
case "movdqa":
|
||||
case "movdqu":
|
||||
case "movupd":
|
||||
case "movups":
|
||||
case "vmovapd":
|
||||
case "vmovaps":
|
||||
case "vmovdqa":
|
||||
case "vmovdqa8":
|
||||
case "vmovdqa16":
|
||||
case "vmovdqa32":
|
||||
case "vmovdqa64":
|
||||
case "vmovdqu":
|
||||
case "vmovdqu8":
|
||||
case "vmovdqu16":
|
||||
case "vmovdqu32":
|
||||
case "vmovdqu64":
|
||||
case "vmovq":
|
||||
case "vmovsd":
|
||||
case "vmovss":
|
||||
case "vmovupd":
|
||||
case "vmovups":
|
||||
instFlags["MovOp"] = true;
|
||||
break;
|
||||
}
|
||||
|
||||
const instFlagsIndex = instFlagsTable.addIndexed("InstRWFlags(" + CxxUtils.flags(instFlags, (f) => { return `FLAG(${f})`; }, "FLAG(None)") + ")");
|
||||
const rwInfoIndex = rwInfoTable.addIndexed(`{ ${rData}, ${wData} }`);
|
||||
|
||||
inst.additionalInfoIndex = additionaInfoTable.addIndexed(`{ ${instFlagsIndex}, ${rwInfoIndex}, { ${features} } }`);
|
||||
});
|
||||
|
||||
var s = `#define EXT(VAL) uint32_t(CpuFeatures::X86::k##VAL)\n` +
|
||||
@@ -1811,8 +1851,12 @@ class AdditionalInfoTable extends core.Task {
|
||||
`\n` +
|
||||
`#define FLAG(VAL) uint32_t(CpuRWFlags::kX86_##VAL)\n` +
|
||||
`const InstDB::RWFlagsInfoTable InstDB::_rwFlagsInfoTable[] = {\n${StringUtils.format(rwInfoTable, kIndent, true)}\n};\n` +
|
||||
`#undef FLAG\n` +
|
||||
`\n` +
|
||||
`#define FLAG(VAL) uint32_t(InstRWFlags::k##VAL)\n` +
|
||||
`const InstRWFlags InstDB::_instFlagsTable[] = {\n${StringUtils.format(instFlagsTable, kIndent, true)}\n};\n` +
|
||||
`#undef FLAG\n`;
|
||||
this.inject("AdditionalInfoTable", disclaimer(s), additionaInfoTable.length * 8 + rwInfoTable.length * 8);
|
||||
this.inject("AdditionalInfoTable", disclaimer(s), additionaInfoTable.length * 8 + rwInfoTable.length * 8 + instFlagsTable.length * 4);
|
||||
}
|
||||
|
||||
rwFlagsOf(dbInsts) {
|
||||
@@ -2032,6 +2076,7 @@ class InstRWInfoTable extends core.Task {
|
||||
String(Math.max(rmInfo.memFixed, 0)).padEnd(2),
|
||||
CxxUtils.flags({
|
||||
"InstDB::RWInfoRm::kFlagAmbiguous": Boolean(rmInfo.memAmbiguous),
|
||||
"InstDB::RWInfoRm::kFlagMovssMovsd": Boolean(inst.name === "movss" || inst.name === "movsd"),
|
||||
"InstDB::RWInfoRm::kFlagPextrw": Boolean(inst.name === "pextrw"),
|
||||
"InstDB::RWInfoRm::kFlagFeatureIfRMI": Boolean(rmInfo.memExtensionIfRMI)
|
||||
}),
|
||||
|
||||
Reference in New Issue
Block a user