@Override public void generate(Method m) { // Optimize code generation for constant loop conditions if (condition instanceof ConstantExpression) { if (((ConstantBooleanExpression) condition).getBoolean()) { // Loop executed just once loopStatements.generate(m); } else { // Infinite loop (unless there is an Exit-Statement somewhere) Method.Label loopLabel = Method.newLabel(); m.setLabel(loopLabel); loopStatements.generate(m); generateLineNumberInformation(m); m.generateInstrGoto(loopLabel); } } else { // Regular loop Method.Label loopLabel = Method.newLabel(); m.setLabel(loopLabel); loopStatements.generate(m); generateLineNumberInformation(m); condition.generateBranchOnFalse(m, loopLabel); } m.setLabel(exitLabel); }
@Override public void generate(Method m) { super.generate(m); Method.Label trueLabel = Method.newLabel(); Method.Label contLabel = Method.newLabel(); leftOperand.type.generateBranchIfCmpLess(m, trueLabel); m.generateInstrLdc(0); m.generateInstrGoto(contLabel); m.setLabel(trueLabel); m.generateInstrLdc(1); m.setLabel(contLabel); }
@Override public void generateConversion(Method m, Type toType) { switch (toType.getKind()) { default: // COV_NF_START Compiler.internalError(); break; // COV_NF_END case BOOLEAN: m.generateInstrInvokestatic(CONVERSION_HELPERS_INTERNAL_NAME, "double2boolean", "(D)Z"); break; case BYTE: m.generateInstrInvokestatic(CONVERSION_HELPERS_INTERNAL_NAME, "double2byte", "(D)B"); break; case SHORT: m.generateInstrInvokestatic(CONVERSION_HELPERS_INTERNAL_NAME, "double2short", "(D)S"); break; case INTEGER: m.generateInstrD2i(); break; case LONG: m.generateInstrD2l(); break; case SINGLE: m.generateInstrD2f(); break; case DOUBLE: break; case STRING: generateToString(m); break; case VARIANT: m.generateInstrInvokestatic( DOUBLE_VARIANT_INTERNAL_NAME, "getDoubleVariant", "(D)L" + DOUBLE_VARIANT_INTERNAL_NAME + ";"); break; } }
@Override public void generateBranchIfCmpLess(Method m, Method.Label label) { m.generateInstrDcmpg(); m.generateInstrIflt(label); }
@Override public void generateModulo(Method m) { m.generateInstrDrem(); }
@Override public void generateExponentiation(Method m) { m.generateInstrInvokestatic("java/lang/Math", "pow", "(DD)D"); }
@Override public void generateDivision(Method m) { m.generateInstrDdiv(); }
@Override public void generateIntegerDivision(Method m) { m.generateInstrInvokestatic(EXPRESSION_HELPERS_INTERNAL_NAME, "idiv", "(DD)D"); }
@Override public void generateDefaultInitializationValue(Method m) { m.generateInstrLdc2(0d); }
@Override public void generateStoreLocal(Method m, short varIndex) { m.generateInstrDstore(varIndex); }
@Override public void generateNegation(Method m) { m.generateInstrDneg(); }
@Override public void generateToString(Method m) { m.generateInstrInvokestatic("java/lang/Double", "toString", "(D)Ljava/lang/String;"); }
@Override public void generateReturn(Method m) { m.generateInstrDreturn(); }
@Override public void generatePop(Method m) { m.generateInstrPop2(); }
@Override public void generateConstM1(Method m) { m.generateInstrLdc2(-1D); }
@Override public void generateStoreArray(Method m) { m.generateInstrDastore(); }
@Override public void generateLoadArray(Method m) { m.generateInstrDaload(); }
@Override public void generateBranchIfCmpGreaterOrEqual(Method m, Method.Label label) { m.generateInstrDcmpg(); m.generateInstrIfge(label); }
@Override public void generateSubtraction(Method m) { m.generateInstrDsub(); }
@Override public void generateJavaBox(Method m) { m.generateInstrInvokestatic("java/lang/Double", "valueOf", "(D)Ljava/lang/Double;"); }
@Override public void generateMultiplication(Method m) { m.generateInstrDmul(); }
@Override public void generateAddition(Method m) { m.generateInstrDadd(); }
@Override public void generateLoadLocal(Method m, short varIndex) { m.generateInstrDload(varIndex); }