nv50/ir: fix moves to/from flags
Noticed this when looking at a trace that caused flags to spill to/from registers. The flags source/destination wasn't encoded correctly according to both envydis and nvdisasm. Signed-off-by: Ilia Mirkin <imirkin@alum.mit.edu>
This commit is contained in:
parent
101e315cc1
commit
6c6f28c35e
|
@ -756,10 +756,10 @@ CodeEmitterNV50::emitMOV(const Instruction *i)
|
||||||
assert(sf == FILE_GPR || df == FILE_GPR);
|
assert(sf == FILE_GPR || df == FILE_GPR);
|
||||||
|
|
||||||
if (sf == FILE_FLAGS) {
|
if (sf == FILE_FLAGS) {
|
||||||
|
assert(i->flagsSrc >= 0);
|
||||||
code[0] = 0x00000001;
|
code[0] = 0x00000001;
|
||||||
code[1] = 0x20000000;
|
code[1] = 0x20000000;
|
||||||
defId(i->def(0), 2);
|
defId(i->def(0), 2);
|
||||||
srcId(i->src(0), 12);
|
|
||||||
emitFlagsRd(i);
|
emitFlagsRd(i);
|
||||||
} else
|
} else
|
||||||
if (sf == FILE_ADDRESS) {
|
if (sf == FILE_ADDRESS) {
|
||||||
|
@ -770,11 +770,12 @@ CodeEmitterNV50::emitMOV(const Instruction *i)
|
||||||
emitFlagsRd(i);
|
emitFlagsRd(i);
|
||||||
} else
|
} else
|
||||||
if (df == FILE_FLAGS) {
|
if (df == FILE_FLAGS) {
|
||||||
|
assert(i->flagsDef >= 0);
|
||||||
code[0] = 0x00000001;
|
code[0] = 0x00000001;
|
||||||
code[1] = 0xa0000000;
|
code[1] = 0xa0000000;
|
||||||
defId(i->def(0), 4);
|
|
||||||
srcId(i->src(0), 9);
|
srcId(i->src(0), 9);
|
||||||
emitFlagsRd(i);
|
emitFlagsRd(i);
|
||||||
|
emitFlagsWr(i);
|
||||||
} else
|
} else
|
||||||
if (sf == FILE_IMMEDIATE) {
|
if (sf == FILE_IMMEDIATE) {
|
||||||
code[0] = 0x10008001;
|
code[0] = 0x10008001;
|
||||||
|
|
|
@ -1599,6 +1599,8 @@ SpillCodeInserter::spill(Instruction *defi, Value *slot, LValue *lval)
|
||||||
st = new_Instruction(func, OP_CVT, ty);
|
st = new_Instruction(func, OP_CVT, ty);
|
||||||
st->setDef(0, slot);
|
st->setDef(0, slot);
|
||||||
st->setSrc(0, lval);
|
st->setSrc(0, lval);
|
||||||
|
if (lval->reg.file == FILE_FLAGS)
|
||||||
|
st->flagsSrc = 0;
|
||||||
}
|
}
|
||||||
defi->bb->insertAfter(defi, st);
|
defi->bb->insertAfter(defi, st);
|
||||||
}
|
}
|
||||||
|
@ -1640,6 +1642,8 @@ SpillCodeInserter::unspill(Instruction *usei, LValue *lval, Value *slot)
|
||||||
}
|
}
|
||||||
ld->setDef(0, lval);
|
ld->setDef(0, lval);
|
||||||
ld->setSrc(0, slot);
|
ld->setSrc(0, slot);
|
||||||
|
if (lval->reg.file == FILE_FLAGS)
|
||||||
|
ld->flagsDef = 0;
|
||||||
|
|
||||||
usei->bb->insertBefore(usei, ld);
|
usei->bb->insertBefore(usei, ld);
|
||||||
return lval;
|
return lval;
|
||||||
|
|
Loading…
Reference in New Issue