From c949c1d3038ba9bc771cb5704f8bc5b8e7c84791 Mon Sep 17 00:00:00 2001 From: gibbed Date: Sun, 14 Jun 2015 02:08:12 -0500 Subject: [PATCH] Support src1 and src2 being a constant in OPCODE_EXTRACT. --- src/xenia/cpu/backend/x64/x64_sequences.cc | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/src/xenia/cpu/backend/x64/x64_sequences.cc b/src/xenia/cpu/backend/x64/x64_sequences.cc index b4593f222..65fd55efa 100644 --- a/src/xenia/cpu/backend/x64/x64_sequences.cc +++ b/src/xenia/cpu/backend/x64/x64_sequences.cc @@ -5519,10 +5519,18 @@ 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) { - if (i.src2.constant() == 0) { - e.vmovd(i.dest, i.src1); + // TODO(gibbed): add support to constant propagation pass for OPCODE_EXTRACT. + Xmm src1; + if (i.src1.is_constant) { + src1 = e.xmm0; + e.LoadConstantXmm(src1, i.src1.constant()); } else { - e.vpextrd(i.dest, i.src1, VEC128_D(i.src2.constant())); + src1 = i.src1; + } + if (i.src2.constant() == 0) { + e.vmovd(i.dest, src1); + } else { + e.vpextrd(i.dest, src1, VEC128_D(i.src2.constant())); } } else { // TODO(benvanik): try out hlide's version: