implement atomic opcode in AOT/JIT (#329)
This commit is contained in:
@ -2331,6 +2331,23 @@ wasm_loader_find_block_addr(BlockAddr *block_addr_cache,
|
||||
break;
|
||||
}
|
||||
|
||||
#if WASM_ENABLE_SHARED_MEMORY != 0
|
||||
case WASM_OP_ATOMIC_PREFIX:
|
||||
{
|
||||
/* atomic_op (1 u8) + memarg (2 u32_leb) */
|
||||
opcode = read_uint8(p);
|
||||
if (opcode != WASM_OP_ATOMIC_FENCE) {
|
||||
skip_leb_uint32(p, p_end); /* align */
|
||||
skip_leb_uint32(p, p_end); /* offset */
|
||||
}
|
||||
else {
|
||||
/* atomic.fence doesn't have memarg */
|
||||
p++;
|
||||
}
|
||||
break;
|
||||
}
|
||||
#endif
|
||||
|
||||
default:
|
||||
bh_assert(0);
|
||||
break;
|
||||
@ -4953,6 +4970,8 @@ handle_op_block_and_loop:
|
||||
bh_assert(*p == 0x00);
|
||||
p++;
|
||||
PUSH_I32();
|
||||
|
||||
module->possible_memory_grow = true;
|
||||
break;
|
||||
|
||||
case WASM_OP_MEMORY_GROW:
|
||||
@ -5318,6 +5337,136 @@ handle_op_block_and_loop:
|
||||
break;
|
||||
}
|
||||
|
||||
#if WASM_ENABLE_SHARED_MEMORY != 0
|
||||
case WASM_OP_ATOMIC_PREFIX:
|
||||
{
|
||||
opcode = read_uint8(p);
|
||||
#if WASM_ENABLE_FAST_INTERP != 0
|
||||
emit_byte(loader_ctx, opcode);
|
||||
#endif
|
||||
if (opcode != WASM_OP_ATOMIC_FENCE) {
|
||||
CHECK_MEMORY();
|
||||
read_leb_uint32(p, p_end, align); /* align */
|
||||
read_leb_uint32(p, p_end, mem_offset); /* offset */
|
||||
}
|
||||
switch (opcode) {
|
||||
case WASM_OP_ATOMIC_NOTIFY:
|
||||
POP2_AND_PUSH(VALUE_TYPE_I32, VALUE_TYPE_I32);
|
||||
break;
|
||||
case WASM_OP_ATOMIC_WAIT32:
|
||||
POP_I64();
|
||||
POP_I32();
|
||||
POP_I32();
|
||||
PUSH_I32();
|
||||
break;
|
||||
case WASM_OP_ATOMIC_WAIT64:
|
||||
POP_I64();
|
||||
POP_I64();
|
||||
POP_I32();
|
||||
PUSH_I32();
|
||||
break;
|
||||
case WASM_OP_ATOMIC_FENCE:
|
||||
/* reserved byte 0x00 */
|
||||
bh_assert(*p == 0x00);
|
||||
p++;
|
||||
break;
|
||||
case WASM_OP_ATOMIC_I32_LOAD:
|
||||
case WASM_OP_ATOMIC_I32_LOAD8_U:
|
||||
case WASM_OP_ATOMIC_I32_LOAD16_U:
|
||||
POP_AND_PUSH(VALUE_TYPE_I32, VALUE_TYPE_I32);
|
||||
break;
|
||||
case WASM_OP_ATOMIC_I32_STORE:
|
||||
case WASM_OP_ATOMIC_I32_STORE8:
|
||||
case WASM_OP_ATOMIC_I32_STORE16:
|
||||
POP_I32();
|
||||
POP_I32();
|
||||
break;
|
||||
case WASM_OP_ATOMIC_I64_LOAD:
|
||||
case WASM_OP_ATOMIC_I64_LOAD8_U:
|
||||
case WASM_OP_ATOMIC_I64_LOAD16_U:
|
||||
case WASM_OP_ATOMIC_I64_LOAD32_U:
|
||||
POP_AND_PUSH(VALUE_TYPE_I32, VALUE_TYPE_I64);
|
||||
break;
|
||||
case WASM_OP_ATOMIC_I64_STORE:
|
||||
case WASM_OP_ATOMIC_I64_STORE8:
|
||||
case WASM_OP_ATOMIC_I64_STORE16:
|
||||
case WASM_OP_ATOMIC_I64_STORE32:
|
||||
POP_I64();
|
||||
POP_I32();
|
||||
break;
|
||||
case WASM_OP_ATOMIC_RMW_I32_ADD:
|
||||
case WASM_OP_ATOMIC_RMW_I32_ADD8_U:
|
||||
case WASM_OP_ATOMIC_RMW_I32_ADD16_U:
|
||||
case WASM_OP_ATOMIC_RMW_I32_SUB:
|
||||
case WASM_OP_ATOMIC_RMW_I32_SUB8_U:
|
||||
case WASM_OP_ATOMIC_RMW_I32_SUB16_U:
|
||||
case WASM_OP_ATOMIC_RMW_I32_AND:
|
||||
case WASM_OP_ATOMIC_RMW_I32_AND8_U:
|
||||
case WASM_OP_ATOMIC_RMW_I32_AND16_U:
|
||||
case WASM_OP_ATOMIC_RMW_I32_OR:
|
||||
case WASM_OP_ATOMIC_RMW_I32_OR8_U:
|
||||
case WASM_OP_ATOMIC_RMW_I32_OR16_U:
|
||||
case WASM_OP_ATOMIC_RMW_I32_XOR:
|
||||
case WASM_OP_ATOMIC_RMW_I32_XOR8_U:
|
||||
case WASM_OP_ATOMIC_RMW_I32_XOR16_U:
|
||||
case WASM_OP_ATOMIC_RMW_I32_XCHG:
|
||||
case WASM_OP_ATOMIC_RMW_I32_XCHG8_U:
|
||||
case WASM_OP_ATOMIC_RMW_I32_XCHG16_U:
|
||||
POP2_AND_PUSH(VALUE_TYPE_I32, VALUE_TYPE_I32);
|
||||
break;
|
||||
case WASM_OP_ATOMIC_RMW_I64_ADD:
|
||||
case WASM_OP_ATOMIC_RMW_I64_ADD8_U:
|
||||
case WASM_OP_ATOMIC_RMW_I64_ADD16_U:
|
||||
case WASM_OP_ATOMIC_RMW_I64_ADD32_U:
|
||||
case WASM_OP_ATOMIC_RMW_I64_SUB:
|
||||
case WASM_OP_ATOMIC_RMW_I64_SUB8_U:
|
||||
case WASM_OP_ATOMIC_RMW_I64_SUB16_U:
|
||||
case WASM_OP_ATOMIC_RMW_I64_SUB32_U:
|
||||
case WASM_OP_ATOMIC_RMW_I64_AND:
|
||||
case WASM_OP_ATOMIC_RMW_I64_AND8_U:
|
||||
case WASM_OP_ATOMIC_RMW_I64_AND16_U:
|
||||
case WASM_OP_ATOMIC_RMW_I64_AND32_U:
|
||||
case WASM_OP_ATOMIC_RMW_I64_OR:
|
||||
case WASM_OP_ATOMIC_RMW_I64_OR8_U:
|
||||
case WASM_OP_ATOMIC_RMW_I64_OR16_U:
|
||||
case WASM_OP_ATOMIC_RMW_I64_OR32_U:
|
||||
case WASM_OP_ATOMIC_RMW_I64_XOR:
|
||||
case WASM_OP_ATOMIC_RMW_I64_XOR8_U:
|
||||
case WASM_OP_ATOMIC_RMW_I64_XOR16_U:
|
||||
case WASM_OP_ATOMIC_RMW_I64_XOR32_U:
|
||||
case WASM_OP_ATOMIC_RMW_I64_XCHG:
|
||||
case WASM_OP_ATOMIC_RMW_I64_XCHG8_U:
|
||||
case WASM_OP_ATOMIC_RMW_I64_XCHG16_U:
|
||||
case WASM_OP_ATOMIC_RMW_I64_XCHG32_U:
|
||||
POP_I64();
|
||||
POP_I32();
|
||||
PUSH_I64();
|
||||
break;
|
||||
case WASM_OP_ATOMIC_RMW_I32_CMPXCHG:
|
||||
case WASM_OP_ATOMIC_RMW_I32_CMPXCHG8_U:
|
||||
case WASM_OP_ATOMIC_RMW_I32_CMPXCHG16_U:
|
||||
POP_I32();
|
||||
POP_I32();
|
||||
POP_I32();
|
||||
PUSH_I32();
|
||||
break;
|
||||
case WASM_OP_ATOMIC_RMW_I64_CMPXCHG:
|
||||
case WASM_OP_ATOMIC_RMW_I64_CMPXCHG8_U:
|
||||
case WASM_OP_ATOMIC_RMW_I64_CMPXCHG16_U:
|
||||
case WASM_OP_ATOMIC_RMW_I64_CMPXCHG32_U:
|
||||
POP_I64();
|
||||
POP_I64();
|
||||
POP_I32();
|
||||
PUSH_I64();
|
||||
break;
|
||||
default:
|
||||
bh_assert(0);
|
||||
break;
|
||||
}
|
||||
break;
|
||||
}
|
||||
#endif /* end of WASM_ENABLE_SHARED_MEMORY */
|
||||
|
||||
default:
|
||||
bh_assert(0);
|
||||
break;
|
||||
|
||||
Reference in New Issue
Block a user