OrcVariable *var;
if (opcode->src_size[i] == 0) continue;
- if (i > 0 && (opcode->flags & ORC_STATIC_OPCODE_SCALAR)) continue;
-
var = compiler->vars + insn.src_args[i];
+
+ if (i > 0 && (opcode->flags & ORC_STATIC_OPCODE_SCALAR) &&
+ (!compiler->load_params || var->vartype != ORC_VAR_TYPE_PARAM))
+ continue;
+
if (var->vartype == ORC_VAR_TYPE_SRC ||
var->vartype == ORC_VAR_TYPE_DEST) {
OrcInstruction *cinsn;
{
int j;
int value = p->constants[i].value;
- int greg = p->gp_tmpreg;
- int label_skip, label_data;
switch (p->constants[i].type) {
case ORC_CONST_ZERO:
break;
}
+ powerpc_load_long_constant (p, reg,
+ p->constants[i].full_value[0],
+ p->constants[i].full_value[1],
+ p->constants[i].full_value[2],
+ p->constants[i].full_value[3]);
+}
+
+void
+powerpc_load_long_constant (OrcCompiler *p, int reg, orc_uint32 a,
+ orc_uint32 b, orc_uint32 c, orc_uint32 d)
+{
+ int label_skip, label_data;
+ int greg = p->gp_tmpreg;
+
label_skip = orc_compiler_label_new (p);
label_data = orc_compiler_label_new (p);
}
powerpc_emit_label (p, label_data);
- for(j=0;j<4;j++){
- ORC_ASM_CODE(p," .long 0x%08x\n", p->constants[i].full_value[j]);
- powerpc_emit (p, p->constants[i].full_value[j]);
- }
+ ORC_ASM_CODE(p," .long 0x%08x\n", a);
+ powerpc_emit (p, a);
+ ORC_ASM_CODE(p," .long 0x%08x\n", b);
+ powerpc_emit (p, b);
+ ORC_ASM_CODE(p," .long 0x%08x\n", c);
+ powerpc_emit (p, c);
+ ORC_ASM_CODE(p," .long 0x%08x\n", d);
+ powerpc_emit (p, d);
powerpc_emit_label (p, label_skip);
powerpc_emit_lwz (p,
int d, int a);
int powerpc_get_constant (OrcCompiler *p, int type, int value);
int powerpc_get_constant_full (OrcCompiler *p, int value0, int value1, int value2, int value3);
+void powerpc_load_long_constant (OrcCompiler *p, int reg, orc_uint32 a,
+ orc_uint32 b, orc_uint32 c, orc_uint32 d);
/* instructions */
#define powerpc_emit_vand(p,a,b,c) powerpc_emit_VX_2 (p, "vand", 0x10000404, a, b, c)
}
compiler->loop_shift = 0;
+ compiler->load_params = TRUE;
}
void
int insn_shift; /* used when emitting rules */
int max_var_size; /* size of largest var */
+ int load_params;
};
#define ORC_SRC_ARG(p,i,n) ((p)->vars[(i)->src_args[(n)]].alloc)
powerpc_emit_VX(compiler, 0x1000030c,
powerpc_regnum(dest->alloc), value & 0x1f, 0);
} else {
- ORC_COMPILER_ERROR(compiler,"can't load constant");
+ value &= 0xff;
+ value |= value << 8;
+ value |= value << 16;
+ powerpc_load_long_constant (compiler, dest->alloc, value, value,
+ value, value);
}
break;
case 2:
powerpc_emit_VX(compiler, 0x1000034c,
powerpc_regnum(dest->alloc), value & 0x1f, 0);
} else {
- ORC_COMPILER_ERROR(compiler,"can't load constant");
+ value &= 0xffff;
+ value |= value << 16;
+ powerpc_load_long_constant (compiler, dest->alloc, value, value,
+ value, value);
}
break;
case 4:
powerpc_emit_VX(compiler, 0x1000038c,
powerpc_regnum(dest->alloc), value & 0x1f, 0);
} else {
- ORC_COMPILER_ERROR(compiler,"can't load constant");
+ powerpc_load_long_constant (compiler, dest->alloc, value, value,
+ value, value);
}
break;
}
powerpc_emit_VX(p, 0x1000030c, \
powerpc_regnum(p->tmpreg), (int)p->vars[insn->src_args[1]].value.i, 0); \
powerpc_emit_VX_2 (p, opcode, code , dest, src1, p->tmpreg);\
- } else if (p->vars[insn->src_args[1]].vartype == ORC_VAR_TYPE_PARAM) { \
- ORC_COMPILER_ERROR(p,"rule only works with constants"); \
- powerpc_emit_VX_2 (p, opcode, code , dest, src1, src2);\
} else { \
- ORC_COMPILER_ERROR(p,"rule only works with constants or params"); \
+ powerpc_emit_VX_2 (p, opcode, code , dest, src1, src2);\
} \
}