}
compiler->valid_regs[compiler->exec_reg] = 0;
-#ifndef MMX
- compiler->loop_shift = 5 - orc_program_get_max_var_size (compiler->program);
-#else
- compiler->loop_shift = 4 - orc_program_get_max_var_size (compiler->program);
+ switch (orc_program_get_max_var_size (compiler->program)) {
+ case 1:
+ compiler->loop_shift = 4;
+ break;
+ case 2:
+ compiler->loop_shift = 3;
+ break;
+ case 4:
+ compiler->loop_shift = 2;
+ break;
+ case 8:
+ compiler->loop_shift = 1;
+ break;
+ default:
+ ORC_ERROR("unhandled max var size %d",
+ orc_program_get_max_var_size (compiler->program));
+ break;
+ }
+#ifdef MMX
+ compiler->loop_shift--;
#endif
compiler->unroll_shift = 1;
#ifndef MMX
orc_mmx_emit_pshufd (compiler, ORC_MMX_SHUF(1,1,1,1), src, compiler->tmpreg);
- if (compiler->vars[i].size == 2) { /* moo */
+ if (compiler->vars[i].size == 2) {
orc_mmx_emit_660f (compiler, "paddw", 0xfd, compiler->tmpreg, src);
} else {
orc_mmx_emit_660f (compiler, "paddd", 0xfe, compiler->tmpreg, src);
orc_x86_emit_mov_imm_reg (compiler, 4, value, compiler->gp_tmpreg);
orc_x86_emit_mov_reg_mmx (compiler, compiler->gp_tmpreg, reg);
#ifndef MMX
- orc_mmx_emit_pshufd (compiler, 0, reg, reg);
+ orc_mmx_emit_pshufd (compiler, ORC_MMX_SHUF(0,0,0,0), reg, reg);
#else
- orc_mmx_emit_pshufw (compiler, 0, reg, reg);
+ orc_mmx_emit_pshufw (compiler, ORC_MMX_SHUF(1,0,1,0), reg, reg);
#endif
}
if (set_mxcsr) {
orc_mmx_restore_mxcsr (compiler);
}
+#else
+ orc_x86_emit_emms (compiler);
#endif
orc_x86_emit_epilogue (compiler);
}
compiler->valid_regs[compiler->exec_reg] = 0;
-#ifndef MMX
- compiler->loop_shift = 5 - orc_program_get_max_var_size (compiler->program);
-#else
- compiler->loop_shift = 4 - orc_program_get_max_var_size (compiler->program);
+ switch (orc_program_get_max_var_size (compiler->program)) {
+ case 1:
+ compiler->loop_shift = 4;
+ break;
+ case 2:
+ compiler->loop_shift = 3;
+ break;
+ case 4:
+ compiler->loop_shift = 2;
+ break;
+ case 8:
+ compiler->loop_shift = 1;
+ break;
+ default:
+ ORC_ERROR("unhandled max var size %d",
+ orc_program_get_max_var_size (compiler->program));
+ break;
+ }
+#ifdef MMX
+ compiler->loop_shift--;
#endif
compiler->unroll_shift = 1;
orc_x86_emit_mov_imm_reg (compiler, 4, value, compiler->gp_tmpreg);
orc_x86_emit_mov_reg_sse (compiler, compiler->gp_tmpreg, reg);
#ifndef MMX
- orc_sse_emit_pshufd (compiler, 0, reg, reg);
+ orc_sse_emit_pshufd (compiler, ORC_SSE_SHUF(0,0,0,0), reg, reg);
#else
- orc_mmx_emit_pshufw (compiler, 0, reg, reg);
+ orc_mmx_emit_pshufw (compiler, ORC_MMX_SHUF(1,0,1,0), reg, reg);
#endif
}
if (set_mxcsr) {
orc_sse_restore_mxcsr (compiler);
}
+#else
+ orc_x86_emit_emms (compiler);
#endif
orc_x86_emit_epilogue (compiler);
if (src->size == 1) {
orc_mmx_emit_punpcklbw (compiler, reg, reg);
}
+#ifndef MMX
if (src->size <= 2) {
-#ifdef MMX
- orc_mmx_emit_pshufw (compiler, 0, reg, reg);
-#else
orc_mmx_emit_pshuflw (compiler, 0, reg, reg);
-#endif
}
-#ifndef MMX
orc_mmx_emit_pshufd (compiler, 0, reg, reg);
+#else
+ if (src->size <= 2) {
+ orc_mmx_emit_pshufw (compiler, ORC_MMX_SHUF(0,0,0,0), reg, reg);
+ } else {
+ orc_mmx_emit_pshufw (compiler, ORC_MMX_SHUF(1,0,1,0), reg, reg);
+ }
#endif
} else if (src->vartype == ORC_VAR_TYPE_CONST) {
int value = src->value;
orc_x86_emit_mov_reg_mmx (compiler, compiler->gp_tmpreg, reg);
#ifndef MMX
orc_mmx_emit_pshufd (compiler, 0, reg, reg);
+#else
+ orc_mmx_emit_pshufw (compiler, ORC_MMX_SHUF(1,0,1,0), reg, reg);
#endif
}
}
orc_rule_register (rule_set, #x , mmx_rule_ ## x, NULL)
/* SSE 2 */
+#ifndef MMX
rule_set = orc_rule_set_new (orc_opcode_set_get("sys"), target,
ORC_TARGET_MMX_MMXEXT);
+#else
+ rule_set = orc_rule_set_new (orc_opcode_set_get("sys"), target,
+ ORC_TARGET_MMX_MMX);
+#endif
orc_rule_register (rule_set, "loadb", mmx_rule_loadX, NULL);
orc_rule_register (rule_set, "loadw", mmx_rule_loadX, NULL);
if (src->size == 1) {
orc_sse_emit_punpcklbw (compiler, reg, reg);
}
+#ifndef MMX
if (src->size <= 2) {
-#ifdef MMX
- orc_mmx_emit_pshufw (compiler, 0, reg, reg);
-#else
orc_sse_emit_pshuflw (compiler, 0, reg, reg);
-#endif
}
-#ifndef MMX
orc_sse_emit_pshufd (compiler, 0, reg, reg);
+#else
+ if (src->size <= 2) {
+ orc_mmx_emit_pshufw (compiler, ORC_MMX_SHUF(0,0,0,0), reg, reg);
+ } else {
+ orc_mmx_emit_pshufw (compiler, ORC_MMX_SHUF(1,0,1,0), reg, reg);
+ }
#endif
} else if (src->vartype == ORC_VAR_TYPE_CONST) {
int value = src->value;
orc_x86_emit_mov_reg_sse (compiler, compiler->gp_tmpreg, reg);
#ifndef MMX
orc_sse_emit_pshufd (compiler, 0, reg, reg);
+#else
+ orc_mmx_emit_pshufw (compiler, ORC_MMX_SHUF(1,0,1,0), reg, reg);
#endif
}
}
orc_rule_register (rule_set, #x , sse_rule_ ## x, NULL)
/* SSE 2 */
+#ifndef MMX
rule_set = orc_rule_set_new (orc_opcode_set_get("sys"), target,
ORC_TARGET_SSE_SSE2);
+#else
+ rule_set = orc_rule_set_new (orc_opcode_set_get("sys"), target,
+ ORC_TARGET_MMX_MMX);
+#endif
orc_rule_register (rule_set, "loadb", sse_rule_loadX, NULL);
orc_rule_register (rule_set, "loadw", sse_rule_loadX, NULL);