nv50: cannot move from local mem to output reg directly

This commit is contained in:
Christoph Bumiller 2010-09-12 11:19:24 +02:00
parent 9b39fb1b61
commit d4fd11a628
3 changed files with 5 additions and 3 deletions

View File

@ -57,6 +57,7 @@ nv50_indirect_opnd(struct nv_instruction *i)
switch (i->opcode) { switch (i->opcode) {
case NV_OP_MOV: case NV_OP_MOV:
case NV_OP_LDA: case NV_OP_LDA:
case NV_OP_STA:
return 0; return 0;
default: default:
return 1; return 1;
@ -341,7 +342,7 @@ nv_print_program(struct nv_pc *pc)
nv_print_function(pc->root[i]); nv_print_function(pc->root[i]);
} }
#ifdef NV50_PC_DEBUG #ifdef NV50PC_DEBUG
static void static void
nv_do_print_cfgraph(struct nv_pc *pc, FILE *f, struct nv_basic_block *b) nv_do_print_cfgraph(struct nv_pc *pc, FILE *f, struct nv_basic_block *b)
{ {

View File

@ -327,7 +327,8 @@ nv_pass_fold_stores(struct nv_pass *ctx, struct nv_basic_block *b)
/* cannot write to $oX when using immediate */ /* cannot write to $oX when using immediate */
for (j = 0; j < 4 && nvi->src[j]; ++j) for (j = 0; j < 4 && nvi->src[j]; ++j)
if (nvi->src[j]->value->reg.file == NV_FILE_IMM) if (nvi->src[j]->value->reg.file == NV_FILE_IMM ||
nvi->src[j]->value->reg.file == NV_FILE_MEM_L)
break; break;
if (j < 4 && nvi->src[j]) if (j < 4 && nvi->src[j])
continue; continue;

View File

@ -220,7 +220,7 @@ nv_print_value(struct nv_value *value, struct nv_value *ind, ubyte type)
PRINT(" %s%cc%i", mgta, reg_pfx, nv_value_id(value)); PRINT(" %s%cc%i", mgta, reg_pfx, nv_value_id(value));
break; break;
case NV_FILE_MEM_L: case NV_FILE_MEM_L:
nv_print_address('l', -1, ind, 4 * nv_value_id(value)); nv_print_address('l', -1, ind, nv_value_id(value));
break; break;
case NV_FILE_MEM_S: case NV_FILE_MEM_S:
nv_print_address('s', -1, ind, 4 * nv_value_id(value)); nv_print_address('s', -1, ind, 4 * nv_value_id(value));