|
|
@ -361,10 +361,10 @@ private:
|
|
|
|
void ABI_CalculateFrameSize(u32 mask, size_t rsp_alignment, size_t needed_frame_size, size_t* shadowp, size_t* subtractionp, size_t* xmm_offsetp);
|
|
|
|
void ABI_CalculateFrameSize(u32 mask, size_t rsp_alignment, size_t needed_frame_size, size_t* shadowp, size_t* subtractionp, size_t* xmm_offsetp);
|
|
|
|
|
|
|
|
|
|
|
|
protected:
|
|
|
|
protected:
|
|
|
|
inline void Write8(u8 value) {*code++ = value;}
|
|
|
|
void Write8(u8 value) {*code++ = value;}
|
|
|
|
inline void Write16(u16 value) {*(u16*)code = (value); code += 2;}
|
|
|
|
void Write16(u16 value) {*(u16*)code = (value); code += 2;}
|
|
|
|
inline void Write32(u32 value) {*(u32*)code = (value); code += 4;}
|
|
|
|
void Write32(u32 value) {*(u32*)code = (value); code += 4;}
|
|
|
|
inline void Write64(u64 value) {*(u64*)code = (value); code += 8;}
|
|
|
|
void Write64(u64 value) {*(u64*)code = (value); code += 8;}
|
|
|
|
|
|
|
|
|
|
|
|
public:
|
|
|
|
public:
|
|
|
|
XEmitter() { code = nullptr; flags_locked = false; }
|
|
|
|
XEmitter() { code = nullptr; flags_locked = false; }
|
|
|
@ -496,11 +496,11 @@ public:
|
|
|
|
|
|
|
|
|
|
|
|
// Extend EAX into EDX in various ways
|
|
|
|
// Extend EAX into EDX in various ways
|
|
|
|
void CWD(int bits = 16);
|
|
|
|
void CWD(int bits = 16);
|
|
|
|
inline void CDQ() {CWD(32);}
|
|
|
|
void CDQ() {CWD(32);}
|
|
|
|
inline void CQO() {CWD(64);}
|
|
|
|
void CQO() {CWD(64);}
|
|
|
|
void CBW(int bits = 8);
|
|
|
|
void CBW(int bits = 8);
|
|
|
|
inline void CWDE() {CBW(16);}
|
|
|
|
void CWDE() {CBW(16);}
|
|
|
|
inline void CDQE() {CBW(32);}
|
|
|
|
void CDQE() {CBW(32);}
|
|
|
|
|
|
|
|
|
|
|
|
// Load effective address
|
|
|
|
// Load effective address
|
|
|
|
void LEA(int bits, X64Reg dest, OpArg src);
|
|
|
|
void LEA(int bits, X64Reg dest, OpArg src);
|
|
|
@ -596,13 +596,13 @@ public:
|
|
|
|
void CMPSS(X64Reg regOp, OpArg arg, u8 compare);
|
|
|
|
void CMPSS(X64Reg regOp, OpArg arg, u8 compare);
|
|
|
|
void CMPSD(X64Reg regOp, OpArg arg, u8 compare);
|
|
|
|
void CMPSD(X64Reg regOp, OpArg arg, u8 compare);
|
|
|
|
|
|
|
|
|
|
|
|
inline void CMPEQSS(X64Reg regOp, OpArg arg) { CMPSS(regOp, arg, CMP_EQ); }
|
|
|
|
void CMPEQSS(X64Reg regOp, OpArg arg) { CMPSS(regOp, arg, CMP_EQ); }
|
|
|
|
inline void CMPLTSS(X64Reg regOp, OpArg arg) { CMPSS(regOp, arg, CMP_LT); }
|
|
|
|
void CMPLTSS(X64Reg regOp, OpArg arg) { CMPSS(regOp, arg, CMP_LT); }
|
|
|
|
inline void CMPLESS(X64Reg regOp, OpArg arg) { CMPSS(regOp, arg, CMP_LE); }
|
|
|
|
void CMPLESS(X64Reg regOp, OpArg arg) { CMPSS(regOp, arg, CMP_LE); }
|
|
|
|
inline void CMPUNORDSS(X64Reg regOp, OpArg arg) { CMPSS(regOp, arg, CMP_UNORD); }
|
|
|
|
void CMPUNORDSS(X64Reg regOp, OpArg arg) { CMPSS(regOp, arg, CMP_UNORD); }
|
|
|
|
inline void CMPNEQSS(X64Reg regOp, OpArg arg) { CMPSS(regOp, arg, CMP_NEQ); }
|
|
|
|
void CMPNEQSS(X64Reg regOp, OpArg arg) { CMPSS(regOp, arg, CMP_NEQ); }
|
|
|
|
inline void CMPNLTSS(X64Reg regOp, OpArg arg) { CMPSS(regOp, arg, CMP_NLT); }
|
|
|
|
void CMPNLTSS(X64Reg regOp, OpArg arg) { CMPSS(regOp, arg, CMP_NLT); }
|
|
|
|
inline void CMPORDSS(X64Reg regOp, OpArg arg) { CMPSS(regOp, arg, CMP_ORD); }
|
|
|
|
void CMPORDSS(X64Reg regOp, OpArg arg) { CMPSS(regOp, arg, CMP_ORD); }
|
|
|
|
|
|
|
|
|
|
|
|
// SSE/SSE2: Floating point packed arithmetic (x4 for float, x2 for double)
|
|
|
|
// SSE/SSE2: Floating point packed arithmetic (x4 for float, x2 for double)
|
|
|
|
void ADDPS(X64Reg regOp, OpArg arg);
|
|
|
|
void ADDPS(X64Reg regOp, OpArg arg);
|
|
|
@ -859,25 +859,25 @@ public:
|
|
|
|
void ROUNDPS(X64Reg dest, OpArg arg, u8 mode);
|
|
|
|
void ROUNDPS(X64Reg dest, OpArg arg, u8 mode);
|
|
|
|
void ROUNDPD(X64Reg dest, OpArg arg, u8 mode);
|
|
|
|
void ROUNDPD(X64Reg dest, OpArg arg, u8 mode);
|
|
|
|
|
|
|
|
|
|
|
|
inline void ROUNDNEARSS(X64Reg dest, OpArg arg) { ROUNDSS(dest, arg, FROUND_NEAREST); }
|
|
|
|
void ROUNDNEARSS(X64Reg dest, OpArg arg) { ROUNDSS(dest, arg, FROUND_NEAREST); }
|
|
|
|
inline void ROUNDFLOORSS(X64Reg dest, OpArg arg) { ROUNDSS(dest, arg, FROUND_FLOOR); }
|
|
|
|
void ROUNDFLOORSS(X64Reg dest, OpArg arg) { ROUNDSS(dest, arg, FROUND_FLOOR); }
|
|
|
|
inline void ROUNDCEILSS(X64Reg dest, OpArg arg) { ROUNDSS(dest, arg, FROUND_CEIL); }
|
|
|
|
void ROUNDCEILSS(X64Reg dest, OpArg arg) { ROUNDSS(dest, arg, FROUND_CEIL); }
|
|
|
|
inline void ROUNDZEROSS(X64Reg dest, OpArg arg) { ROUNDSS(dest, arg, FROUND_ZERO); }
|
|
|
|
void ROUNDZEROSS(X64Reg dest, OpArg arg) { ROUNDSS(dest, arg, FROUND_ZERO); }
|
|
|
|
|
|
|
|
|
|
|
|
inline void ROUNDNEARSD(X64Reg dest, OpArg arg) { ROUNDSD(dest, arg, FROUND_NEAREST); }
|
|
|
|
void ROUNDNEARSD(X64Reg dest, OpArg arg) { ROUNDSD(dest, arg, FROUND_NEAREST); }
|
|
|
|
inline void ROUNDFLOORSD(X64Reg dest, OpArg arg) { ROUNDSD(dest, arg, FROUND_FLOOR); }
|
|
|
|
void ROUNDFLOORSD(X64Reg dest, OpArg arg) { ROUNDSD(dest, arg, FROUND_FLOOR); }
|
|
|
|
inline void ROUNDCEILSD(X64Reg dest, OpArg arg) { ROUNDSD(dest, arg, FROUND_CEIL); }
|
|
|
|
void ROUNDCEILSD(X64Reg dest, OpArg arg) { ROUNDSD(dest, arg, FROUND_CEIL); }
|
|
|
|
inline void ROUNDZEROSD(X64Reg dest, OpArg arg) { ROUNDSD(dest, arg, FROUND_ZERO); }
|
|
|
|
void ROUNDZEROSD(X64Reg dest, OpArg arg) { ROUNDSD(dest, arg, FROUND_ZERO); }
|
|
|
|
|
|
|
|
|
|
|
|
inline void ROUNDNEARPS(X64Reg dest, OpArg arg) { ROUNDPS(dest, arg, FROUND_NEAREST); }
|
|
|
|
void ROUNDNEARPS(X64Reg dest, OpArg arg) { ROUNDPS(dest, arg, FROUND_NEAREST); }
|
|
|
|
inline void ROUNDFLOORPS(X64Reg dest, OpArg arg) { ROUNDPS(dest, arg, FROUND_FLOOR); }
|
|
|
|
void ROUNDFLOORPS(X64Reg dest, OpArg arg) { ROUNDPS(dest, arg, FROUND_FLOOR); }
|
|
|
|
inline void ROUNDCEILPS(X64Reg dest, OpArg arg) { ROUNDPS(dest, arg, FROUND_CEIL); }
|
|
|
|
void ROUNDCEILPS(X64Reg dest, OpArg arg) { ROUNDPS(dest, arg, FROUND_CEIL); }
|
|
|
|
inline void ROUNDZEROPS(X64Reg dest, OpArg arg) { ROUNDPS(dest, arg, FROUND_ZERO); }
|
|
|
|
void ROUNDZEROPS(X64Reg dest, OpArg arg) { ROUNDPS(dest, arg, FROUND_ZERO); }
|
|
|
|
|
|
|
|
|
|
|
|
inline void ROUNDNEARPD(X64Reg dest, OpArg arg) { ROUNDPD(dest, arg, FROUND_NEAREST); }
|
|
|
|
void ROUNDNEARPD(X64Reg dest, OpArg arg) { ROUNDPD(dest, arg, FROUND_NEAREST); }
|
|
|
|
inline void ROUNDFLOORPD(X64Reg dest, OpArg arg) { ROUNDPD(dest, arg, FROUND_FLOOR); }
|
|
|
|
void ROUNDFLOORPD(X64Reg dest, OpArg arg) { ROUNDPD(dest, arg, FROUND_FLOOR); }
|
|
|
|
inline void ROUNDCEILPD(X64Reg dest, OpArg arg) { ROUNDPD(dest, arg, FROUND_CEIL); }
|
|
|
|
void ROUNDCEILPD(X64Reg dest, OpArg arg) { ROUNDPD(dest, arg, FROUND_CEIL); }
|
|
|
|
inline void ROUNDZEROPD(X64Reg dest, OpArg arg) { ROUNDPD(dest, arg, FROUND_ZERO); }
|
|
|
|
void ROUNDZEROPD(X64Reg dest, OpArg arg) { ROUNDPD(dest, arg, FROUND_ZERO); }
|
|
|
|
|
|
|
|
|
|
|
|
// AVX
|
|
|
|
// AVX
|
|
|
|
void VADDSD(X64Reg regOp1, X64Reg regOp2, OpArg arg);
|
|
|
|
void VADDSD(X64Reg regOp1, X64Reg regOp2, OpArg arg);
|
|
|
@ -1048,9 +1048,9 @@ public:
|
|
|
|
void ABI_EmitEpilogue(int maxCallParams);
|
|
|
|
void ABI_EmitEpilogue(int maxCallParams);
|
|
|
|
|
|
|
|
|
|
|
|
#ifdef _M_IX86
|
|
|
|
#ifdef _M_IX86
|
|
|
|
inline int ABI_GetNumXMMRegs() { return 8; }
|
|
|
|
static int ABI_GetNumXMMRegs() { return 8; }
|
|
|
|
#else
|
|
|
|
#else
|
|
|
|
inline int ABI_GetNumXMMRegs() { return 16; }
|
|
|
|
static int ABI_GetNumXMMRegs() { return 16; }
|
|
|
|
#endif
|
|
|
|
#endif
|
|
|
|
}; // class XEmitter
|
|
|
|
}; // class XEmitter
|
|
|
|
|
|
|
|
|
|
|
|