Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(21)

Unified Diff: src/IceAssemblerX86Base.h

Issue 1548363002: Subzero. Code organization. (Closed) Base URL: https://chromium.googlesource.com/native_client/pnacl-subzero.git@master
Patch Set: Created 5 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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
« no previous file with comments | « src/IceAssemblerX8664.h ('k') | src/IceAssemblerX86BaseImpl.h » ('j') | src/IceInstX86Base.h » ('J')

Powered by Google App Engine
This is Rietveld 408576698