From 9c1cd641d681c02c98c187b15ca0d3d015ebf77e Mon Sep 17 00:00:00 2001 From: David Schleef Date: Wed, 8 Sep 2010 14:18:59 -0700 Subject: [PATCH] sse: Fix shrsq rule --- orc/orcrules-sse.c | 19 +++++++------------ 1 file changed, 7 insertions(+), 12 deletions(-) diff --git a/orc/orcrules-sse.c b/orc/orcrules-sse.c index 841fa28..b8473ca 100644 --- a/orc/orcrules-sse.c +++ b/orc/orcrules-sse.c @@ -795,22 +795,17 @@ sse_rule_shrsq (OrcCompiler *p, void *user, OrcInstruction *insn) int src = p->vars[insn->src_args[0]].alloc; int dest = p->vars[insn->dest_args[0]].alloc; int tmp = orc_compiler_get_temp_reg (p); - int tmp2 = orc_compiler_get_temp_reg (p); if (p->vars[insn->src_args[1]].vartype == ORC_VAR_TYPE_CONST) { - orc_sse_emit_pcmpeqd (p, tmp, tmp); - orc_sse_emit_psllq (p, 63, tmp); - orc_sse_emit_pand (p, src, tmp); - orc_sse_emit_pxor (p, tmp2, tmp2); - orc_sse_emit_pcmpgtd (p, tmp, tmp2); - orc_sse_emit_punpckhdq (p, tmp2, tmp2); - /* tmp2 = 0xff..ff if negative, 0 otherwise */ +#ifndef MMX + orc_sse_emit_pshufd (p, ORC_SSE_SHUF(3,3,1,1), src, tmp); +#else + orc_mmx_emit_pshufw (p, ORC_MMX_SHUF(3,2,3,2), src, tmp); +#endif + orc_sse_emit_psrad (p, 31, tmp); + orc_sse_emit_psllq (p, 64-p->vars[insn->src_args[1]].value.i, tmp); orc_sse_emit_psrlq (p, p->vars[insn->src_args[1]].value.i, dest); - - orc_sse_emit_pcmpeqd (p, tmp, tmp); - orc_sse_emit_psllq (p, 64 - p->vars[insn->src_args[1]].value.i, tmp); - orc_sse_emit_pand (p, tmp2, tmp); orc_sse_emit_por (p, tmp, dest); } else { ORC_COMPILER_ERROR(p,"rule only works with constants"); -- 2.34.1