Index: src/IceInstX8632.h |
diff --git a/src/IceInstX8632.h b/src/IceInstX8632.h |
index 8a6f14a9efe5cce8a3d7e2ebfb3ea8e6dccbb2c0..7e6e19987a4dcda3cab4678143b00adce4d35bb0 100644 |
--- a/src/IceInstX8632.h |
+++ b/src/IceInstX8632.h |
@@ -52,16 +52,26 @@ private: |
// value for the index register. |
class OperandX8632Mem : public OperandX8632 { |
public: |
+ enum SegmentRegisters { |
+ DefaultSegment = -1, |
+#define X(val, name) \ |
+ val, |
+ SEG_REGX8632_TABLE |
+#undef X |
+ SegReg_NUM |
+ }; |
static OperandX8632Mem *create(Cfg *Func, Type Ty, Variable *Base, |
Constant *Offset, Variable *Index = NULL, |
- uint32_t Shift = 0) { |
+ uint16_t Shift = 0, |
+ SegmentRegisters SegmentReg = DefaultSegment) { |
return new (Func->allocate<OperandX8632Mem>()) |
- OperandX8632Mem(Func, Ty, Base, Offset, Index, Shift); |
+ OperandX8632Mem(Func, Ty, Base, Offset, Index, Shift, SegmentReg); |
} |
Variable *getBase() const { return Base; } |
Constant *getOffset() const { return Offset; } |
Variable *getIndex() const { return Index; } |
- uint32_t getShift() const { return Shift; } |
+ uint16_t getShift() const { return Shift; } |
+ SegmentRegisters getSegmentRegister() const { return SegmentReg; } |
virtual void emit(const Cfg *Func) const; |
virtual void dump(const Cfg *Func) const; |
@@ -71,14 +81,15 @@ public: |
private: |
OperandX8632Mem(Cfg *Func, Type Ty, Variable *Base, Constant *Offset, |
- Variable *Index, uint32_t Shift); |
+ Variable *Index, uint16_t Shift, SegmentRegisters SegmentReg); |
OperandX8632Mem(const OperandX8632Mem &) LLVM_DELETED_FUNCTION; |
OperandX8632Mem &operator=(const OperandX8632Mem &) LLVM_DELETED_FUNCTION; |
virtual ~OperandX8632Mem() {} |
Variable *Base; |
Constant *Offset; |
Variable *Index; |
- uint32_t Shift; |
+ uint16_t Shift; |
+ SegmentRegisters SegmentReg : 16; |
}; |
// VariableSplit is a way to treat an f64 memory location as a pair |
@@ -160,6 +171,7 @@ public: |
Subss, |
Test, |
Ucomiss, |
+ UD2, |
Xor |
}; |
static const char *getWidthString(Type Ty); |
@@ -531,6 +543,23 @@ 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: |