sse: Calculate insn_shift for each instruction
authorDavid Schleef <ds@schleef.org>
Thu, 14 Oct 2010 22:23:23 +0000 (15:23 -0700)
committerDavid Schleef <ds@schleef.org>
Thu, 14 Oct 2010 22:23:23 +0000 (15:23 -0700)
orc/orcprogram-mmx.c
orc/orcprogram-sse.c
orc/orcrules-mmx.c
orc/orcrules-sse.c

index e6dbd07..f67926f 100644 (file)
@@ -1006,6 +1006,14 @@ orc_mmx_emit_loop (OrcCompiler *compiler, int offset, int update)
 
     compiler->min_temp_reg = ORC_VEC_REG_BASE;
 
+    compiler->insn_shift = compiler->loop_shift;
+    if (insn->flags & ORC_INSTRUCTION_FLAG_X2) {
+      compiler->insn_shift += 1;
+    }
+    if (insn->flags & ORC_INSTRUCTION_FLAG_X4) {
+      compiler->insn_shift += 2;
+    }
+
     rule = insn->rule;
     if (rule && rule->emit) {
       if (!(insn->opcode->flags & (ORC_STATIC_OPCODE_ACCUMULATOR|ORC_STATIC_OPCODE_LOAD|ORC_STATIC_OPCODE_STORE)) &&
@@ -1070,6 +1078,14 @@ orc_mmx_emit_invariants (OrcCompiler *compiler)
 
     ORC_ASM_CODE(compiler,"# %d: %s\n", j, insn->opcode->name);
 
+    compiler->insn_shift = compiler->loop_shift;
+    if (insn->flags & ORC_INSTRUCTION_FLAG_X2) {
+      compiler->insn_shift += 1;
+    }
+    if (insn->flags & ORC_INSTRUCTION_FLAG_X4) {
+      compiler->insn_shift += 2;
+    }
+
     rule = insn->rule;
     if (rule && rule->emit) {
       rule->emit (compiler, rule->emit_user, insn);
index d22c846..21c980c 100644 (file)
@@ -1006,6 +1006,14 @@ orc_sse_emit_loop (OrcCompiler *compiler, int offset, int update)
 
     compiler->min_temp_reg = ORC_VEC_REG_BASE;
 
+    compiler->insn_shift = compiler->loop_shift;
+    if (insn->flags & ORC_INSTRUCTION_FLAG_X2) {
+      compiler->insn_shift += 1;
+    }
+    if (insn->flags & ORC_INSTRUCTION_FLAG_X4) {
+      compiler->insn_shift += 2;
+    }
+
     rule = insn->rule;
     if (rule && rule->emit) {
       if (!(insn->opcode->flags & (ORC_STATIC_OPCODE_ACCUMULATOR|ORC_STATIC_OPCODE_LOAD|ORC_STATIC_OPCODE_STORE)) &&
@@ -1070,6 +1078,14 @@ orc_sse_emit_invariants (OrcCompiler *compiler)
 
     ORC_ASM_CODE(compiler,"# %d: %s\n", j, insn->opcode->name);
 
+    compiler->insn_shift = compiler->loop_shift;
+    if (insn->flags & ORC_INSTRUCTION_FLAG_X2) {
+      compiler->insn_shift += 1;
+    }
+    if (insn->flags & ORC_INSTRUCTION_FLAG_X4) {
+      compiler->insn_shift += 2;
+    }
+
     rule = insn->rule;
     if (rule && rule->emit) {
       rule->emit (compiler, rule->emit_user, insn);
index e19f7ca..bb7b1c1 100644 (file)
@@ -1508,7 +1508,7 @@ mmx_rule_mulll_slow (OrcCompiler *p, void *user, OrcInstruction *insn)
   orc_x86_emit_mov_mmx_memoffset (p, 16, p->vars[insn->src_args[1]].alloc,
       offset + 16, p->exec_reg, FALSE, FALSE);
 
-  for(i=0;i<(1<<p->loop_shift);i++) {
+  for(i=0;i<(1<<p->insn_shift);i++) {
     orc_x86_emit_mov_memoffset_reg (p, 4, offset + 4*i, p->exec_reg,
         p->gp_tmpreg);
     orc_x86_emit_imul_memoffset_reg (p, 4, offset + 16+4*i, p->exec_reg,
@@ -1556,7 +1556,7 @@ mmx_rule_mulhsl_slow (OrcCompiler *p, void *user, OrcInstruction *insn)
   orc_x86_emit_mov_reg_memoffset (p, regsize, X86_EDX, offset + 40,
       p->exec_reg);
 
-  for(i=0;i<(1<<p->loop_shift);i++) {
+  for(i=0;i<(1<<p->insn_shift);i++) {
     orc_x86_emit_mov_memoffset_reg (p, 4, offset + 4*i, p->exec_reg, X86_EAX);
     ORC_ASM_CODE(p,"  imull %d(%%%s)\n", offset + 16 + 4*i,
         orc_x86_get_regname_ptr(p, p->exec_reg));
index fcd8f3d..2b35983 100644 (file)
@@ -1508,7 +1508,7 @@ sse_rule_mulll_slow (OrcCompiler *p, void *user, OrcInstruction *insn)
   orc_x86_emit_mov_sse_memoffset (p, 16, p->vars[insn->src_args[1]].alloc,
       offset + 16, p->exec_reg, FALSE, FALSE);
 
-  for(i=0;i<(1<<p->loop_shift);i++) {
+  for(i=0;i<(1<<p->insn_shift);i++) {
     orc_x86_emit_mov_memoffset_reg (p, 4, offset + 4*i, p->exec_reg,
         p->gp_tmpreg);
     orc_x86_emit_imul_memoffset_reg (p, 4, offset + 16+4*i, p->exec_reg,
@@ -1556,7 +1556,7 @@ sse_rule_mulhsl_slow (OrcCompiler *p, void *user, OrcInstruction *insn)
   orc_x86_emit_mov_reg_memoffset (p, regsize, X86_EDX, offset + 40,
       p->exec_reg);
 
-  for(i=0;i<(1<<p->loop_shift);i++) {
+  for(i=0;i<(1<<p->insn_shift);i++) {
     orc_x86_emit_mov_memoffset_reg (p, 4, offset + 4*i, p->exec_reg, X86_EAX);
     ORC_ASM_CODE(p,"  imull %d(%%%s)\n", offset + 16 + 4*i,
         orc_x86_get_regname_ptr(p, p->exec_reg));