summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSebastian Dröge <sebastian.droege@collabora.co.uk>2010-09-06 11:22:18 +0200
committerDavid Schleef <ds@schleef.org>2010-09-08 13:35:00 -0700
commit984700b69ce74af8a62390664b6c8826e5803375 (patch)
tree6432e5f076e2e1216039abab68485175db2a28b3
parent2bb83143de54e66d1b1f0bfa8a2aa91654a9b845 (diff)
Implement SSE versions of shlq/shruq
-rw-r--r--orc/orcrules-sse.c10
1 files changed, 6 insertions, 4 deletions
diff --git a/orc/orcrules-sse.c b/orc/orcrules-sse.c
index 2598fcc..fbb1d84 100644
--- a/orc/orcrules-sse.c
+++ b/orc/orcrules-sse.c
@@ -706,10 +706,10 @@ static void
sse_rule_shift (OrcCompiler *p, void *user, OrcInstruction *insn)
{
int type = ORC_PTR_TO_INT(user);
- int imm_code1[] = { 0x71, 0x71, 0x71, 0x72, 0x72, 0x72 };
- int imm_code2[] = { 6, 2, 4, 6, 2, 4 };
- int reg_code[] = { 0xf1, 0xd1, 0xe1, 0xf2, 0xd2, 0xe2 };
- const char *code[] = { "psllw", "psrlw", "psraw", "pslld", "psrld", "psrad" };
+ int imm_code1[] = { 0x71, 0x71, 0x71, 0x72, 0x72, 0x72, 0x73, 0x73 };
+ int imm_code2[] = { 6, 2, 4, 6, 2, 4, 6, 2 };
+ int reg_code[] = { 0xf1, 0xd1, 0xe1, 0xf2, 0xd2, 0xe2, 0xf3, 0xd3 };
+ const char *code[] = { "psllw", "psrlw", "psraw", "pslld", "psrld", "psrad", "psllq", "psrlq" };
if (p->vars[insn->src_args[1]].vartype == ORC_VAR_TYPE_CONST) {
orc_sse_emit_shiftimm (p, code[type], imm_code1[type], imm_code2[type],
@@ -2366,6 +2366,8 @@ orc_compiler_sse_register_rules (OrcTarget *target)
orc_rule_register (rule_set, "shll", sse_rule_shift, (void *)3);
orc_rule_register (rule_set, "shrul", sse_rule_shift, (void *)4);
orc_rule_register (rule_set, "shrsl", sse_rule_shift, (void *)5);
+ orc_rule_register (rule_set, "shlq", sse_rule_shift, (void *)6);
+ orc_rule_register (rule_set, "shruq", sse_rule_shift, (void *)7);
orc_rule_register (rule_set, "convsbw", sse_rule_convsbw, NULL);
orc_rule_register (rule_set, "convubw", sse_rule_convubw, NULL);