jaroslav@1858: /** jaroslav@1858: * Back 2 Browser Bytecode Translator jaroslav@1858: * Copyright (C) 2012-2015 Jaroslav Tulach jaroslav@1858: * jaroslav@1858: * This program is free software: you can redistribute it and/or modify jaroslav@1858: * it under the terms of the GNU General Public License as published by jaroslav@1858: * the Free Software Foundation, version 2 of the License. jaroslav@1858: * jaroslav@1858: * This program is distributed in the hope that it will be useful, jaroslav@1858: * but WITHOUT ANY WARRANTY; without even the implied warranty of jaroslav@1858: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the jaroslav@1858: * GNU General Public License for more details. jaroslav@1858: * jaroslav@1858: * You should have received a copy of the GNU General Public License jaroslav@1858: * along with this program. Look for COPYING file in the top folder. jaroslav@1858: * If not, see http://opensource.org/licenses/GPL-2.0. jaroslav@1858: */ jaroslav@1858: package org.apidesign.vm4brwsr; jaroslav@1858: jaroslav@1858: final class NumberOperations { jaroslav@1858: private static final int DIV32 = 1; jaroslav@1858: private static final int MOD32 = 2; jaroslav@1858: private static final int MUL32 = 4; jaroslav@1865: private static final int BIT64 = 8; jaroslav@1858: jaroslav@1858: private int used; jaroslav@1858: jaroslav@1858: public String mul32() { jaroslav@1858: used |= MUL32; jaroslav@1858: return "__mul32(@1,@2)"; jaroslav@1858: } jaroslav@1858: public String div32() { jaroslav@1858: used |= DIV32; jaroslav@1858: return "__div32(@1,@2)"; jaroslav@1858: } jaroslav@1858: jaroslav@1858: public String mod32() { jaroslav@1858: used |= MOD32; jaroslav@1858: return "__mod32(@1,@2)"; jaroslav@1858: } jaroslav@1858: jaroslav@1862: public String add64() { jaroslav@1865: used |= BIT64; jaroslav@1865: return "__add64(@1,@2)"; jaroslav@1862: } jaroslav@1862: jaroslav@1862: public String sub64() { jaroslav@1865: used |= BIT64; jaroslav@1865: return "__sub64(@1,@2)"; jaroslav@1862: } jaroslav@1862: jaroslav@1862: public String mul64() { jaroslav@1865: used |= BIT64; jaroslav@1865: return "__mul64(@1,@2)"; jaroslav@1862: } jaroslav@1862: jaroslav@1862: public String div64() { jaroslav@1865: used |= BIT64; jaroslav@1865: return "__div64(@1,@2)"; jaroslav@1862: } jaroslav@1862: jaroslav@1862: public String mod64() { jaroslav@1865: used |= BIT64; jaroslav@1865: return "__mod64(@1,@2)"; jaroslav@1862: } jaroslav@1862: jaroslav@1862: public String and64() { jaroslav@1865: used |= BIT64; jaroslav@1865: return "__and64(@1,@2)"; jaroslav@1862: } jaroslav@1862: jaroslav@1862: public String or64() { jaroslav@1865: used |= BIT64; jaroslav@1865: return "__or64(@1,@2)"; jaroslav@1862: } jaroslav@1862: jaroslav@1862: public String xor64() { jaroslav@1865: used |= BIT64; jaroslav@1865: return "__xor64(@1,@2)"; jaroslav@1862: } jaroslav@1862: jaroslav@1862: public String neg64() { jaroslav@1865: used |= BIT64; jaroslav@1865: return "__neg64(@1)"; jaroslav@1862: } jaroslav@1862: jaroslav@1862: public String shl64() { jaroslav@1865: used |= BIT64; jaroslav@1865: return "__shl64(@1,@2)"; jaroslav@1862: } jaroslav@1862: jaroslav@1862: public String shr64() { jaroslav@1865: used |= BIT64; jaroslav@1865: return "__shr64(@1,@2)"; jaroslav@1862: } jaroslav@1862: jaroslav@1862: public String ushr64() { jaroslav@1865: used |= BIT64; jaroslav@1865: return "__ushr64(@1,@2)"; jaroslav@1862: } jaroslav@1862: jaroslav@1862: public String compare64() { jaroslav@1865: used |= BIT64; jaroslav@1871: return "__compare64(@2,@1)"; jaroslav@1862: } jaroslav@1862: jaroslav@1858: public String generate() { jaroslav@1858: if (used == 0) { jaroslav@1858: return ""; jaroslav@1858: } jaroslav@1858: StringBuilder sb = new StringBuilder(); jaroslav@1858: if ((used & MUL32) != 0) { jaroslav@1858: sb.append( jaroslav@1858: " __mul32 = function(x, y) {\n" + jaroslav@1858: " return (((x * (y >> 16)) << 16) + x * (y & 0xFFFF)) | 0;\n" + jaroslav@1858: " };\n" + jaroslav@1858: "" jaroslav@1858: ); jaroslav@1858: } jaroslav@1858: if ((used & (MOD32 | DIV32)) != 0) { jaroslav@1858: sb.append( jaroslav@1858: " function __handleDivByZero() {\n" + jaroslav@1858: " var exception = new vm.java_lang_ArithmeticException;\n" + jaroslav@1858: " vm.java_lang_ArithmeticException(false).constructor\n" + jaroslav@1858: " .cons__VLjava_lang_String_2.call(exception, \"/ by zero\");\n" + jaroslav@1858: "\n" + jaroslav@1858: " throw exception;\n" + jaroslav@1858: " }\n" + jaroslav@1858: "" jaroslav@1858: ); jaroslav@1858: } jaroslav@1858: if ((used & MOD32) != 0) { jaroslav@1858: sb.append( jaroslav@1858: " function __mod32(x, y) {\n" + jaroslav@1858: " if (y === 0) __handleDivByZero();\n" + jaroslav@1858: " return (x % y) | 0;\n" + jaroslav@1858: " }\n" + jaroslav@1858: "" jaroslav@1858: ); jaroslav@1858: } jaroslav@1858: if ((used & DIV32) != 0) { jaroslav@1858: sb.append( jaroslav@1858: " function __div32(x, y) {\n" + jaroslav@1858: " if (y === 0) __handleDivByZero();\n" + jaroslav@1858: " return (x / y) | 0;\n" + jaroslav@1858: " }\n" + jaroslav@1858: "" jaroslav@1858: ); jaroslav@1858: } jaroslav@1865: if ((used & BIT64) != 0) { jaroslav@1865: sb.append( jaroslav@1866: " var __add64 = Number.prototype['__bit64']['add64'];\n" + jaroslav@1866: " var __sub64 = Number.prototype['__bit64']['sub64'];\n" + jaroslav@1866: " var __mul64 = Number.prototype['__bit64']['mul64'];\n" + jaroslav@1866: " var __div64 = Number.prototype['__bit64']['div64'];\n" + jaroslav@1866: " var __mod64 = Number.prototype['__bit64']['mod64'];\n" + jaroslav@1866: " var __and64 = Number.prototype['__bit64']['and64'];\n" + jaroslav@1866: " var __or64 = Number.prototype['__bit64']['or64'];\n" + jaroslav@1866: " var __xor64 = Number.prototype['__bit64']['xor64'];\n" + jaroslav@1870: " var __neg64 = Number.prototype['__bit64']['neg64'];\n" + jaroslav@1866: " var __shl64 = Number.prototype['__bit64']['shl64'];\n" + jaroslav@1866: " var __shr64 = Number.prototype['__bit64']['shr64'];\n" + jaroslav@1866: " var __ushr64 = Number.prototype['__bit64']['ushr64'];\n" + jaroslav@1866: " var __compare64 = Number.prototype['__bit64']['compare64'];\n" + jaroslav@1865: "" jaroslav@1865: ); jaroslav@1865: } jaroslav@1858: return sb.toString(); jaroslav@1858: } jaroslav@1858: }