| Index: src/IceAssemblerX86Base.h
|
| diff --git a/src/IceAssemblerX86Base.h b/src/IceAssemblerX86Base.h
|
| index e3791fa80fec8a652de8c399b72f1e372e168c65..5a72b6c31242ff774e73c604688bae32ef269d87 100644
|
| --- a/src/IceAssemblerX86Base.h
|
| +++ b/src/IceAssemblerX86Base.h
|
| @@ -32,102 +32,116 @@
|
|
|
| namespace Ice {
|
|
|
| -namespace X86Internal {
|
| +#ifndef X86NAMESPACE
|
| +#error "You must define the X86 Target namespace."
|
| +#endif
|
|
|
| -template <class Machine> class AssemblerX86Base;
|
| -template <class Machine> struct MachineTraits;
|
| +namespace X86NAMESPACE {
|
|
|
| -constexpr int MAX_NOP_SIZE = 8;
|
| +template <typename TraitsType>
|
| +class AssemblerX86Base : public ::Ice::Assembler {
|
| + AssemblerX86Base(const AssemblerX86Base &) = delete;
|
| + AssemblerX86Base &operator=(const AssemblerX86Base &) = delete;
|
|
|
| -class Immediate {
|
| - Immediate(const Immediate &) = delete;
|
| - Immediate &operator=(const Immediate &) = delete;
|
| +protected:
|
| + explicit AssemblerX86Base(bool use_far_branches = false)
|
| + : Assembler(Traits::AsmKind) {
|
| + // This mode is only needed and implemented for MIPS and ARM.
|
| + assert(!use_far_branches);
|
| + (void)use_far_branches;
|
| + }
|
|
|
| public:
|
| - explicit Immediate(int32_t value) : value_(value) {}
|
| -
|
| - Immediate(RelocOffsetT offset, AssemblerFixup *fixup)
|
| - : value_(offset), fixup_(fixup) {
|
| - // Use the Offset in the "value" for now. If we decide to process fixups,
|
| - // we'll need to patch that offset with the true value.
|
| + using Traits = TraitsType;
|
| + using Address = typename Traits::Address;
|
| + using ByteRegister = typename Traits::ByteRegister;
|
| + using BrCond = typename Traits::Cond::BrCond;
|
| + using CmppsCond = typename Traits::Cond::CmppsCond;
|
| + using GPRRegister = typename Traits::GPRRegister;
|
| + using Operand = typename Traits::Operand;
|
| + using XmmRegister = typename Traits::XmmRegister;
|
| +
|
| + static constexpr int MAX_NOP_SIZE = 8;
|
| +
|
| + static bool classof(const Assembler *Asm) {
|
| + return Asm->getKind() == Traits::AsmKind;
|
| }
|
|
|
| - int32_t value() const { return value_; }
|
| - AssemblerFixup *fixup() const { return fixup_; }
|
| + class Immediate {
|
| + Immediate(const Immediate &) = delete;
|
| + Immediate &operator=(const Immediate &) = delete;
|
|
|
| - bool is_int8() const {
|
| - // We currently only allow 32-bit fixups, and they usually have value = 0,
|
| - // so if fixup_ != nullptr, it shouldn't be classified as int8/16.
|
| - return fixup_ == nullptr && Utils::IsInt(8, value_);
|
| - }
|
| - bool is_uint8() const {
|
| - return fixup_ == nullptr && Utils::IsUint(8, value_);
|
| - }
|
| - bool is_uint16() const {
|
| - return fixup_ == nullptr && Utils::IsUint(16, value_);
|
| - }
|
| + public:
|
| + explicit Immediate(int32_t value) : value_(value) {}
|
|
|
| -private:
|
| - const int32_t value_;
|
| - AssemblerFixup *fixup_ = nullptr;
|
| -};
|
| + Immediate(RelocOffsetT offset, AssemblerFixup *fixup)
|
| + : value_(offset), fixup_(fixup) {
|
| + // Use the Offset in the "value" for now. If we decide to process fixups,
|
| + // we'll need to patch that offset with the true value.
|
| + }
|
|
|
| -/// X86 allows near and far jumps.
|
| -class Label final : public Ice::Label {
|
| - Label(const Label &) = delete;
|
| - Label &operator=(const Label &) = delete;
|
| + int32_t value() const { return value_; }
|
| + AssemblerFixup *fixup() const { return fixup_; }
|
|
|
| -public:
|
| - Label() = default;
|
| - ~Label() = default;
|
| + bool is_int8() const {
|
| + // We currently only allow 32-bit fixups, and they usually have value = 0,
|
| + // so if fixup_ != nullptr, it shouldn't be classified as int8/16.
|
| + return fixup_ == nullptr && Utils::IsInt(8, value_);
|
| + }
|
| + bool is_uint8() const {
|
| + return fixup_ == nullptr && Utils::IsUint(8, value_);
|
| + }
|
| + bool is_uint16() const {
|
| + return fixup_ == nullptr && Utils::IsUint(16, value_);
|
| + }
|
|
|
| - void finalCheck() const override {
|
| - Ice::Label::finalCheck();
|
| - assert(!hasNear());
|
| - }
|
| + private:
|
| + const int32_t value_;
|
| + AssemblerFixup *fixup_ = nullptr;
|
| + };
|
|
|
| - /// Returns the position of an earlier branch instruction which assumes that
|
| - /// this label is "near", and bumps iterator to the next near position.
|
| - intptr_t getNearPosition() {
|
| - assert(hasNear());
|
| - intptr_t Pos = UnresolvedNearPositions.back();
|
| - UnresolvedNearPositions.pop_back();
|
| - return Pos;
|
| - }
|
| + /// X86 allows near and far jumps.
|
| + class Label final : public Ice::Label {
|
| + Label(const Label &) = delete;
|
| + Label &operator=(const Label &) = delete;
|
|
|
| - bool hasNear() const { return !UnresolvedNearPositions.empty(); }
|
| - bool isUnused() const override {
|
| - return Ice::Label::isUnused() && !hasNear();
|
| - }
|
| + public:
|
| + Label() = default;
|
| + ~Label() = default;
|
|
|
| -private:
|
| - void nearLinkTo(const Assembler &Asm, intptr_t position) {
|
| - if (Asm.getPreliminary())
|
| - return;
|
| - assert(!isBound());
|
| - UnresolvedNearPositions.push_back(position);
|
| - }
|
| + void finalCheck() const override {
|
| + Ice::Label::finalCheck();
|
| + assert(!hasNear());
|
| + }
|
|
|
| - llvm::SmallVector<intptr_t, 20> UnresolvedNearPositions;
|
| + /// Returns the position of an earlier branch instruction which assumes that
|
| + /// this label is "near", and bumps iterator to the next near position.
|
| + intptr_t getNearPosition() {
|
| + assert(hasNear());
|
| + intptr_t Pos = UnresolvedNearPositions.back();
|
| + UnresolvedNearPositions.pop_back();
|
| + return Pos;
|
| + }
|
|
|
| - template <class> friend class AssemblerX86Base;
|
| -};
|
| + bool hasNear() const { return !UnresolvedNearPositions.empty(); }
|
| + bool isUnused() const override {
|
| + return Ice::Label::isUnused() && !hasNear();
|
| + }
|
|
|
| -template <class Machine> class AssemblerX86Base : public Assembler {
|
| - AssemblerX86Base(const AssemblerX86Base &) = delete;
|
| - AssemblerX86Base &operator=(const AssemblerX86Base &) = delete;
|
| + private:
|
| + friend class AssemblerX86Base<TraitsType>;
|
|
|
| -protected:
|
| - AssemblerX86Base(AssemblerKind Kind, bool use_far_branches)
|
| - : Assembler(Kind) {
|
| - // This mode is only needed and implemented for MIPS and ARM.
|
| - assert(!use_far_branches);
|
| - (void)use_far_branches;
|
| - }
|
| + void nearLinkTo(const Assembler &Asm, intptr_t position) {
|
| + if (Asm.getPreliminary())
|
| + return;
|
| + assert(!isBound());
|
| + UnresolvedNearPositions.push_back(position);
|
| + }
|
|
|
| -public:
|
| - using Traits = MachineTraits<Machine>;
|
| + llvm::SmallVector<intptr_t, 20> UnresolvedNearPositions;
|
| + };
|
|
|
| +public:
|
| ~AssemblerX86Base() override;
|
|
|
| static const bool kNearJump = true;
|
| @@ -166,21 +180,19 @@ public:
|
| }
|
|
|
| // Operations to emit GPR instructions (and dispatch on operand type).
|
| - using TypedEmitGPR = void (AssemblerX86Base::*)(Type,
|
| - typename Traits::GPRRegister);
|
| - using TypedEmitAddr =
|
| - void (AssemblerX86Base::*)(Type, const typename Traits::Address &);
|
| + using TypedEmitGPR = void (AssemblerX86Base::*)(Type, GPRRegister);
|
| + using TypedEmitAddr = void (AssemblerX86Base::*)(Type, const Address &);
|
| struct GPREmitterOneOp {
|
| TypedEmitGPR Reg;
|
| TypedEmitAddr Addr;
|
| };
|
|
|
| - using TypedEmitGPRGPR = void (AssemblerX86Base::*)(
|
| - Type, typename Traits::GPRRegister, typename Traits::GPRRegister);
|
| - using TypedEmitGPRAddr = void (AssemblerX86Base::*)(
|
| - Type, typename Traits::GPRRegister, const typename Traits::Address &);
|
| - using TypedEmitGPRImm = void (AssemblerX86Base::*)(
|
| - Type, typename Traits::GPRRegister, const Immediate &);
|
| + using TypedEmitGPRGPR = void (AssemblerX86Base::*)(Type, GPRRegister,
|
| + GPRRegister);
|
| + using TypedEmitGPRAddr = void (AssemblerX86Base::*)(Type, GPRRegister,
|
| + const Address &);
|
| + using TypedEmitGPRImm = void (AssemblerX86Base::*)(Type, GPRRegister,
|
| + const Immediate &);
|
| struct GPREmitterRegOp {
|
| TypedEmitGPRGPR GPRGPR;
|
| TypedEmitGPRAddr GPRAddr;
|
| @@ -188,15 +200,15 @@ public:
|
| };
|
|
|
| struct GPREmitterShiftOp {
|
| - // Technically, Addr/GPR and Addr/Imm are also allowed, but */Addr are not.
|
| - // In practice, we always normalize the Dest to a Register first.
|
| + // Technically, Addr/GPR and Addr/Imm are also allowed, but */Addr are
|
| + // not. In practice, we always normalize the Dest to a Register first.
|
| TypedEmitGPRGPR GPRGPR;
|
| TypedEmitGPRImm GPRImm;
|
| };
|
|
|
| - using TypedEmitGPRGPRImm = void (AssemblerX86Base::*)(
|
| - Type, typename Traits::GPRRegister, typename Traits::GPRRegister,
|
| - const Immediate &);
|
| + using TypedEmitGPRGPRImm = void (AssemblerX86Base::*)(Type, GPRRegister,
|
| + GPRRegister,
|
| + const Immediate &);
|
| struct GPREmitterShiftD {
|
| // Technically AddrGPR and AddrGPRImm are also allowed, but in practice we
|
| // always normalize Dest to a Register first.
|
| @@ -204,39 +216,36 @@ public:
|
| TypedEmitGPRGPRImm GPRGPRImm;
|
| };
|
|
|
| - using TypedEmitAddrGPR = void (AssemblerX86Base::*)(
|
| - Type, const typename Traits::Address &, typename Traits::GPRRegister);
|
| - using TypedEmitAddrImm = void (AssemblerX86Base::*)(
|
| - Type, const typename Traits::Address &, const Immediate &);
|
| + using TypedEmitAddrGPR = void (AssemblerX86Base::*)(Type, const Address &,
|
| + GPRRegister);
|
| + using TypedEmitAddrImm = void (AssemblerX86Base::*)(Type, const Address &,
|
| + const Immediate &);
|
| struct GPREmitterAddrOp {
|
| TypedEmitAddrGPR AddrGPR;
|
| TypedEmitAddrImm AddrImm;
|
| };
|
|
|
| // Operations to emit XMM instructions (and dispatch on operand type).
|
| - using TypedEmitXmmXmm = void (AssemblerX86Base::*)(
|
| - Type, typename Traits::XmmRegister, typename Traits::XmmRegister);
|
| - using TypedEmitXmmAddr = void (AssemblerX86Base::*)(
|
| - Type, typename Traits::XmmRegister, const typename Traits::Address &);
|
| + using TypedEmitXmmXmm = void (AssemblerX86Base::*)(Type, XmmRegister,
|
| + XmmRegister);
|
| + using TypedEmitXmmAddr = void (AssemblerX86Base::*)(Type, XmmRegister,
|
| + const Address &);
|
| struct XmmEmitterRegOp {
|
| TypedEmitXmmXmm XmmXmm;
|
| TypedEmitXmmAddr XmmAddr;
|
| };
|
|
|
| - using EmitXmmXmm = void (AssemblerX86Base::*)(typename Traits::XmmRegister,
|
| - typename Traits::XmmRegister);
|
| - using EmitXmmAddr = void (AssemblerX86Base::*)(
|
| - typename Traits::XmmRegister, const typename Traits::Address &);
|
| - using EmitAddrXmm = void (AssemblerX86Base::*)(
|
| - const typename Traits::Address &, typename Traits::XmmRegister);
|
| + using EmitXmmXmm = void (AssemblerX86Base::*)(XmmRegister, XmmRegister);
|
| + using EmitXmmAddr = void (AssemblerX86Base::*)(XmmRegister, const Address &);
|
| + using EmitAddrXmm = void (AssemblerX86Base::*)(const Address &, XmmRegister);
|
| struct XmmEmitterMovOps {
|
| EmitXmmXmm XmmXmm;
|
| EmitXmmAddr XmmAddr;
|
| EmitAddrXmm AddrXmm;
|
| };
|
|
|
| - using TypedEmitXmmImm = void (AssemblerX86Base::*)(
|
| - Type, typename Traits::XmmRegister, const Immediate &);
|
| + using TypedEmitXmmImm = void (AssemblerX86Base::*)(Type, XmmRegister,
|
| + const Immediate &);
|
|
|
| struct XmmEmitterShiftOp {
|
| TypedEmitXmmXmm XmmXmm;
|
| @@ -248,8 +257,8 @@ public:
|
| template <typename DReg_t, typename SReg_t> struct CastEmitterRegOp {
|
| using TypedEmitRegs = void (AssemblerX86Base::*)(Type, DReg_t, Type,
|
| SReg_t);
|
| - using TypedEmitAddr = void (AssemblerX86Base::*)(
|
| - Type, DReg_t, Type, const typename Traits::Address &);
|
| + using TypedEmitAddr = void (AssemblerX86Base::*)(Type, DReg_t, Type,
|
| + const Address &);
|
|
|
| TypedEmitRegs RegReg;
|
| TypedEmitAddr RegAddr;
|
| @@ -260,8 +269,9 @@ public:
|
| template <typename DReg_t, typename SReg_t> struct ThreeOpImmEmitter {
|
| using TypedEmitRegRegImm = void (AssemblerX86Base::*)(Type, DReg_t, SReg_t,
|
| const Immediate &);
|
| - using TypedEmitRegAddrImm = void (AssemblerX86Base::*)(
|
| - Type, DReg_t, const typename Traits::Address &, const Immediate &);
|
| + using TypedEmitRegAddrImm = void (AssemblerX86Base::*)(Type, DReg_t,
|
| + const Address &,
|
| + const Immediate &);
|
|
|
| TypedEmitRegRegImm RegRegImm;
|
| TypedEmitRegAddrImm RegAddrImm;
|
| @@ -270,17 +280,17 @@ public:
|
| /*
|
| * Emit Machine Instructions.
|
| */
|
| - void call(typename Traits::GPRRegister reg);
|
| - void call(const typename Traits::Address &address);
|
| + void call(GPRRegister reg);
|
| + void call(const Address &address);
|
| void call(const ConstantRelocatable *label); // not testable.
|
| void call(const Immediate &abs_address);
|
|
|
| static const intptr_t kCallExternalLabelSize = 5;
|
|
|
| - void pushl(typename Traits::GPRRegister reg);
|
| + void pushl(GPRRegister reg);
|
|
|
| - void popl(typename Traits::GPRRegister reg);
|
| - void popl(const typename Traits::Address &address);
|
| + void popl(GPRRegister reg);
|
| + void popl(const Address &address);
|
|
|
| template <typename T = Traits,
|
| typename = typename std::enable_if<T::HasPusha>::type>
|
| @@ -289,309 +299,190 @@ public:
|
| typename = typename std::enable_if<T::HasPopa>::type>
|
| void popal();
|
|
|
| - void setcc(typename Traits::Cond::BrCond condition,
|
| - typename Traits::ByteRegister dst);
|
| - void setcc(typename Traits::Cond::BrCond condition,
|
| - const typename Traits::Address &address);
|
| + void setcc(BrCond condition, ByteRegister dst);
|
| + void setcc(BrCond condition, const Address &address);
|
|
|
| - void mov(Type Ty, typename Traits::GPRRegister dst, const Immediate &src);
|
| - void mov(Type Ty, typename Traits::GPRRegister dst,
|
| - typename Traits::GPRRegister src);
|
| - void mov(Type Ty, typename Traits::GPRRegister dst,
|
| - const typename Traits::Address &src);
|
| - void mov(Type Ty, const typename Traits::Address &dst,
|
| - typename Traits::GPRRegister src);
|
| - void mov(Type Ty, const typename Traits::Address &dst, const Immediate &imm);
|
| + void mov(Type Ty, GPRRegister dst, const Immediate &src);
|
| + void mov(Type Ty, GPRRegister dst, GPRRegister src);
|
| + void mov(Type Ty, GPRRegister dst, const Address &src);
|
| + void mov(Type Ty, const Address &dst, GPRRegister src);
|
| + void mov(Type Ty, const Address &dst, const Immediate &imm);
|
|
|
| template <typename T = Traits>
|
| - typename std::enable_if<T::Is64Bit, void>::type
|
| - movabs(const typename Traits::GPRRegister Dst, uint64_t Imm64);
|
| + typename std::enable_if<T::Is64Bit, void>::type movabs(const GPRRegister Dst,
|
| + uint64_t Imm64);
|
| template <typename T = Traits>
|
| - typename std::enable_if<!T::Is64Bit, void>::type
|
| - movabs(const typename Traits::GPRRegister, uint64_t) {
|
| + typename std::enable_if<!T::Is64Bit, void>::type movabs(const GPRRegister,
|
| + uint64_t) {
|
| llvm::report_fatal_error("movabs is only supported in 64-bit x86 targets.");
|
| }
|
|
|
| - void movzx(Type Ty, typename Traits::GPRRegister dst,
|
| - typename Traits::GPRRegister src);
|
| - void movzx(Type Ty, typename Traits::GPRRegister dst,
|
| - const typename Traits::Address &src);
|
| - void movsx(Type Ty, typename Traits::GPRRegister dst,
|
| - typename Traits::GPRRegister src);
|
| - void movsx(Type Ty, typename Traits::GPRRegister dst,
|
| - const typename Traits::Address &src);
|
| + void movzx(Type Ty, GPRRegister dst, GPRRegister src);
|
| + void movzx(Type Ty, GPRRegister dst, const Address &src);
|
| + void movsx(Type Ty, GPRRegister dst, GPRRegister src);
|
| + void movsx(Type Ty, GPRRegister dst, const Address &src);
|
|
|
| - void lea(Type Ty, typename Traits::GPRRegister dst,
|
| - const typename Traits::Address &src);
|
| + void lea(Type Ty, GPRRegister dst, const Address &src);
|
|
|
| - void cmov(Type Ty, typename Traits::Cond::BrCond cond,
|
| - typename Traits::GPRRegister dst, typename Traits::GPRRegister src);
|
| - void cmov(Type Ty, typename Traits::Cond::BrCond cond,
|
| - typename Traits::GPRRegister dst,
|
| - const typename Traits::Address &src);
|
| + void cmov(Type Ty, BrCond cond, GPRRegister dst, GPRRegister src);
|
| + void cmov(Type Ty, BrCond cond, GPRRegister dst, const Address &src);
|
|
|
| void rep_movsb();
|
|
|
| - void movss(Type Ty, typename Traits::XmmRegister dst,
|
| - const typename Traits::Address &src);
|
| - void movss(Type Ty, const typename Traits::Address &dst,
|
| - typename Traits::XmmRegister src);
|
| - void movss(Type Ty, typename Traits::XmmRegister dst,
|
| - typename Traits::XmmRegister src);
|
| -
|
| - void movd(Type SrcTy, typename Traits::XmmRegister dst,
|
| - typename Traits::GPRRegister src);
|
| - void movd(Type SrcTy, typename Traits::XmmRegister dst,
|
| - const typename Traits::Address &src);
|
| - void movd(Type DestTy, typename Traits::GPRRegister dst,
|
| - typename Traits::XmmRegister src);
|
| - void movd(Type DestTy, const typename Traits::Address &dst,
|
| - typename Traits::XmmRegister src);
|
| -
|
| - void movq(typename Traits::XmmRegister dst, typename Traits::XmmRegister src);
|
| - void movq(const typename Traits::Address &dst,
|
| - typename Traits::XmmRegister src);
|
| - void movq(typename Traits::XmmRegister dst,
|
| - const typename Traits::Address &src);
|
| -
|
| - void addss(Type Ty, typename Traits::XmmRegister dst,
|
| - typename Traits::XmmRegister src);
|
| - void addss(Type Ty, typename Traits::XmmRegister dst,
|
| - const typename Traits::Address &src);
|
| - void subss(Type Ty, typename Traits::XmmRegister dst,
|
| - typename Traits::XmmRegister src);
|
| - void subss(Type Ty, typename Traits::XmmRegister dst,
|
| - const typename Traits::Address &src);
|
| - void mulss(Type Ty, typename Traits::XmmRegister dst,
|
| - typename Traits::XmmRegister src);
|
| - void mulss(Type Ty, typename Traits::XmmRegister dst,
|
| - const typename Traits::Address &src);
|
| - void divss(Type Ty, typename Traits::XmmRegister dst,
|
| - typename Traits::XmmRegister src);
|
| - void divss(Type Ty, typename Traits::XmmRegister dst,
|
| - const typename Traits::Address &src);
|
| -
|
| - void movaps(typename Traits::XmmRegister dst,
|
| - typename Traits::XmmRegister src);
|
| -
|
| - void movups(typename Traits::XmmRegister dst,
|
| - typename Traits::XmmRegister src);
|
| - void movups(typename Traits::XmmRegister dst,
|
| - const typename Traits::Address &src);
|
| - void movups(const typename Traits::Address &dst,
|
| - typename Traits::XmmRegister src);
|
| -
|
| - void padd(Type Ty, typename Traits::XmmRegister dst,
|
| - typename Traits::XmmRegister src);
|
| - void padd(Type Ty, typename Traits::XmmRegister dst,
|
| - const typename Traits::Address &src);
|
| - void pand(Type Ty, typename Traits::XmmRegister dst,
|
| - typename Traits::XmmRegister src);
|
| - void pand(Type Ty, typename Traits::XmmRegister dst,
|
| - const typename Traits::Address &src);
|
| - void pandn(Type Ty, typename Traits::XmmRegister dst,
|
| - typename Traits::XmmRegister src);
|
| - void pandn(Type Ty, typename Traits::XmmRegister dst,
|
| - const typename Traits::Address &src);
|
| - void pmull(Type Ty, typename Traits::XmmRegister dst,
|
| - typename Traits::XmmRegister src);
|
| - void pmull(Type Ty, typename Traits::XmmRegister dst,
|
| - const typename Traits::Address &src);
|
| - void pmuludq(Type Ty, typename Traits::XmmRegister dst,
|
| - typename Traits::XmmRegister src);
|
| - void pmuludq(Type Ty, typename Traits::XmmRegister dst,
|
| - const typename Traits::Address &src);
|
| - void por(Type Ty, typename Traits::XmmRegister dst,
|
| - typename Traits::XmmRegister src);
|
| - void por(Type Ty, typename Traits::XmmRegister dst,
|
| - const typename Traits::Address &src);
|
| - void psub(Type Ty, typename Traits::XmmRegister dst,
|
| - typename Traits::XmmRegister src);
|
| - void psub(Type Ty, typename Traits::XmmRegister dst,
|
| - const typename Traits::Address &src);
|
| - void pxor(Type Ty, typename Traits::XmmRegister dst,
|
| - typename Traits::XmmRegister src);
|
| - void pxor(Type Ty, typename Traits::XmmRegister dst,
|
| - const typename Traits::Address &src);
|
| -
|
| - void psll(Type Ty, typename Traits::XmmRegister dst,
|
| - typename Traits::XmmRegister src);
|
| - void psll(Type Ty, typename Traits::XmmRegister dst,
|
| - const typename Traits::Address &src);
|
| - void psll(Type Ty, typename Traits::XmmRegister dst, const Immediate &src);
|
| -
|
| - void psra(Type Ty, typename Traits::XmmRegister dst,
|
| - typename Traits::XmmRegister src);
|
| - void psra(Type Ty, typename Traits::XmmRegister dst,
|
| - const typename Traits::Address &src);
|
| - void psra(Type Ty, typename Traits::XmmRegister dst, const Immediate &src);
|
| - void psrl(Type Ty, typename Traits::XmmRegister dst,
|
| - typename Traits::XmmRegister src);
|
| - void psrl(Type Ty, typename Traits::XmmRegister dst,
|
| - const typename Traits::Address &src);
|
| - void psrl(Type Ty, typename Traits::XmmRegister dst, const Immediate &src);
|
| -
|
| - void addps(Type Ty, typename Traits::XmmRegister dst,
|
| - typename Traits::XmmRegister src);
|
| - void addps(Type Ty, typename Traits::XmmRegister dst,
|
| - const typename Traits::Address &src);
|
| - void subps(Type Ty, typename Traits::XmmRegister dst,
|
| - typename Traits::XmmRegister src);
|
| - void subps(Type Ty, typename Traits::XmmRegister dst,
|
| - const typename Traits::Address &src);
|
| - void divps(Type Ty, typename Traits::XmmRegister dst,
|
| - typename Traits::XmmRegister src);
|
| - void divps(Type Ty, typename Traits::XmmRegister dst,
|
| - const typename Traits::Address &src);
|
| - void mulps(Type Ty, typename Traits::XmmRegister dst,
|
| - typename Traits::XmmRegister src);
|
| - void mulps(Type Ty, typename Traits::XmmRegister dst,
|
| - const typename Traits::Address &src);
|
| - void minps(Type Ty, typename Traits::XmmRegister dst,
|
| - const typename Traits::Address &src);
|
| - void minps(Type Ty, typename Traits::XmmRegister dst,
|
| - typename Traits::XmmRegister src);
|
| - void minss(Type Ty, typename Traits::XmmRegister dst,
|
| - const typename Traits::Address &src);
|
| - void minss(Type Ty, typename Traits::XmmRegister dst,
|
| - typename Traits::XmmRegister src);
|
| - void maxps(Type Ty, typename Traits::XmmRegister dst,
|
| - const typename Traits::Address &src);
|
| - void maxps(Type Ty, typename Traits::XmmRegister dst,
|
| - typename Traits::XmmRegister src);
|
| - void maxss(Type Ty, typename Traits::XmmRegister dst,
|
| - const typename Traits::Address &src);
|
| - void maxss(Type Ty, typename Traits::XmmRegister dst,
|
| - typename Traits::XmmRegister src);
|
| - void andnps(Type Ty, typename Traits::XmmRegister dst,
|
| - const typename Traits::Address &src);
|
| - void andnps(Type Ty, typename Traits::XmmRegister dst,
|
| - typename Traits::XmmRegister src);
|
| - void andps(Type Ty, typename Traits::XmmRegister dst,
|
| - const typename Traits::Address &src);
|
| - void andps(Type Ty, typename Traits::XmmRegister dst,
|
| - typename Traits::XmmRegister src);
|
| - void orps(Type Ty, typename Traits::XmmRegister dst,
|
| - const typename Traits::Address &src);
|
| - void orps(Type Ty, typename Traits::XmmRegister dst,
|
| - typename Traits::XmmRegister src);
|
| -
|
| - void blendvps(Type Ty, typename Traits::XmmRegister dst,
|
| - typename Traits::XmmRegister src);
|
| - void blendvps(Type Ty, typename Traits::XmmRegister dst,
|
| - const typename Traits::Address &src);
|
| - void pblendvb(Type Ty, typename Traits::XmmRegister dst,
|
| - typename Traits::XmmRegister src);
|
| - void pblendvb(Type Ty, typename Traits::XmmRegister dst,
|
| - const typename Traits::Address &src);
|
| -
|
| - void cmpps(Type Ty, typename Traits::XmmRegister dst,
|
| - typename Traits::XmmRegister src,
|
| - typename Traits::Cond::CmppsCond CmpCondition);
|
| - void cmpps(Type Ty, typename Traits::XmmRegister dst,
|
| - const typename Traits::Address &src,
|
| - typename Traits::Cond::CmppsCond CmpCondition);
|
| -
|
| - void sqrtps(typename Traits::XmmRegister dst);
|
| - void rsqrtps(typename Traits::XmmRegister dst);
|
| - void reciprocalps(typename Traits::XmmRegister dst);
|
| -
|
| - void movhlps(typename Traits::XmmRegister dst,
|
| - typename Traits::XmmRegister src);
|
| - void movlhps(typename Traits::XmmRegister dst,
|
| - typename Traits::XmmRegister src);
|
| - void unpcklps(typename Traits::XmmRegister dst,
|
| - typename Traits::XmmRegister src);
|
| - void unpckhps(typename Traits::XmmRegister dst,
|
| - typename Traits::XmmRegister src);
|
| - void unpcklpd(typename Traits::XmmRegister dst,
|
| - typename Traits::XmmRegister src);
|
| - void unpckhpd(typename Traits::XmmRegister dst,
|
| - typename Traits::XmmRegister src);
|
| -
|
| - void set1ps(typename Traits::XmmRegister dst,
|
| - typename Traits::GPRRegister tmp, const Immediate &imm);
|
| -
|
| - void sqrtpd(typename Traits::XmmRegister dst);
|
| -
|
| - void pshufd(Type Ty, typename Traits::XmmRegister dst,
|
| - typename Traits::XmmRegister src, const Immediate &mask);
|
| - void pshufd(Type Ty, typename Traits::XmmRegister dst,
|
| - const typename Traits::Address &src, const Immediate &mask);
|
| - void shufps(Type Ty, typename Traits::XmmRegister dst,
|
| - typename Traits::XmmRegister src, const Immediate &mask);
|
| - void shufps(Type Ty, typename Traits::XmmRegister dst,
|
| - const typename Traits::Address &src, const Immediate &mask);
|
| -
|
| - void cvtdq2ps(Type, typename Traits::XmmRegister dst,
|
| - typename Traits::XmmRegister src);
|
| - void cvtdq2ps(Type, typename Traits::XmmRegister dst,
|
| - const typename Traits::Address &src);
|
| -
|
| - void cvttps2dq(Type, typename Traits::XmmRegister dst,
|
| - typename Traits::XmmRegister src);
|
| - void cvttps2dq(Type, typename Traits::XmmRegister dst,
|
| - const typename Traits::Address &src);
|
| -
|
| - void cvtsi2ss(Type DestTy, typename Traits::XmmRegister dst, Type SrcTy,
|
| - typename Traits::GPRRegister src);
|
| - void cvtsi2ss(Type DestTy, typename Traits::XmmRegister dst, Type SrcTy,
|
| - const typename Traits::Address &src);
|
| -
|
| - void cvtfloat2float(Type SrcTy, typename Traits::XmmRegister dst,
|
| - typename Traits::XmmRegister src);
|
| - void cvtfloat2float(Type SrcTy, typename Traits::XmmRegister dst,
|
| - const typename Traits::Address &src);
|
| -
|
| - void cvttss2si(Type DestTy, typename Traits::GPRRegister dst, Type SrcTy,
|
| - typename Traits::XmmRegister src);
|
| - void cvttss2si(Type DestTy, typename Traits::GPRRegister dst, Type SrcTy,
|
| - const typename Traits::Address &src);
|
| -
|
| - void ucomiss(Type Ty, typename Traits::XmmRegister a,
|
| - typename Traits::XmmRegister b);
|
| - void ucomiss(Type Ty, typename Traits::XmmRegister a,
|
| - const typename Traits::Address &b);
|
| -
|
| - void movmskpd(typename Traits::GPRRegister dst,
|
| - typename Traits::XmmRegister src);
|
| - void movmskps(typename Traits::GPRRegister dst,
|
| - typename Traits::XmmRegister src);
|
| -
|
| - void sqrtss(Type Ty, typename Traits::XmmRegister dst,
|
| - const typename Traits::Address &src);
|
| - void sqrtss(Type Ty, typename Traits::XmmRegister dst,
|
| - typename Traits::XmmRegister src);
|
| -
|
| - void xorps(Type Ty, typename Traits::XmmRegister dst,
|
| - const typename Traits::Address &src);
|
| - void xorps(Type Ty, typename Traits::XmmRegister dst,
|
| - typename Traits::XmmRegister src);
|
| -
|
| - void insertps(Type Ty, typename Traits::XmmRegister dst,
|
| - typename Traits::XmmRegister src, const Immediate &imm);
|
| - void insertps(Type Ty, typename Traits::XmmRegister dst,
|
| - const typename Traits::Address &src, const Immediate &imm);
|
| -
|
| - void pinsr(Type Ty, typename Traits::XmmRegister dst,
|
| - typename Traits::GPRRegister src, const Immediate &imm);
|
| - void pinsr(Type Ty, typename Traits::XmmRegister dst,
|
| - const typename Traits::Address &src, const Immediate &imm);
|
| -
|
| - void pextr(Type Ty, typename Traits::GPRRegister dst,
|
| - typename Traits::XmmRegister src, const Immediate &imm);
|
| -
|
| - void pmovsxdq(typename Traits::XmmRegister dst,
|
| - typename Traits::XmmRegister src);
|
| -
|
| - void pcmpeq(Type Ty, typename Traits::XmmRegister dst,
|
| - typename Traits::XmmRegister src);
|
| - void pcmpeq(Type Ty, typename Traits::XmmRegister dst,
|
| - const typename Traits::Address &src);
|
| - void pcmpgt(Type Ty, typename Traits::XmmRegister dst,
|
| - typename Traits::XmmRegister src);
|
| - void pcmpgt(Type Ty, typename Traits::XmmRegister dst,
|
| - const typename Traits::Address &src);
|
| + void movss(Type Ty, XmmRegister dst, const Address &src);
|
| + void movss(Type Ty, const Address &dst, XmmRegister src);
|
| + void movss(Type Ty, XmmRegister dst, XmmRegister src);
|
| +
|
| + void movd(Type SrcTy, XmmRegister dst, GPRRegister src);
|
| + void movd(Type SrcTy, XmmRegister dst, const Address &src);
|
| + void movd(Type DestTy, GPRRegister dst, XmmRegister src);
|
| + void movd(Type DestTy, const Address &dst, XmmRegister src);
|
| +
|
| + void movq(XmmRegister dst, XmmRegister src);
|
| + void movq(const Address &dst, XmmRegister src);
|
| + void movq(XmmRegister dst, const Address &src);
|
| +
|
| + void addss(Type Ty, XmmRegister dst, XmmRegister src);
|
| + void addss(Type Ty, XmmRegister dst, const Address &src);
|
| + void subss(Type Ty, XmmRegister dst, XmmRegister src);
|
| + void subss(Type Ty, XmmRegister dst, const Address &src);
|
| + void mulss(Type Ty, XmmRegister dst, XmmRegister src);
|
| + void mulss(Type Ty, XmmRegister dst, const Address &src);
|
| + void divss(Type Ty, XmmRegister dst, XmmRegister src);
|
| + void divss(Type Ty, XmmRegister dst, const Address &src);
|
| +
|
| + void movaps(XmmRegister dst, XmmRegister src);
|
| +
|
| + void movups(XmmRegister dst, XmmRegister src);
|
| + void movups(XmmRegister dst, const Address &src);
|
| + void movups(const Address &dst, XmmRegister src);
|
| +
|
| + void padd(Type Ty, XmmRegister dst, XmmRegister src);
|
| + void padd(Type Ty, XmmRegister dst, const Address &src);
|
| + void pand(Type Ty, XmmRegister dst, XmmRegister src);
|
| + void pand(Type Ty, XmmRegister dst, const Address &src);
|
| + void pandn(Type Ty, XmmRegister dst, XmmRegister src);
|
| + void pandn(Type Ty, XmmRegister dst, const Address &src);
|
| + void pmull(Type Ty, XmmRegister dst, XmmRegister src);
|
| + void pmull(Type Ty, XmmRegister dst, const Address &src);
|
| + void pmuludq(Type Ty, XmmRegister dst, XmmRegister src);
|
| + void pmuludq(Type Ty, XmmRegister dst, const Address &src);
|
| + void por(Type Ty, XmmRegister dst, XmmRegister src);
|
| + void por(Type Ty, XmmRegister dst, const Address &src);
|
| + void psub(Type Ty, XmmRegister dst, XmmRegister src);
|
| + void psub(Type Ty, XmmRegister dst, const Address &src);
|
| + void pxor(Type Ty, XmmRegister dst, XmmRegister src);
|
| + void pxor(Type Ty, XmmRegister dst, const Address &src);
|
| +
|
| + void psll(Type Ty, XmmRegister dst, XmmRegister src);
|
| + void psll(Type Ty, XmmRegister dst, const Address &src);
|
| + void psll(Type Ty, XmmRegister dst, const Immediate &src);
|
| +
|
| + void psra(Type Ty, XmmRegister dst, XmmRegister src);
|
| + void psra(Type Ty, XmmRegister dst, const Address &src);
|
| + void psra(Type Ty, XmmRegister dst, const Immediate &src);
|
| + void psrl(Type Ty, XmmRegister dst, XmmRegister src);
|
| + void psrl(Type Ty, XmmRegister dst, const Address &src);
|
| + void psrl(Type Ty, XmmRegister dst, const Immediate &src);
|
| +
|
| + void addps(Type Ty, XmmRegister dst, XmmRegister src);
|
| + void addps(Type Ty, XmmRegister dst, const Address &src);
|
| + void subps(Type Ty, XmmRegister dst, XmmRegister src);
|
| + void subps(Type Ty, XmmRegister dst, const Address &src);
|
| + void divps(Type Ty, XmmRegister dst, XmmRegister src);
|
| + void divps(Type Ty, XmmRegister dst, const Address &src);
|
| + void mulps(Type Ty, XmmRegister dst, XmmRegister src);
|
| + void mulps(Type Ty, XmmRegister dst, const Address &src);
|
| + void minps(Type Ty, XmmRegister dst, const Address &src);
|
| + void minps(Type Ty, XmmRegister dst, XmmRegister src);
|
| + void minss(Type Ty, XmmRegister dst, const Address &src);
|
| + void minss(Type Ty, XmmRegister dst, XmmRegister src);
|
| + void maxps(Type Ty, XmmRegister dst, const Address &src);
|
| + void maxps(Type Ty, XmmRegister dst, XmmRegister src);
|
| + void maxss(Type Ty, XmmRegister dst, const Address &src);
|
| + void maxss(Type Ty, XmmRegister dst, XmmRegister src);
|
| + void andnps(Type Ty, XmmRegister dst, const Address &src);
|
| + void andnps(Type Ty, XmmRegister dst, XmmRegister src);
|
| + void andps(Type Ty, XmmRegister dst, const Address &src);
|
| + void andps(Type Ty, XmmRegister dst, XmmRegister src);
|
| + void orps(Type Ty, XmmRegister dst, const Address &src);
|
| + void orps(Type Ty, XmmRegister dst, XmmRegister src);
|
| +
|
| + void blendvps(Type Ty, XmmRegister dst, XmmRegister src);
|
| + void blendvps(Type Ty, XmmRegister dst, const Address &src);
|
| + void pblendvb(Type Ty, XmmRegister dst, XmmRegister src);
|
| + void pblendvb(Type Ty, XmmRegister dst, const Address &src);
|
| +
|
| + void cmpps(Type Ty, XmmRegister dst, XmmRegister src, CmppsCond CmpCondition);
|
| + void cmpps(Type Ty, XmmRegister dst, const Address &src,
|
| + CmppsCond CmpCondition);
|
| +
|
| + void sqrtps(XmmRegister dst);
|
| + void rsqrtps(XmmRegister dst);
|
| + void reciprocalps(XmmRegister dst);
|
| +
|
| + void movhlps(XmmRegister dst, XmmRegister src);
|
| + void movlhps(XmmRegister dst, XmmRegister src);
|
| + void unpcklps(XmmRegister dst, XmmRegister src);
|
| + void unpckhps(XmmRegister dst, XmmRegister src);
|
| + void unpcklpd(XmmRegister dst, XmmRegister src);
|
| + void unpckhpd(XmmRegister dst, XmmRegister src);
|
| +
|
| + void set1ps(XmmRegister dst, GPRRegister tmp, const Immediate &imm);
|
| +
|
| + void sqrtpd(XmmRegister dst);
|
| +
|
| + void pshufd(Type Ty, XmmRegister dst, XmmRegister src, const Immediate &mask);
|
| + void pshufd(Type Ty, XmmRegister dst, const Address &src,
|
| + const Immediate &mask);
|
| + void shufps(Type Ty, XmmRegister dst, XmmRegister src, const Immediate &mask);
|
| + void shufps(Type Ty, XmmRegister dst, const Address &src,
|
| + const Immediate &mask);
|
| +
|
| + void cvtdq2ps(Type, XmmRegister dst, XmmRegister src);
|
| + void cvtdq2ps(Type, XmmRegister dst, const Address &src);
|
| +
|
| + void cvttps2dq(Type, XmmRegister dst, XmmRegister src);
|
| + void cvttps2dq(Type, XmmRegister dst, const Address &src);
|
| +
|
| + void cvtsi2ss(Type DestTy, XmmRegister dst, Type SrcTy, GPRRegister src);
|
| + void cvtsi2ss(Type DestTy, XmmRegister dst, Type SrcTy, const Address &src);
|
| +
|
| + void cvtfloat2float(Type SrcTy, XmmRegister dst, XmmRegister src);
|
| + void cvtfloat2float(Type SrcTy, XmmRegister dst, const Address &src);
|
| +
|
| + void cvttss2si(Type DestTy, GPRRegister dst, Type SrcTy, XmmRegister src);
|
| + void cvttss2si(Type DestTy, GPRRegister dst, Type SrcTy, const Address &src);
|
| +
|
| + void ucomiss(Type Ty, XmmRegister a, XmmRegister b);
|
| + void ucomiss(Type Ty, XmmRegister a, const Address &b);
|
| +
|
| + void movmskpd(GPRRegister dst, XmmRegister src);
|
| + void movmskps(GPRRegister dst, XmmRegister src);
|
| +
|
| + void sqrtss(Type Ty, XmmRegister dst, const Address &src);
|
| + void sqrtss(Type Ty, XmmRegister dst, XmmRegister src);
|
| +
|
| + void xorps(Type Ty, XmmRegister dst, const Address &src);
|
| + void xorps(Type Ty, XmmRegister dst, XmmRegister src);
|
| +
|
| + void insertps(Type Ty, XmmRegister dst, XmmRegister src,
|
| + const Immediate &imm);
|
| + void insertps(Type Ty, XmmRegister dst, const Address &src,
|
| + const Immediate &imm);
|
| +
|
| + void pinsr(Type Ty, XmmRegister dst, GPRRegister src, const Immediate &imm);
|
| + void pinsr(Type Ty, XmmRegister dst, const Address &src,
|
| + const Immediate &imm);
|
| +
|
| + void pextr(Type Ty, GPRRegister dst, XmmRegister src, const Immediate &imm);
|
| +
|
| + void pmovsxdq(XmmRegister dst, XmmRegister src);
|
| +
|
| + void pcmpeq(Type Ty, XmmRegister dst, XmmRegister src);
|
| + void pcmpeq(Type Ty, XmmRegister dst, const Address &src);
|
| + void pcmpgt(Type Ty, XmmRegister dst, XmmRegister src);
|
| + void pcmpgt(Type Ty, XmmRegister dst, const Address &src);
|
|
|
| enum RoundingMode {
|
| kRoundToNearest = 0x0,
|
| @@ -599,8 +490,7 @@ public:
|
| kRoundUp = 0x2,
|
| kRoundToZero = 0x3
|
| };
|
| - void roundsd(typename Traits::XmmRegister dst,
|
| - typename Traits::XmmRegister src, RoundingMode mode);
|
| + void roundsd(XmmRegister dst, XmmRegister src, RoundingMode mode);
|
|
|
| //----------------------------------------------------------------------------
|
| //
|
| @@ -646,93 +536,58 @@ public:
|
| //
|
| //----------------------------------------------------------------------------
|
|
|
| - void cmp(Type Ty, typename Traits::GPRRegister reg0,
|
| - typename Traits::GPRRegister reg1);
|
| - void cmp(Type Ty, typename Traits::GPRRegister reg,
|
| - const typename Traits::Address &address);
|
| - void cmp(Type Ty, typename Traits::GPRRegister reg, const Immediate &imm);
|
| - void cmp(Type Ty, const typename Traits::Address &address,
|
| - typename Traits::GPRRegister reg);
|
| - void cmp(Type Ty, const typename Traits::Address &address,
|
| - const Immediate &imm);
|
| -
|
| - void test(Type Ty, typename Traits::GPRRegister reg0,
|
| - typename Traits::GPRRegister reg1);
|
| - void test(Type Ty, typename Traits::GPRRegister reg, const Immediate &imm);
|
| - void test(Type Ty, const typename Traits::Address &address,
|
| - typename Traits::GPRRegister reg);
|
| - void test(Type Ty, const typename Traits::Address &address,
|
| - const Immediate &imm);
|
| -
|
| - void And(Type Ty, typename Traits::GPRRegister dst,
|
| - typename Traits::GPRRegister src);
|
| - void And(Type Ty, typename Traits::GPRRegister dst,
|
| - const typename Traits::Address &address);
|
| - void And(Type Ty, typename Traits::GPRRegister dst, const Immediate &imm);
|
| - void And(Type Ty, const typename Traits::Address &address,
|
| - typename Traits::GPRRegister reg);
|
| - void And(Type Ty, const typename Traits::Address &address,
|
| - const Immediate &imm);
|
| -
|
| - void Or(Type Ty, typename Traits::GPRRegister dst,
|
| - typename Traits::GPRRegister src);
|
| - void Or(Type Ty, typename Traits::GPRRegister dst,
|
| - const typename Traits::Address &address);
|
| - void Or(Type Ty, typename Traits::GPRRegister dst, const Immediate &imm);
|
| - void Or(Type Ty, const typename Traits::Address &address,
|
| - typename Traits::GPRRegister reg);
|
| - void Or(Type Ty, const typename Traits::Address &address,
|
| - const Immediate &imm);
|
| -
|
| - void Xor(Type Ty, typename Traits::GPRRegister dst,
|
| - typename Traits::GPRRegister src);
|
| - void Xor(Type Ty, typename Traits::GPRRegister dst,
|
| - const typename Traits::Address &address);
|
| - void Xor(Type Ty, typename Traits::GPRRegister dst, const Immediate &imm);
|
| - void Xor(Type Ty, const typename Traits::Address &address,
|
| - typename Traits::GPRRegister reg);
|
| - void Xor(Type Ty, const typename Traits::Address &address,
|
| - const Immediate &imm);
|
| -
|
| - void add(Type Ty, typename Traits::GPRRegister dst,
|
| - typename Traits::GPRRegister src);
|
| - void add(Type Ty, typename Traits::GPRRegister reg,
|
| - const typename Traits::Address &address);
|
| - void add(Type Ty, typename Traits::GPRRegister reg, const Immediate &imm);
|
| - void add(Type Ty, const typename Traits::Address &address,
|
| - typename Traits::GPRRegister reg);
|
| - void add(Type Ty, const typename Traits::Address &address,
|
| - const Immediate &imm);
|
| -
|
| - void adc(Type Ty, typename Traits::GPRRegister dst,
|
| - typename Traits::GPRRegister src);
|
| - void adc(Type Ty, typename Traits::GPRRegister dst,
|
| - const typename Traits::Address &address);
|
| - void adc(Type Ty, typename Traits::GPRRegister reg, const Immediate &imm);
|
| - void adc(Type Ty, const typename Traits::Address &address,
|
| - typename Traits::GPRRegister reg);
|
| - void adc(Type Ty, const typename Traits::Address &address,
|
| - const Immediate &imm);
|
| -
|
| - void sub(Type Ty, typename Traits::GPRRegister dst,
|
| - typename Traits::GPRRegister src);
|
| - void sub(Type Ty, typename Traits::GPRRegister reg,
|
| - const typename Traits::Address &address);
|
| - void sub(Type Ty, typename Traits::GPRRegister reg, const Immediate &imm);
|
| - void sub(Type Ty, const typename Traits::Address &address,
|
| - typename Traits::GPRRegister reg);
|
| - void sub(Type Ty, const typename Traits::Address &address,
|
| - const Immediate &imm);
|
| -
|
| - void sbb(Type Ty, typename Traits::GPRRegister dst,
|
| - typename Traits::GPRRegister src);
|
| - void sbb(Type Ty, typename Traits::GPRRegister reg,
|
| - const typename Traits::Address &address);
|
| - void sbb(Type Ty, typename Traits::GPRRegister reg, const Immediate &imm);
|
| - void sbb(Type Ty, const typename Traits::Address &address,
|
| - typename Traits::GPRRegister reg);
|
| - void sbb(Type Ty, const typename Traits::Address &address,
|
| - const Immediate &imm);
|
| + void cmp(Type Ty, GPRRegister reg0, GPRRegister reg1);
|
| + void cmp(Type Ty, GPRRegister reg, const Address &address);
|
| + void cmp(Type Ty, GPRRegister reg, const Immediate &imm);
|
| + void cmp(Type Ty, const Address &address, GPRRegister reg);
|
| + void cmp(Type Ty, const Address &address, const Immediate &imm);
|
| +
|
| + void test(Type Ty, GPRRegister reg0, GPRRegister reg1);
|
| + void test(Type Ty, GPRRegister reg, const Immediate &imm);
|
| + void test(Type Ty, const Address &address, GPRRegister reg);
|
| + void test(Type Ty, const Address &address, const Immediate &imm);
|
| +
|
| + void And(Type Ty, GPRRegister dst, GPRRegister src);
|
| + void And(Type Ty, GPRRegister dst, const Address &address);
|
| + void And(Type Ty, GPRRegister dst, const Immediate &imm);
|
| + void And(Type Ty, const Address &address, GPRRegister reg);
|
| + void And(Type Ty, const Address &address, const Immediate &imm);
|
| +
|
| + void Or(Type Ty, GPRRegister dst, GPRRegister src);
|
| + void Or(Type Ty, GPRRegister dst, const Address &address);
|
| + void Or(Type Ty, GPRRegister dst, const Immediate &imm);
|
| + void Or(Type Ty, const Address &address, GPRRegister reg);
|
| + void Or(Type Ty, const Address &address, const Immediate &imm);
|
| +
|
| + void Xor(Type Ty, GPRRegister dst, GPRRegister src);
|
| + void Xor(Type Ty, GPRRegister dst, const Address &address);
|
| + void Xor(Type Ty, GPRRegister dst, const Immediate &imm);
|
| + void Xor(Type Ty, const Address &address, GPRRegister reg);
|
| + void Xor(Type Ty, const Address &address, const Immediate &imm);
|
| +
|
| + void add(Type Ty, GPRRegister dst, GPRRegister src);
|
| + void add(Type Ty, GPRRegister reg, const Address &address);
|
| + void add(Type Ty, GPRRegister reg, const Immediate &imm);
|
| + void add(Type Ty, const Address &address, GPRRegister reg);
|
| + void add(Type Ty, const Address &address, const Immediate &imm);
|
| +
|
| + void adc(Type Ty, GPRRegister dst, GPRRegister src);
|
| + void adc(Type Ty, GPRRegister dst, const Address &address);
|
| + void adc(Type Ty, GPRRegister reg, const Immediate &imm);
|
| + void adc(Type Ty, const Address &address, GPRRegister reg);
|
| + void adc(Type Ty, const Address &address, const Immediate &imm);
|
| +
|
| + void sub(Type Ty, GPRRegister dst, GPRRegister src);
|
| + void sub(Type Ty, GPRRegister reg, const Address &address);
|
| + void sub(Type Ty, GPRRegister reg, const Immediate &imm);
|
| + void sub(Type Ty, const Address &address, GPRRegister reg);
|
| + void sub(Type Ty, const Address &address, const Immediate &imm);
|
| +
|
| + void sbb(Type Ty, GPRRegister dst, GPRRegister src);
|
| + void sbb(Type Ty, GPRRegister reg, const Address &address);
|
| + void sbb(Type Ty, GPRRegister reg, const Immediate &imm);
|
| + void sbb(Type Ty, const Address &address, GPRRegister reg);
|
| + void sbb(Type Ty, const Address &address, const Immediate &imm);
|
|
|
| void cbw();
|
| void cwd();
|
| @@ -744,93 +599,71 @@ public:
|
| llvm::report_fatal_error("CQO is only available in 64-bit x86 backends.");
|
| }
|
|
|
| - void div(Type Ty, typename Traits::GPRRegister reg);
|
| - void div(Type Ty, const typename Traits::Address &address);
|
| + void div(Type Ty, GPRRegister reg);
|
| + void div(Type Ty, const Address &address);
|
|
|
| - void idiv(Type Ty, typename Traits::GPRRegister reg);
|
| - void idiv(Type Ty, const typename Traits::Address &address);
|
| + void idiv(Type Ty, GPRRegister reg);
|
| + void idiv(Type Ty, const Address &address);
|
|
|
| - void imul(Type Ty, typename Traits::GPRRegister dst,
|
| - typename Traits::GPRRegister src);
|
| - void imul(Type Ty, typename Traits::GPRRegister reg, const Immediate &imm);
|
| - void imul(Type Ty, typename Traits::GPRRegister reg,
|
| - const typename Traits::Address &address);
|
| + void imul(Type Ty, GPRRegister dst, GPRRegister src);
|
| + void imul(Type Ty, GPRRegister reg, const Immediate &imm);
|
| + void imul(Type Ty, GPRRegister reg, const Address &address);
|
|
|
| - void imul(Type Ty, typename Traits::GPRRegister reg);
|
| - void imul(Type Ty, const typename Traits::Address &address);
|
| + void imul(Type Ty, GPRRegister reg);
|
| + void imul(Type Ty, const Address &address);
|
|
|
| - void imul(Type Ty, typename Traits::GPRRegister dst,
|
| - typename Traits::GPRRegister src, const Immediate &imm);
|
| - void imul(Type Ty, typename Traits::GPRRegister dst,
|
| - const typename Traits::Address &address, const Immediate &imm);
|
| + void imul(Type Ty, GPRRegister dst, GPRRegister src, const Immediate &imm);
|
| + void imul(Type Ty, GPRRegister dst, const Address &address,
|
| + const Immediate &imm);
|
|
|
| - void mul(Type Ty, typename Traits::GPRRegister reg);
|
| - void mul(Type Ty, const typename Traits::Address &address);
|
| + void mul(Type Ty, GPRRegister reg);
|
| + void mul(Type Ty, const Address &address);
|
|
|
| template <class T = Traits,
|
| typename = typename std::enable_if<!T::Is64Bit>::type>
|
| - void incl(typename Traits::GPRRegister reg);
|
| - void incl(const typename Traits::Address &address);
|
| + void incl(GPRRegister reg);
|
| + void incl(const Address &address);
|
|
|
| template <class T = Traits,
|
| typename = typename std::enable_if<!T::Is64Bit>::type>
|
| - void decl(typename Traits::GPRRegister reg);
|
| - void decl(const typename Traits::Address &address);
|
| -
|
| - void rol(Type Ty, typename Traits::GPRRegister reg, const Immediate &imm);
|
| - void rol(Type Ty, typename Traits::GPRRegister operand,
|
| - typename Traits::GPRRegister shifter);
|
| - void rol(Type Ty, const typename Traits::Address &operand,
|
| - typename Traits::GPRRegister shifter);
|
| -
|
| - void shl(Type Ty, typename Traits::GPRRegister reg, const Immediate &imm);
|
| - void shl(Type Ty, typename Traits::GPRRegister operand,
|
| - typename Traits::GPRRegister shifter);
|
| - void shl(Type Ty, const typename Traits::Address &operand,
|
| - typename Traits::GPRRegister shifter);
|
| -
|
| - void shr(Type Ty, typename Traits::GPRRegister reg, const Immediate &imm);
|
| - void shr(Type Ty, typename Traits::GPRRegister operand,
|
| - typename Traits::GPRRegister shifter);
|
| - void shr(Type Ty, const typename Traits::Address &operand,
|
| - typename Traits::GPRRegister shifter);
|
| -
|
| - void sar(Type Ty, typename Traits::GPRRegister reg, const Immediate &imm);
|
| - void sar(Type Ty, typename Traits::GPRRegister operand,
|
| - typename Traits::GPRRegister shifter);
|
| - void sar(Type Ty, const typename Traits::Address &address,
|
| - typename Traits::GPRRegister shifter);
|
| -
|
| - void shld(Type Ty, typename Traits::GPRRegister dst,
|
| - typename Traits::GPRRegister src);
|
| - void shld(Type Ty, typename Traits::GPRRegister dst,
|
| - typename Traits::GPRRegister src, const Immediate &imm);
|
| - void shld(Type Ty, const typename Traits::Address &operand,
|
| - typename Traits::GPRRegister src);
|
| - void shrd(Type Ty, typename Traits::GPRRegister dst,
|
| - typename Traits::GPRRegister src);
|
| - void shrd(Type Ty, typename Traits::GPRRegister dst,
|
| - typename Traits::GPRRegister src, const Immediate &imm);
|
| - void shrd(Type Ty, const typename Traits::Address &dst,
|
| - typename Traits::GPRRegister src);
|
| -
|
| - void neg(Type Ty, typename Traits::GPRRegister reg);
|
| - void neg(Type Ty, const typename Traits::Address &addr);
|
| - void notl(typename Traits::GPRRegister reg);
|
| -
|
| - void bsf(Type Ty, typename Traits::GPRRegister dst,
|
| - typename Traits::GPRRegister src);
|
| - void bsf(Type Ty, typename Traits::GPRRegister dst,
|
| - const typename Traits::Address &src);
|
| - void bsr(Type Ty, typename Traits::GPRRegister dst,
|
| - typename Traits::GPRRegister src);
|
| - void bsr(Type Ty, typename Traits::GPRRegister dst,
|
| - const typename Traits::Address &src);
|
| -
|
| - void bswap(Type Ty, typename Traits::GPRRegister reg);
|
| -
|
| - void bt(typename Traits::GPRRegister base,
|
| - typename Traits::GPRRegister offset);
|
| + void decl(GPRRegister reg);
|
| + void decl(const Address &address);
|
| +
|
| + void rol(Type Ty, GPRRegister reg, const Immediate &imm);
|
| + void rol(Type Ty, GPRRegister operand, GPRRegister shifter);
|
| + void rol(Type Ty, const Address &operand, GPRRegister shifter);
|
| +
|
| + void shl(Type Ty, GPRRegister reg, const Immediate &imm);
|
| + void shl(Type Ty, GPRRegister operand, GPRRegister shifter);
|
| + void shl(Type Ty, const Address &operand, GPRRegister shifter);
|
| +
|
| + void shr(Type Ty, GPRRegister reg, const Immediate &imm);
|
| + void shr(Type Ty, GPRRegister operand, GPRRegister shifter);
|
| + void shr(Type Ty, const Address &operand, GPRRegister shifter);
|
| +
|
| + void sar(Type Ty, GPRRegister reg, const Immediate &imm);
|
| + void sar(Type Ty, GPRRegister operand, GPRRegister shifter);
|
| + void sar(Type Ty, const Address &address, GPRRegister shifter);
|
| +
|
| + void shld(Type Ty, GPRRegister dst, GPRRegister src);
|
| + void shld(Type Ty, GPRRegister dst, GPRRegister src, const Immediate &imm);
|
| + void shld(Type Ty, const Address &operand, GPRRegister src);
|
| + void shrd(Type Ty, GPRRegister dst, GPRRegister src);
|
| + void shrd(Type Ty, GPRRegister dst, GPRRegister src, const Immediate &imm);
|
| + void shrd(Type Ty, const Address &dst, GPRRegister src);
|
| +
|
| + void neg(Type Ty, GPRRegister reg);
|
| + void neg(Type Ty, const Address &addr);
|
| + void notl(GPRRegister reg);
|
| +
|
| + void bsf(Type Ty, GPRRegister dst, GPRRegister src);
|
| + void bsf(Type Ty, GPRRegister dst, const Address &src);
|
| + void bsr(Type Ty, GPRRegister dst, GPRRegister src);
|
| + void bsr(Type Ty, GPRRegister dst, const Address &src);
|
| +
|
| + void bswap(Type Ty, GPRRegister reg);
|
| +
|
| + void bt(GPRRegister base, GPRRegister offset);
|
|
|
| void ret();
|
| void ret(const Immediate &imm);
|
| @@ -842,27 +675,21 @@ public:
|
| void ud2();
|
|
|
| // j(Label) is fully tested.
|
| - void j(typename Traits::Cond::BrCond condition, Label *label,
|
| - bool near = kFarJump);
|
| - void j(typename Traits::Cond::BrCond condition,
|
| - const ConstantRelocatable *label); // not testable.
|
| + void j(BrCond condition, Label *label, bool near = kFarJump);
|
| + void j(BrCond condition, const ConstantRelocatable *label); // not testable.
|
|
|
| - void jmp(typename Traits::GPRRegister reg);
|
| + void jmp(GPRRegister reg);
|
| void jmp(Label *label, bool near = kFarJump);
|
| void jmp(const ConstantRelocatable *label); // not testable.
|
|
|
| void mfence();
|
|
|
| void lock();
|
| - void cmpxchg(Type Ty, const typename Traits::Address &address,
|
| - typename Traits::GPRRegister reg, bool Locked);
|
| - void cmpxchg8b(const typename Traits::Address &address, bool Locked);
|
| - void xadd(Type Ty, const typename Traits::Address &address,
|
| - typename Traits::GPRRegister reg, bool Locked);
|
| - void xchg(Type Ty, typename Traits::GPRRegister reg0,
|
| - typename Traits::GPRRegister reg1);
|
| - void xchg(Type Ty, const typename Traits::Address &address,
|
| - typename Traits::GPRRegister reg);
|
| + void cmpxchg(Type Ty, const Address &address, GPRRegister reg, bool Locked);
|
| + void cmpxchg8b(const Address &address, bool Locked);
|
| + void xadd(Type Ty, const Address &address, GPRRegister reg, bool Locked);
|
| + void xchg(Type Ty, GPRRegister reg0, GPRRegister reg1);
|
| + void xchg(Type Ty, const Address &address, GPRRegister reg);
|
|
|
| /// \name Intel Architecture Code Analyzer markers.
|
| /// @{
|
| @@ -882,9 +709,11 @@ protected:
|
| inline void emitUint8(uint8_t value);
|
|
|
| private:
|
| + ENABLE_MAKE_UNIQUE;
|
| +
|
| static constexpr Type RexTypeIrrelevant = IceType_i32;
|
| static constexpr Type RexTypeForceRexW = IceType_i64;
|
| - static constexpr typename Traits::GPRRegister RexRegIrrelevant =
|
| + static constexpr GPRRegister RexRegIrrelevant =
|
| Traits::GPRRegister::Encoded_Reg_eax;
|
|
|
| inline void emitInt16(int16_t value);
|
| @@ -894,21 +723,19 @@ private:
|
| inline void emitXmmRegisterOperand(RegType reg, RmType rm);
|
| inline void emitOperandSizeOverride();
|
|
|
| - void emitOperand(int rm, const typename Traits::Operand &operand);
|
| + void emitOperand(int rm, const Operand &operand);
|
| void emitImmediate(Type ty, const Immediate &imm);
|
| - void emitComplexI8(int rm, const typename Traits::Operand &operand,
|
| + void emitComplexI8(int rm, const Operand &operand,
|
| const Immediate &immediate);
|
| - void emitComplex(Type Ty, int rm, const typename Traits::Operand &operand,
|
| + void emitComplex(Type Ty, int rm, const Operand &operand,
|
| const Immediate &immediate);
|
| void emitLabel(Label *label, intptr_t instruction_size);
|
| void emitLabelLink(Label *label);
|
| void emitNearLabelLink(Label *label);
|
|
|
| - void emitGenericShift(int rm, Type Ty, typename Traits::GPRRegister reg,
|
| - const Immediate &imm);
|
| - void emitGenericShift(int rm, Type Ty,
|
| - const typename Traits::Operand &operand,
|
| - typename Traits::GPRRegister shifter);
|
| + void emitGenericShift(int rm, Type Ty, GPRRegister reg, const Immediate &imm);
|
| + void emitGenericShift(int rm, Type Ty, const Operand &operand,
|
| + GPRRegister shifter);
|
|
|
| using LabelVector = std::vector<Label *>;
|
| // A vector of pool-allocated x86 labels for CFG nodes.
|
| @@ -930,24 +757,19 @@ private:
|
| // of add(), Or(), adc(), sbb(), And(), sub(), Xor(), and cmp(). The Tag
|
| // parameter is statically asserted to be less than 8.
|
| template <uint32_t Tag>
|
| - void arith_int(Type Ty, typename Traits::GPRRegister reg,
|
| - const Immediate &imm);
|
| + void arith_int(Type Ty, GPRRegister reg, const Immediate &imm);
|
|
|
| template <uint32_t Tag>
|
| - void arith_int(Type Ty, typename Traits::GPRRegister reg0,
|
| - typename Traits::GPRRegister reg1);
|
| + void arith_int(Type Ty, GPRRegister reg0, GPRRegister reg1);
|
|
|
| template <uint32_t Tag>
|
| - void arith_int(Type Ty, typename Traits::GPRRegister reg,
|
| - const typename Traits::Address &address);
|
| + void arith_int(Type Ty, GPRRegister reg, const Address &address);
|
|
|
| template <uint32_t Tag>
|
| - void arith_int(Type Ty, const typename Traits::Address &address,
|
| - typename Traits::GPRRegister reg);
|
| + void arith_int(Type Ty, const Address &address, GPRRegister reg);
|
|
|
| template <uint32_t Tag>
|
| - void arith_int(Type Ty, const typename Traits::Address &address,
|
| - const Immediate &imm);
|
| + void arith_int(Type Ty, const Address &address, const Immediate &imm);
|
|
|
| // gprEncoding returns Reg encoding for operand emission. For x86-64 we mask
|
| // out the 4th bit as it is encoded in the REX.[RXB] bits. No other bits are
|
| @@ -955,8 +777,7 @@ private:
|
| template <typename RegType, typename T = Traits>
|
| typename std::enable_if<T::Is64Bit, typename T::GPRRegister>::type
|
| gprEncoding(const RegType Reg) {
|
| - return static_cast<typename Traits::GPRRegister>(static_cast<uint8_t>(Reg) &
|
| - ~0x08);
|
| + return static_cast<GPRRegister>(static_cast<uint8_t>(Reg) & ~0x08);
|
| }
|
|
|
| template <typename RegType, typename T = Traits>
|
| @@ -968,18 +789,16 @@ private:
|
| template <typename RegType>
|
| bool is8BitRegisterRequiringRex(const Type Ty, const RegType Reg) {
|
| static constexpr bool IsGPR =
|
| - std::is_same<typename std::decay<RegType>::type,
|
| - typename Traits::ByteRegister>::value ||
|
| - std::is_same<typename std::decay<RegType>::type,
|
| - typename Traits::GPRRegister>::value;
|
| + std::is_same<typename std::decay<RegType>::type, ByteRegister>::value ||
|
| + std::is_same<typename std::decay<RegType>::type, GPRRegister>::value;
|
|
|
| // At this point in the assembler, we have encoded regs, so it is not
|
| // possible to distinguish between the "new" low byte registers introduced
|
| - // in x86-64 and the legacy [abcd]h registers. Because x86, we may still see
|
| - // ah (div) in the assembler, so we whitelist it here.
|
| + // in x86-64 and the legacy [abcd]h registers. Because x86, we may still
|
| + // see ah (div) in the assembler, so we whitelist it here.
|
| //
|
| - // The "local" uint32_t Encoded_Reg_ah is needed because RegType is an enum
|
| - // that is not necessarily the same type of
|
| + // The "local" uint32_t Encoded_Reg_ah is needed because RegType is an
|
| + // enum that is not necessarily the same type of
|
| // Traits::RegisterSet::Encoded_Reg_ah.
|
| constexpr uint32_t Encoded_Reg_ah = Traits::RegisterSet::Encoded_Reg_ah;
|
| return IsGPR && (Reg & 0x04) != 0 && (Reg & 0x08) == 0 &&
|
| @@ -988,9 +807,10 @@ private:
|
|
|
| // assembleAndEmitRex is used for determining which (if any) rex prefix
|
| // should be emitted for the current instruction. It allows different types
|
| - // for Reg and Rm because they could be of different types (e.g., in mov[sz]x
|
| - // instructions.) If Addr is not nullptr, then Rm is ignored, and Rex.B is
|
| - // determined by Addr instead. TyRm is still used to determine Addr's size.
|
| + // for Reg and Rm because they could be of different types (e.g., in
|
| + // mov[sz]x instructions.) If Addr is not nullptr, then Rm is ignored, and
|
| + // Rex.B is determined by Addr instead. TyRm is still used to determine
|
| + // Addr's size.
|
| template <typename RegType, typename RmType, typename T = Traits>
|
| typename std::enable_if<T::Is64Bit, void>::type
|
| assembleAndEmitRex(const Type TyReg, const RegType Reg, const Type TyRm,
|
| @@ -1021,8 +841,8 @@ private:
|
| assembleAndEmitRex(const Type, const RegType, const Type, const RmType,
|
| const typename T::Address * = nullptr) {}
|
|
|
| - // emitRexRB is used for emitting a Rex prefix instructions with two explicit
|
| - // register operands in its mod-rm byte.
|
| + // emitRexRB is used for emitting a Rex prefix instructions with two
|
| + // explicit register operands in its mod-rm byte.
|
| template <typename RegType, typename RmType>
|
| void emitRexRB(const Type Ty, const RegType Reg, const RmType Rm) {
|
| assembleAndEmitRex(Ty, Reg, Ty, Rm);
|
| @@ -1044,53 +864,52 @@ private:
|
| // emitRex is used for emitting a Rex prefix for an address and a GPR. The
|
| // address may contain zero, one, or two registers.
|
| template <typename RegType>
|
| - void emitRex(const Type Ty, const typename Traits::Address &Addr,
|
| - const RegType Reg) {
|
| + void emitRex(const Type Ty, const Address &Addr, const RegType Reg) {
|
| assembleAndEmitRex(Ty, Reg, Ty, RexRegIrrelevant, &Addr);
|
| }
|
|
|
| template <typename RegType>
|
| - void emitRex(const Type AddrTy, const typename Traits::Address &Addr,
|
| - const Type TyReg, const RegType Reg) {
|
| + void emitRex(const Type AddrTy, const Address &Addr, const Type TyReg,
|
| + const RegType Reg) {
|
| assembleAndEmitRex(TyReg, Reg, AddrTy, RexRegIrrelevant, &Addr);
|
| }
|
| };
|
|
|
| -template <class Machine>
|
| -inline void AssemblerX86Base<Machine>::emitUint8(uint8_t value) {
|
| +template <typename TraitsType>
|
| +inline void AssemblerX86Base<TraitsType>::emitUint8(uint8_t value) {
|
| Buffer.emit<uint8_t>(value);
|
| }
|
|
|
| -template <class Machine>
|
| -inline void AssemblerX86Base<Machine>::emitInt16(int16_t value) {
|
| +template <typename TraitsType>
|
| +inline void AssemblerX86Base<TraitsType>::emitInt16(int16_t value) {
|
| Buffer.emit<int16_t>(value);
|
| }
|
|
|
| -template <class Machine>
|
| -inline void AssemblerX86Base<Machine>::emitInt32(int32_t value) {
|
| +template <typename TraitsType>
|
| +inline void AssemblerX86Base<TraitsType>::emitInt32(int32_t value) {
|
| Buffer.emit<int32_t>(value);
|
| }
|
|
|
| -template <class Machine>
|
| -inline void AssemblerX86Base<Machine>::emitRegisterOperand(int reg, int rm) {
|
| +template <typename TraitsType>
|
| +inline void AssemblerX86Base<TraitsType>::emitRegisterOperand(int reg, int rm) {
|
| assert(reg >= 0 && reg < 8);
|
| assert(rm >= 0 && rm < 8);
|
| Buffer.emit<uint8_t>(0xC0 + (reg << 3) + rm);
|
| }
|
|
|
| -template <class Machine>
|
| +template <typename TraitsType>
|
| template <typename RegType, typename RmType>
|
| -inline void AssemblerX86Base<Machine>::emitXmmRegisterOperand(RegType reg,
|
| - RmType rm) {
|
| +inline void AssemblerX86Base<TraitsType>::emitXmmRegisterOperand(RegType reg,
|
| + RmType rm) {
|
| emitRegisterOperand(gprEncoding(reg), gprEncoding(rm));
|
| }
|
|
|
| -template <class Machine>
|
| -inline void AssemblerX86Base<Machine>::emitOperandSizeOverride() {
|
| +template <typename TraitsType>
|
| +inline void AssemblerX86Base<TraitsType>::emitOperandSizeOverride() {
|
| emitUint8(0x66);
|
| }
|
|
|
| -} // end of namespace X86Internal
|
| +} // end of namespace X86NAMESPACE
|
|
|
| } // end of namespace Ice
|
|
|
|
|