void GenFin(void) { if (StructCpyLabel) { char s[1 + 2 + (2 + CHAR_BIT * sizeof StructCpyLabel) / 3]; char *p = s + sizeof s; int lbl = LabelCnt++; *--p = '\0'; p = lab2str(p, StructCpyLabel); *--p = '_'; *--p = '_'; if (OutputFormat != FormatFlat) puts2(CodeHeader); GenLabel(p, 1); puts2("\tmove\t$2, $6\n" "\tmove\t$3, $6"); GenNumLabel(lbl); puts2("\tlbu\t$6, 0($5)\n" "\taddiu\t$5, $5, 1\n" "\taddiu\t$4, $4, -1\n" "\tsb\t$6, 0($3)\n" "\taddiu\t$3, $3, 1"); printf2("\tbne\t$4, $0, "); GenPrintNumLabel(lbl); puts2(""); #ifndef NO_REORDER_WORKAROUND GenNop(); #endif puts2("\tj\t$31"); #ifndef NO_REORDER_WORKAROUND GenNop(); #endif if (OutputFormat != FormatFlat) puts2(CodeFooter); } }
void GenPrintOperand(int op, int val) { if (op >= MipsOpRegZero && op <= MipsOpRegRa) { printf2("$%d", op); } else if (op >= MipsOpIndRegZero && op <= MipsOpIndRegRa) { printf2("%d($%d)", truncInt(val), op - MipsOpIndRegZero); } else { switch (op) { case MipsOpConst: printf2("%d", truncInt(val)); break; case MipsOpLabelGpOption: if (UseGp) { printf2("%%gp_rel("); GenPrintLabel(IdentTable + val); printf2(")($28)"); } else { printf2("%%lo("); GenPrintLabel(IdentTable + val); printf2(")($1)"); } break; case MipsOpLabel: GenPrintLabel(IdentTable + val); break; case MipsOpNumLabel: GenPrintNumLabel(val); break; default: //error("WTF!\n"); errorInternal(100); break; } } }
STATIC void GenPrintOperand(int op, int val) { if (op >= Tr32OpReg0 && op <= Tr32OpRegFlags) { GenRegsUsed |= 1 << op; switch (op) { case Tr32OpRegBp: printf2("%%bp"); break; case Tr32OpRegSp: printf2("%%sp"); break; case Tr32OpRegY: printf2("%%y"); break; case Tr32OpRegFlags: printf2("%%flags"); break; default: printf2("%%r%d", op); } } else if (op >= Tr32OpIndReg0 && op <= Tr32OpIndRegFlags) { GenPrintOperand(op - Tr32OpIndReg0, 0); val = truncInt(val); if (val) printf2(", %d", val); } else { switch (op) { case Tr32OpConst: printf2("%d", truncInt(val)); break; case Tr32OpLabel: GenPrintLabel(IdentTable + val); break; case Tr32OpNumLabel: GenPrintNumLabel(val); break; default: //error("WTF!\n"); errorInternal(100); break; } } }