compiler->alloc_regs[compiler->vars[j].alloc] = 1;
}
}
+ for(j=0;j<compiler->n_constants;j++){
+ if (compiler->constants[j].alloc_reg) {
+ compiler->alloc_regs[compiler->constants[j].alloc_reg] = 1;
+ }
+ }
ORC_DEBUG("at insn %d", compiler->insn_index);
for(j=0;j<8;j++){
compiler->target->load_constant (compiler, reg, size, value);
}
+int
+orc_compiler_get_temp_constant (OrcCompiler *compiler, int size, int value)
+{
+ int tmp;
+
+ tmp = orc_compiler_get_temp_reg (compiler);
+ orc_compiler_load_constant (compiler, tmp, size, value);
+ return tmp;
+}
+
int
orc_compiler_get_constant (OrcCompiler *compiler, int size, int value)
{
return tmp;
}
+int
+orc_compiler_get_constant_reg (OrcCompiler *compiler)
+{
+ int j;
+
+ for(j=0;j<ORC_N_REGS;j++){
+ compiler->alloc_regs[j] = 0;
+ }
+ for(j=0;j<ORC_N_COMPILER_VARIABLES;j++){
+ if (!compiler->vars[j].alloc) continue;
+
+ ORC_DEBUG("var %d: %d %d %d", j, compiler->vars[j].alloc,
+ compiler->vars[j].first_use,
+ compiler->vars[j].last_use);
+
+ if (compiler->vars[j].first_use == -1) {
+ compiler->alloc_regs[compiler->vars[j].alloc] = 1;
+ } else if (compiler->vars[j].last_use != -1) {
+ compiler->alloc_regs[compiler->vars[j].alloc] = 1;
+ }
+ }
+ for(j=0;j<compiler->n_constants;j++){
+ if (compiler->constants[j].alloc_reg) {
+ compiler->alloc_regs[compiler->constants[j].alloc_reg] = 1;
+ }
+ }
+
+ for(j=0;j<8;j++){
+ ORC_DEBUG("xmm%d: %d %d", j, compiler->valid_regs[ORC_VEC_REG_BASE + j],
+ compiler->alloc_regs[ORC_VEC_REG_BASE + j]);
+ }
+
+ for(j=compiler->min_temp_reg;j<ORC_VEC_REG_BASE+16;j++){
+ if (compiler->valid_regs[j] && !compiler->alloc_regs[j]) {
+ return j;
+ }
+ }
+
+ return 0;
+}
+
value |= (value << 16);
}
+ ORC_ASM_CODE(compiler, "# loading constant %d 0x%08x\n", value, value);
if (value == 0) {
orc_sse_emit_pxor(compiler, reg, reg);
return;
}
if (value == 0xffffffff) {
orc_sse_emit_pcmpeqb (compiler, reg, reg);
+ return;
}
if (compiler->target_flags & ORC_TARGET_SSE_SSSE3) {
if (value == 0x01010101) {
orc_sse_emit_pcmpeqb (compiler, reg, reg);
orc_sse_emit_pabsb (compiler, reg, reg);
+ return;
}
}
case ORC_VAR_TYPE_DEST:
break;
case ORC_VAR_TYPE_ACCUMULATOR:
- orc_sse_emit_660f (compiler, "pxor", 0xef,
+ orc_sse_emit_pxor (compiler,
compiler->vars[i].alloc, compiler->vars[i].alloc);
break;
case ORC_VAR_TYPE_TEMP:
orc_sse_emit_invariants (compiler);
+ /* FIXME move to a better place */
+ for(i=0;i<compiler->n_constants;i++){
+ compiler->constants[i].alloc_reg =
+ orc_compiler_get_constant_reg (compiler);
+ }
+
+ for(i=0;i<compiler->n_constants;i++){
+ if (compiler->constants[i].alloc_reg) {
+ sse_load_constant (compiler, compiler->constants[i].alloc_reg,
+ 4, compiler->constants[i].value);
+ }
+ }
}
void
compiler->vars[align_var].is_aligned = FALSE;
+ {
+ orc_sse_emit_loop (compiler, 0, 0);
+
+ compiler->codeptr = compiler->program->code;
+ free (compiler->asm_code);
+ compiler->asm_code = NULL;
+ compiler->asm_code_len = 0;
+ }
+
orc_x86_emit_prologue (compiler);
#ifndef MMX
#endif
} else if (src->vartype == ORC_VAR_TYPE_CONST) {
sse_load_constant (compiler, dest->alloc, src->size, src->value);
+ } else {
+ ORC_ASSERT(0);
}
}
int type = ORC_PTR_TO_INT(user);
int tmpc;
- tmpc = orc_compiler_get_constant (p, 1<<type, 1);
+ tmpc = orc_compiler_get_temp_constant (p, 1<<type, 1);
if (src == dest) {
orc_sse_emit_660f (p, names[type], codes[type], src, tmpc);
orc_sse_emit_movdqa (p, tmpc, dest);
if (src != dest) {
orc_sse_emit_movdqa (p, src, dest);
}
- tmp = orc_compiler_get_constant (p, 2, 0x0080);
+ tmp = orc_compiler_get_temp_constant (p, 2, 0x0080);
orc_sse_emit_paddw (p, tmp, dest);
orc_sse_emit_movdqa (p, dest, tmp);
orc_sse_emit_psrlw (p, 8, tmp);
{
int src = p->vars[insn->src_args[1]].alloc;
int dest = p->vars[insn->dest_args[0]].alloc;
- int tmp;
+ int tmp = orc_compiler_get_temp_reg (p);
+ int tmpc;
- tmp = orc_compiler_get_constant (p, 4, 0x80000000);
- orc_sse_emit_pxor(p, tmp, src);
- orc_sse_emit_pxor(p, tmp, dest);
+ tmpc = orc_compiler_get_constant (p, 4, 0x80000000);
+ orc_sse_emit_pxor(p, tmpc, src);
+ orc_sse_emit_pxor(p, tmpc, dest);
orc_sse_emit_movdqa (p, dest, tmp);
orc_sse_emit_pcmpgtd (p, src, tmp);
orc_sse_emit_pandn (p, src, tmp);
orc_sse_emit_por (p, tmp, dest);
- tmp = orc_compiler_get_constant (p, 4, 0x80000000);
- orc_sse_emit_pxor(p, tmp, src);
- orc_sse_emit_pxor(p, tmp, dest);
+ orc_sse_emit_pxor(p, tmpc, src);
+ orc_sse_emit_pxor(p, tmpc, dest);
}
static void
{
int src = p->vars[insn->src_args[1]].alloc;
int dest = p->vars[insn->dest_args[0]].alloc;
- int tmp;
+ int tmp = orc_compiler_get_temp_reg (p);
+ int tmpc;
- tmp = orc_compiler_get_constant (p, 4, 0x80000000);
- orc_sse_emit_pxor(p, tmp, src);
- orc_sse_emit_pxor(p, tmp, dest);
+ tmpc = orc_compiler_get_constant (p, 4, 0x80000000);
+ orc_sse_emit_pxor(p, tmpc, src);
+ orc_sse_emit_pxor(p, tmpc, dest);
orc_sse_emit_movdqa (p, src, tmp);
orc_sse_emit_pcmpgtd (p, dest, tmp);
orc_sse_emit_pandn (p, src, tmp);
orc_sse_emit_por (p, tmp, dest);
- tmp = orc_compiler_get_constant (p, 4, 0x80000000);
- orc_sse_emit_pxor(p, tmp, src);
- orc_sse_emit_pxor(p, tmp, dest);
+ orc_sse_emit_pxor(p, tmpc, src);
+ orc_sse_emit_pxor(p, tmpc, dest);
}
static void
int tmp2 = orc_compiler_get_temp_reg (p);
int tmp3 = orc_compiler_get_temp_reg (p);
- tmp = orc_compiler_get_constant (p, 4, 0xffffffff);
+ tmp = orc_compiler_get_temp_constant (p, 4, 0xffffffff);
orc_sse_emit_pxor (p, src, tmp);
orc_sse_emit_movdqa (p, tmp, tmp2);
orc_sse_emit_por (p, dest, tmp);