diff options
| author | 2018-01-26 16:33:41 +0000 | |
|---|---|---|
| committer | 2018-01-26 16:33:41 +0000 | |
| commit | ded559460a2c1059e7f6232bb6c0ff954c9d0cf5 (patch) | |
| tree | c8f7baa791b377b62cba53a1a6c57b13b4605e29 /compiler/utils/x86/assembler_x86.cc | |
| parent | 3d2680b40f2ce2b726c2442d6163100aa1237651 (diff) | |
Add addw support to x86 and x64.
Test: assembler_x86_64_test assembler_x86_test
Change-Id: I2cfb815f15fa3df393bbeb4043ec208b3bdd9081
Diffstat (limited to 'compiler/utils/x86/assembler_x86.cc')
| -rw-r--r-- | compiler/utils/x86/assembler_x86.cc | 24 |
1 files changed, 19 insertions, 5 deletions
diff --git a/compiler/utils/x86/assembler_x86.cc b/compiler/utils/x86/assembler_x86.cc index 9fcede5e97..8640e2db0e 100644 --- a/compiler/utils/x86/assembler_x86.cc +++ b/compiler/utils/x86/assembler_x86.cc @@ -2100,6 +2100,14 @@ void X86Assembler::addl(const Address& address, const Immediate& imm) { } +void X86Assembler::addw(const Address& address, const Immediate& imm) { + AssemblerBuffer::EnsureCapacity ensured(&buffer_); + CHECK(imm.is_uint16() || imm.is_int16()) << imm.value(); + EmitUint8(0x66); + EmitComplex(0, address, imm, /* is_16_op */ true); +} + + void X86Assembler::adcl(Register reg, const Immediate& imm) { AssemblerBuffer::EnsureCapacity ensured(&buffer_); EmitComplex(2, Operand(reg), imm); @@ -2751,14 +2759,20 @@ void X86Assembler::EmitOperand(int reg_or_opcode, const Operand& operand) { } -void X86Assembler::EmitImmediate(const Immediate& imm) { - EmitInt32(imm.value()); +void X86Assembler::EmitImmediate(const Immediate& imm, bool is_16_op) { + if (is_16_op) { + EmitUint8(imm.value() & 0xFF); + EmitUint8(imm.value() >> 8); + } else { + EmitInt32(imm.value()); + } } void X86Assembler::EmitComplex(int reg_or_opcode, const Operand& operand, - const Immediate& immediate) { + const Immediate& immediate, + bool is_16_op) { CHECK_GE(reg_or_opcode, 0); CHECK_LT(reg_or_opcode, 8); if (immediate.is_int8()) { @@ -2769,11 +2783,11 @@ void X86Assembler::EmitComplex(int reg_or_opcode, } else if (operand.IsRegister(EAX)) { // Use short form if the destination is eax. EmitUint8(0x05 + (reg_or_opcode << 3)); - EmitImmediate(immediate); + EmitImmediate(immediate, is_16_op); } else { EmitUint8(0x81); EmitOperand(reg_or_opcode, operand); - EmitImmediate(immediate); + EmitImmediate(immediate, is_16_op); } } |