Index: src/IceInstX8632.cpp |
diff --git a/src/IceInstX8632.cpp b/src/IceInstX8632.cpp |
index 1365d54795b70028440533e27dc4943c2e34976e..82f04d10c9c42a284ef10c5cbfbfc2e76634c636 100644 |
--- a/src/IceInstX8632.cpp |
+++ b/src/IceInstX8632.cpp |
@@ -111,6 +111,14 @@ OperandX8632Mem::OperandX8632Mem(Cfg *Func, Type Ty, Variable *Base, |
} |
} |
+InstX8632FakeRMW::InstX8632FakeRMW(Cfg *Func, Operand *Data, Operand *Addr, |
+ InstArithmetic::OpKind Op, Variable *Beacon) |
+ : InstX8632(Func, InstX8632::FakeRMW, 3, nullptr), Op(Op) { |
+ addSource(Data); |
+ addSource(Addr); |
+ addSource(Beacon); |
+} |
+ |
InstX8632AdjustStack::InstX8632AdjustStack(Cfg *Func, SizeT Amount, |
Variable *Esp) |
: InstX8632(Func, InstX8632::Adjuststack, 1, Esp), Amount(Amount) { |
@@ -370,6 +378,17 @@ void InstX8632::dump(const Cfg *Func) const { |
Inst::dump(Func); |
} |
+void InstX8632FakeRMW::dump(const Cfg *Func) const { |
+ if (!ALLOW_DUMP) |
+ return; |
+ Ostream &Str = Func->getContext()->getStrDump(); |
+ Type Ty = getData()->getType(); |
+ Str << "rmw " << InstArithmetic::getOpName(getOp()) << " " << Ty << " *"; |
+ getAddr()->dump(Func); |
+ Str << ", "; |
+ getData()->dump(Func); |
jvoung (off chromium)
2015/06/16 17:59:21
Would it be helpful for this to dump the beacon to
Jim Stichnoth
2015/06/17 00:15:40
Done.
|
+} |
+ |
void InstX8632Label::emit(const Cfg *Func) const { |
if (!ALLOW_DUMP) |
return; |
@@ -589,7 +608,9 @@ void InstX8632::emitTwoAddress(const char *Opcode, const Inst *Inst, |
return; |
Ostream &Str = Func->getContext()->getStrEmit(); |
assert(Inst->getSrcSize() == 2); |
- Variable *Dest = Inst->getDest(); |
+ Operand *Dest = Inst->getDest(); |
+ if (Dest == nullptr) |
+ Dest = Inst->getSrc(0); |
assert(Dest == Inst->getSrc(0)); |
Operand *Src1 = Inst->getSrc(1); |
Str << "\t" << Opcode << InstX8632::getWidthString(Dest->getType()) << "\t"; |
@@ -911,6 +932,7 @@ template <> const char *InstX8632Movp::Opcode = "movups"; |
template <> const char *InstX8632Movq::Opcode = "movq"; |
// Binary ops |
template <> const char *InstX8632Add::Opcode = "add"; |
+template <> const char *InstX8632AddRMW::Opcode = "add"; |
template <> const char *InstX8632Addps::Opcode = "addps"; |
template <> const char *InstX8632Adc::Opcode = "adc"; |
template <> const char *InstX8632Addss::Opcode = "addss"; |
@@ -994,6 +1016,9 @@ const X8632::AssemblerX8632::GPREmitterRegOp InstX8632Add::Emitter = { |
&X8632::AssemblerX8632::add, &X8632::AssemblerX8632::add, |
&X8632::AssemblerX8632::add}; |
template <> |
+const X8632::AssemblerX8632::GPREmitterAddrOp InstX8632AddRMW::Emitter = { |
+ &X8632::AssemblerX8632::add, &X8632::AssemblerX8632::add}; |
+template <> |
const X8632::AssemblerX8632::GPREmitterRegOp InstX8632Adc::Emitter = { |
&X8632::AssemblerX8632::adc, &X8632::AssemblerX8632::adc, |
&X8632::AssemblerX8632::adc}; |