summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavid Schleef <ds@schleef.org>2010-09-08 14:18:59 -0700
committerDavid Schleef <ds@schleef.org>2010-09-08 14:18:59 -0700
commit9c1cd641d681c02c98c187b15ca0d3d015ebf77e (patch)
treefb450dccff2e43232ff90bf8cdb48534a0d3ec8c
parentfd3f6925128c908718bc2e5ca612e1a6f93b0e04 (diff)
sse: Fix shrsq rule
-rw-r--r--orc/orcrules-sse.c19
1 files 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");