cinsn = compiler->insns + compiler->n_insns;
compiler->n_insns++;
+ cinsn->flags = insn.flags;
cinsn->flags |= ORC_INSN_FLAG_ADDED;
+ cinsn->flags &= ~(ORC_INSTRUCTION_FLAG_X2|ORC_INSTRUCTION_FLAG_X4);
cinsn->opcode = get_load_opcode_for_size (var->size);
cinsn->dest_args[0] = orc_compiler_new_temporary (compiler, var->size);
cinsn->src_args[0] = insn.src_args[i];
cinsn = compiler->insns + compiler->n_insns;
compiler->n_insns++;
+ cinsn->flags = insn.flags;
cinsn->flags |= ORC_INSN_FLAG_ADDED;
- cinsn->opcode = get_loadp_opcode_for_size (var->size);
- cinsn->dest_args[0] = orc_compiler_new_temporary (compiler, var->size);
+ cinsn->opcode = get_loadp_opcode_for_size (opcode->src_size[i]);
+ cinsn->dest_args[0] = orc_compiler_new_temporary (compiler, opcode->src_size[i]);
cinsn->src_args[0] = insn.src_args[i];
insn.src_args[i] = cinsn->dest_args[0];
}
cinsn = compiler->insns + compiler->n_insns;
compiler->n_insns++;
+ cinsn->flags = xinsn->flags;
cinsn->flags |= ORC_INSN_FLAG_ADDED;
+ cinsn->flags &= ~(ORC_INSTRUCTION_FLAG_X2|ORC_INSTRUCTION_FLAG_X4);
cinsn->opcode = get_store_opcode_for_size (var->size);
cinsn->src_args[0] = orc_compiler_new_temporary (compiler, var->size);
cinsn->dest_args[0] = xinsn->dest_args[i];
OrcVariable *src = compiler->vars + insn->src_args[0];
OrcVariable *dest = compiler->vars + insn->dest_args[0];
int reg;
+ int size = ORC_PTR_TO_INT(user);
if (src->vartype == ORC_VAR_TYPE_PARAM) {
reg = dest->alloc;
orc_x86_emit_mov_memoffset_sse (compiler, 4,
(int)ORC_STRUCT_OFFSET(OrcExecutor, params[insn->src_args[0]]),
compiler->exec_reg, reg, FALSE);
- if (src->size == 1) {
+ if (size == 1) {
orc_sse_emit_punpcklbw (compiler, reg, reg);
}
#ifndef MMX
- if (src->size <= 2) {
+ if (size <= 2) {
orc_sse_emit_pshuflw (compiler, 0, reg, reg);
}
orc_sse_emit_pshufd (compiler, 0, reg, reg);
#else
- if (src->size <= 2) {
+ if (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) {
- sse_load_constant (compiler, dest->alloc, src->size, src->value);
+ sse_load_constant (compiler, dest->alloc, size, src->value);
} else {
ORC_ASSERT(0);
}
{
int src = p->vars[insn->src_args[0]].alloc;
int dest = p->vars[insn->dest_args[0]].alloc;
- int tmp;
+ int tmp = orc_compiler_get_temp_reg (p);
+ int tmpc;
if (src != dest) {
orc_sse_emit_movdqa (p, src, dest);
}
- tmp = orc_compiler_get_temp_constant (p, 2, 0x0080);
- orc_sse_emit_paddw (p, tmp, dest);
+ tmpc = orc_compiler_get_constant (p, 2, 0x0080);
+ orc_sse_emit_paddw (p, tmpc, dest);
orc_sse_emit_movdqa (p, dest, tmp);
orc_sse_emit_psrlw (p, 8, tmp);
orc_sse_emit_paddw (p, tmp, dest);
orc_rule_register (rule_set, "loadoffl", sse_rule_loadoffX, NULL);
orc_rule_register (rule_set, "loadupdb", sse_rule_loadupdb, NULL);
orc_rule_register (rule_set, "loadupib", sse_rule_loadupib, NULL);
- orc_rule_register (rule_set, "loadpb", sse_rule_loadpX, NULL);
- orc_rule_register (rule_set, "loadpw", sse_rule_loadpX, NULL);
- orc_rule_register (rule_set, "loadpl", sse_rule_loadpX, NULL);
- orc_rule_register (rule_set, "loadpq", sse_rule_loadpX, NULL);
+ orc_rule_register (rule_set, "loadpb", sse_rule_loadpX, (void *)1);
+ orc_rule_register (rule_set, "loadpw", sse_rule_loadpX, (void *)2);
+ orc_rule_register (rule_set, "loadpl", sse_rule_loadpX, (void *)4);
+ orc_rule_register (rule_set, "loadpq", sse_rule_loadpX, (void *)8);
orc_rule_register (rule_set, "storeb", sse_rule_storeX, NULL);
orc_rule_register (rule_set, "storew", sse_rule_storeX, NULL);