vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java
brancharithmetic
changeset 582 8e546d108658
parent 503 80a388c8c27b
child 593 b42911b78a16
     1.1 --- a/vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java	Mon Jan 21 13:39:23 2013 +0100
     1.2 +++ b/vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java	Fri Jan 25 11:00:52 2013 +0100
     1.3 @@ -304,7 +304,7 @@
     1.4                      emit(out, "var @1 = @2;", smapper.pushI(), lmapper.getI(0));
     1.5                      break;
     1.6                  case opc_lload_0:
     1.7 -                    emit(out, "var @1 = @2;", smapper.pushL(), lmapper.getL(0));
     1.8 +                    emit(out, "var @1 = MakeLong(@2);", smapper.pushL(), lmapper.getL(0));
     1.9                      break;
    1.10                  case opc_fload_0:
    1.11                      emit(out, "var @1 = @2;", smapper.pushF(), lmapper.getF(0));
    1.12 @@ -319,7 +319,7 @@
    1.13                      emit(out, "var @1 = @2;", smapper.pushI(), lmapper.getI(1));
    1.14                      break;
    1.15                  case opc_lload_1:
    1.16 -                    emit(out, "var @1 = @2;", smapper.pushL(), lmapper.getL(1));
    1.17 +                    emit(out, "var @1 = MakeLong(@2);", smapper.pushL(), lmapper.getL(1));
    1.18                      break;
    1.19                  case opc_fload_1:
    1.20                      emit(out, "var @1 = @2;", smapper.pushF(), lmapper.getF(1));
    1.21 @@ -334,7 +334,7 @@
    1.22                      emit(out, "var @1 = @2;", smapper.pushI(), lmapper.getI(2));
    1.23                      break;
    1.24                  case opc_lload_2:
    1.25 -                    emit(out, "var @1 = @2;", smapper.pushL(), lmapper.getL(2));
    1.26 +                    emit(out, "var @1 = MakeLong(@2);", smapper.pushL(), lmapper.getL(2));
    1.27                      break;
    1.28                  case opc_fload_2:
    1.29                      emit(out, "var @1 = @2;", smapper.pushF(), lmapper.getF(2));
    1.30 @@ -349,7 +349,7 @@
    1.31                      emit(out, "var @1 = @2;", smapper.pushI(), lmapper.getI(3));
    1.32                      break;
    1.33                  case opc_lload_3:
    1.34 -                    emit(out, "var @1 = @2;", smapper.pushL(), lmapper.getL(3));
    1.35 +                    emit(out, "var @1 = MakeLong(@2);", smapper.pushL(), lmapper.getL(3));
    1.36                      break;
    1.37                  case opc_fload_3:
    1.38                      emit(out, "var @1 = @2;", smapper.pushF(), lmapper.getF(3));
    1.39 @@ -481,7 +481,7 @@
    1.40                      emit(out, "@1 = @1.add32(@2);", smapper.getI(1), smapper.popI());
    1.41                      break;
    1.42                  case opc_ladd:
    1.43 -                    emit(out, "@1 += @2;", smapper.getL(1), smapper.popL());
    1.44 +                    emit(out, "@1 = @1.add64(@2);", smapper.getL(1), smapper.popL());
    1.45                      break;
    1.46                  case opc_fadd:
    1.47                      emit(out, "@1 += @2;", smapper.getF(1), smapper.popF());
    1.48 @@ -518,7 +518,7 @@
    1.49                           smapper.getI(1), smapper.popI());
    1.50                      break;
    1.51                  case opc_ldiv:
    1.52 -                    emit(out, "@1 = Math.floor(@1 / @2);",
    1.53 +                    emit(out, "@1 = @1.div64(@2);",
    1.54                           smapper.getL(1), smapper.popL());
    1.55                      break;
    1.56                  case opc_fdiv:
    1.57 @@ -573,7 +573,7 @@
    1.58                      emit(out, "@1 <<= @2;", smapper.getI(1), smapper.popI());
    1.59                      break;
    1.60                  case opc_lshl:
    1.61 -                    emit(out, "@1 <<= @2;", smapper.getL(1), smapper.popI());
    1.62 +                    emit(out, "@1 = @1.shl64(@2);", smapper.getL(1), smapper.popI());
    1.63                      break;
    1.64                  case opc_ishr:
    1.65                      emit(out, "@1 >>= @2;", smapper.getI(1), smapper.popI());
    1.66 @@ -618,7 +618,7 @@
    1.67                      emit(out, "return @1;", smapper.popA());
    1.68                      break;
    1.69                  case opc_i2l:
    1.70 -                    emit(out, "var @2 = @1;", smapper.popI(), smapper.pushL());
    1.71 +                    emit(out, "var @2 = new Long(@1, 0);", smapper.popI(), smapper.pushL());
    1.72                      break;
    1.73                  case opc_i2f:
    1.74                      emit(out, "var @2 = @1;", smapper.popI(), smapper.pushF());
    1.75 @@ -627,14 +627,14 @@
    1.76                      emit(out, "var @2 = @1;", smapper.popI(), smapper.pushD());
    1.77                      break;
    1.78                  case opc_l2i:
    1.79 -                    emit(out, "var @2 = @1;", smapper.popL(), smapper.pushI());
    1.80 +                    emit(out, "var @2 = @1.toInt32();", smapper.popL(), smapper.pushI());
    1.81                      break;
    1.82                      // max int check?
    1.83                  case opc_l2f:
    1.84 -                    emit(out, "var @2 = @1;", smapper.popL(), smapper.pushF());
    1.85 +                    emit(out, "var @2 = @1.toFP();", smapper.popL(), smapper.pushF());
    1.86                      break;
    1.87                  case opc_l2d:
    1.88 -                    emit(out, "var @2 = @1;", smapper.popL(), smapper.pushD());
    1.89 +                    emit(out, "var @2 = @1.toFP();", smapper.popL(), smapper.pushD());
    1.90                      break;
    1.91                  case opc_f2d:
    1.92                      emit(out, "var @2 = @1;", smapper.popF(), smapper.pushD());
    1.93 @@ -647,7 +647,7 @@
    1.94                           smapper.popF(), smapper.pushI());
    1.95                      break;
    1.96                  case opc_f2l:
    1.97 -                    emit(out, "var @2 = Math.floor(@1);",
    1.98 +                    emit(out, "var @2 = LongFromNumber(Math.floor(@1));",
    1.99                           smapper.popF(), smapper.pushL());
   1.100                      break;
   1.101                  case opc_d2i:
   1.102 @@ -655,7 +655,7 @@
   1.103                           smapper.popD(), smapper.pushI());
   1.104                      break;
   1.105                  case opc_d2l:
   1.106 -                    emit(out, "var @2 = Math.floor(@1);",
   1.107 +                    emit(out, "var @2 = LongFromNumber(Math.floor(@1));",
   1.108                           smapper.popD(), smapper.pushL());
   1.109                      break;
   1.110                  case opc_i2b:
   1.111 @@ -680,7 +680,7 @@
   1.112                      emit(out, "var @1 = 0;", smapper.pushD());
   1.113                      break;
   1.114                  case opc_lconst_0:
   1.115 -                    emit(out, "var @1 = 0;", smapper.pushL());
   1.116 +                    emit(out, "var @1 = new Long(0,0);", smapper.pushL());
   1.117                      break;
   1.118                  case opc_fconst_0:
   1.119                      emit(out, "var @1 = 0;", smapper.pushF());
   1.120 @@ -689,7 +689,7 @@
   1.121                      emit(out, "var @1 = 1;", smapper.pushI());
   1.122                      break;
   1.123                  case opc_lconst_1:
   1.124 -                    emit(out, "var @1 = 1;", smapper.pushL());
   1.125 +                    emit(out, "var @1 = new Long(1,0);", smapper.pushL());
   1.126                      break;
   1.127                  case opc_fconst_1:
   1.128                      emit(out, "var @1 = 1;", smapper.pushF());
   1.129 @@ -725,11 +725,19 @@
   1.130                      i += 2;
   1.131                      String v = encodeConstant(indx);
   1.132                      int type = VarType.fromConstantType(jc.getTag(indx));
   1.133 -                    emit(out, "var @1 = @2;", smapper.pushT(type), v);
   1.134 +                    if (type == VarType.LONG) {
   1.135 +                        final Long lv = new Long(v);
   1.136 +                        final int low = (int)(lv.longValue() & 0xFFFFFFFF);
   1.137 +                        final int hi = (int)(lv.longValue() >> 32);
   1.138 +                        emit(out, "var @1 = new Long(0x@2, 0x@3);", smapper.pushL(), 
   1.139 +                                Integer.toHexString(low), Integer.toHexString(hi));
   1.140 +                    } else {
   1.141 +                        emit(out, "var @1 = @2;", smapper.pushT(type), v);
   1.142 +                    }
   1.143                      break;
   1.144                  }
   1.145                  case opc_lcmp:
   1.146 -                    emit(out, "var @3 = (@2 == @1) ? 0 : ((@2 < @1) ? -1 : 1);",
   1.147 +                    emit(out, "var @3 = @2.compare64(@1);",
   1.148                           smapper.popL(), smapper.popL(), smapper.pushI());
   1.149                      break;
   1.150                  case opc_fcmpl: