Chromium Code Reviews| Index: src/assembler_ia32.cpp |
| diff --git a/src/assembler_ia32.cpp b/src/assembler_ia32.cpp |
| index 4347f469d720639237a5c614938405a6873cedf7..34e7a4258f0c0bb25d4db8560052cf5b2dc6d157 100644 |
| --- a/src/assembler_ia32.cpp |
| +++ b/src/assembler_ia32.cpp |
| @@ -1146,18 +1146,6 @@ void AssemblerX86::cmpl(GPRRegister reg, const Address &address) { |
| EmitOperand(reg, address); |
| } |
| -void AssemblerX86::addl(GPRRegister dst, GPRRegister src) { |
| - AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
| - EmitUint8(0x03); |
| - EmitRegisterOperand(dst, src); |
| -} |
| - |
| -void AssemblerX86::addl(GPRRegister reg, const Address &address) { |
| - AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
| - EmitUint8(0x03); |
| - EmitOperand(reg, address); |
| -} |
| - |
| void AssemblerX86::cmpl(const Address &address, GPRRegister reg) { |
| AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
| EmitUint8(0x39); |
| @@ -1207,117 +1195,235 @@ void AssemblerX86::testl(GPRRegister reg, const Immediate &immediate) { |
| } |
| } |
| -void AssemblerX86::andl(GPRRegister dst, GPRRegister src) { |
| +void AssemblerX86::And(Type Ty, GPRRegister dst, GPRRegister src) { |
| AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
| - EmitUint8(0x23); |
| - EmitOperand(dst, Operand(src)); |
| + if (Ty == IceType_i16) |
| + EmitOperandSizeOverride(); |
| + if (Ty == IceType_i8 || Ty == IceType_i1) |
|
jvoung (off chromium)
2014/09/25 20:05:53
Turns out that most of the i8 || i1 are in this fi
Jim Stichnoth
2014/09/26 02:31:36
That sounds good. There are also a couple other p
|
| + EmitUint8(0x22); |
| + else |
| + EmitUint8(0x23); |
| + EmitRegisterOperand(dst, src); |
| } |
| -void AssemblerX86::andl(GPRRegister dst, const Immediate &imm) { |
| +void AssemblerX86::And(Type Ty, GPRRegister dst, const Address &address) { |
| AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
| + if (Ty == IceType_i16) |
| + EmitOperandSizeOverride(); |
| + if (Ty == IceType_i8 || Ty == IceType_i1) |
| + EmitUint8(0x22); |
| + else |
| + EmitUint8(0x23); |
| + EmitOperand(dst, address); |
| +} |
| + |
| +void AssemblerX86::And(Type Ty, GPRRegister dst, const Immediate &imm) { |
| + AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
| + if (Ty == IceType_i8 || Ty == IceType_i1) { |
| + EmitComplexI8(4, Operand(dst), imm); |
| + return; |
| + } |
| + if (Ty == IceType_i16) |
| + EmitOperandSizeOverride(); |
| EmitComplex(4, Operand(dst), imm); |
| } |
| -void AssemblerX86::andl(GPRRegister dst, const Address &address) { |
| +void AssemblerX86::Or(Type Ty, GPRRegister dst, GPRRegister src) { |
| AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
| - EmitUint8(0x23); |
| - EmitOperand(dst, address); |
| + if (Ty == IceType_i16) |
| + EmitOperandSizeOverride(); |
| + if (Ty == IceType_i8 || Ty == IceType_i1) |
| + EmitUint8(0x0A); |
| + else |
| + EmitUint8(0x0B); |
| + EmitRegisterOperand(dst, src); |
| } |
| -void AssemblerX86::orl(GPRRegister dst, GPRRegister src) { |
| +void AssemblerX86::Or(Type Ty, GPRRegister dst, const Address &address) { |
| AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
| - EmitUint8(0x0B); |
| - EmitOperand(dst, Operand(src)); |
| + if (Ty == IceType_i16) |
| + EmitOperandSizeOverride(); |
| + if (Ty == IceType_i8 || Ty == IceType_i1) |
| + EmitUint8(0x0A); |
| + else |
| + EmitUint8(0x0B); |
| + EmitOperand(dst, address); |
| } |
| -void AssemblerX86::orl(GPRRegister dst, const Immediate &imm) { |
| +void AssemblerX86::Or(Type Ty, GPRRegister dst, const Immediate &imm) { |
| AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
| + if (Ty == IceType_i8 || Ty == IceType_i1) { |
| + EmitComplexI8(1, Operand(dst), imm); |
| + return; |
| + } |
| + if (Ty == IceType_i16) |
| + EmitOperandSizeOverride(); |
| EmitComplex(1, Operand(dst), imm); |
| } |
| -void AssemblerX86::orl(GPRRegister dst, const Address &address) { |
| +void AssemblerX86::Xor(Type Ty, GPRRegister dst, GPRRegister src) { |
| AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
| - EmitUint8(0x0B); |
| - EmitOperand(dst, address); |
| + if (Ty == IceType_i16) |
| + EmitOperandSizeOverride(); |
| + if (Ty == IceType_i8 || Ty == IceType_i1) |
| + EmitUint8(0x32); |
| + else |
| + EmitUint8(0x33); |
| + EmitRegisterOperand(dst, src); |
| } |
| -void AssemblerX86::xorl(GPRRegister dst, GPRRegister src) { |
| +void AssemblerX86::Xor(Type Ty, GPRRegister dst, const Address &address) { |
| AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
| - EmitUint8(0x33); |
| - EmitOperand(dst, Operand(src)); |
| + if (Ty == IceType_i16) |
| + EmitOperandSizeOverride(); |
| + if (Ty == IceType_i8 || Ty == IceType_i1) |
| + EmitUint8(0x32); |
| + else |
| + EmitUint8(0x33); |
| + EmitOperand(dst, address); |
| } |
| -void AssemblerX86::xorl(GPRRegister dst, const Immediate &imm) { |
| +void AssemblerX86::Xor(Type Ty, GPRRegister dst, const Immediate &imm) { |
| AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
| + if (Ty == IceType_i8 || Ty == IceType_i1) { |
| + EmitComplexI8(6, Operand(dst), imm); |
| + return; |
| + } |
| + if (Ty == IceType_i16) |
| + EmitOperandSizeOverride(); |
| EmitComplex(6, Operand(dst), imm); |
| } |
| -void AssemblerX86::xorl(GPRRegister dst, const Address &address) { |
| +void AssemblerX86::add(Type Ty, GPRRegister dst, GPRRegister src) { |
| AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
| - EmitUint8(0x33); |
| - EmitOperand(dst, address); |
| + if (Ty == IceType_i16) |
| + EmitOperandSizeOverride(); |
| + if (Ty == IceType_i8 || Ty == IceType_i1) |
| + EmitUint8(0x02); |
| + else |
| + EmitUint8(0x03); |
| + EmitRegisterOperand(dst, src); |
| } |
| -void AssemblerX86::addl(GPRRegister reg, const Immediate &imm) { |
| +void AssemblerX86::add(Type Ty, GPRRegister reg, const Address &address) { |
| AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
| - EmitComplex(0, Operand(reg), imm); |
| + if (Ty == IceType_i16) |
| + EmitOperandSizeOverride(); |
| + if (Ty == IceType_i8 || Ty == IceType_i1) |
| + EmitUint8(0x02); |
| + else |
| + EmitUint8(0x03); |
| + EmitOperand(reg, address); |
| } |
| -void AssemblerX86::addl(const Address &address, GPRRegister reg) { |
| +void AssemblerX86::add(Type Ty, GPRRegister reg, const Immediate &imm) { |
| AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
| - EmitUint8(0x01); |
| - EmitOperand(reg, address); |
| + if (Ty == IceType_i8 || Ty == IceType_i1) { |
| + EmitComplexI8(0, Operand(reg), imm); |
| + return; |
| + } |
| + if (Ty == IceType_i16) |
| + EmitOperandSizeOverride(); |
| + EmitComplex(0, Operand(reg), imm); |
| } |
| -void AssemblerX86::addl(const Address &address, const Immediate &imm) { |
| +void AssemblerX86::adc(Type Ty, GPRRegister dst, GPRRegister src) { |
| AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
| - EmitComplex(0, address, imm); |
| + if (Ty == IceType_i16) |
| + EmitOperandSizeOverride(); |
| + if (Ty == IceType_i8 || Ty == IceType_i1) |
| + EmitUint8(0x12); |
| + else |
| + EmitUint8(0x13); |
| + EmitRegisterOperand(dst, src); |
| } |
| -void AssemblerX86::adcl(GPRRegister reg, const Immediate &imm) { |
| +void AssemblerX86::adc(Type Ty, GPRRegister dst, const Address &address) { |
| AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
| - EmitComplex(2, Operand(reg), imm); |
| + if (Ty == IceType_i16) |
| + EmitOperandSizeOverride(); |
| + if (Ty == IceType_i8 || Ty == IceType_i1) |
| + EmitUint8(0x12); |
| + else |
| + EmitUint8(0x13); |
| + EmitOperand(dst, address); |
| } |
| -void AssemblerX86::adcl(GPRRegister dst, GPRRegister src) { |
| +void AssemblerX86::adc(Type Ty, GPRRegister reg, const Immediate &imm) { |
| AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
| - EmitUint8(0x13); |
| - EmitOperand(dst, Operand(src)); |
| + if (Ty == IceType_i8 || Ty == IceType_i1) { |
| + EmitComplexI8(2, Operand(reg), imm); |
| + return; |
| + } |
| + if (Ty == IceType_i16) |
| + EmitOperandSizeOverride(); |
| + EmitComplex(2, Operand(reg), imm); |
| } |
| -void AssemblerX86::adcl(GPRRegister dst, const Address &address) { |
| +void AssemblerX86::sub(Type Ty, GPRRegister dst, GPRRegister src) { |
| AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
| - EmitUint8(0x13); |
| - EmitOperand(dst, address); |
| + if (Ty == IceType_i16) |
| + EmitOperandSizeOverride(); |
| + if (Ty == IceType_i8 || Ty == IceType_i1) |
| + EmitUint8(0x2A); |
| + else |
| + EmitUint8(0x2B); |
| + EmitRegisterOperand(dst, src); |
| } |
| -void AssemblerX86::adcl(const Address &address, GPRRegister reg) { |
| +void AssemblerX86::sub(Type Ty, GPRRegister reg, const Address &address) { |
| AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
| - EmitUint8(0x11); |
| + if (Ty == IceType_i16) |
| + EmitOperandSizeOverride(); |
| + if (Ty == IceType_i8 || Ty == IceType_i1) |
| + EmitUint8(0x2A); |
| + else |
| + EmitUint8(0x2B); |
| EmitOperand(reg, address); |
| } |
| -void AssemblerX86::subl(GPRRegister dst, GPRRegister src) { |
| +void AssemblerX86::sub(Type Ty, GPRRegister reg, const Immediate &imm) { |
| AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
| - EmitUint8(0x2B); |
| - EmitOperand(dst, Operand(src)); |
| + if (Ty == IceType_i8 || Ty == IceType_i1) { |
| + EmitComplexI8(5, Operand(reg), imm); |
| + return; |
| + } |
| + if (Ty == IceType_i16) |
| + EmitOperandSizeOverride(); |
| + EmitComplex(5, Operand(reg), imm); |
| } |
| -void AssemblerX86::subl(GPRRegister reg, const Immediate &imm) { |
| +void AssemblerX86::sbb(Type Ty, GPRRegister dst, GPRRegister src) { |
| AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
| - EmitComplex(5, Operand(reg), imm); |
| + if (Ty == IceType_i16) |
| + EmitOperandSizeOverride(); |
| + if (Ty == IceType_i8 || Ty == IceType_i1) |
| + EmitUint8(0x1A); |
| + else |
| + EmitUint8(0x1B); |
| + EmitRegisterOperand(dst, src); |
| } |
| -void AssemblerX86::subl(GPRRegister reg, const Address &address) { |
| +void AssemblerX86::sbb(Type Ty, GPRRegister dst, const Address &address) { |
| AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
| - EmitUint8(0x2B); |
| - EmitOperand(reg, address); |
| + if (Ty == IceType_i16) |
| + EmitOperandSizeOverride(); |
| + if (Ty == IceType_i8 || Ty == IceType_i1) |
| + EmitUint8(0x1A); |
| + else |
| + EmitUint8(0x1B); |
| + EmitOperand(dst, address); |
| } |
| -void AssemblerX86::subl(const Address &address, GPRRegister reg) { |
| +void AssemblerX86::sbb(Type Ty, GPRRegister reg, const Immediate &imm) { |
| AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
| - EmitUint8(0x29); |
| - EmitOperand(reg, address); |
| + if (Ty == IceType_i8 || Ty == IceType_i1) { |
| + EmitComplexI8(3, Operand(reg), imm); |
| + return; |
| + } |
| + if (Ty == IceType_i16) |
| + EmitOperandSizeOverride(); |
| + EmitComplex(3, Operand(reg), imm); |
| } |
| void AssemblerX86::cbw() { |
| @@ -1337,10 +1443,48 @@ void AssemblerX86::cdq() { |
| EmitUint8(0x99); |
| } |
| -void AssemblerX86::idivl(GPRRegister reg) { |
| +void AssemblerX86::div(Type Ty, GPRRegister reg) { |
| AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
| - EmitUint8(0xF7); |
| - EmitUint8(0xF8 | reg); |
| + if (Ty == IceType_i16) |
| + EmitOperandSizeOverride(); |
| + if (Ty == IceType_i8 || Ty == IceType_i1) |
| + EmitUint8(0xF6); |
| + else |
| + EmitUint8(0xF7); |
| + EmitRegisterOperand(6, reg); |
| +} |
| + |
| +void AssemblerX86::div(Type Ty, const Address &addr) { |
| + AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
| + if (Ty == IceType_i16) |
| + EmitOperandSizeOverride(); |
| + if (Ty == IceType_i8 || Ty == IceType_i1) |
| + EmitUint8(0xF6); |
| + else |
| + EmitUint8(0xF7); |
| + EmitOperand(6, addr); |
| +} |
| + |
| +void AssemblerX86::idiv(Type Ty, GPRRegister reg) { |
| + AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
| + if (Ty == IceType_i16) |
| + EmitOperandSizeOverride(); |
| + if (Ty == IceType_i8 || Ty == IceType_i1) |
| + EmitUint8(0xF6); |
| + else |
| + EmitUint8(0xF7); |
| + EmitRegisterOperand(7, reg); |
| +} |
| + |
| +void AssemblerX86::idiv(Type Ty, const Address &addr) { |
| + AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
| + if (Ty == IceType_i16) |
| + EmitOperandSizeOverride(); |
| + if (Ty == IceType_i8 || Ty == IceType_i1) |
| + EmitUint8(0xF6); |
| + else |
| + EmitUint8(0xF7); |
| + EmitOperand(7, addr); |
| } |
| void AssemblerX86::imull(GPRRegister dst, GPRRegister src) { |
| @@ -1376,41 +1520,28 @@ void AssemblerX86::imull(const Address &address) { |
| EmitOperand(5, address); |
| } |
| -void AssemblerX86::mull(GPRRegister reg) { |
| +void AssemblerX86::mul(Type Ty, GPRRegister reg) { |
| AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
| - EmitUint8(0xF7); |
| - EmitOperand(4, Operand(reg)); |
| + if (Ty == IceType_i16) |
| + EmitOperandSizeOverride(); |
| + if (Ty == IceType_i8 || Ty == IceType_i1) |
| + EmitUint8(0xF6); |
| + else |
| + EmitUint8(0xF7); |
| + EmitRegisterOperand(4, reg); |
| } |
| -void AssemblerX86::mull(const Address &address) { |
| +void AssemblerX86::mul(Type Ty, const Address &address) { |
| AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
| - EmitUint8(0xF7); |
| + if (Ty == IceType_i16) |
| + EmitOperandSizeOverride(); |
| + if (Ty == IceType_i8 || Ty == IceType_i1) |
| + EmitUint8(0xF6); |
| + else |
| + EmitUint8(0xF7); |
| EmitOperand(4, address); |
| } |
| -void AssemblerX86::sbbl(GPRRegister dst, GPRRegister src) { |
| - AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
| - EmitUint8(0x1B); |
| - EmitOperand(dst, Operand(src)); |
| -} |
| - |
| -void AssemblerX86::sbbl(GPRRegister reg, const Immediate &imm) { |
| - AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
| - EmitComplex(3, Operand(reg), imm); |
| -} |
| - |
| -void AssemblerX86::sbbl(GPRRegister dst, const Address &address) { |
| - AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
| - EmitUint8(0x1B); |
| - EmitOperand(dst, address); |
| -} |
| - |
| -void AssemblerX86::sbbl(const Address &address, GPRRegister dst) { |
| - AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
| - EmitUint8(0x19); |
| - EmitOperand(dst, address); |
| -} |
| - |
| void AssemblerX86::incl(GPRRegister reg) { |
| AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
| EmitUint8(0x40 + reg); |
| @@ -1750,6 +1881,13 @@ void AssemblerX86::jmp(const ConstantRelocatable *label) { |
| EmitInt32(-4); |
| } |
| +void AssemblerX86::mfence() { |
| + AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
| + EmitUint8(0x0F); |
| + EmitUint8(0xAE); |
| + EmitUint8(0xF0); |
| +} |
| + |
| void AssemblerX86::lock() { |
| AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
| EmitUint8(0xF0); |