void emitCOND(char op, GeneralType a, GeneralType b, GeneralType c) // {{{ { if(!isNoError) return; const char *prefixV=(b.t==INT)?"I":"F"; const char *prefixF=(b.t==INT)?"":"F"; const char *zero=(a.t==INT)?"0":"0.0"; int labelTrue=newLabel(); // true int labelEnd=newLabel(); // end switch(op){ case '<': case '>': case '=': case 'G': case 'L': case 'N': GeneralType constGt; constGt.t = INT; constGt.s = _CONST; fprintf(cmmOut, "/* a = b %c c */\n", op); loadAddr(b, 1); loadAddr(c, 2); fprintf(cmmOut, "%s__1 = %s__1 - %s__2;\n", prefixV, prefixV, prefixV); if(op == 'G') fprintf(cmmOut, "if ( %s__1 >= %s ) ", prefixV, zero); else if(op == 'L') fprintf(cmmOut, "if ( %s__1 <= %s ) ", prefixV, zero); else if(op == 'N' || op == '=') fprintf(cmmOut, "if ( %s__1 == %s ) ", prefixV, zero); else fprintf(cmmOut, "if ( %s__1 %c %s ) ", prefixV, op, zero); emitJUMP(labelTrue); constGt.ival = (op=='N')?1:0; emitASSIGN('=', a, constGt); emitJUMP(labelEnd); emitLABEL(labelTrue); constGt.ival = (op=='N')?0:1; emitASSIGN('=', a, constGt); emitLABEL(labelEnd); break; } } // }}}
void emitCODE(CODE *c) { if (c!=NULL) { fprintf(emitFILE," "); switch(c->kind) { case nopCK: fprintf(emitFILE,"nop"); break; case i2cCK: fprintf(emitFILE,"i2c"); break; case newCK: fprintf(emitFILE,"new %s",c->val.newC); break; case instanceofCK: fprintf(emitFILE,"instanceof %s",c->val.instanceofC); break; case checkcastCK: fprintf(emitFILE,"checkcast %s",c->val.checkcastC); break; case imulCK: fprintf(emitFILE,"imul"); break; case inegCK: fprintf(emitFILE,"ineg"); break; case iremCK: fprintf(emitFILE,"irem"); break; case isubCK: fprintf(emitFILE,"isub"); break; case idivCK: fprintf(emitFILE,"idiv"); break; case iaddCK: fprintf(emitFILE,"iadd"); break; case iincCK: fprintf(emitFILE,"iinc %i %i", c->val.iincC.offset,c->val.iincC.amount); break; case labelCK: emitLABEL(c->val.labelC); fprintf(emitFILE,":"); break; case gotoCK: fprintf(emitFILE,"goto "); emitLABEL(c->val.gotoC); break; case ifeqCK: fprintf(emitFILE,"ifeq "); emitLABEL(c->val.ifeqC); break; case ifneCK: fprintf(emitFILE,"ifne "); emitLABEL(c->val.ifneC); break; case if_acmpeqCK: fprintf(emitFILE,"if_acmpeq "); emitLABEL(c->val.if_acmpeqC); break; case if_acmpneCK: fprintf(emitFILE,"if_acmpne "); emitLABEL(c->val.if_acmpneC); break; case ifnullCK: fprintf(emitFILE,"ifnull "); emitLABEL(c->val.ifnullC); break; case ifnonnullCK: fprintf(emitFILE,"ifnonnull "); emitLABEL(c->val.ifnonnullC); break; case if_icmpeqCK: fprintf(emitFILE,"if_icmpeq "); emitLABEL(c->val.if_icmpeqC); break; case if_icmpgtCK: fprintf(emitFILE,"if_icmpgt "); emitLABEL(c->val.if_icmpgtC); break; case if_icmpltCK: fprintf(emitFILE,"if_icmplt "); emitLABEL(c->val.if_icmpltC); break; case if_icmpleCK: fprintf(emitFILE,"if_icmple "); emitLABEL(c->val.if_icmpleC); break; case if_icmpgeCK: fprintf(emitFILE,"if_icmpge "); emitLABEL(c->val.if_icmpgeC); break; case if_icmpneCK: fprintf(emitFILE,"if_icmpne "); emitLABEL(c->val.if_icmpneC); break; case ireturnCK: fprintf(emitFILE,"ireturn"); break; case areturnCK: fprintf(emitFILE,"areturn"); break; case returnCK: fprintf(emitFILE,"return"); break; case aloadCK: localmem("aload",c->val.aloadC); break; case astoreCK: localmem("astore",c->val.astoreC); break; case iloadCK: localmem("iload",c->val.iloadC); break; case istoreCK: localmem("istore",c->val.istoreC); break; case dupCK: fprintf(emitFILE,"dup"); break; case popCK: fprintf(emitFILE,"pop"); break; case swapCK: fprintf(emitFILE,"swap"); break; case ldc_intCK: if (c->val.ldc_intC >= 0 && c->val.ldc_intC <= 5) { fprintf(emitFILE,"iconst_%i",c->val.ldc_intC); } else { fprintf(emitFILE,"ldc %i",c->val.ldc_intC); } break; case ldc_stringCK: fprintf(emitFILE,"ldc \"%s\"",c->val.ldc_stringC); break; case aconst_nullCK: fprintf(emitFILE,"aconst_null"); break; case getfieldCK: fprintf(emitFILE,"getfield %s",c->val.getfieldC); break; case putfieldCK: fprintf(emitFILE,"putfield %s",c->val.putfieldC); break; case invokevirtualCK: fprintf(emitFILE,"invokevirtual %s",c->val.invokevirtualC); break; case invokenonvirtualCK: fprintf(emitFILE,"invokenonvirtual %s",c->val.invokenonvirtualC); break; } fprintf(emitFILE,"\n"); emitCODE(c->next); } }