From cfac54ec407ef2ca4e615c09c6776c8af8be9c44 Mon Sep 17 00:00:00 2001 From: Volker Berlin Date: Sun, 16 Apr 2017 12:20:53 +0200 Subject: [PATCH] add integer bitt operations --- .../binary/BinaryModuleWriter.java | 60 +++++++++++++++++++ .../binary/InstructionOpcodes.java | 24 ++++++++ .../jwebassembly/module/ModuleWriter.java | 36 +++++++++++ .../jwebassembly/module/NumericOperator.java | 6 ++ 4 files changed, 126 insertions(+) diff --git a/src/de/inetsoftware/jwebassembly/binary/BinaryModuleWriter.java b/src/de/inetsoftware/jwebassembly/binary/BinaryModuleWriter.java index ce1ad1a..4160555 100644 --- a/src/de/inetsoftware/jwebassembly/binary/BinaryModuleWriter.java +++ b/src/de/inetsoftware/jwebassembly/binary/BinaryModuleWriter.java @@ -365,6 +365,66 @@ public class BinaryModuleWriter extends ModuleWriter implements InstructionOpcod break; } break; + case and: + switch( valueType ) { + case i32: + op = I32_AND; + break; + case i64: + op = I64_AND; + break; + } + break; + case or: + switch( valueType ) { + case i32: + op = I32_OR; + break; + case i64: + op = I64_OR; + break; + } + break; + case xor: + switch( valueType ) { + case i32: + op = I32_XOR; + break; + case i64: + op = I64_XOR; + break; + } + break; + case shl: + switch( valueType ) { + case i32: + op = I32_SHL; + break; + case i64: + op = I64_SHL; + break; + } + break; + case shr_s: + switch( valueType ) { + case i32: + op = I32_SHR_S; + break; + case i64: + op = I64_SHR_S; + break; + } + break; + case shr_u: + switch( valueType ) { + case i32: + op = I32_SHR_U; + break; + case i64: + op = I64_SHR_U; + break; + } + break; } if( op == 0 ) { throw new Error(); diff --git a/src/de/inetsoftware/jwebassembly/binary/InstructionOpcodes.java b/src/de/inetsoftware/jwebassembly/binary/InstructionOpcodes.java index 76fb2a9..e4fee88 100644 --- a/src/de/inetsoftware/jwebassembly/binary/InstructionOpcodes.java +++ b/src/de/inetsoftware/jwebassembly/binary/InstructionOpcodes.java @@ -63,6 +63,18 @@ interface InstructionOpcodes { static final int I32_REM_S = 0x6F; + static final int I32_AND = 0x71; + + static final int I32_OR = 0x72; + + static final int I32_XOR = 0x73; + + static final int I32_SHL = 0x74; + + static final int I32_SHR_S = 0x75; + + static final int I32_SHR_U = 0x76; + static final int I64_ADD = 0x7C; static final int I64_SUB = 0x7D; @@ -73,6 +85,18 @@ interface InstructionOpcodes { static final int I64_REM_S = 0x81; + static final int I64_AND = 0x83; + + static final int I64_OR = 0x84; + + static final int I64_XOR = 0x85; + + static final int I64_SHL = 0x86; + + static final int I64_SHR_S = 0x87; + + static final int I64_SHR_U = 0x88; + static final int F32_ADD = 0x92; static final int F32_SUB = 0x93; diff --git a/src/de/inetsoftware/jwebassembly/module/ModuleWriter.java b/src/de/inetsoftware/jwebassembly/module/ModuleWriter.java index da35e55..4d9d671 100644 --- a/src/de/inetsoftware/jwebassembly/module/ModuleWriter.java +++ b/src/de/inetsoftware/jwebassembly/module/ModuleWriter.java @@ -395,6 +395,42 @@ public abstract class ModuleWriter implements Closeable { case 114: // frem case 115: // drem throw new WasmException( "Modulo/Remainder for floating numbers is not supported in WASM. Use int or long data types." + op, sourceFile, lineNumber ); + case 120: // ishl + writeNumericOperator( NumericOperator.shl, ValueType.i32 ); + break; + case 121: // lshl + writeNumericOperator( NumericOperator.shl, ValueType.i64 ); + break; + case 122: // ishr + writeNumericOperator( NumericOperator.shr_s, ValueType.i32 ); + break; + case 123: // lshr + writeNumericOperator( NumericOperator.shr_s, ValueType.i64 ); + break; + case 124: // iushr + writeNumericOperator( NumericOperator.shr_u, ValueType.i32 ); + break; + case 125: // lushr + writeNumericOperator( NumericOperator.shr_u, ValueType.i64 ); + break; + case 126: // iand + writeNumericOperator( NumericOperator.and, ValueType.i32 ); + break; + case 127: // land + writeNumericOperator( NumericOperator.and, ValueType.i64 ); + break; + case 128: // ior + writeNumericOperator( NumericOperator.or, ValueType.i32 ); + break; + case 129: // lor + writeNumericOperator( NumericOperator.or, ValueType.i64 ); + break; + case 130: // ixor + writeNumericOperator( NumericOperator.xor, ValueType.i32 ); + break; + case 131: // lxor + writeNumericOperator( NumericOperator.xor, ValueType.i64 ); + break; case 132: // iinc int idx = byteCode.readUnsignedByte(); writeLoadStore( true, ValueType.i32, idx ); diff --git a/src/de/inetsoftware/jwebassembly/module/NumericOperator.java b/src/de/inetsoftware/jwebassembly/module/NumericOperator.java index 1422b1d..15408bc 100644 --- a/src/de/inetsoftware/jwebassembly/module/NumericOperator.java +++ b/src/de/inetsoftware/jwebassembly/module/NumericOperator.java @@ -24,4 +24,10 @@ public enum NumericOperator { mul, div, rem, + and, + or, + xor, + shl, + shr_s, + shr_u, }