From e7c4ecbbf74e71f3cb0260347f38864f8a61f1f7 Mon Sep 17 00:00:00 2001 From: David Schleef Date: Mon, 9 Aug 2010 16:45:39 -0700 Subject: [PATCH] Fix splatw0q opcode to be useful for pixman --- orc/orcemulateopcodes.c | 2 +- orc/orcprogram-c.c | 5 ++++- orc/orcrules-sse.c | 4 ++-- 3 files changed, 7 insertions(+), 4 deletions(-) diff --git a/orc/orcemulateopcodes.c b/orc/orcemulateopcodes.c index f8cac0a..98b2e73 100644 --- a/orc/orcemulateopcodes.c +++ b/orc/orcemulateopcodes.c @@ -2606,7 +2606,7 @@ emulate_splatw0q (OrcOpcodeExecutor *ex, int offset, int n) /* 0: loadq */ var32 = ptr4[i]; /* 1: splatw0q */ - var33.i = ((orc_uint64)(var32.i&0xffff) << 48) | ((orc_uint64)(var32.i&0xffff)<<32) | ((var32.i&0xffff) << 16) | (var32.i&0xffff); + var33.i = ((((orc_uint64)var32.i)>>48) << 48) | ((((orc_uint64)var32.i)>>48)<<32) | ((((orc_uint64)var32.i)>>48) << 16) | ((((orc_uint64)var32.i)>>48)); /* 2: storeq */ ptr0[i] = var33; } diff --git a/orc/orcprogram-c.c b/orc/orcprogram-c.c index 6d91242..0b152ad 100644 --- a/orc/orcprogram-c.c +++ b/orc/orcprogram-c.c @@ -817,7 +817,10 @@ c_rule_splatw0q (OrcCompiler *p, void *user, OrcInstruction *insn) c_get_name_int (src, p, insn->src_args[0]); ORC_ASM_CODE(p, - " %s = ((orc_uint64)(%s&0xffff) << 48) | ((orc_uint64)(%s&0xffff)<<32) | ((%s&0xffff) << 16) | (%s&0xffff);\n", + " %s = ((((orc_uint64)%s)>>48) << 48) | " + "((((orc_uint64)%s)>>48)<<32) | " + "((((orc_uint64)%s)>>48) << 16) | " + "((((orc_uint64)%s)>>48));\n", dest, src, src, src, src); } diff --git a/orc/orcrules-sse.c b/orc/orcrules-sse.c index 42ec99a..c0afb22 100644 --- a/orc/orcrules-sse.c +++ b/orc/orcrules-sse.c @@ -945,8 +945,8 @@ sse_rule_splatw0q (OrcCompiler *p, void *user, OrcInstruction *insn) if (src != dest) { orc_sse_emit_movdqa (p, src, dest); } - orc_sse_emit_pshuflw (p, ORC_SSE_SHUF(0,0,0,0), dest, dest); - orc_sse_emit_pshufhw (p, ORC_SSE_SHUF(0,0,0,0), dest, dest); + orc_sse_emit_pshuflw (p, ORC_SSE_SHUF(3,3,3,3), dest, dest); + orc_sse_emit_pshufhw (p, ORC_SSE_SHUF(3,3,3,3), dest, dest); } static void -- 2.7.4