Index: src/IceInstX8632.h |
diff --git a/src/IceInstX8632.h b/src/IceInstX8632.h |
index 8a6f14a9efe5cce8a3d7e2ebfb3ea8e6dccbb2c0..037a1dfbd9815c00b6b76ad679975e65d3fc5ec9 100644 |
--- a/src/IceInstX8632.h |
+++ b/src/IceInstX8632.h |
@@ -26,12 +26,13 @@ namespace Ice { |
class TargetX8632; |
// OperandX8632 extends the Operand hierarchy. Its subclasses are |
-// OperandX8632Mem and VariableSplit. |
+// OperandX8632Mem, OperandX8632MemOffSeg, and VariableSplit. |
class OperandX8632 : public Operand { |
public: |
enum OperandKindX8632 { |
k__Start = Operand::kTarget, |
kMem, |
+ kMemOffSeg, |
kSplit |
}; |
virtual void emit(const Cfg *Func) const = 0; |
@@ -81,6 +82,37 @@ private: |
uint32_t Shift; |
}; |
+// OperandX8632MemOffSeg represents the moffs addressing mode, where |
+// the address is given by an offset relative to the segment base. |
+class OperandX8632MemOffSeg : public OperandX8632 { |
Jim Stichnoth
2014/06/10 22:58:28
Instead of creating this new class, couldn't we ju
jvoung (off chromium)
2014/06/12 05:48:30
Done.
The initial concern was that we would be wa
Jim Stichnoth
2014/06/12 20:52:06
You're right, I should have been looking at create
|
+public: |
+ static OperandX8632MemOffSeg *create(Cfg *Func, Type Ty, |
+ Constant *Offset, |
+ SizeT SegmentReg) { |
+ return new (Func->allocate<OperandX8632MemOffSeg>()) |
+ OperandX8632MemOffSeg(Ty, Offset, SegmentReg); |
+ } |
+ Constant *getOffset() const { return Offset; } |
+ SizeT getSegmentRegister() const { return SegmentReg; } |
JF
2014/06/10 03:50:41
It seems weird to have SegmentReg as a SizeT. Shou
Jim Stichnoth
2014/06/10 22:58:28
The regular registers are using int32_t, but I won
jvoung (off chromium)
2014/06/12 05:48:30
Moved to using the enum.
|
+ virtual void emit(const Cfg *Func) const; |
+ virtual void dump(const Cfg *Func) const; |
+ |
+ static bool classof(const Operand *Operand) { |
+ return Operand->getKind() == static_cast<OperandKind>(kMemOffSeg); |
+ } |
+ |
+private: |
+ OperandX8632MemOffSeg(Type Ty, Constant *Offset, SizeT SegmentReg) |
+ : OperandX8632(kMemOffSeg, Ty), Offset(Offset), SegmentReg(SegmentReg) {} |
+ OperandX8632MemOffSeg( |
+ const OperandX8632MemOffSeg &) LLVM_DELETED_FUNCTION; |
+ OperandX8632MemOffSeg &operator=( |
+ const OperandX8632MemOffSeg &) LLVM_DELETED_FUNCTION; |
+ virtual ~OperandX8632MemOffSeg() {} |
+ Constant *Offset; |
+ SizeT SegmentReg; |
+}; |
+ |
// VariableSplit is a way to treat an f64 memory location as a pair |
// of i32 locations (Low and High). This is needed for some cases |
// of the Bitcast instruction. Since it's not possible for integer |
@@ -160,6 +192,7 @@ public: |
Subss, |
Test, |
Ucomiss, |
+ UD2, |
Xor |
}; |
static const char *getWidthString(Type Ty); |
@@ -531,6 +564,24 @@ private: |
virtual ~InstX8632Ucomiss() {} |
}; |
+// UD2 instruction. |
+class InstX8632UD2 : public InstX8632 { |
+public: |
+ static InstX8632UD2 *create(Cfg *Func) { |
+ return new (Func->allocate<InstX8632UD2>()) |
+ InstX8632UD2(Func); |
+ } |
+ virtual void emit(const Cfg *Func) const; |
+ virtual void dump(const Cfg *Func) const; |
+ static bool classof(const Inst *Inst) { return isClassof(Inst, UD2); } |
+ |
+private: |
+ InstX8632UD2(Cfg *Func); |
+ InstX8632UD2(const InstX8632UD2 &) LLVM_DELETED_FUNCTION; |
+ InstX8632UD2 &operator=(const InstX8632UD2 &) LLVM_DELETED_FUNCTION; |
+ virtual ~InstX8632UD2() {} |
+}; |
+ |
// Test instruction. |
class InstX8632Test : public InstX8632 { |
public: |