| 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.
|
| 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:
|
|
|