| Index: src/IceAssemblerX86BaseImpl.h
|
| diff --git a/src/IceAssemblerX86BaseImpl.h b/src/IceAssemblerX86BaseImpl.h
|
| index 46654b1f9bfe11ba107ac50bd49c29e822a75e66..a32d97c14a76273d5d32408fdd34f28759f00a63 100644
|
| --- a/src/IceAssemblerX86BaseImpl.h
|
| +++ b/src/IceAssemblerX86BaseImpl.h
|
| @@ -112,6 +112,7 @@ void AssemblerX86Base<Machine>::call(typename Traits::GPRRegister reg) {
|
| template <class Machine>
|
| void AssemblerX86Base<Machine>::call(const typename Traits::Address &address) {
|
| AssemblerBuffer::EnsureCapacity ensured(&Buffer);
|
| + emitAddrSizeOverridePrefix();
|
| emitRex(RexTypeIrrelevant, address, RexRegIrrelevant);
|
| emitUint8(0xFF);
|
| emitOperand(2, address);
|
| @@ -158,6 +159,7 @@ void AssemblerX86Base<Machine>::popl(typename Traits::GPRRegister reg) {
|
| template <class Machine>
|
| void AssemblerX86Base<Machine>::popl(const typename Traits::Address &address) {
|
| AssemblerBuffer::EnsureCapacity ensured(&Buffer);
|
| + emitAddrSizeOverridePrefix();
|
| emitRex(RexTypeIrrelevant, address, RexRegIrrelevant);
|
| emitUint8(0x8F);
|
| emitOperand(0, address);
|
| @@ -191,6 +193,7 @@ template <class Machine>
|
| void AssemblerX86Base<Machine>::setcc(typename Traits::Cond::BrCond condition,
|
| const typename Traits::Address &address) {
|
| AssemblerBuffer::EnsureCapacity ensured(&Buffer);
|
| + emitAddrSizeOverridePrefix();
|
| emitRex(RexTypeIrrelevant, address, RexRegIrrelevant);
|
| emitUint8(0x0F);
|
| emitUint8(0x90 + condition);
|
| @@ -237,6 +240,7 @@ void AssemblerX86Base<Machine>::mov(Type Ty, typename Traits::GPRRegister dst,
|
| AssemblerBuffer::EnsureCapacity ensured(&Buffer);
|
| if (Ty == IceType_i16)
|
| emitOperandSizeOverride();
|
| + emitAddrSizeOverridePrefix();
|
| emitRex(Ty, src, dst);
|
| if (isByteSizedType(Ty)) {
|
| emitUint8(0x8A);
|
| @@ -253,6 +257,7 @@ void AssemblerX86Base<Machine>::mov(Type Ty,
|
| AssemblerBuffer::EnsureCapacity ensured(&Buffer);
|
| if (Ty == IceType_i16)
|
| emitOperandSizeOverride();
|
| + emitAddrSizeOverridePrefix();
|
| emitRex(Ty, dst, src);
|
| if (isByteSizedType(Ty)) {
|
| emitUint8(0x88);
|
| @@ -270,6 +275,7 @@ void AssemblerX86Base<Machine>::mov(Type Ty,
|
| AssemblerBuffer::EnsureCapacity ensured(&Buffer);
|
| if (Ty == IceType_i16)
|
| emitOperandSizeOverride();
|
| + emitAddrSizeOverridePrefix();
|
| emitRex(Ty, dst, RexRegIrrelevant);
|
| if (isByteSizedType(Ty)) {
|
| emitUint8(0xC6);
|
| @@ -334,6 +340,7 @@ void AssemblerX86Base<Machine>::movzx(Type SrcTy,
|
| AssemblerBuffer::EnsureCapacity ensured(&Buffer);
|
| bool ByteSized = isByteSizedType(SrcTy);
|
| assert(ByteSized || SrcTy == IceType_i16);
|
| + emitAddrSizeOverridePrefix();
|
| emitRex(SrcTy, src, RexTypeIrrelevant, dst);
|
| emitUint8(0x0F);
|
| emitUint8(ByteSized ? 0xB6 : 0xB7);
|
| @@ -363,6 +370,7 @@ void AssemblerX86Base<Machine>::movsx(Type SrcTy,
|
| const typename Traits::Address &src) {
|
| AssemblerBuffer::EnsureCapacity ensured(&Buffer);
|
| bool ByteSized = isByteSizedType(SrcTy);
|
| + emitAddrSizeOverridePrefix();
|
| emitRex(SrcTy, src, RexTypeForceRexW, dst);
|
| if (ByteSized || SrcTy == IceType_i16) {
|
| emitUint8(0x0F);
|
| @@ -381,6 +389,7 @@ void AssemblerX86Base<Machine>::lea(Type Ty, typename Traits::GPRRegister dst,
|
| assert(Ty == IceType_i16 || Ty == IceType_i32);
|
| if (Ty == IceType_i16)
|
| emitOperandSizeOverride();
|
| + emitAddrSizeOverridePrefix();
|
| emitRex(Ty, src, dst);
|
| emitUint8(0x8D);
|
| emitOperand(gprEncoding(dst), src);
|
| @@ -412,6 +421,7 @@ void AssemblerX86Base<Machine>::cmov(Type Ty,
|
| emitOperandSizeOverride();
|
| else
|
| assert(Ty == IceType_i32 || (Traits::Is64Bit && Ty == IceType_i64));
|
| + emitAddrSizeOverridePrefix();
|
| emitRex(Ty, src, dst);
|
| emitUint8(0x0F);
|
| emitUint8(0x40 + cond);
|
| @@ -429,6 +439,7 @@ void AssemblerX86Base<Machine>::movss(Type Ty, typename Traits::XmmRegister dst,
|
| const typename Traits::Address &src) {
|
| AssemblerBuffer::EnsureCapacity ensured(&Buffer);
|
| emitUint8(isFloat32Asserting32Or64(Ty) ? 0xF3 : 0xF2);
|
| + emitAddrSizeOverridePrefix();
|
| emitRex(RexTypeIrrelevant, src, dst);
|
| emitUint8(0x0F);
|
| emitUint8(0x10);
|
| @@ -441,6 +452,7 @@ void AssemblerX86Base<Machine>::movss(Type Ty,
|
| typename Traits::XmmRegister src) {
|
| AssemblerBuffer::EnsureCapacity ensured(&Buffer);
|
| emitUint8(isFloat32Asserting32Or64(Ty) ? 0xF3 : 0xF2);
|
| + emitAddrSizeOverridePrefix();
|
| emitRex(RexTypeIrrelevant, dst, src);
|
| emitUint8(0x0F);
|
| emitUint8(0x11);
|
| @@ -476,6 +488,7 @@ void AssemblerX86Base<Machine>::movd(Type SrcTy,
|
| const typename Traits::Address &src) {
|
| AssemblerBuffer::EnsureCapacity ensured(&Buffer);
|
| emitUint8(0x66);
|
| + emitAddrSizeOverridePrefix();
|
| emitRex(SrcTy, src, dst);
|
| emitUint8(0x0F);
|
| emitUint8(0x6E);
|
| @@ -500,6 +513,7 @@ void AssemblerX86Base<Machine>::movd(Type DestTy,
|
| typename Traits::XmmRegister src) {
|
| AssemblerBuffer::EnsureCapacity ensured(&Buffer);
|
| emitUint8(0x66);
|
| + emitAddrSizeOverridePrefix();
|
| emitRex(DestTy, dst, src);
|
| emitUint8(0x0F);
|
| emitUint8(0x7E);
|
| @@ -522,6 +536,7 @@ void AssemblerX86Base<Machine>::movq(const typename Traits::Address &dst,
|
| typename Traits::XmmRegister src) {
|
| AssemblerBuffer::EnsureCapacity ensured(&Buffer);
|
| emitUint8(0x66);
|
| + emitAddrSizeOverridePrefix();
|
| emitRex(RexTypeIrrelevant, dst, src);
|
| emitUint8(0x0F);
|
| emitUint8(0xD6);
|
| @@ -533,6 +548,7 @@ void AssemblerX86Base<Machine>::movq(typename Traits::XmmRegister dst,
|
| const typename Traits::Address &src) {
|
| AssemblerBuffer::EnsureCapacity ensured(&Buffer);
|
| emitUint8(0xF3);
|
| + emitAddrSizeOverridePrefix();
|
| emitRex(RexTypeIrrelevant, src, dst);
|
| emitUint8(0x0F);
|
| emitUint8(0x7E);
|
| @@ -555,6 +571,7 @@ void AssemblerX86Base<Machine>::addss(Type Ty, typename Traits::XmmRegister dst,
|
| const typename Traits::Address &src) {
|
| AssemblerBuffer::EnsureCapacity ensured(&Buffer);
|
| emitUint8(isFloat32Asserting32Or64(Ty) ? 0xF3 : 0xF2);
|
| + emitAddrSizeOverridePrefix();
|
| emitRex(RexTypeIrrelevant, src, dst);
|
| emitUint8(0x0F);
|
| emitUint8(0x58);
|
| @@ -577,6 +594,7 @@ void AssemblerX86Base<Machine>::subss(Type Ty, typename Traits::XmmRegister dst,
|
| const typename Traits::Address &src) {
|
| AssemblerBuffer::EnsureCapacity ensured(&Buffer);
|
| emitUint8(isFloat32Asserting32Or64(Ty) ? 0xF3 : 0xF2);
|
| + emitAddrSizeOverridePrefix();
|
| emitRex(RexTypeIrrelevant, src, dst);
|
| emitUint8(0x0F);
|
| emitUint8(0x5C);
|
| @@ -599,6 +617,7 @@ void AssemblerX86Base<Machine>::mulss(Type Ty, typename Traits::XmmRegister dst,
|
| const typename Traits::Address &src) {
|
| AssemblerBuffer::EnsureCapacity ensured(&Buffer);
|
| emitUint8(isFloat32Asserting32Or64(Ty) ? 0xF3 : 0xF2);
|
| + emitAddrSizeOverridePrefix();
|
| emitRex(RexTypeIrrelevant, src, dst);
|
| emitUint8(0x0F);
|
| emitUint8(0x59);
|
| @@ -621,6 +640,7 @@ void AssemblerX86Base<Machine>::divss(Type Ty, typename Traits::XmmRegister dst,
|
| const typename Traits::Address &src) {
|
| AssemblerBuffer::EnsureCapacity ensured(&Buffer);
|
| emitUint8(isFloat32Asserting32Or64(Ty) ? 0xF3 : 0xF2);
|
| + emitAddrSizeOverridePrefix();
|
| emitRex(RexTypeIrrelevant, src, dst);
|
| emitUint8(0x0F);
|
| emitUint8(0x5E);
|
| @@ -631,6 +651,7 @@ template <class Machine>
|
| template <typename T, typename>
|
| void AssemblerX86Base<Machine>::fld(Type Ty, const typename T::Address &src) {
|
| AssemblerBuffer::EnsureCapacity ensured(&Buffer);
|
| + emitAddrSizeOverridePrefix();
|
| emitUint8(isFloat32Asserting32Or64(Ty) ? 0xD9 : 0xDD);
|
| emitOperand(0, src);
|
| }
|
| @@ -639,6 +660,7 @@ template <class Machine>
|
| template <typename T, typename>
|
| void AssemblerX86Base<Machine>::fstp(Type Ty, const typename T::Address &dst) {
|
| AssemblerBuffer::EnsureCapacity ensured(&Buffer);
|
| + emitAddrSizeOverridePrefix();
|
| emitUint8(isFloat32Asserting32Or64(Ty) ? 0xD9 : 0xDD);
|
| emitOperand(3, dst);
|
| }
|
| @@ -675,6 +697,7 @@ template <class Machine>
|
| void AssemblerX86Base<Machine>::movups(typename Traits::XmmRegister dst,
|
| const typename Traits::Address &src) {
|
| AssemblerBuffer::EnsureCapacity ensured(&Buffer);
|
| + emitAddrSizeOverridePrefix();
|
| emitRex(RexTypeIrrelevant, src, dst);
|
| emitUint8(0x0F);
|
| emitUint8(0x10);
|
| @@ -685,6 +708,7 @@ template <class Machine>
|
| void AssemblerX86Base<Machine>::movups(const typename Traits::Address &dst,
|
| typename Traits::XmmRegister src) {
|
| AssemblerBuffer::EnsureCapacity ensured(&Buffer);
|
| + emitAddrSizeOverridePrefix();
|
| emitRex(RexTypeIrrelevant, dst, src);
|
| emitUint8(0x0F);
|
| emitUint8(0x11);
|
| @@ -713,6 +737,7 @@ void AssemblerX86Base<Machine>::padd(Type Ty, typename Traits::XmmRegister dst,
|
| const typename Traits::Address &src) {
|
| AssemblerBuffer::EnsureCapacity ensured(&Buffer);
|
| emitUint8(0x66);
|
| + emitAddrSizeOverridePrefix();
|
| emitRex(RexTypeIrrelevant, src, dst);
|
| emitUint8(0x0F);
|
| if (isByteSizedArithType(Ty)) {
|
| @@ -743,6 +768,7 @@ void AssemblerX86Base<Machine>::pand(Type /* Ty */,
|
| const typename Traits::Address &src) {
|
| AssemblerBuffer::EnsureCapacity ensured(&Buffer);
|
| emitUint8(0x66);
|
| + emitAddrSizeOverridePrefix();
|
| emitRex(RexTypeIrrelevant, src, dst);
|
| emitUint8(0x0F);
|
| emitUint8(0xDB);
|
| @@ -767,6 +793,7 @@ void AssemblerX86Base<Machine>::pandn(Type /* Ty */,
|
| const typename Traits::Address &src) {
|
| AssemblerBuffer::EnsureCapacity ensured(&Buffer);
|
| emitUint8(0x66);
|
| + emitAddrSizeOverridePrefix();
|
| emitRex(RexTypeIrrelevant, src, dst);
|
| emitUint8(0x0F);
|
| emitUint8(0xDF);
|
| @@ -795,6 +822,7 @@ void AssemblerX86Base<Machine>::pmull(Type Ty, typename Traits::XmmRegister dst,
|
| const typename Traits::Address &src) {
|
| AssemblerBuffer::EnsureCapacity ensured(&Buffer);
|
| emitUint8(0x66);
|
| + emitAddrSizeOverridePrefix();
|
| emitRex(RexTypeIrrelevant, src, dst);
|
| emitUint8(0x0F);
|
| if (Ty == IceType_i16) {
|
| @@ -825,6 +853,7 @@ void AssemblerX86Base<Machine>::pmuludq(Type /* Ty */,
|
| const typename Traits::Address &src) {
|
| AssemblerBuffer::EnsureCapacity ensured(&Buffer);
|
| emitUint8(0x66);
|
| + emitAddrSizeOverridePrefix();
|
| emitRex(RexTypeIrrelevant, src, dst);
|
| emitUint8(0x0F);
|
| emitUint8(0xF4);
|
| @@ -849,6 +878,7 @@ void AssemblerX86Base<Machine>::por(Type /* Ty */,
|
| const typename Traits::Address &src) {
|
| AssemblerBuffer::EnsureCapacity ensured(&Buffer);
|
| emitUint8(0x66);
|
| + emitAddrSizeOverridePrefix();
|
| emitRex(RexTypeIrrelevant, src, dst);
|
| emitUint8(0x0F);
|
| emitUint8(0xEB);
|
| @@ -877,6 +907,7 @@ void AssemblerX86Base<Machine>::psub(Type Ty, typename Traits::XmmRegister dst,
|
| const typename Traits::Address &src) {
|
| AssemblerBuffer::EnsureCapacity ensured(&Buffer);
|
| emitUint8(0x66);
|
| + emitAddrSizeOverridePrefix();
|
| emitRex(RexTypeIrrelevant, src, dst);
|
| emitUint8(0x0F);
|
| if (isByteSizedArithType(Ty)) {
|
| @@ -907,6 +938,7 @@ void AssemblerX86Base<Machine>::pxor(Type /* Ty */,
|
| const typename Traits::Address &src) {
|
| AssemblerBuffer::EnsureCapacity ensured(&Buffer);
|
| emitUint8(0x66);
|
| + emitAddrSizeOverridePrefix();
|
| emitRex(RexTypeIrrelevant, src, dst);
|
| emitUint8(0x0F);
|
| emitUint8(0xEF);
|
| @@ -934,6 +966,7 @@ void AssemblerX86Base<Machine>::psll(Type Ty, typename Traits::XmmRegister dst,
|
| const typename Traits::Address &src) {
|
| AssemblerBuffer::EnsureCapacity ensured(&Buffer);
|
| emitUint8(0x66);
|
| + emitAddrSizeOverridePrefix();
|
| emitRex(RexTypeIrrelevant, src, dst);
|
| emitUint8(0x0F);
|
| if (Ty == IceType_i16) {
|
| @@ -984,6 +1017,7 @@ void AssemblerX86Base<Machine>::psra(Type Ty, typename Traits::XmmRegister dst,
|
| const typename Traits::Address &src) {
|
| AssemblerBuffer::EnsureCapacity ensured(&Buffer);
|
| emitUint8(0x66);
|
| + emitAddrSizeOverridePrefix();
|
| emitRex(RexTypeIrrelevant, src, dst);
|
| emitUint8(0x0F);
|
| if (Ty == IceType_i16) {
|
| @@ -1036,6 +1070,7 @@ void AssemblerX86Base<Machine>::psrl(Type Ty, typename Traits::XmmRegister dst,
|
| const typename Traits::Address &src) {
|
| AssemblerBuffer::EnsureCapacity ensured(&Buffer);
|
| emitUint8(0x66);
|
| + emitAddrSizeOverridePrefix();
|
| emitRex(RexTypeIrrelevant, src, dst);
|
| emitUint8(0x0F);
|
| if (Ty == IceType_i16) {
|
| @@ -1088,6 +1123,7 @@ void AssemblerX86Base<Machine>::addps(Type /* Ty */,
|
| typename Traits::XmmRegister dst,
|
| const typename Traits::Address &src) {
|
| AssemblerBuffer::EnsureCapacity ensured(&Buffer);
|
| + emitAddrSizeOverridePrefix();
|
| emitRex(RexTypeIrrelevant, src, dst);
|
| emitUint8(0x0F);
|
| emitUint8(0x58);
|
| @@ -1110,6 +1146,7 @@ void AssemblerX86Base<Machine>::subps(Type /* Ty */,
|
| typename Traits::XmmRegister dst,
|
| const typename Traits::Address &src) {
|
| AssemblerBuffer::EnsureCapacity ensured(&Buffer);
|
| + emitAddrSizeOverridePrefix();
|
| emitRex(RexTypeIrrelevant, src, dst);
|
| emitUint8(0x0F);
|
| emitUint8(0x5C);
|
| @@ -1132,6 +1169,7 @@ void AssemblerX86Base<Machine>::divps(Type /* Ty */,
|
| typename Traits::XmmRegister dst,
|
| const typename Traits::Address &src) {
|
| AssemblerBuffer::EnsureCapacity ensured(&Buffer);
|
| + emitAddrSizeOverridePrefix();
|
| emitRex(RexTypeIrrelevant, src, dst);
|
| emitUint8(0x0F);
|
| emitUint8(0x5E);
|
| @@ -1154,6 +1192,7 @@ void AssemblerX86Base<Machine>::mulps(Type /* Ty */,
|
| typename Traits::XmmRegister dst,
|
| const typename Traits::Address &src) {
|
| AssemblerBuffer::EnsureCapacity ensured(&Buffer);
|
| + emitAddrSizeOverridePrefix();
|
| emitRex(RexTypeIrrelevant, src, dst);
|
| emitUint8(0x0F);
|
| emitUint8(0x59);
|
| @@ -1178,6 +1217,7 @@ void AssemblerX86Base<Machine>::minps(Type Ty, typename Traits::XmmRegister dst,
|
| AssemblerBuffer::EnsureCapacity ensured(&Buffer);
|
| if (!isFloat32Asserting32Or64(Ty))
|
| emitUint8(0x66);
|
| + emitAddrSizeOverridePrefix();
|
| emitRex(RexTypeIrrelevant, src, dst);
|
| emitUint8(0x0F);
|
| emitUint8(0x5D);
|
| @@ -1200,6 +1240,7 @@ void AssemblerX86Base<Machine>::minss(Type Ty, typename Traits::XmmRegister dst,
|
| const typename Traits::Address &src) {
|
| AssemblerBuffer::EnsureCapacity ensured(&Buffer);
|
| emitUint8(isFloat32Asserting32Or64(Ty) ? 0xF3 : 0xF2);
|
| + emitAddrSizeOverridePrefix();
|
| emitRex(RexTypeIrrelevant, src, dst);
|
| emitUint8(0x0F);
|
| emitUint8(0x5D);
|
| @@ -1224,6 +1265,7 @@ void AssemblerX86Base<Machine>::maxps(Type Ty, typename Traits::XmmRegister dst,
|
| AssemblerBuffer::EnsureCapacity ensured(&Buffer);
|
| if (!isFloat32Asserting32Or64(Ty))
|
| emitUint8(0x66);
|
| + emitAddrSizeOverridePrefix();
|
| emitRex(RexTypeIrrelevant, src, dst);
|
| emitUint8(0x0F);
|
| emitUint8(0x5F);
|
| @@ -1246,6 +1288,7 @@ void AssemblerX86Base<Machine>::maxss(Type Ty, typename Traits::XmmRegister dst,
|
| const typename Traits::Address &src) {
|
| AssemblerBuffer::EnsureCapacity ensured(&Buffer);
|
| emitUint8(isFloat32Asserting32Or64(Ty) ? 0xF3 : 0xF2);
|
| + emitAddrSizeOverridePrefix();
|
| emitRex(RexTypeIrrelevant, src, dst);
|
| emitUint8(0x0F);
|
| emitUint8(0x5F);
|
| @@ -1272,6 +1315,7 @@ void AssemblerX86Base<Machine>::andnps(Type Ty,
|
| AssemblerBuffer::EnsureCapacity ensured(&Buffer);
|
| if (!isFloat32Asserting32Or64(Ty))
|
| emitUint8(0x66);
|
| + emitAddrSizeOverridePrefix();
|
| emitRex(RexTypeIrrelevant, src, dst);
|
| emitUint8(0x0F);
|
| emitUint8(0x55);
|
| @@ -1296,6 +1340,7 @@ void AssemblerX86Base<Machine>::andps(Type Ty, typename Traits::XmmRegister dst,
|
| AssemblerBuffer::EnsureCapacity ensured(&Buffer);
|
| if (!isFloat32Asserting32Or64(Ty))
|
| emitUint8(0x66);
|
| + emitAddrSizeOverridePrefix();
|
| emitRex(RexTypeIrrelevant, src, dst);
|
| emitUint8(0x0F);
|
| emitUint8(0x54);
|
| @@ -1320,6 +1365,7 @@ void AssemblerX86Base<Machine>::orps(Type Ty, typename Traits::XmmRegister dst,
|
| AssemblerBuffer::EnsureCapacity ensured(&Buffer);
|
| if (!isFloat32Asserting32Or64(Ty))
|
| emitUint8(0x66);
|
| + emitAddrSizeOverridePrefix();
|
| emitRex(RexTypeIrrelevant, src, dst);
|
| emitUint8(0x0F);
|
| emitUint8(0x56);
|
| @@ -1345,6 +1391,7 @@ void AssemblerX86Base<Machine>::blendvps(Type /* Ty */,
|
| const typename Traits::Address &src) {
|
| AssemblerBuffer::EnsureCapacity ensured(&Buffer);
|
| emitUint8(0x66);
|
| + emitAddrSizeOverridePrefix();
|
| emitRex(RexTypeIrrelevant, src, dst);
|
| emitUint8(0x0F);
|
| emitUint8(0x38);
|
| @@ -1371,6 +1418,7 @@ void AssemblerX86Base<Machine>::pblendvb(Type /* Ty */,
|
| const typename Traits::Address &src) {
|
| AssemblerBuffer::EnsureCapacity ensured(&Buffer);
|
| emitUint8(0x66);
|
| + emitAddrSizeOverridePrefix();
|
| emitRex(RexTypeIrrelevant, src, dst);
|
| emitUint8(0x0F);
|
| emitUint8(0x38);
|
| @@ -1400,6 +1448,7 @@ void AssemblerX86Base<Machine>::cmpps(
|
| AssemblerBuffer::EnsureCapacity ensured(&Buffer);
|
| if (Ty == IceType_f64)
|
| emitUint8(0x66);
|
| + emitAddrSizeOverridePrefix();
|
| emitRex(RexTypeIrrelevant, src, dst);
|
| emitUint8(0x0F);
|
| emitUint8(0xC2);
|
| @@ -1530,6 +1579,7 @@ void AssemblerX86Base<Machine>::pshufd(Type /* Ty */,
|
| const Immediate &imm) {
|
| AssemblerBuffer::EnsureCapacity ensured(&Buffer);
|
| emitUint8(0x66);
|
| + emitAddrSizeOverridePrefix();
|
| emitRex(RexTypeIrrelevant, src, dst);
|
| emitUint8(0x0F);
|
| emitUint8(0x70);
|
| @@ -1558,6 +1608,7 @@ void AssemblerX86Base<Machine>::shufps(Type /* Ty */,
|
| const typename Traits::Address &src,
|
| const Immediate &imm) {
|
| AssemblerBuffer::EnsureCapacity ensured(&Buffer);
|
| + emitAddrSizeOverridePrefix();
|
| emitRex(RexTypeIrrelevant, src, dst);
|
| emitUint8(0x0F);
|
| emitUint8(0xC6);
|
| @@ -1592,6 +1643,7 @@ void AssemblerX86Base<Machine>::cvtdq2ps(Type /* Ignore */,
|
| typename Traits::XmmRegister dst,
|
| const typename Traits::Address &src) {
|
| AssemblerBuffer::EnsureCapacity ensured(&Buffer);
|
| + emitAddrSizeOverridePrefix();
|
| emitRex(RexTypeIrrelevant, src, dst);
|
| emitUint8(0x0F);
|
| emitUint8(0x5B);
|
| @@ -1616,6 +1668,7 @@ void AssemblerX86Base<Machine>::cvttps2dq(Type /* Ignore */,
|
| const typename Traits::Address &src) {
|
| AssemblerBuffer::EnsureCapacity ensured(&Buffer);
|
| emitUint8(0xF3);
|
| + emitAddrSizeOverridePrefix();
|
| emitRex(RexTypeIrrelevant, src, dst);
|
| emitUint8(0x0F);
|
| emitUint8(0x5B);
|
| @@ -1642,6 +1695,7 @@ void AssemblerX86Base<Machine>::cvtsi2ss(Type DestTy,
|
| const typename Traits::Address &src) {
|
| AssemblerBuffer::EnsureCapacity ensured(&Buffer);
|
| emitUint8(isFloat32Asserting32Or64(DestTy) ? 0xF3 : 0xF2);
|
| + emitAddrSizeOverridePrefix();
|
| emitRex(SrcTy, src, dst);
|
| emitUint8(0x0F);
|
| emitUint8(0x2A);
|
| @@ -1667,6 +1721,7 @@ void AssemblerX86Base<Machine>::cvtfloat2float(
|
| const typename Traits::Address &src) {
|
| AssemblerBuffer::EnsureCapacity ensured(&Buffer);
|
| emitUint8(isFloat32Asserting32Or64(SrcTy) ? 0xF3 : 0xF2);
|
| + emitAddrSizeOverridePrefix();
|
| emitRex(RexTypeIrrelevant, src, dst);
|
| emitUint8(0x0F);
|
| emitUint8(0x5A);
|
| @@ -1693,6 +1748,7 @@ void AssemblerX86Base<Machine>::cvttss2si(Type DestTy,
|
| const typename Traits::Address &src) {
|
| AssemblerBuffer::EnsureCapacity ensured(&Buffer);
|
| emitUint8(isFloat32Asserting32Or64(SrcTy) ? 0xF3 : 0xF2);
|
| + emitAddrSizeOverridePrefix();
|
| emitRex(DestTy, src, dst);
|
| emitUint8(0x0F);
|
| emitUint8(0x2C);
|
| @@ -1717,6 +1773,7 @@ void AssemblerX86Base<Machine>::ucomiss(Type Ty, typename Traits::XmmRegister a,
|
| AssemblerBuffer::EnsureCapacity ensured(&Buffer);
|
| if (Ty == IceType_f64)
|
| emitUint8(0x66);
|
| + emitAddrSizeOverridePrefix();
|
| emitRex(RexTypeIrrelevant, b, a);
|
| emitUint8(0x0F);
|
| emitUint8(0x2E);
|
| @@ -1750,6 +1807,7 @@ void AssemblerX86Base<Machine>::sqrtss(Type Ty,
|
| const typename Traits::Address &src) {
|
| AssemblerBuffer::EnsureCapacity ensured(&Buffer);
|
| emitUint8(isFloat32Asserting32Or64(Ty) ? 0xF3 : 0xF2);
|
| + emitAddrSizeOverridePrefix();
|
| emitRex(RexTypeIrrelevant, src, dst);
|
| emitUint8(0x0F);
|
| emitUint8(0x51);
|
| @@ -1774,6 +1832,7 @@ void AssemblerX86Base<Machine>::xorps(Type Ty, typename Traits::XmmRegister dst,
|
| AssemblerBuffer::EnsureCapacity ensured(&Buffer);
|
| if (!isFloat32Asserting32Or64(Ty))
|
| emitUint8(0x66);
|
| + emitAddrSizeOverridePrefix();
|
| emitRex(RexTypeIrrelevant, src, dst);
|
| emitUint8(0x0F);
|
| emitUint8(0x57);
|
| @@ -1820,6 +1879,7 @@ void AssemblerX86Base<Machine>::insertps(Type Ty,
|
| assert(isVectorFloatingType(Ty));
|
| (void)Ty;
|
| emitUint8(0x66);
|
| + emitAddrSizeOverridePrefix();
|
| emitRex(RexTypeIrrelevant, src, dst);
|
| emitUint8(0x0F);
|
| emitUint8(0x3A);
|
| @@ -1854,6 +1914,7 @@ void AssemblerX86Base<Machine>::pinsr(Type Ty, typename Traits::XmmRegister dst,
|
| AssemblerBuffer::EnsureCapacity ensured(&Buffer);
|
| assert(imm.is_uint8());
|
| emitUint8(0x66);
|
| + emitAddrSizeOverridePrefix();
|
| emitRex(RexTypeIrrelevant, src, dst);
|
| emitUint8(0x0F);
|
| if (Ty == IceType_i16) {
|
| @@ -1928,6 +1989,7 @@ void AssemblerX86Base<Machine>::pcmpeq(Type Ty,
|
| const typename Traits::Address &src) {
|
| AssemblerBuffer::EnsureCapacity ensured(&Buffer);
|
| emitUint8(0x66);
|
| + emitAddrSizeOverridePrefix();
|
| emitRex(RexTypeIrrelevant, src, dst);
|
| emitUint8(0x0F);
|
| if (isByteSizedArithType(Ty)) {
|
| @@ -1964,6 +2026,7 @@ void AssemblerX86Base<Machine>::pcmpgt(Type Ty,
|
| const typename Traits::Address &src) {
|
| AssemblerBuffer::EnsureCapacity ensured(&Buffer);
|
| emitUint8(0x66);
|
| + emitAddrSizeOverridePrefix();
|
| emitRex(RexTypeIrrelevant, src, dst);
|
| emitUint8(0x0F);
|
| if (isByteSizedArithType(Ty)) {
|
| @@ -1995,6 +2058,7 @@ template <class Machine>
|
| template <typename T, typename>
|
| void AssemblerX86Base<Machine>::fnstcw(const typename T::Address &dst) {
|
| AssemblerBuffer::EnsureCapacity ensured(&Buffer);
|
| + emitAddrSizeOverridePrefix();
|
| emitUint8(0xD9);
|
| emitOperand(7, dst);
|
| }
|
| @@ -2003,6 +2067,7 @@ template <class Machine>
|
| template <typename T, typename>
|
| void AssemblerX86Base<Machine>::fldcw(const typename T::Address &src) {
|
| AssemblerBuffer::EnsureCapacity ensured(&Buffer);
|
| + emitAddrSizeOverridePrefix();
|
| emitUint8(0xD9);
|
| emitOperand(5, src);
|
| }
|
| @@ -2011,6 +2076,7 @@ template <class Machine>
|
| template <typename T, typename>
|
| void AssemblerX86Base<Machine>::fistpl(const typename T::Address &dst) {
|
| AssemblerBuffer::EnsureCapacity ensured(&Buffer);
|
| + emitAddrSizeOverridePrefix();
|
| emitUint8(0xDF);
|
| emitOperand(7, dst);
|
| }
|
| @@ -2019,6 +2085,7 @@ template <class Machine>
|
| template <typename T, typename>
|
| void AssemblerX86Base<Machine>::fistps(const typename T::Address &dst) {
|
| AssemblerBuffer::EnsureCapacity ensured(&Buffer);
|
| + emitAddrSizeOverridePrefix();
|
| emitUint8(0xDB);
|
| emitOperand(3, dst);
|
| }
|
| @@ -2027,6 +2094,7 @@ template <class Machine>
|
| template <typename T, typename>
|
| void AssemblerX86Base<Machine>::fildl(const typename T::Address &src) {
|
| AssemblerBuffer::EnsureCapacity ensured(&Buffer);
|
| + emitAddrSizeOverridePrefix();
|
| emitUint8(0xDF);
|
| emitOperand(5, src);
|
| }
|
| @@ -2035,6 +2103,7 @@ template <class Machine>
|
| template <typename T, typename>
|
| void AssemblerX86Base<Machine>::filds(const typename T::Address &src) {
|
| AssemblerBuffer::EnsureCapacity ensured(&Buffer);
|
| + emitAddrSizeOverridePrefix();
|
| emitUint8(0xDB);
|
| emitOperand(0, src);
|
| }
|
| @@ -2090,6 +2159,7 @@ void AssemblerX86Base<Machine>::arith_int(
|
| AssemblerBuffer::EnsureCapacity ensured(&Buffer);
|
| if (Ty == IceType_i16)
|
| emitOperandSizeOverride();
|
| + emitAddrSizeOverridePrefix();
|
| emitRex(Ty, address, reg);
|
| if (isByteSizedType(Ty))
|
| emitUint8(Tag * 8 + 2);
|
| @@ -2107,6 +2177,7 @@ void AssemblerX86Base<Machine>::arith_int(
|
| AssemblerBuffer::EnsureCapacity ensured(&Buffer);
|
| if (Ty == IceType_i16)
|
| emitOperandSizeOverride();
|
| + emitAddrSizeOverridePrefix();
|
| emitRex(Ty, address, reg);
|
| if (isByteSizedType(Ty))
|
| emitUint8(Tag * 8 + 0);
|
| @@ -2123,6 +2194,7 @@ void AssemblerX86Base<Machine>::arith_int(
|
| AssemblerBuffer::EnsureCapacity ensured(&Buffer);
|
| if (Ty == IceType_i16)
|
| emitOperandSizeOverride();
|
| + emitAddrSizeOverridePrefix();
|
| emitRex(Ty, address, RexRegIrrelevant);
|
| if (isByteSizedType(Ty)) {
|
| emitComplexI8(Tag, address, imm);
|
| @@ -2184,6 +2256,7 @@ void AssemblerX86Base<Machine>::test(Type Ty,
|
| AssemblerBuffer::EnsureCapacity ensured(&Buffer);
|
| if (Ty == IceType_i16)
|
| emitOperandSizeOverride();
|
| + emitAddrSizeOverridePrefix();
|
| emitRex(Ty, addr, reg);
|
| if (isByteSizedType(Ty))
|
| emitUint8(0x84);
|
| @@ -2236,6 +2309,7 @@ void AssemblerX86Base<Machine>::test(Type Ty,
|
| // short.
|
| if (immediate.is_uint8()) {
|
| // Use zero-extended 8-bit immediate.
|
| + emitAddrSizeOverridePrefix();
|
| emitRex(Ty, addr, RexRegIrrelevant);
|
| emitUint8(0xF6);
|
| emitOperand(0, addr);
|
| @@ -2243,6 +2317,7 @@ void AssemblerX86Base<Machine>::test(Type Ty,
|
| } else {
|
| if (Ty == IceType_i16)
|
| emitOperandSizeOverride();
|
| + emitAddrSizeOverridePrefix();
|
| emitRex(Ty, addr, RexRegIrrelevant);
|
| emitUint8(0xF7);
|
| emitOperand(0, addr);
|
| @@ -2519,6 +2594,7 @@ void AssemblerX86Base<Machine>::div(Type Ty,
|
| AssemblerBuffer::EnsureCapacity ensured(&Buffer);
|
| if (Ty == IceType_i16)
|
| emitOperandSizeOverride();
|
| + emitAddrSizeOverridePrefix();
|
| emitRex(Ty, addr, RexRegIrrelevant);
|
| if (isByteSizedArithType(Ty))
|
| emitUint8(0xF6);
|
| @@ -2547,6 +2623,7 @@ void AssemblerX86Base<Machine>::idiv(Type Ty,
|
| AssemblerBuffer::EnsureCapacity ensured(&Buffer);
|
| if (Ty == IceType_i16)
|
| emitOperandSizeOverride();
|
| + emitAddrSizeOverridePrefix();
|
| emitRex(Ty, addr, RexRegIrrelevant);
|
| if (isByteSizedArithType(Ty))
|
| emitUint8(0xF6);
|
| @@ -2577,6 +2654,7 @@ void AssemblerX86Base<Machine>::imul(Type Ty, typename Traits::GPRRegister reg,
|
| (Traits::Is64Bit && Ty == IceType_i64));
|
| if (Ty == IceType_i16)
|
| emitOperandSizeOverride();
|
| + emitAddrSizeOverridePrefix();
|
| emitRex(Ty, address, reg);
|
| emitUint8(0x0F);
|
| emitUint8(0xAF);
|
| @@ -2622,6 +2700,7 @@ void AssemblerX86Base<Machine>::imul(Type Ty,
|
| AssemblerBuffer::EnsureCapacity ensured(&Buffer);
|
| if (Ty == IceType_i16)
|
| emitOperandSizeOverride();
|
| + emitAddrSizeOverridePrefix();
|
| emitRex(Ty, address, RexRegIrrelevant);
|
| if (isByteSizedArithType(Ty))
|
| emitUint8(0xF6);
|
| @@ -2658,6 +2737,7 @@ void AssemblerX86Base<Machine>::imul(Type Ty, typename Traits::GPRRegister dst,
|
| assert(Ty == IceType_i16 || Ty == IceType_i32);
|
| if (Ty == IceType_i16)
|
| emitOperandSizeOverride();
|
| + emitAddrSizeOverridePrefix();
|
| emitRex(Ty, address, dst);
|
| if (imm.is_int8()) {
|
| emitUint8(0x6B);
|
| @@ -2689,6 +2769,7 @@ void AssemblerX86Base<Machine>::mul(Type Ty,
|
| AssemblerBuffer::EnsureCapacity ensured(&Buffer);
|
| if (Ty == IceType_i16)
|
| emitOperandSizeOverride();
|
| + emitAddrSizeOverridePrefix();
|
| emitRex(Ty, address, RexRegIrrelevant);
|
| if (isByteSizedArithType(Ty))
|
| emitUint8(0xF6);
|
| @@ -2707,6 +2788,7 @@ void AssemblerX86Base<Machine>::incl(typename Traits::GPRRegister reg) {
|
| template <class Machine>
|
| void AssemblerX86Base<Machine>::incl(const typename Traits::Address &address) {
|
| AssemblerBuffer::EnsureCapacity ensured(&Buffer);
|
| + emitAddrSizeOverridePrefix();
|
| emitRex(IceType_i32, address, RexRegIrrelevant);
|
| emitUint8(0xFF);
|
| emitOperand(0, address);
|
| @@ -2722,6 +2804,7 @@ void AssemblerX86Base<Machine>::decl(typename Traits::GPRRegister reg) {
|
| template <class Machine>
|
| void AssemblerX86Base<Machine>::decl(const typename Traits::Address &address) {
|
| AssemblerBuffer::EnsureCapacity ensured(&Buffer);
|
| + emitAddrSizeOverridePrefix();
|
| emitRex(IceType_i32, address, RexRegIrrelevant);
|
| emitUint8(0xFF);
|
| emitOperand(1, address);
|
| @@ -2844,6 +2927,7 @@ void AssemblerX86Base<Machine>::shld(Type Ty,
|
| assert(Ty == IceType_i16 || Ty == IceType_i32);
|
| if (Ty == IceType_i16)
|
| emitOperandSizeOverride();
|
| + emitAddrSizeOverridePrefix();
|
| emitRex(Ty, operand, src);
|
| emitUint8(0x0F);
|
| emitUint8(0xA5);
|
| @@ -2887,6 +2971,7 @@ void AssemblerX86Base<Machine>::shrd(Type Ty,
|
| assert(Ty == IceType_i16 || Ty == IceType_i32);
|
| if (Ty == IceType_i16)
|
| emitOperandSizeOverride();
|
| + emitAddrSizeOverridePrefix();
|
| emitRex(Ty, dst, src);
|
| emitUint8(0x0F);
|
| emitUint8(0xAD);
|
| @@ -2912,6 +2997,7 @@ void AssemblerX86Base<Machine>::neg(Type Ty,
|
| AssemblerBuffer::EnsureCapacity ensured(&Buffer);
|
| if (Ty == IceType_i16)
|
| emitOperandSizeOverride();
|
| + emitAddrSizeOverridePrefix();
|
| emitRex(Ty, addr, RexRegIrrelevant);
|
| if (isByteSizedArithType(Ty))
|
| emitUint8(0xF6);
|
| @@ -2942,7 +3028,8 @@ template <class Machine>
|
| void AssemblerX86Base<Machine>::bsf(Type Ty, typename Traits::GPRRegister dst,
|
| typename Traits::GPRRegister src) {
|
| AssemblerBuffer::EnsureCapacity ensured(&Buffer);
|
| - assert(Ty == IceType_i16 || Ty == IceType_i32);
|
| + assert(Ty == IceType_i16 || Ty == IceType_i32 ||
|
| + (Traits::Is64Bit && Ty == IceType_i64));
|
| if (Ty == IceType_i16)
|
| emitOperandSizeOverride();
|
| emitRexRB(Ty, dst, src);
|
| @@ -2955,9 +3042,11 @@ template <class Machine>
|
| void AssemblerX86Base<Machine>::bsf(Type Ty, typename Traits::GPRRegister dst,
|
| const typename Traits::Address &src) {
|
| AssemblerBuffer::EnsureCapacity ensured(&Buffer);
|
| - assert(Ty == IceType_i16 || Ty == IceType_i32);
|
| + assert(Ty == IceType_i16 || Ty == IceType_i32 ||
|
| + (Traits::Is64Bit && Ty == IceType_i64));
|
| if (Ty == IceType_i16)
|
| emitOperandSizeOverride();
|
| + emitAddrSizeOverridePrefix();
|
| emitRex(Ty, src, dst);
|
| emitUint8(0x0F);
|
| emitUint8(0xBC);
|
| @@ -2968,7 +3057,8 @@ template <class Machine>
|
| void AssemblerX86Base<Machine>::bsr(Type Ty, typename Traits::GPRRegister dst,
|
| typename Traits::GPRRegister src) {
|
| AssemblerBuffer::EnsureCapacity ensured(&Buffer);
|
| - assert(Ty == IceType_i16 || Ty == IceType_i32);
|
| + assert(Ty == IceType_i16 || Ty == IceType_i32 ||
|
| + (Traits::Is64Bit && Ty == IceType_i64));
|
| if (Ty == IceType_i16)
|
| emitOperandSizeOverride();
|
| emitRexRB(Ty, dst, src);
|
| @@ -2981,9 +3071,11 @@ template <class Machine>
|
| void AssemblerX86Base<Machine>::bsr(Type Ty, typename Traits::GPRRegister dst,
|
| const typename Traits::Address &src) {
|
| AssemblerBuffer::EnsureCapacity ensured(&Buffer);
|
| - assert(Ty == IceType_i16 || Ty == IceType_i32);
|
| + assert(Ty == IceType_i16 || Ty == IceType_i32 ||
|
| + (Traits::Is64Bit && Ty == IceType_i64));
|
| if (Ty == IceType_i16)
|
| emitOperandSizeOverride();
|
| + emitAddrSizeOverridePrefix();
|
| emitRex(Ty, src, dst);
|
| emitUint8(0x0F);
|
| emitUint8(0xBD);
|
| @@ -3198,6 +3290,7 @@ void AssemblerX86Base<Machine>::cmpxchg(Type Ty,
|
| emitOperandSizeOverride();
|
| if (Locked)
|
| emitUint8(0xF0);
|
| + emitAddrSizeOverridePrefix();
|
| emitRex(Ty, address, reg);
|
| emitUint8(0x0F);
|
| if (isByteSizedArithType(Ty))
|
| @@ -3213,6 +3306,7 @@ void AssemblerX86Base<Machine>::cmpxchg8b(
|
| AssemblerBuffer::EnsureCapacity ensured(&Buffer);
|
| if (Locked)
|
| emitUint8(0xF0);
|
| + emitAddrSizeOverridePrefix();
|
| emitRex(IceType_i32, address, RexRegIrrelevant);
|
| emitUint8(0x0F);
|
| emitUint8(0xC7);
|
| @@ -3229,6 +3323,7 @@ void AssemblerX86Base<Machine>::xadd(Type Ty,
|
| emitOperandSizeOverride();
|
| if (Locked)
|
| emitUint8(0xF0);
|
| + emitAddrSizeOverridePrefix();
|
| emitRex(Ty, addr, reg);
|
| emitUint8(0x0F);
|
| if (isByteSizedArithType(Ty))
|
| @@ -3268,6 +3363,7 @@ void AssemblerX86Base<Machine>::xchg(Type Ty,
|
| AssemblerBuffer::EnsureCapacity ensured(&Buffer);
|
| if (Ty == IceType_i16)
|
| emitOperandSizeOverride();
|
| + emitAddrSizeOverridePrefix();
|
| emitRex(Ty, addr, reg);
|
| if (isByteSizedArithType(Ty))
|
| emitUint8(0x86);
|
|
|