Chromium Code Reviews| 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: |