Index: src/IceInstX8632.h |
diff --git a/src/IceInstX8632.h b/src/IceInstX8632.h |
index 8a6f14a9efe5cce8a3d7e2ebfb3ea8e6dccbb2c0..8c405aa6252bfefeb8d019f5596ccd7a87e6cedd 100644 |
--- a/src/IceInstX8632.h |
+++ b/src/IceInstX8632.h |
@@ -26,7 +26,7 @@ namespace Ice { |
class TargetX8632; |
// OperandX8632 extends the Operand hierarchy. Its subclasses are |
-// OperandX8632Mem and VariableSplit. |
+// OperandX8632Mem, and VariableSplit. |
Jim Stichnoth
2014/06/12 20:52:07
Remove the comma. :)
jvoung (off chromium)
2014/06/16 20:51:59
Done.
|
class OperandX8632 : public Operand { |
public: |
enum OperandKindX8632 { |
@@ -52,16 +52,26 @@ private: |
// value for the index register. |
class OperandX8632Mem : public OperandX8632 { |
public: |
- static OperandX8632Mem *create(Cfg *Func, Type Ty, Variable *Base, |
- Constant *Offset, Variable *Index = NULL, |
- uint32_t Shift = 0) { |
+ 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, |
+ 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,16 @@ 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 +172,7 @@ public: |
Subss, |
Test, |
Ucomiss, |
+ UD2, |
Xor |
}; |
static const char *getWidthString(Type Ty); |
@@ -531,6 +544,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: |