From 02709e0d65c86d600831b3314089e5af1d9e9942 Mon Sep 17 00:00:00 2001 From: Ben Vanik Date: Tue, 10 Jun 2014 21:38:17 -0700 Subject: [PATCH] Optimize EXTRACT_I32(0). --- src/alloy/backend/x64/x64_sequences.cc | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/src/alloy/backend/x64/x64_sequences.cc b/src/alloy/backend/x64/x64_sequences.cc index dace0ac17..7f90b09e2 100644 --- a/src/alloy/backend/x64/x64_sequences.cc +++ b/src/alloy/backend/x64/x64_sequences.cc @@ -47,8 +47,8 @@ static std::unordered_multimap sequence_table; // Selects the right byte/word/etc from a vector. We need to flip logical // indices (0,1,2,3,4,5,6,7,...) = (3,2,1,0,7,6,5,4,...) -#define VEC128_B(n) ((n) & 0xC) | ((~(n)) & 0x3) -#define VEC128_W(n) ((n) & 0x6) | ((~(n)) & 0x1) +#define VEC128_B(n) ((n) ^ 0x3) +#define VEC128_W(n) ((n) ^ 0x1) #define VEC128_D(n) (n) #define VEC128_F(n) (n) @@ -4413,7 +4413,11 @@ EMITTER(EXTRACT_I32, MATCH(I, V128<>, I8<>>)) { vec128b(15, 14, 13, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), }; if (i.src2.is_constant) { - e.vpextrd(i.dest, i.src1, VEC128_D(i.src2.constant())); + if (i.src2.constant() == 0) { + e.vmovd(i.dest, i.src1); + } else { + e.vpextrd(i.dest, i.src1, VEC128_D(i.src2.constant())); + } } else { // TODO(benvanik): try out hlide's version: // e.mov(e.eax, 3);