add integer bitt operations

This commit is contained in:
Volker Berlin 2017-04-16 12:20:53 +02:00
parent 28d4fb9b1c
commit cfac54ec40
4 changed files with 126 additions and 0 deletions

View File

@ -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();

View File

@ -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;

View File

@ -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 );

View File

@ -24,4 +24,10 @@ public enum NumericOperator {
mul,
div,
rem,
and,
or,
xor,
shl,
shr_s,
shr_u,
}