diff options
author | Mark Mendell <mark.p.mendell@intel.com> | 2015-03-13 13:47:53 -0400 |
---|---|---|
committer | Mark Mendell <mark.p.mendell@intel.com> | 2015-03-13 14:01:43 -0400 |
commit | 3f6c7f61855172d3d9b7a9221baba76136088e7c (patch) | |
tree | b61ab89a880ae74f44956425f5c9794d73ef029d /compiler/utils/x86_64 | |
parent | cc22e3946baf035c8732e9417ab132bfe663aa45 (diff) | |
download | art-3f6c7f61855172d3d9b7a9221baba76136088e7c.zip art-3f6c7f61855172d3d9b7a9221baba76136088e7c.tar.gz art-3f6c7f61855172d3d9b7a9221baba76136088e7c.tar.bz2 |
[optimizing] Improve x86, x86_64 code
Tweak the generated code to allow more use of constants and other small
changes
- Use test vs. compare to 0
- EmitMove of 0.0 should use xorps
- VisitCompare kPrimLong can use constants
- cmp/add/sub/mul on x86_64 can use constants if in int32_t range
- long bit operations on x86 examine long constant high/low to optimize
- Use 3 operand imulq if constant is in int32_t range
Change-Id: I2dd4010fdffa129fe00905b0020590fe95f3f926
Signed-off-by: Mark Mendell <mark.p.mendell@intel.com>
Diffstat (limited to 'compiler/utils/x86_64')
-rw-r--r-- | compiler/utils/x86_64/assembler_x86_64.cc | 19 | ||||
-rw-r--r-- | compiler/utils/x86_64/assembler_x86_64.h | 2 |
2 files changed, 17 insertions, 4 deletions
diff --git a/compiler/utils/x86_64/assembler_x86_64.cc b/compiler/utils/x86_64/assembler_x86_64.cc index f2704b7..bd155ed 100644 --- a/compiler/utils/x86_64/assembler_x86_64.cc +++ b/compiler/utils/x86_64/assembler_x86_64.cc @@ -1277,6 +1277,14 @@ void X86_64Assembler::orl(CpuRegister dst, const Immediate& imm) { } +void X86_64Assembler::orq(CpuRegister dst, const Immediate& imm) { + AssemblerBuffer::EnsureCapacity ensured(&buffer_); + CHECK(imm.is_int32()); // orq only supports 32b immediate. + EmitRex64(dst); + EmitComplex(1, Operand(dst), imm); +} + + void X86_64Assembler::orq(CpuRegister dst, CpuRegister src) { AssemblerBuffer::EnsureCapacity ensured(&buffer_); EmitRex64(dst, src); @@ -1548,27 +1556,30 @@ void X86_64Assembler::imulq(CpuRegister dst, CpuRegister src) { void X86_64Assembler::imulq(CpuRegister reg, const Immediate& imm) { + imulq(reg, reg, imm); +} + +void X86_64Assembler::imulq(CpuRegister dst, CpuRegister reg, const Immediate& imm) { AssemblerBuffer::EnsureCapacity ensured(&buffer_); CHECK(imm.is_int32()); // imulq only supports 32b immediate. - EmitRex64(reg, reg); + EmitRex64(dst, reg); // See whether imm can be represented as a sign-extended 8bit value. int64_t v64 = imm.value(); if (IsInt<8>(v64)) { // Sign-extension works. EmitUint8(0x6B); - EmitOperand(reg.LowBits(), Operand(reg)); + EmitOperand(dst.LowBits(), Operand(reg)); EmitUint8(static_cast<uint8_t>(v64 & 0xFF)); } else { // Not representable, use full immediate. EmitUint8(0x69); - EmitOperand(reg.LowBits(), Operand(reg)); + EmitOperand(dst.LowBits(), Operand(reg)); EmitImmediate(imm); } } - void X86_64Assembler::imulq(CpuRegister reg, const Address& address) { AssemblerBuffer::EnsureCapacity ensured(&buffer_); EmitRex64(reg, address); diff --git a/compiler/utils/x86_64/assembler_x86_64.h b/compiler/utils/x86_64/assembler_x86_64.h index 5dfcf45..495f74f 100644 --- a/compiler/utils/x86_64/assembler_x86_64.h +++ b/compiler/utils/x86_64/assembler_x86_64.h @@ -429,6 +429,7 @@ class X86_64Assembler FINAL : public Assembler { void orl(CpuRegister dst, CpuRegister src); void orl(CpuRegister reg, const Address& address); void orq(CpuRegister dst, CpuRegister src); + void orq(CpuRegister dst, const Immediate& imm); void xorl(CpuRegister dst, CpuRegister src); void xorl(CpuRegister dst, const Immediate& imm); @@ -467,6 +468,7 @@ class X86_64Assembler FINAL : public Assembler { void imulq(CpuRegister dst, CpuRegister src); void imulq(CpuRegister reg, const Immediate& imm); void imulq(CpuRegister reg, const Address& address); + void imulq(CpuRegister dst, CpuRegister reg, const Immediate& imm); void imull(CpuRegister reg); void imull(const Address& address); |