uint32 allreg(uint32 b, Rgn *r) { Var *v; int i; v = var + r->varno; r->regno = 0; switch(v->etype) { default: fatal("unknown etype %d/%E", bitno(b), v->etype); break; case TINT8: case TUINT8: case TINT16: case TUINT16: case TINT32: case TUINT32: case TINT: case TUINT: case TUINTPTR: case TBOOL: case TPTR32: i = BtoR(~b); if(i && r->cost >= 0) { r->regno = i; return RtoB(i); } break; case TFLOAT32: case TFLOAT64: i = BtoF(~b); if(i && r->cost >= 0) { r->regno = i+NREG; return FtoB(i); } break; case TINT64: case TUINT64: case TPTR64: case TINTER: case TSTRUCT: case TARRAY: break; } return 0; }
uint32 reguse(Reg *r, uint32 bb) { uint32 b, set; Adr v; int c; set = 0; v = zprog.from; while(b = bb & ~(bb-1)) { v.type = b & 0xFFFF? BtoR(b): BtoF(b); c = copyu(r->f.prog, &v, nil); if(c == 1 || c == 2 || c == 4) set |= b; bb &= ~b; } return set; }
uint32 allreg(uint32 b, Rgn *r) { Var *v; int i; v = var + r->varno; r->regno = 0; switch(v->etype) { default: diag(Z, "unknown etype %d/%d", bitno(b), v->etype); break; case TCHAR: case TUCHAR: case TSHORT: case TUSHORT: case TINT: case TUINT: case TLONG: case TULONG: case TVLONG: case TUVLONG: case TIND: case TARRAY: i = BtoR(~b); if(i && r->cost > 0) { r->regno = i; return RtoB(i); } break; case TDOUBLE: case TFLOAT: i = BtoF(~b); if(i && r->cost > 0) { r->regno = i; return FtoB(i); } break; } return 0; }
uint32 regset(Reg *r, uint32 bb) { uint32 b, set; Adr v; int c; set = 0; v = zprog.from; while(b = bb & ~(bb-1)) { v.type = b & 0xFFFF? BtoR(b): BtoF(b); if(v.type == 0) fatal("zero v.type for %#ux", b); c = copyu(r->f.prog, &v, nil); if(c == 3) set |= b; bb &= ~b; } return set; }
uint32_t regset(Reg *r, uint32_t bb) { uint32_t b, set; Adr v; int c; set = 0; v = zprog.from; while(b = bb & ~(bb-1)) { v.type = b & 0xFFFF? BtoR(b): BtoF(b); if(v.type == 0) diag(Z, "zero v.type for %#lux", b); c = copyu(r->prog, &v, A); if(c == 3) set |= b; bb &= ~b; } return set; }