From e1c08bafdded36993800332b24be9cf881ac76fb Mon Sep 17 00:00:00 2001 From: bmeurer Date: Wed, 25 Feb 2015 03:28:39 -0800 Subject: [PATCH] [x64] Improve materialization of certain double constants (i.e. -0.0). R=dcarney@chromium.org Review URL: https://codereview.chromium.org/946423003 Cr-Commit-Position: refs/heads/master@{#26846} --- src/x64/macro-assembler-x64.cc | 41 ++++++++++++++++++++++++++++++----------- 1 file changed, 30 insertions(+), 11 deletions(-) diff --git a/src/x64/macro-assembler-x64.cc b/src/x64/macro-assembler-x64.cc index 295f891..86915e9 100644 --- a/src/x64/macro-assembler-x64.cc +++ b/src/x64/macro-assembler-x64.cc @@ -2578,24 +2578,43 @@ void MacroAssembler::Move(XMMRegister dst, uint32_t src) { if (src == 0) { xorps(dst, dst); } else { - movl(kScratchRegister, Immediate(src)); - movq(dst, kScratchRegister); + unsigned pop = base::bits::CountPopulation32(src); + DCHECK_NE(0u, pop); + if (pop == 32) { + pcmpeqd(dst, dst); + } else { + movl(kScratchRegister, Immediate(src)); + movq(dst, kScratchRegister); + } } } void MacroAssembler::Move(XMMRegister dst, uint64_t src) { - uint32_t lower = static_cast(src); - uint32_t upper = static_cast(src >> 32); - if (upper == 0) { - Move(dst, lower); + if (src == 0) { + xorps(dst, dst); } else { - if (lower == 0) { - Move(dst, upper); - psllq(dst, 32); + unsigned nlz = base::bits::CountLeadingZeros64(src); + unsigned ntz = base::bits::CountTrailingZeros64(src); + unsigned pop = base::bits::CountPopulation64(src); + DCHECK_NE(0u, pop); + if (pop == 64) { + pcmpeqd(dst, dst); + } else if (pop + ntz == 64) { + pcmpeqd(dst, dst); + psllq(dst, ntz); + } else if (pop + nlz == 64) { + pcmpeqd(dst, dst); + psrlq(dst, nlz); } else { - movq(kScratchRegister, src); - movq(dst, kScratchRegister); + uint32_t lower = static_cast(src); + uint32_t upper = static_cast(src >> 32); + if (upper == 0) { + Move(dst, lower); + } else { + movq(kScratchRegister, src); + movq(dst, kScratchRegister); + } } } } -- 2.7.4