- Allow for a larger rhs on phi variables
git-svn-id: svn://svn.coreboot.org/coreboot/trunk@932 2b7e53f0-3cfb-0310-b3e9-8179ed1497e1
This commit is contained in:
parent
530b5193e4
commit
678d816f26
|
@ -648,9 +648,9 @@ struct triple_set {
|
||||||
};
|
};
|
||||||
|
|
||||||
#define MAX_LHS 15
|
#define MAX_LHS 15
|
||||||
#define MAX_RHS 15
|
#define MAX_RHS 250
|
||||||
#define MAX_MISC 15
|
#define MAX_MISC 3
|
||||||
#define MAX_TARG 15
|
#define MAX_TARG 3
|
||||||
|
|
||||||
struct occurance {
|
struct occurance {
|
||||||
int count;
|
int count;
|
||||||
|
@ -668,19 +668,19 @@ struct triple {
|
||||||
unsigned char template_id;
|
unsigned char template_id;
|
||||||
unsigned short sizes;
|
unsigned short sizes;
|
||||||
#define TRIPLE_LHS(SIZES) (((SIZES) >> 0) & 0x0f)
|
#define TRIPLE_LHS(SIZES) (((SIZES) >> 0) & 0x0f)
|
||||||
#define TRIPLE_RHS(SIZES) (((SIZES) >> 4) & 0x0f)
|
#define TRIPLE_RHS(SIZES) (((SIZES) >> 4) & 0xff)
|
||||||
#define TRIPLE_MISC(SIZES) (((SIZES) >> 8) & 0x0f)
|
#define TRIPLE_MISC(SIZES) (((SIZES) >> 12) & 0x03)
|
||||||
#define TRIPLE_TARG(SIZES) (((SIZES) >> 12) & 0x0f)
|
#define TRIPLE_TARG(SIZES) (((SIZES) >> 14) & 0x03)
|
||||||
#define TRIPLE_SIZE(SIZES) \
|
#define TRIPLE_SIZE(SIZES) \
|
||||||
((((SIZES) >> 0) & 0x0f) + \
|
(TRIPLE_LHS(SIZES) + \
|
||||||
(((SIZES) >> 4) & 0x0f) + \
|
TRIPLE_RHS(SIZES) + \
|
||||||
(((SIZES) >> 8) & 0x0f) + \
|
TRIPLE_MISC(SIZES) + \
|
||||||
(((SIZES) >> 12) & 0x0f))
|
TRIPLE_TARG(SIZES))
|
||||||
#define TRIPLE_SIZES(LHS, RHS, MISC, TARG) \
|
#define TRIPLE_SIZES(LHS, RHS, MISC, TARG) \
|
||||||
((((LHS) & 0x0f) << 0) | \
|
((((LHS) & 0x0f) << 0) | \
|
||||||
(((RHS) & 0x0f) << 4) | \
|
(((RHS) & 0xff) << 4) | \
|
||||||
(((MISC) & 0x0f) << 8) | \
|
(((MISC) & 0x03) << 12) | \
|
||||||
(((TARG) & 0x0f) << 12))
|
(((TARG) & 0x03) << 14))
|
||||||
#define TRIPLE_LHS_OFF(SIZES) (0)
|
#define TRIPLE_LHS_OFF(SIZES) (0)
|
||||||
#define TRIPLE_RHS_OFF(SIZES) (TRIPLE_LHS_OFF(SIZES) + TRIPLE_LHS(SIZES))
|
#define TRIPLE_RHS_OFF(SIZES) (TRIPLE_LHS_OFF(SIZES) + TRIPLE_LHS(SIZES))
|
||||||
#define TRIPLE_MISC_OFF(SIZES) (TRIPLE_RHS_OFF(SIZES) + TRIPLE_RHS(SIZES))
|
#define TRIPLE_MISC_OFF(SIZES) (TRIPLE_RHS_OFF(SIZES) + TRIPLE_RHS(SIZES))
|
||||||
|
@ -1336,9 +1336,13 @@ static struct triple zero_triple = {
|
||||||
|
|
||||||
|
|
||||||
static unsigned short triple_sizes(struct compile_state *state,
|
static unsigned short triple_sizes(struct compile_state *state,
|
||||||
int op, struct type *type, int lhs_wanted, int rhs_wanted)
|
int op, struct type *type, int lhs_wanted, int rhs_wanted,
|
||||||
|
struct occurance *occurance)
|
||||||
{
|
{
|
||||||
int lhs, rhs, misc, targ;
|
int lhs, rhs, misc, targ;
|
||||||
|
struct triple dummy;
|
||||||
|
dummy.op = op;
|
||||||
|
dummy.occurance = occurance;
|
||||||
valid_op(state, op);
|
valid_op(state, op);
|
||||||
lhs = table_ops[op].lhs;
|
lhs = table_ops[op].lhs;
|
||||||
rhs = table_ops[op].rhs;
|
rhs = table_ops[op].rhs;
|
||||||
|
@ -1373,16 +1377,16 @@ static unsigned short triple_sizes(struct compile_state *state,
|
||||||
lhs = lhs_wanted;
|
lhs = lhs_wanted;
|
||||||
}
|
}
|
||||||
if ((rhs < 0) || (rhs > MAX_RHS)) {
|
if ((rhs < 0) || (rhs > MAX_RHS)) {
|
||||||
internal_error(state, 0, "bad rhs");
|
internal_error(state, &dummy, "bad rhs %d", rhs);
|
||||||
}
|
}
|
||||||
if ((lhs < 0) || (lhs > MAX_LHS)) {
|
if ((lhs < 0) || (lhs > MAX_LHS)) {
|
||||||
internal_error(state, 0, "bad lhs");
|
internal_error(state, &dummy, "bad lhs");
|
||||||
}
|
}
|
||||||
if ((misc < 0) || (misc > MAX_MISC)) {
|
if ((misc < 0) || (misc > MAX_MISC)) {
|
||||||
internal_error(state, 0, "bad misc");
|
internal_error(state, &dummy, "bad misc");
|
||||||
}
|
}
|
||||||
if ((targ < 0) || (targ > MAX_TARG)) {
|
if ((targ < 0) || (targ > MAX_TARG)) {
|
||||||
internal_error(state, 0, "bad targs");
|
internal_error(state, &dummy, "bad targs");
|
||||||
}
|
}
|
||||||
return TRIPLE_SIZES(lhs, rhs, misc, targ);
|
return TRIPLE_SIZES(lhs, rhs, misc, targ);
|
||||||
}
|
}
|
||||||
|
@ -1393,7 +1397,7 @@ static struct triple *alloc_triple(struct compile_state *state,
|
||||||
{
|
{
|
||||||
size_t size, sizes, extra_count, min_count;
|
size_t size, sizes, extra_count, min_count;
|
||||||
struct triple *ret;
|
struct triple *ret;
|
||||||
sizes = triple_sizes(state, op, type, lhs, rhs);
|
sizes = triple_sizes(state, op, type, lhs, rhs, occurance);
|
||||||
|
|
||||||
min_count = sizeof(ret->param)/sizeof(ret->param[0]);
|
min_count = sizeof(ret->param)/sizeof(ret->param[0]);
|
||||||
extra_count = TRIPLE_SIZE(sizes);
|
extra_count = TRIPLE_SIZE(sizes);
|
||||||
|
@ -10588,7 +10592,7 @@ static void rename_block_variables(
|
||||||
var = RHS(ptr, 0);
|
var = RHS(ptr, 0);
|
||||||
tval = val = RHS(ptr, 1);
|
tval = val = RHS(ptr, 1);
|
||||||
if ((val->op == OP_WRITE) || (val->op == OP_READ)) {
|
if ((val->op == OP_WRITE) || (val->op == OP_READ)) {
|
||||||
internal_error(state, val, "bad value in write");
|
internal_error(state, ptr, "bad value in write");
|
||||||
}
|
}
|
||||||
/* Insert a copy if the types differ */
|
/* Insert a copy if the types differ */
|
||||||
if (!equiv_types(ptr->type, val->type)) {
|
if (!equiv_types(ptr->type, val->type)) {
|
||||||
|
@ -17111,7 +17115,7 @@ static void print_op_move(struct compile_state *state,
|
||||||
(dst_regcm & (REGCM_MMX | REGCM_XMM))) {
|
(dst_regcm & (REGCM_MMX | REGCM_XMM))) {
|
||||||
const char *op;
|
const char *op;
|
||||||
int mid_reg;
|
int mid_reg;
|
||||||
op = is_signed(src->type)? "movsx":"movxz";
|
op = is_signed(src->type)? "movsx":"movzx";
|
||||||
mid_reg = (src_reg - REGC_GPR16_FIRST) + REGC_GPR32_FIRST;
|
mid_reg = (src_reg - REGC_GPR16_FIRST) + REGC_GPR32_FIRST;
|
||||||
fprintf(fp, "\t%s %s, %s\n\tmovd %s, %s\n",
|
fprintf(fp, "\t%s %s, %s\n\tmovd %s, %s\n",
|
||||||
op,
|
op,
|
||||||
|
|
Loading…
Reference in New Issue