diff --git a/src/Language/Wasm/Interpreter.hs b/src/Language/Wasm/Interpreter.hs index 7f45338..015037b 100644 --- a/src/Language/Wasm/Interpreter.hs +++ b/src/Language/Wasm/Interpreter.hs @@ -2277,9 +2277,9 @@ eval budget store inst FunctionInstance { funcType, moduleInstance, code = Funct _ -> error "impossible due to validation" in return $ Done ctx { stack = VV128 r : rest } - step ctx@EvalCtx{ stack = (VV128 v:rest) } (I32x4TruncSatF32x4 signed) = + step ctx@EvalCtx{ stack = (VV128 v:rest) } (I32x4TruncSatF signed sz) = let - floatTruncSat :: Bool -> Float -> Word32 + floatTruncSat :: (RealFloat f) => Bool -> f -> Word32 floatTruncSat True v | isNaN v = 0 floatTruncSat True v | v >= 2^31 = 0x7fffffff floatTruncSat True v | v < -2^31 - 1 = 0x80000000 @@ -2288,7 +2288,11 @@ eval budget store inst FunctionInstance { funcType, moduleInstance, code = Funct floatTruncSat False v | v >= 2^32 = 0xffffffff floatTruncSat False v = truncate v in - let r = floatTruncSat signed . ByteArray.indexByteArray @Float v <$> [0..3] in + let r = case sz of + BS32 -> floatTruncSat signed . ByteArray.indexByteArray @Float v <$> [0..3] + BS64 -> (floatTruncSat signed . ByteArray.indexByteArray @Double v <$> [0..1]) ++ [0, 0] + _ -> error "impossible due to validation" + in return $ Done ctx { stack = VV128 (ByteArray.byteArrayFromList @Word32 r) : rest } step EvalCtx{ stack } instr = error $ "Error during evaluation of instruction: " ++ show instr ++ ". Stack " ++ show stack eval _ _ _ HostInstance { funcType, hostCode } args = Just <$> hostCode args diff --git a/src/Language/Wasm/Parser.y b/src/Language/Wasm/Parser.y index 52be730..dd4d05d 100644 --- a/src/Language/Wasm/Parser.y +++ b/src/Language/Wasm/Parser.y @@ -113,506 +113,508 @@ import Language.Wasm.Lexer ( %token -'(' { Lexeme _ TOpenBracket } -')' { Lexeme _ TCloseBracket } -'func' { Lexeme _ (TKeyword "func") } -'param' { Lexeme _ (TKeyword "param") } -'result' { Lexeme _ (TKeyword "result") } -'i32' { Lexeme _ (TKeyword "i32") } -'i64' { Lexeme _ (TKeyword "i64") } -'f32' { Lexeme _ (TKeyword "f32") } -'f64' { Lexeme _ (TKeyword "f64") } -'v128' { Lexeme _ (TKeyword "v128") } -'mut' { Lexeme _ (TKeyword "mut") } -'funcref' { Lexeme _ (TKeyword "funcref") } -'externref' { Lexeme _ (TKeyword "externref") } -'extern' { Lexeme _ (TKeyword "extern") } -'type' { Lexeme _ (TKeyword "type") } -'unreachable' { Lexeme _ (TKeyword "unreachable") } -'nop' { Lexeme _ (TKeyword "nop") } -'br' { Lexeme _ (TKeyword "br") } -'br_if' { Lexeme _ (TKeyword "br_if") } -'br_table' { Lexeme _ (TKeyword "br_table") } -'return' { Lexeme _ (TKeyword "return") } -'call' { Lexeme _ (TKeyword "call") } -'call_indirect' { Lexeme _ (TKeyword "call_indirect") } -'ref.null' { Lexeme _ (TKeyword "ref.null") } -'ref.is_null' { Lexeme _ (TKeyword "ref.is_null") } -'ref.func' { Lexeme _ (TKeyword "ref.func") } -'ref.extern' { Lexeme _ (TKeyword "ref.extern") } -'drop' { Lexeme _ (TKeyword "drop") } -'select' { Lexeme _ (TKeyword "select") } -'get_local' { Lexeme _ (TKeyword "local.get") } -'set_local' { Lexeme _ (TKeyword "local.set") } -'tee_local' { Lexeme _ (TKeyword "local.tee") } -'get_global' { Lexeme _ (TKeyword "global.get") } -'set_global' { Lexeme _ (TKeyword "global.set") } -'i32.load' { Lexeme _ (TKeyword "i32.load") } -'i64.load' { Lexeme _ (TKeyword "i64.load") } -'f32.load' { Lexeme _ (TKeyword "f32.load") } -'f64.load' { Lexeme _ (TKeyword "f64.load") } -'v128.load' { Lexeme _ (TKeyword "v128.load") } -'v128.load8_lane' { Lexeme _ (TKeyword "v128.load8_lane") } -'v128.load16_lane' { Lexeme _ (TKeyword "v128.load16_lane") } -'v128.load32_lane' { Lexeme _ (TKeyword "v128.load32_lane") } -'v128.load64_lane' { Lexeme _ (TKeyword "v128.load64_lane") } -'v128.load8_splat' { Lexeme _ (TKeyword "v128.load8_splat") } -'v128.load16_splat' { Lexeme _ (TKeyword "v128.load16_splat") } -'v128.load32_splat' { Lexeme _ (TKeyword "v128.load32_splat") } -'v128.load64_splat' { Lexeme _ (TKeyword "v128.load64_splat") } -'v128.load32_zero' { Lexeme _ (TKeyword "v128.load32_zero") } -'v128.load64_zero' { Lexeme _ (TKeyword "v128.load64_zero") } -'v128.load8x8_s' { Lexeme _ (TKeyword "v128.load8x8_s") } -'v128.load8x8_u' { Lexeme _ (TKeyword "v128.load8x8_u") } -'v128.load16x4_s' { Lexeme _ (TKeyword "v128.load16x4_s") } -'v128.load16x4_u' { Lexeme _ (TKeyword "v128.load16x4_u") } -'v128.load32x2_s' { Lexeme _ (TKeyword "v128.load32x2_s") } -'v128.load32x2_u' { Lexeme _ (TKeyword "v128.load32x2_u") } -'i32.load8_s' { Lexeme _ (TKeyword "i32.load8_s") } -'i32.load8_u' { Lexeme _ (TKeyword "i32.load8_u") } -'i32.load16_s' { Lexeme _ (TKeyword "i32.load16_s") } -'i32.load16_u' { Lexeme _ (TKeyword "i32.load16_u") } -'i64.load8_s' { Lexeme _ (TKeyword "i64.load8_s") } -'i64.load8_u' { Lexeme _ (TKeyword "i64.load8_u") } -'i64.load16_s' { Lexeme _ (TKeyword "i64.load16_s") } -'i64.load16_u' { Lexeme _ (TKeyword "i64.load16_u") } -'i64.load32_s' { Lexeme _ (TKeyword "i64.load32_s") } -'i64.load32_u' { Lexeme _ (TKeyword "i64.load32_u") } -'i32.store' { Lexeme _ (TKeyword "i32.store") } -'i64.store' { Lexeme _ (TKeyword "i64.store") } -'f32.store' { Lexeme _ (TKeyword "f32.store") } -'f64.store' { Lexeme _ (TKeyword "f64.store") } -'v128.store' { Lexeme _ (TKeyword "v128.store") } -'v128.store8_lane' { Lexeme _ (TKeyword "v128.store8_lane") } -'v128.store16_lane' { Lexeme _ (TKeyword "v128.store16_lane") } -'v128.store32_lane' { Lexeme _ (TKeyword "v128.store32_lane") } -'v128.store64_lane' { Lexeme _ (TKeyword "v128.store64_lane") } -'i32.store8' { Lexeme _ (TKeyword "i32.store8") } -'i32.store16' { Lexeme _ (TKeyword "i32.store16") } -'i64.store8' { Lexeme _ (TKeyword "i64.store8") } -'i64.store16' { Lexeme _ (TKeyword "i64.store16") } -'i64.store32' { Lexeme _ (TKeyword "i64.store32") } -'memory.size' { Lexeme _ (TKeyword "memory.size") } -'memory.grow' { Lexeme _ (TKeyword "memory.grow") } -'memory.fill' { Lexeme _ (TKeyword "memory.fill") } -'memory.copy' { Lexeme _ (TKeyword "memory.copy") } -'memory.init' { Lexeme _ (TKeyword "memory.init") } -'data.drop' { Lexeme _ (TKeyword "data.drop") } -'table.init' { Lexeme _ (TKeyword "table.init") } -'table.copy' { Lexeme _ (TKeyword "table.copy") } -'table.fill' { Lexeme _ (TKeyword "table.fill") } -'table.size' { Lexeme _ (TKeyword "table.size") } -'table.grow' { Lexeme _ (TKeyword "table.grow") } -'table.get' { Lexeme _ (TKeyword "table.get") } -'table.set' { Lexeme _ (TKeyword "table.set") } -'elem.drop' { Lexeme _ (TKeyword "elem.drop") } -'i32.const' { Lexeme _ (TKeyword "i32.const") } -'i64.const' { Lexeme _ (TKeyword "i64.const") } -'f32.const' { Lexeme _ (TKeyword "f32.const") } -'f64.const' { Lexeme _ (TKeyword "f64.const") } -'v128.const' { Lexeme _ (TKeyword "v128.const") } -'i32.clz' { Lexeme _ (TKeyword "i32.clz") } -'i32.ctz' { Lexeme _ (TKeyword "i32.ctz") } -'i32.popcnt' { Lexeme _ (TKeyword "i32.popcnt") } -'i32.extend8_s' { Lexeme _ (TKeyword "i32.extend8_s") } -'i32.extend16_s' { Lexeme _ (TKeyword "i32.extend16_s") } -'i32.add' { Lexeme _ (TKeyword "i32.add") } -'i32.sub' { Lexeme _ (TKeyword "i32.sub") } -'i32.mul' { Lexeme _ (TKeyword "i32.mul") } -'i32.div_s' { Lexeme _ (TKeyword "i32.div_s") } -'i32.div_u' { Lexeme _ (TKeyword "i32.div_u") } -'i32.rem_s' { Lexeme _ (TKeyword "i32.rem_s") } -'i32.rem_u' { Lexeme _ (TKeyword "i32.rem_u") } -'i32.and' { Lexeme _ (TKeyword "i32.and") } -'i32.or' { Lexeme _ (TKeyword "i32.or") } -'i32.xor' { Lexeme _ (TKeyword "i32.xor") } -'i32.shl' { Lexeme _ (TKeyword "i32.shl") } -'i32.shr_s' { Lexeme _ (TKeyword "i32.shr_s") } -'i32.shr_u' { Lexeme _ (TKeyword "i32.shr_u") } -'i32.rotl' { Lexeme _ (TKeyword "i32.rotl") } -'i32.rotr' { Lexeme _ (TKeyword "i32.rotr") } -'i64.clz' { Lexeme _ (TKeyword "i64.clz") } -'i64.ctz' { Lexeme _ (TKeyword "i64.ctz") } -'i64.popcnt' { Lexeme _ (TKeyword "i64.popcnt") } -'i64.extend8_s' { Lexeme _ (TKeyword "i64.extend8_s") } -'i64.extend16_s' { Lexeme _ (TKeyword "i64.extend16_s") } -'i64.extend32_s' { Lexeme _ (TKeyword "i64.extend32_s") } -'i64.add' { Lexeme _ (TKeyword "i64.add") } -'i64.sub' { Lexeme _ (TKeyword "i64.sub") } -'i64.mul' { Lexeme _ (TKeyword "i64.mul") } -'i64.div_s' { Lexeme _ (TKeyword "i64.div_s") } -'i64.div_u' { Lexeme _ (TKeyword "i64.div_u") } -'i64.rem_s' { Lexeme _ (TKeyword "i64.rem_s") } -'i64.rem_u' { Lexeme _ (TKeyword "i64.rem_u") } -'i64.and' { Lexeme _ (TKeyword "i64.and") } -'i64.or' { Lexeme _ (TKeyword "i64.or") } -'i64.xor' { Lexeme _ (TKeyword "i64.xor") } -'i64.shl' { Lexeme _ (TKeyword "i64.shl") } -'i64.shr_s' { Lexeme _ (TKeyword "i64.shr_s") } -'i64.shr_u' { Lexeme _ (TKeyword "i64.shr_u") } -'i64.rotl' { Lexeme _ (TKeyword "i64.rotl") } -'i64.rotr' { Lexeme _ (TKeyword "i64.rotr") } -'f32.abs' { Lexeme _ (TKeyword "f32.abs") } -'f32.neg' { Lexeme _ (TKeyword "f32.neg") } -'f32.ceil' { Lexeme _ (TKeyword "f32.ceil") } -'f32.floor' { Lexeme _ (TKeyword "f32.floor") } -'f32.trunc' { Lexeme _ (TKeyword "f32.trunc") } -'f32.nearest' { Lexeme _ (TKeyword "f32.nearest") } -'f32.sqrt' { Lexeme _ (TKeyword "f32.sqrt") } -'f32.add' { Lexeme _ (TKeyword "f32.add") } -'f32.sub' { Lexeme _ (TKeyword "f32.sub") } -'f32.mul' { Lexeme _ (TKeyword "f32.mul") } -'f32.div' { Lexeme _ (TKeyword "f32.div") } -'f32.min' { Lexeme _ (TKeyword "f32.min") } -'f32.max' { Lexeme _ (TKeyword "f32.max") } -'f32.copysign' { Lexeme _ (TKeyword "f32.copysign") } -'f64.abs' { Lexeme _ (TKeyword "f64.abs") } -'f64.neg' { Lexeme _ (TKeyword "f64.neg") } -'f64.ceil' { Lexeme _ (TKeyword "f64.ceil") } -'f64.floor' { Lexeme _ (TKeyword "f64.floor") } -'f64.trunc' { Lexeme _ (TKeyword "f64.trunc") } -'f64.nearest' { Lexeme _ (TKeyword "f64.nearest") } -'f64.sqrt' { Lexeme _ (TKeyword "f64.sqrt") } -'f64.add' { Lexeme _ (TKeyword "f64.add") } -'f64.sub' { Lexeme _ (TKeyword "f64.sub") } -'f64.mul' { Lexeme _ (TKeyword "f64.mul") } -'f64.div' { Lexeme _ (TKeyword "f64.div") } -'f64.min' { Lexeme _ (TKeyword "f64.min") } -'f64.max' { Lexeme _ (TKeyword "f64.max") } -'f64.copysign' { Lexeme _ (TKeyword "f64.copysign") } -'i32.eqz' { Lexeme _ (TKeyword "i32.eqz") } -'i32.eq' { Lexeme _ (TKeyword "i32.eq") } -'i32.ne' { Lexeme _ (TKeyword "i32.ne") } -'i32.lt_s' { Lexeme _ (TKeyword "i32.lt_s") } -'i32.lt_u' { Lexeme _ (TKeyword "i32.lt_u") } -'i32.gt_s' { Lexeme _ (TKeyword "i32.gt_s") } -'i32.gt_u' { Lexeme _ (TKeyword "i32.gt_u") } -'i32.le_s' { Lexeme _ (TKeyword "i32.le_s") } -'i32.le_u' { Lexeme _ (TKeyword "i32.le_u") } -'i32.ge_s' { Lexeme _ (TKeyword "i32.ge_s") } -'i32.ge_u' { Lexeme _ (TKeyword "i32.ge_u") } -'i64.eqz' { Lexeme _ (TKeyword "i64.eqz") } -'i64.eq' { Lexeme _ (TKeyword "i64.eq") } -'i64.ne' { Lexeme _ (TKeyword "i64.ne") } -'i64.lt_s' { Lexeme _ (TKeyword "i64.lt_s") } -'i64.lt_u' { Lexeme _ (TKeyword "i64.lt_u") } -'i64.gt_s' { Lexeme _ (TKeyword "i64.gt_s") } -'i64.gt_u' { Lexeme _ (TKeyword "i64.gt_u") } -'i64.le_s' { Lexeme _ (TKeyword "i64.le_s") } -'i64.le_u' { Lexeme _ (TKeyword "i64.le_u") } -'i64.ge_s' { Lexeme _ (TKeyword "i64.ge_s") } -'i64.ge_u' { Lexeme _ (TKeyword "i64.ge_u") } -'f32.eq' { Lexeme _ (TKeyword "f32.eq") } -'f32.ne' { Lexeme _ (TKeyword "f32.ne") } -'f32.lt' { Lexeme _ (TKeyword "f32.lt") } -'f32.gt' { Lexeme _ (TKeyword "f32.gt") } -'f32.le' { Lexeme _ (TKeyword "f32.le") } -'f32.ge' { Lexeme _ (TKeyword "f32.ge") } -'f64.eq' { Lexeme _ (TKeyword "f64.eq") } -'f64.ne' { Lexeme _ (TKeyword "f64.ne") } -'f64.lt' { Lexeme _ (TKeyword "f64.lt") } -'f64.gt' { Lexeme _ (TKeyword "f64.gt") } -'f64.le' { Lexeme _ (TKeyword "f64.le") } -'f64.ge' { Lexeme _ (TKeyword "f64.ge") } -'i32.wrap_i64' { Lexeme _ (TKeyword "i32.wrap_i64") } -'i32.trunc_f32_s' { Lexeme _ (TKeyword "i32.trunc_f32_s") } -'i32.trunc_f32_u' { Lexeme _ (TKeyword "i32.trunc_f32_u") } -'i32.trunc_f64_s' { Lexeme _ (TKeyword "i32.trunc_f64_s") } -'i32.trunc_f64_u' { Lexeme _ (TKeyword "i32.trunc_f64_u") } -'i32.trunc_sat_f32_s' { Lexeme _ (TKeyword "i32.trunc_sat_f32_s") } -'i32.trunc_sat_f32_u' { Lexeme _ (TKeyword "i32.trunc_sat_f32_u") } -'i32.trunc_sat_f64_s' { Lexeme _ (TKeyword "i32.trunc_sat_f64_s") } -'i32.trunc_sat_f64_u' { Lexeme _ (TKeyword "i32.trunc_sat_f64_u") } -'i64.extend_i32_s' { Lexeme _ (TKeyword "i64.extend_i32_s") } -'i64.extend_i32_u' { Lexeme _ (TKeyword "i64.extend_i32_u") } -'i64.trunc_f32_s' { Lexeme _ (TKeyword "i64.trunc_f32_s") } -'i64.trunc_f32_u' { Lexeme _ (TKeyword "i64.trunc_f32_u") } -'i64.trunc_f64_s' { Lexeme _ (TKeyword "i64.trunc_f64_s") } -'i64.trunc_f64_u' { Lexeme _ (TKeyword "i64.trunc_f64_u") } -'i64.trunc_sat_f32_s' { Lexeme _ (TKeyword "i64.trunc_sat_f32_s") } -'i64.trunc_sat_f32_u' { Lexeme _ (TKeyword "i64.trunc_sat_f32_u") } -'i64.trunc_sat_f64_s' { Lexeme _ (TKeyword "i64.trunc_sat_f64_s") } -'i64.trunc_sat_f64_u' { Lexeme _ (TKeyword "i64.trunc_sat_f64_u") } -'f32.convert_i32_s' { Lexeme _ (TKeyword "f32.convert_i32_s") } -'f32.convert_i32_u' { Lexeme _ (TKeyword "f32.convert_i32_u") } -'f32.convert_i64_s' { Lexeme _ (TKeyword "f32.convert_i64_s") } -'f32.convert_i64_u' { Lexeme _ (TKeyword "f32.convert_i64_u") } -'f32x4.convert_i32x4_s' { Lexeme _ (TKeyword "f32x4.convert_i32x4_s") } -'f32x4.convert_i32x4_u' { Lexeme _ (TKeyword "f32x4.convert_i32x4_u") } -'f64x2.convert_low_i32x4_s' { Lexeme _ (TKeyword "f64x2.convert_low_i32x4_s") } -'f64x2.convert_low_i32x4_u' { Lexeme _ (TKeyword "f64x2.convert_low_i32x4_u") } -'i8x16.narrow_i16x8_s'{ Lexeme _ (TKeyword "i8x16.narrow_i16x8_s") } -'i8x16.narrow_i16x8_u'{ Lexeme _ (TKeyword "i8x16.narrow_i16x8_u") } -'i16x8.narrow_i32x4_s'{ Lexeme _ (TKeyword "i16x8.narrow_i32x4_s") } -'i16x8.narrow_i32x4_u'{ Lexeme _ (TKeyword "i16x8.narrow_i32x4_u") } -'f64x2.promote_low_f32x4'{ Lexeme _ (TKeyword "f64x2.promote_low_f32x4") } -'f32x4.demote_f64x2_zero'{ Lexeme _ (TKeyword "f32x4.demote_f64x2_zero") } -'f32.demote_f64' { Lexeme _ (TKeyword "f32.demote_f64") } -'f64.convert_i32_s' { Lexeme _ (TKeyword "f64.convert_i32_s") } -'f64.convert_i32_u' { Lexeme _ (TKeyword "f64.convert_i32_u") } -'f64.convert_i64_s' { Lexeme _ (TKeyword "f64.convert_i64_s") } -'f64.convert_i64_u' { Lexeme _ (TKeyword "f64.convert_i64_u") } -'f64.promote_f32' { Lexeme _ (TKeyword "f64.promote_f32") } -'i32.reinterpret_f32' { Lexeme _ (TKeyword "i32.reinterpret_f32") } -'i64.reinterpret_f64' { Lexeme _ (TKeyword "i64.reinterpret_f64") } -'f32.reinterpret_i32' { Lexeme _ (TKeyword "f32.reinterpret_i32") } -'f64.reinterpret_i64' { Lexeme _ (TKeyword "f64.reinterpret_i64") } -'i8x16' { Lexeme _ (TKeyword "i8x16") } -'i16x8' { Lexeme _ (TKeyword "i16x8") } -'i32x4' { Lexeme _ (TKeyword "i32x4") } -'i64x2' { Lexeme _ (TKeyword "i64x2") } -'f32x4' { Lexeme _ (TKeyword "f32x4") } -'f64x2' { Lexeme _ (TKeyword "f64x2") } -'block' { Lexeme _ (TKeyword "block") } -'loop' { Lexeme _ (TKeyword "loop") } -'if' { Lexeme _ (TKeyword "if") } -'else' { Lexeme _ (TKeyword "else") } -'end' { Lexeme _ (TKeyword "end") } -'then' { Lexeme _ (TKeyword "then") } -'table' { Lexeme _ (TKeyword "table") } -'memory' { Lexeme _ (TKeyword "memory") } -'global' { Lexeme _ (TKeyword "global") } -'import' { Lexeme _ (TKeyword "import") } -'export' { Lexeme _ (TKeyword "export") } -'local' { Lexeme _ (TKeyword "local") } -'elem' { Lexeme _ (TKeyword "elem") } -'item' { Lexeme _ (TKeyword "item") } -'declare' { Lexeme _ (TKeyword "declare") } -'data' { Lexeme _ (TKeyword "data") } -'offset' { Lexeme _ (TKeyword "offset") } -'start' { Lexeme _ (TKeyword "start") } -'module' { Lexeme _ (TKeyword "module") } --- simd -'i8x16.shuffle' { Lexeme _ (TKeyword "i8x16.shuffle") } -'i8x16.swizzle' { Lexeme _ (TKeyword "i8x16.swizzle") } -'i8x16.splat' { Lexeme _ (TKeyword "i8x16.splat") } -'i16x8.splat' { Lexeme _ (TKeyword "i16x8.splat") } -'i32x4.splat' { Lexeme _ (TKeyword "i32x4.splat") } -'i64x2.splat' { Lexeme _ (TKeyword "i64x2.splat") } -'f32x4.splat' { Lexeme _ (TKeyword "f32x4.splat") } -'f64x2.splat' { Lexeme _ (TKeyword "f64x2.splat") } -'i8x16.extract_lane_u'{ Lexeme _ (TKeyword "i8x16.extract_lane_u") } -'i16x8.extract_lane_u'{ Lexeme _ (TKeyword "i16x8.extract_lane_u") } -'i8x16.extract_lane_s'{ Lexeme _ (TKeyword "i8x16.extract_lane_s") } -'i16x8.extract_lane_s'{ Lexeme _ (TKeyword "i16x8.extract_lane_s") } -'i32x4.extract_lane' { Lexeme _ (TKeyword "i32x4.extract_lane") } -'i64x2.extract_lane' { Lexeme _ (TKeyword "i64x2.extract_lane") } -'f32x4.extract_lane' { Lexeme _ (TKeyword "f32x4.extract_lane") } -'f64x2.extract_lane' { Lexeme _ (TKeyword "f64x2.extract_lane") } -'i8x16.replace_lane' { Lexeme _ (TKeyword "i8x16.replace_lane") } -'i16x8.replace_lane' { Lexeme _ (TKeyword "i16x8.replace_lane") } -'i32x4.replace_lane' { Lexeme _ (TKeyword "i32x4.replace_lane") } -'i64x2.replace_lane' { Lexeme _ (TKeyword "i64x2.replace_lane") } -'f32x4.replace_lane' { Lexeme _ (TKeyword "f32x4.replace_lane") } -'f64x2.replace_lane' { Lexeme _ (TKeyword "f64x2.replace_lane") } -'i8x16.all_true' { Lexeme _ (TKeyword "i8x16.all_true") } -'i16x8.all_true' { Lexeme _ (TKeyword "i16x8.all_true") } -'i32x4.all_true' { Lexeme _ (TKeyword "i32x4.all_true") } -'i64x2.all_true' { Lexeme _ (TKeyword "i64x2.all_true") } -'i8x16.popcnt' { Lexeme _ (TKeyword "i8x16.popcnt") } -'v128.not' { Lexeme _ (TKeyword "v128.not") } -'v128.and' { Lexeme _ (TKeyword "v128.and") } -'v128.andnot' { Lexeme _ (TKeyword "v128.andnot") } -'v128.or' { Lexeme _ (TKeyword "v128.or") } -'v128.xor' { Lexeme _ (TKeyword "v128.xor") } -'v128.any_true' { Lexeme _ (TKeyword "v128.any_true") } -'v128.bitselect' { Lexeme _ (TKeyword "v128.bitselect") } -'i8x16.add' { Lexeme _ (TKeyword "i8x16.add") } -'i16x8.add' { Lexeme _ (TKeyword "i16x8.add") } -'i32x4.add' { Lexeme _ (TKeyword "i32x4.add") } -'i64x2.add' { Lexeme _ (TKeyword "i64x2.add") } -'i8x16.sub' { Lexeme _ (TKeyword "i8x16.sub") } -'i16x8.sub' { Lexeme _ (TKeyword "i16x8.sub") } -'i32x4.sub' { Lexeme _ (TKeyword "i32x4.sub") } -'i64x2.sub' { Lexeme _ (TKeyword "i64x2.sub") } -'i8x16.add_sat_s' { Lexeme _ (TKeyword "i8x16.add_sat_s") } -'i16x8.add_sat_s' { Lexeme _ (TKeyword "i16x8.add_sat_s") } -'i8x16.sub_sat_s' { Lexeme _ (TKeyword "i8x16.sub_sat_s") } -'i16x8.sub_sat_s' { Lexeme _ (TKeyword "i16x8.sub_sat_s") } -'i8x16.add_sat_u' { Lexeme _ (TKeyword "i8x16.add_sat_u") } -'i16x8.add_sat_u' { Lexeme _ (TKeyword "i16x8.add_sat_u") } -'i8x16.sub_sat_u' { Lexeme _ (TKeyword "i8x16.sub_sat_u") } -'i16x8.sub_sat_u' { Lexeme _ (TKeyword "i16x8.sub_sat_u") } -'i8x16.avgr_u' { Lexeme _ (TKeyword "i8x16.avgr_u") } -'i16x8.avgr_u' { Lexeme _ (TKeyword "i16x8.avgr_u") } +'(' { Lexeme _ TOpenBracket } +')' { Lexeme _ TCloseBracket } +'func' { Lexeme _ (TKeyword "func") } +'param' { Lexeme _ (TKeyword "param") } +'result' { Lexeme _ (TKeyword "result") } +'i32' { Lexeme _ (TKeyword "i32") } +'i64' { Lexeme _ (TKeyword "i64") } +'f32' { Lexeme _ (TKeyword "f32") } +'f64' { Lexeme _ (TKeyword "f64") } +'v128' { Lexeme _ (TKeyword "v128") } +'mut' { Lexeme _ (TKeyword "mut") } +'funcref' { Lexeme _ (TKeyword "funcref") } +'externref' { Lexeme _ (TKeyword "externref") } +'extern' { Lexeme _ (TKeyword "extern") } +'type' { Lexeme _ (TKeyword "type") } +'unreachable' { Lexeme _ (TKeyword "unreachable") } +'nop' { Lexeme _ (TKeyword "nop") } +'br' { Lexeme _ (TKeyword "br") } +'br_if' { Lexeme _ (TKeyword "br_if") } +'br_table' { Lexeme _ (TKeyword "br_table") } +'return' { Lexeme _ (TKeyword "return") } +'call' { Lexeme _ (TKeyword "call") } +'call_indirect' { Lexeme _ (TKeyword "call_indirect") } +'ref.null' { Lexeme _ (TKeyword "ref.null") } +'ref.is_null' { Lexeme _ (TKeyword "ref.is_null") } +'ref.func' { Lexeme _ (TKeyword "ref.func") } +'ref.extern' { Lexeme _ (TKeyword "ref.extern") } +'drop' { Lexeme _ (TKeyword "drop") } +'select' { Lexeme _ (TKeyword "select") } +'get_local' { Lexeme _ (TKeyword "local.get") } +'set_local' { Lexeme _ (TKeyword "local.set") } +'tee_local' { Lexeme _ (TKeyword "local.tee") } +'get_global' { Lexeme _ (TKeyword "global.get") } +'set_global' { Lexeme _ (TKeyword "global.set") } +'i32.load' { Lexeme _ (TKeyword "i32.load") } +'i64.load' { Lexeme _ (TKeyword "i64.load") } +'f32.load' { Lexeme _ (TKeyword "f32.load") } +'f64.load' { Lexeme _ (TKeyword "f64.load") } +'v128.load' { Lexeme _ (TKeyword "v128.load") } +'v128.load8_lane' { Lexeme _ (TKeyword "v128.load8_lane") } +'v128.load16_lane' { Lexeme _ (TKeyword "v128.load16_lane") } +'v128.load32_lane' { Lexeme _ (TKeyword "v128.load32_lane") } +'v128.load64_lane' { Lexeme _ (TKeyword "v128.load64_lane") } +'v128.load8_splat' { Lexeme _ (TKeyword "v128.load8_splat") } +'v128.load16_splat' { Lexeme _ (TKeyword "v128.load16_splat") } +'v128.load32_splat' { Lexeme _ (TKeyword "v128.load32_splat") } +'v128.load64_splat' { Lexeme _ (TKeyword "v128.load64_splat") } +'v128.load32_zero' { Lexeme _ (TKeyword "v128.load32_zero") } +'v128.load64_zero' { Lexeme _ (TKeyword "v128.load64_zero") } +'v128.load8x8_s' { Lexeme _ (TKeyword "v128.load8x8_s") } +'v128.load8x8_u' { Lexeme _ (TKeyword "v128.load8x8_u") } +'v128.load16x4_s' { Lexeme _ (TKeyword "v128.load16x4_s") } +'v128.load16x4_u' { Lexeme _ (TKeyword "v128.load16x4_u") } +'v128.load32x2_s' { Lexeme _ (TKeyword "v128.load32x2_s") } +'v128.load32x2_u' { Lexeme _ (TKeyword "v128.load32x2_u") } +'i32.load8_s' { Lexeme _ (TKeyword "i32.load8_s") } +'i32.load8_u' { Lexeme _ (TKeyword "i32.load8_u") } +'i32.load16_s' { Lexeme _ (TKeyword "i32.load16_s") } +'i32.load16_u' { Lexeme _ (TKeyword "i32.load16_u") } +'i64.load8_s' { Lexeme _ (TKeyword "i64.load8_s") } +'i64.load8_u' { Lexeme _ (TKeyword "i64.load8_u") } +'i64.load16_s' { Lexeme _ (TKeyword "i64.load16_s") } +'i64.load16_u' { Lexeme _ (TKeyword "i64.load16_u") } +'i64.load32_s' { Lexeme _ (TKeyword "i64.load32_s") } +'i64.load32_u' { Lexeme _ (TKeyword "i64.load32_u") } +'i32.store' { Lexeme _ (TKeyword "i32.store") } +'i64.store' { Lexeme _ (TKeyword "i64.store") } +'f32.store' { Lexeme _ (TKeyword "f32.store") } +'f64.store' { Lexeme _ (TKeyword "f64.store") } +'v128.store' { Lexeme _ (TKeyword "v128.store") } +'v128.store8_lane' { Lexeme _ (TKeyword "v128.store8_lane") } +'v128.store16_lane' { Lexeme _ (TKeyword "v128.store16_lane") } +'v128.store32_lane' { Lexeme _ (TKeyword "v128.store32_lane") } +'v128.store64_lane' { Lexeme _ (TKeyword "v128.store64_lane") } +'i32.store8' { Lexeme _ (TKeyword "i32.store8") } +'i32.store16' { Lexeme _ (TKeyword "i32.store16") } +'i64.store8' { Lexeme _ (TKeyword "i64.store8") } +'i64.store16' { Lexeme _ (TKeyword "i64.store16") } +'i64.store32' { Lexeme _ (TKeyword "i64.store32") } +'memory.size' { Lexeme _ (TKeyword "memory.size") } +'memory.grow' { Lexeme _ (TKeyword "memory.grow") } +'memory.fill' { Lexeme _ (TKeyword "memory.fill") } +'memory.copy' { Lexeme _ (TKeyword "memory.copy") } +'memory.init' { Lexeme _ (TKeyword "memory.init") } +'data.drop' { Lexeme _ (TKeyword "data.drop") } +'table.init' { Lexeme _ (TKeyword "table.init") } +'table.copy' { Lexeme _ (TKeyword "table.copy") } +'table.fill' { Lexeme _ (TKeyword "table.fill") } +'table.size' { Lexeme _ (TKeyword "table.size") } +'table.grow' { Lexeme _ (TKeyword "table.grow") } +'table.get' { Lexeme _ (TKeyword "table.get") } +'table.set' { Lexeme _ (TKeyword "table.set") } +'elem.drop' { Lexeme _ (TKeyword "elem.drop") } +'i32.const' { Lexeme _ (TKeyword "i32.const") } +'i64.const' { Lexeme _ (TKeyword "i64.const") } +'f32.const' { Lexeme _ (TKeyword "f32.const") } +'f64.const' { Lexeme _ (TKeyword "f64.const") } +'v128.const' { Lexeme _ (TKeyword "v128.const") } +'i32.clz' { Lexeme _ (TKeyword "i32.clz") } +'i32.ctz' { Lexeme _ (TKeyword "i32.ctz") } +'i32.popcnt' { Lexeme _ (TKeyword "i32.popcnt") } +'i32.extend8_s' { Lexeme _ (TKeyword "i32.extend8_s") } +'i32.extend16_s' { Lexeme _ (TKeyword "i32.extend16_s") } +'i32.add' { Lexeme _ (TKeyword "i32.add") } +'i32.sub' { Lexeme _ (TKeyword "i32.sub") } +'i32.mul' { Lexeme _ (TKeyword "i32.mul") } +'i32.div_s' { Lexeme _ (TKeyword "i32.div_s") } +'i32.div_u' { Lexeme _ (TKeyword "i32.div_u") } +'i32.rem_s' { Lexeme _ (TKeyword "i32.rem_s") } +'i32.rem_u' { Lexeme _ (TKeyword "i32.rem_u") } +'i32.and' { Lexeme _ (TKeyword "i32.and") } +'i32.or' { Lexeme _ (TKeyword "i32.or") } +'i32.xor' { Lexeme _ (TKeyword "i32.xor") } +'i32.shl' { Lexeme _ (TKeyword "i32.shl") } +'i32.shr_s' { Lexeme _ (TKeyword "i32.shr_s") } +'i32.shr_u' { Lexeme _ (TKeyword "i32.shr_u") } +'i32.rotl' { Lexeme _ (TKeyword "i32.rotl") } +'i32.rotr' { Lexeme _ (TKeyword "i32.rotr") } +'i64.clz' { Lexeme _ (TKeyword "i64.clz") } +'i64.ctz' { Lexeme _ (TKeyword "i64.ctz") } +'i64.popcnt' { Lexeme _ (TKeyword "i64.popcnt") } +'i64.extend8_s' { Lexeme _ (TKeyword "i64.extend8_s") } +'i64.extend16_s' { Lexeme _ (TKeyword "i64.extend16_s") } +'i64.extend32_s' { Lexeme _ (TKeyword "i64.extend32_s") } +'i64.add' { Lexeme _ (TKeyword "i64.add") } +'i64.sub' { Lexeme _ (TKeyword "i64.sub") } +'i64.mul' { Lexeme _ (TKeyword "i64.mul") } +'i64.div_s' { Lexeme _ (TKeyword "i64.div_s") } +'i64.div_u' { Lexeme _ (TKeyword "i64.div_u") } +'i64.rem_s' { Lexeme _ (TKeyword "i64.rem_s") } +'i64.rem_u' { Lexeme _ (TKeyword "i64.rem_u") } +'i64.and' { Lexeme _ (TKeyword "i64.and") } +'i64.or' { Lexeme _ (TKeyword "i64.or") } +'i64.xor' { Lexeme _ (TKeyword "i64.xor") } +'i64.shl' { Lexeme _ (TKeyword "i64.shl") } +'i64.shr_s' { Lexeme _ (TKeyword "i64.shr_s") } +'i64.shr_u' { Lexeme _ (TKeyword "i64.shr_u") } +'i64.rotl' { Lexeme _ (TKeyword "i64.rotl") } +'i64.rotr' { Lexeme _ (TKeyword "i64.rotr") } +'f32.abs' { Lexeme _ (TKeyword "f32.abs") } +'f32.neg' { Lexeme _ (TKeyword "f32.neg") } +'f32.ceil' { Lexeme _ (TKeyword "f32.ceil") } +'f32.floor' { Lexeme _ (TKeyword "f32.floor") } +'f32.trunc' { Lexeme _ (TKeyword "f32.trunc") } +'f32.nearest' { Lexeme _ (TKeyword "f32.nearest") } +'f32.sqrt' { Lexeme _ (TKeyword "f32.sqrt") } +'f32.add' { Lexeme _ (TKeyword "f32.add") } +'f32.sub' { Lexeme _ (TKeyword "f32.sub") } +'f32.mul' { Lexeme _ (TKeyword "f32.mul") } +'f32.div' { Lexeme _ (TKeyword "f32.div") } +'f32.min' { Lexeme _ (TKeyword "f32.min") } +'f32.max' { Lexeme _ (TKeyword "f32.max") } +'f32.copysign' { Lexeme _ (TKeyword "f32.copysign") } +'f64.abs' { Lexeme _ (TKeyword "f64.abs") } +'f64.neg' { Lexeme _ (TKeyword "f64.neg") } +'f64.ceil' { Lexeme _ (TKeyword "f64.ceil") } +'f64.floor' { Lexeme _ (TKeyword "f64.floor") } +'f64.trunc' { Lexeme _ (TKeyword "f64.trunc") } +'f64.nearest' { Lexeme _ (TKeyword "f64.nearest") } +'f64.sqrt' { Lexeme _ (TKeyword "f64.sqrt") } +'f64.add' { Lexeme _ (TKeyword "f64.add") } +'f64.sub' { Lexeme _ (TKeyword "f64.sub") } +'f64.mul' { Lexeme _ (TKeyword "f64.mul") } +'f64.div' { Lexeme _ (TKeyword "f64.div") } +'f64.min' { Lexeme _ (TKeyword "f64.min") } +'f64.max' { Lexeme _ (TKeyword "f64.max") } +'f64.copysign' { Lexeme _ (TKeyword "f64.copysign") } +'i32.eqz' { Lexeme _ (TKeyword "i32.eqz") } +'i32.eq' { Lexeme _ (TKeyword "i32.eq") } +'i32.ne' { Lexeme _ (TKeyword "i32.ne") } +'i32.lt_s' { Lexeme _ (TKeyword "i32.lt_s") } +'i32.lt_u' { Lexeme _ (TKeyword "i32.lt_u") } +'i32.gt_s' { Lexeme _ (TKeyword "i32.gt_s") } +'i32.gt_u' { Lexeme _ (TKeyword "i32.gt_u") } +'i32.le_s' { Lexeme _ (TKeyword "i32.le_s") } +'i32.le_u' { Lexeme _ (TKeyword "i32.le_u") } +'i32.ge_s' { Lexeme _ (TKeyword "i32.ge_s") } +'i32.ge_u' { Lexeme _ (TKeyword "i32.ge_u") } +'i64.eqz' { Lexeme _ (TKeyword "i64.eqz") } +'i64.eq' { Lexeme _ (TKeyword "i64.eq") } +'i64.ne' { Lexeme _ (TKeyword "i64.ne") } +'i64.lt_s' { Lexeme _ (TKeyword "i64.lt_s") } +'i64.lt_u' { Lexeme _ (TKeyword "i64.lt_u") } +'i64.gt_s' { Lexeme _ (TKeyword "i64.gt_s") } +'i64.gt_u' { Lexeme _ (TKeyword "i64.gt_u") } +'i64.le_s' { Lexeme _ (TKeyword "i64.le_s") } +'i64.le_u' { Lexeme _ (TKeyword "i64.le_u") } +'i64.ge_s' { Lexeme _ (TKeyword "i64.ge_s") } +'i64.ge_u' { Lexeme _ (TKeyword "i64.ge_u") } +'f32.eq' { Lexeme _ (TKeyword "f32.eq") } +'f32.ne' { Lexeme _ (TKeyword "f32.ne") } +'f32.lt' { Lexeme _ (TKeyword "f32.lt") } +'f32.gt' { Lexeme _ (TKeyword "f32.gt") } +'f32.le' { Lexeme _ (TKeyword "f32.le") } +'f32.ge' { Lexeme _ (TKeyword "f32.ge") } +'f64.eq' { Lexeme _ (TKeyword "f64.eq") } +'f64.ne' { Lexeme _ (TKeyword "f64.ne") } +'f64.lt' { Lexeme _ (TKeyword "f64.lt") } +'f64.gt' { Lexeme _ (TKeyword "f64.gt") } +'f64.le' { Lexeme _ (TKeyword "f64.le") } +'f64.ge' { Lexeme _ (TKeyword "f64.ge") } +'i32.wrap_i64' { Lexeme _ (TKeyword "i32.wrap_i64") } +'i32.trunc_f32_s' { Lexeme _ (TKeyword "i32.trunc_f32_s") } +'i32.trunc_f32_u' { Lexeme _ (TKeyword "i32.trunc_f32_u") } +'i32.trunc_f64_s' { Lexeme _ (TKeyword "i32.trunc_f64_s") } +'i32.trunc_f64_u' { Lexeme _ (TKeyword "i32.trunc_f64_u") } +'i32.trunc_sat_f32_s' { Lexeme _ (TKeyword "i32.trunc_sat_f32_s") } +'i32.trunc_sat_f32_u' { Lexeme _ (TKeyword "i32.trunc_sat_f32_u") } +'i32.trunc_sat_f64_s' { Lexeme _ (TKeyword "i32.trunc_sat_f64_s") } +'i32.trunc_sat_f64_u' { Lexeme _ (TKeyword "i32.trunc_sat_f64_u") } +'i64.extend_i32_s' { Lexeme _ (TKeyword "i64.extend_i32_s") } +'i64.extend_i32_u' { Lexeme _ (TKeyword "i64.extend_i32_u") } +'i64.trunc_f32_s' { Lexeme _ (TKeyword "i64.trunc_f32_s") } +'i64.trunc_f32_u' { Lexeme _ (TKeyword "i64.trunc_f32_u") } +'i64.trunc_f64_s' { Lexeme _ (TKeyword "i64.trunc_f64_s") } +'i64.trunc_f64_u' { Lexeme _ (TKeyword "i64.trunc_f64_u") } +'i64.trunc_sat_f32_s' { Lexeme _ (TKeyword "i64.trunc_sat_f32_s") } +'i64.trunc_sat_f32_u' { Lexeme _ (TKeyword "i64.trunc_sat_f32_u") } +'i64.trunc_sat_f64_s' { Lexeme _ (TKeyword "i64.trunc_sat_f64_s") } +'i64.trunc_sat_f64_u' { Lexeme _ (TKeyword "i64.trunc_sat_f64_u") } +'f32.convert_i32_s' { Lexeme _ (TKeyword "f32.convert_i32_s") } +'f32.convert_i32_u' { Lexeme _ (TKeyword "f32.convert_i32_u") } +'f32.convert_i64_s' { Lexeme _ (TKeyword "f32.convert_i64_s") } +'f32.convert_i64_u' { Lexeme _ (TKeyword "f32.convert_i64_u") } +'f32x4.convert_i32x4_s' { Lexeme _ (TKeyword "f32x4.convert_i32x4_s") } +'f32x4.convert_i32x4_u' { Lexeme _ (TKeyword "f32x4.convert_i32x4_u") } +'f64x2.convert_low_i32x4_s' { Lexeme _ (TKeyword "f64x2.convert_low_i32x4_s") } +'f64x2.convert_low_i32x4_u' { Lexeme _ (TKeyword "f64x2.convert_low_i32x4_u") } +'i8x16.narrow_i16x8_s' { Lexeme _ (TKeyword "i8x16.narrow_i16x8_s") } +'i8x16.narrow_i16x8_u' { Lexeme _ (TKeyword "i8x16.narrow_i16x8_u") } +'i16x8.narrow_i32x4_s' { Lexeme _ (TKeyword "i16x8.narrow_i32x4_s") } +'i16x8.narrow_i32x4_u' { Lexeme _ (TKeyword "i16x8.narrow_i32x4_u") } +'f64x2.promote_low_f32x4' { Lexeme _ (TKeyword "f64x2.promote_low_f32x4") } +'f32x4.demote_f64x2_zero' { Lexeme _ (TKeyword "f32x4.demote_f64x2_zero") } +'f32.demote_f64' { Lexeme _ (TKeyword "f32.demote_f64") } +'f64.convert_i32_s' { Lexeme _ (TKeyword "f64.convert_i32_s") } +'f64.convert_i32_u' { Lexeme _ (TKeyword "f64.convert_i32_u") } +'f64.convert_i64_s' { Lexeme _ (TKeyword "f64.convert_i64_s") } +'f64.convert_i64_u' { Lexeme _ (TKeyword "f64.convert_i64_u") } +'f64.promote_f32' { Lexeme _ (TKeyword "f64.promote_f32") } +'i32.reinterpret_f32' { Lexeme _ (TKeyword "i32.reinterpret_f32") } +'i64.reinterpret_f64' { Lexeme _ (TKeyword "i64.reinterpret_f64") } +'f32.reinterpret_i32' { Lexeme _ (TKeyword "f32.reinterpret_i32") } +'f64.reinterpret_i64' { Lexeme _ (TKeyword "f64.reinterpret_i64") } +'i8x16' { Lexeme _ (TKeyword "i8x16") } +'i16x8' { Lexeme _ (TKeyword "i16x8") } +'i32x4' { Lexeme _ (TKeyword "i32x4") } +'i64x2' { Lexeme _ (TKeyword "i64x2") } +'f32x4' { Lexeme _ (TKeyword "f32x4") } +'f64x2' { Lexeme _ (TKeyword "f64x2") } +'block' { Lexeme _ (TKeyword "block") } +'loop' { Lexeme _ (TKeyword "loop") } +'if' { Lexeme _ (TKeyword "if") } +'else' { Lexeme _ (TKeyword "else") } +'end' { Lexeme _ (TKeyword "end") } +'then' { Lexeme _ (TKeyword "then") } +'table' { Lexeme _ (TKeyword "table") } +'memory' { Lexeme _ (TKeyword "memory") } +'global' { Lexeme _ (TKeyword "global") } +'import' { Lexeme _ (TKeyword "import") } +'export' { Lexeme _ (TKeyword "export") } +'local' { Lexeme _ (TKeyword "local") } +'elem' { Lexeme _ (TKeyword "elem") } +'item' { Lexeme _ (TKeyword "item") } +'declare' { Lexeme _ (TKeyword "declare") } +'data' { Lexeme _ (TKeyword "data") } +'offset' { Lexeme _ (TKeyword "offset") } +'start' { Lexeme _ (TKeyword "start") } +'module' { Lexeme _ (TKeyword "module") } +-- simd +'i8x16.shuffle' { Lexeme _ (TKeyword "i8x16.shuffle") } +'i8x16.swizzle' { Lexeme _ (TKeyword "i8x16.swizzle") } +'i8x16.splat' { Lexeme _ (TKeyword "i8x16.splat") } +'i16x8.splat' { Lexeme _ (TKeyword "i16x8.splat") } +'i32x4.splat' { Lexeme _ (TKeyword "i32x4.splat") } +'i64x2.splat' { Lexeme _ (TKeyword "i64x2.splat") } +'f32x4.splat' { Lexeme _ (TKeyword "f32x4.splat") } +'f64x2.splat' { Lexeme _ (TKeyword "f64x2.splat") } +'i8x16.extract_lane_u' { Lexeme _ (TKeyword "i8x16.extract_lane_u") } +'i16x8.extract_lane_u' { Lexeme _ (TKeyword "i16x8.extract_lane_u") } +'i8x16.extract_lane_s' { Lexeme _ (TKeyword "i8x16.extract_lane_s") } +'i16x8.extract_lane_s' { Lexeme _ (TKeyword "i16x8.extract_lane_s") } +'i32x4.extract_lane' { Lexeme _ (TKeyword "i32x4.extract_lane") } +'i64x2.extract_lane' { Lexeme _ (TKeyword "i64x2.extract_lane") } +'f32x4.extract_lane' { Lexeme _ (TKeyword "f32x4.extract_lane") } +'f64x2.extract_lane' { Lexeme _ (TKeyword "f64x2.extract_lane") } +'i8x16.replace_lane' { Lexeme _ (TKeyword "i8x16.replace_lane") } +'i16x8.replace_lane' { Lexeme _ (TKeyword "i16x8.replace_lane") } +'i32x4.replace_lane' { Lexeme _ (TKeyword "i32x4.replace_lane") } +'i64x2.replace_lane' { Lexeme _ (TKeyword "i64x2.replace_lane") } +'f32x4.replace_lane' { Lexeme _ (TKeyword "f32x4.replace_lane") } +'f64x2.replace_lane' { Lexeme _ (TKeyword "f64x2.replace_lane") } +'i8x16.all_true' { Lexeme _ (TKeyword "i8x16.all_true") } +'i16x8.all_true' { Lexeme _ (TKeyword "i16x8.all_true") } +'i32x4.all_true' { Lexeme _ (TKeyword "i32x4.all_true") } +'i64x2.all_true' { Lexeme _ (TKeyword "i64x2.all_true") } +'i8x16.popcnt' { Lexeme _ (TKeyword "i8x16.popcnt") } +'v128.not' { Lexeme _ (TKeyword "v128.not") } +'v128.and' { Lexeme _ (TKeyword "v128.and") } +'v128.andnot' { Lexeme _ (TKeyword "v128.andnot") } +'v128.or' { Lexeme _ (TKeyword "v128.or") } +'v128.xor' { Lexeme _ (TKeyword "v128.xor") } +'v128.any_true' { Lexeme _ (TKeyword "v128.any_true") } +'v128.bitselect' { Lexeme _ (TKeyword "v128.bitselect") } +'i8x16.add' { Lexeme _ (TKeyword "i8x16.add") } +'i16x8.add' { Lexeme _ (TKeyword "i16x8.add") } +'i32x4.add' { Lexeme _ (TKeyword "i32x4.add") } +'i64x2.add' { Lexeme _ (TKeyword "i64x2.add") } +'i8x16.sub' { Lexeme _ (TKeyword "i8x16.sub") } +'i16x8.sub' { Lexeme _ (TKeyword "i16x8.sub") } +'i32x4.sub' { Lexeme _ (TKeyword "i32x4.sub") } +'i64x2.sub' { Lexeme _ (TKeyword "i64x2.sub") } +'i8x16.add_sat_s' { Lexeme _ (TKeyword "i8x16.add_sat_s") } +'i16x8.add_sat_s' { Lexeme _ (TKeyword "i16x8.add_sat_s") } +'i8x16.sub_sat_s' { Lexeme _ (TKeyword "i8x16.sub_sat_s") } +'i16x8.sub_sat_s' { Lexeme _ (TKeyword "i16x8.sub_sat_s") } +'i8x16.add_sat_u' { Lexeme _ (TKeyword "i8x16.add_sat_u") } +'i16x8.add_sat_u' { Lexeme _ (TKeyword "i16x8.add_sat_u") } +'i8x16.sub_sat_u' { Lexeme _ (TKeyword "i8x16.sub_sat_u") } +'i16x8.sub_sat_u' { Lexeme _ (TKeyword "i16x8.sub_sat_u") } +'i8x16.avgr_u' { Lexeme _ (TKeyword "i8x16.avgr_u") } +'i16x8.avgr_u' { Lexeme _ (TKeyword "i16x8.avgr_u") } 'i16x8.extadd_pairwise_i8x16_s' { Lexeme _ (TKeyword "i16x8.extadd_pairwise_i8x16_s") } 'i32x4.extadd_pairwise_i16x8_s' { Lexeme _ (TKeyword "i32x4.extadd_pairwise_i16x8_s") } 'i16x8.extadd_pairwise_i8x16_u' { Lexeme _ (TKeyword "i16x8.extadd_pairwise_i8x16_u") } 'i32x4.extadd_pairwise_i16x8_u' { Lexeme _ (TKeyword "i32x4.extadd_pairwise_i16x8_u") } -'i16x8.extmul_low_i8x16_s' { Lexeme _ (TKeyword "i16x8.extmul_low_i8x16_s") } -'i32x4.extmul_low_i16x8_s' { Lexeme _ (TKeyword "i32x4.extmul_low_i16x8_s") } -'i64x2.extmul_low_i32x4_s' { Lexeme _ (TKeyword "i64x2.extmul_low_i32x4_s") } -'i16x8.extmul_low_i8x16_u' { Lexeme _ (TKeyword "i16x8.extmul_low_i8x16_u") } -'i32x4.extmul_low_i16x8_u' { Lexeme _ (TKeyword "i32x4.extmul_low_i16x8_u") } -'i64x2.extmul_low_i32x4_u' { Lexeme _ (TKeyword "i64x2.extmul_low_i32x4_u") } -'i16x8.extmul_high_i8x16_s' { Lexeme _ (TKeyword "i16x8.extmul_high_i8x16_s") } -'i32x4.extmul_high_i16x8_s' { Lexeme _ (TKeyword "i32x4.extmul_high_i16x8_s") } -'i64x2.extmul_high_i32x4_s' { Lexeme _ (TKeyword "i64x2.extmul_high_i32x4_s") } -'i16x8.extmul_high_i8x16_u' { Lexeme _ (TKeyword "i16x8.extmul_high_i8x16_u") } -'i32x4.extmul_high_i16x8_u' { Lexeme _ (TKeyword "i32x4.extmul_high_i16x8_u") } -'i64x2.extmul_high_i32x4_u' { Lexeme _ (TKeyword "i64x2.extmul_high_i32x4_u") } -'i8x16.min_s' { Lexeme _ (TKeyword "i8x16.min_s") } -'i16x8.min_s' { Lexeme _ (TKeyword "i16x8.min_s") } -'i32x4.min_s' { Lexeme _ (TKeyword "i32x4.min_s") } -'i8x16.min_u' { Lexeme _ (TKeyword "i8x16.min_u") } -'i16x8.min_u' { Lexeme _ (TKeyword "i16x8.min_u") } -'i32x4.min_u' { Lexeme _ (TKeyword "i32x4.min_u") } -'i8x16.max_s' { Lexeme _ (TKeyword "i8x16.max_s") } -'i16x8.max_s' { Lexeme _ (TKeyword "i16x8.max_s") } -'i32x4.max_s' { Lexeme _ (TKeyword "i32x4.max_s") } -'i8x16.max_u' { Lexeme _ (TKeyword "i8x16.max_u") } -'i16x8.max_u' { Lexeme _ (TKeyword "i16x8.max_u") } -'i32x4.max_u' { Lexeme _ (TKeyword "i32x4.max_u") } -'i16x8.mul' { Lexeme _ (TKeyword "i16x8.mul") } -'i32x4.mul' { Lexeme _ (TKeyword "i32x4.mul") } -'i64x2.mul' { Lexeme _ (TKeyword "i64x2.mul") } -'i8x16.abs' { Lexeme _ (TKeyword "i8x16.abs") } -'i16x8.abs' { Lexeme _ (TKeyword "i16x8.abs") } -'i32x4.abs' { Lexeme _ (TKeyword "i32x4.abs") } -'i64x2.abs' { Lexeme _ (TKeyword "i64x2.abs") } -'i8x16.neg' { Lexeme _ (TKeyword "i8x16.neg") } -'i16x8.neg' { Lexeme _ (TKeyword "i16x8.neg") } -'i32x4.neg' { Lexeme _ (TKeyword "i32x4.neg") } -'i64x2.neg' { Lexeme _ (TKeyword "i64x2.neg") } -'i8x16.shl' { Lexeme _ (TKeyword "i8x16.shl") } -'i16x8.shl' { Lexeme _ (TKeyword "i16x8.shl") } -'i32x4.shl' { Lexeme _ (TKeyword "i32x4.shl") } -'i64x2.shl' { Lexeme _ (TKeyword "i64x2.shl") } -'i8x16.shr_u' { Lexeme _ (TKeyword "i8x16.shr_u") } -'i16x8.shr_u' { Lexeme _ (TKeyword "i16x8.shr_u") } -'i32x4.shr_u' { Lexeme _ (TKeyword "i32x4.shr_u") } -'i64x2.shr_u' { Lexeme _ (TKeyword "i64x2.shr_u") } -'i8x16.shr_s' { Lexeme _ (TKeyword "i8x16.shr_s") } -'i16x8.shr_s' { Lexeme _ (TKeyword "i16x8.shr_s") } -'i32x4.shr_s' { Lexeme _ (TKeyword "i32x4.shr_s") } -'i64x2.shr_s' { Lexeme _ (TKeyword "i64x2.shr_s") } -'i8x16.bitmask' { Lexeme _ (TKeyword "i8x16.bitmask") } -'i16x8.bitmask' { Lexeme _ (TKeyword "i16x8.bitmask") } -'i32x4.bitmask' { Lexeme _ (TKeyword "i32x4.bitmask") } -'i64x2.bitmask' { Lexeme _ (TKeyword "i64x2.bitmask") } -'i8x16.eq' { Lexeme _ (TKeyword "i8x16.eq") } -'i16x8.eq' { Lexeme _ (TKeyword "i16x8.eq") } -'i32x4.eq' { Lexeme _ (TKeyword "i32x4.eq") } -'i64x2.eq' { Lexeme _ (TKeyword "i64x2.eq") } -'i8x16.ne' { Lexeme _ (TKeyword "i8x16.ne") } -'i16x8.ne' { Lexeme _ (TKeyword "i16x8.ne") } -'i32x4.ne' { Lexeme _ (TKeyword "i32x4.ne") } -'i64x2.ne' { Lexeme _ (TKeyword "i64x2.ne") } -'i8x16.lt_s' { Lexeme _ (TKeyword "i8x16.lt_s") } -'i16x8.lt_s' { Lexeme _ (TKeyword "i16x8.lt_s") } -'i32x4.lt_s' { Lexeme _ (TKeyword "i32x4.lt_s") } -'i64x2.lt_s' { Lexeme _ (TKeyword "i64x2.lt_s") } -'i8x16.lt_u' { Lexeme _ (TKeyword "i8x16.lt_u") } -'i16x8.lt_u' { Lexeme _ (TKeyword "i16x8.lt_u") } -'i32x4.lt_u' { Lexeme _ (TKeyword "i32x4.lt_u") } -'i64x2.lt_u' { Lexeme _ (TKeyword "i64x2.lt_u") } -'i8x16.le_s' { Lexeme _ (TKeyword "i8x16.le_s") } -'i16x8.le_s' { Lexeme _ (TKeyword "i16x8.le_s") } -'i32x4.le_s' { Lexeme _ (TKeyword "i32x4.le_s") } -'i64x2.le_s' { Lexeme _ (TKeyword "i64x2.le_s") } -'i8x16.le_u' { Lexeme _ (TKeyword "i8x16.le_u") } -'i16x8.le_u' { Lexeme _ (TKeyword "i16x8.le_u") } -'i32x4.le_u' { Lexeme _ (TKeyword "i32x4.le_u") } -'i64x2.le_u' { Lexeme _ (TKeyword "i64x2.le_u") } -'i8x16.gt_s' { Lexeme _ (TKeyword "i8x16.gt_s") } -'i16x8.gt_s' { Lexeme _ (TKeyword "i16x8.gt_s") } -'i32x4.gt_s' { Lexeme _ (TKeyword "i32x4.gt_s") } -'i64x2.gt_s' { Lexeme _ (TKeyword "i64x2.gt_s") } -'i8x16.gt_u' { Lexeme _ (TKeyword "i8x16.gt_u") } -'i16x8.gt_u' { Lexeme _ (TKeyword "i16x8.gt_u") } -'i32x4.gt_u' { Lexeme _ (TKeyword "i32x4.gt_u") } -'i64x2.gt_u' { Lexeme _ (TKeyword "i64x2.gt_u") } -'i8x16.ge_s' { Lexeme _ (TKeyword "i8x16.ge_s") } -'i16x8.ge_s' { Lexeme _ (TKeyword "i16x8.ge_s") } -'i32x4.ge_s' { Lexeme _ (TKeyword "i32x4.ge_s") } -'i64x2.ge_s' { Lexeme _ (TKeyword "i64x2.ge_s") } -'i8x16.ge_u' { Lexeme _ (TKeyword "i8x16.ge_u") } -'i16x8.ge_u' { Lexeme _ (TKeyword "i16x8.ge_u") } -'i32x4.ge_u' { Lexeme _ (TKeyword "i32x4.ge_u") } -'i64x2.ge_u' { Lexeme _ (TKeyword "i64x2.ge_u") } -'f32x4.add' { Lexeme _ (TKeyword "f32x4.add") } -'f64x2.add' { Lexeme _ (TKeyword "f64x2.add") } -'f32x4.sub' { Lexeme _ (TKeyword "f32x4.sub") } -'f64x2.sub' { Lexeme _ (TKeyword "f64x2.sub") } -'f32x4.mul' { Lexeme _ (TKeyword "f32x4.mul") } -'f64x2.mul' { Lexeme _ (TKeyword "f64x2.mul") } -'f32x4.div' { Lexeme _ (TKeyword "f32x4.div") } -'f64x2.div' { Lexeme _ (TKeyword "f64x2.div") } -'f32x4.min' { Lexeme _ (TKeyword "f32x4.min") } -'f64x2.min' { Lexeme _ (TKeyword "f64x2.min") } -'f32x4.max' { Lexeme _ (TKeyword "f32x4.max") } -'f64x2.max' { Lexeme _ (TKeyword "f64x2.max") } -'f32x4.pmin' { Lexeme _ (TKeyword "f32x4.pmin") } -'f64x2.pmin' { Lexeme _ (TKeyword "f64x2.pmin") } -'f32x4.pmax' { Lexeme _ (TKeyword "f32x4.pmax") } -'f64x2.pmax' { Lexeme _ (TKeyword "f64x2.pmax") } -'f32x4.abs' { Lexeme _ (TKeyword "f32x4.abs") } -'f64x2.abs' { Lexeme _ (TKeyword "f64x2.abs") } -'f32x4.neg' { Lexeme _ (TKeyword "f32x4.neg") } -'f64x2.neg' { Lexeme _ (TKeyword "f64x2.neg") } -'f32x4.ceil' { Lexeme _ (TKeyword "f32x4.ceil") } -'f64x2.ceil' { Lexeme _ (TKeyword "f64x2.ceil") } -'f32x4.floor' { Lexeme _ (TKeyword "f32x4.floor") } -'f64x2.floor' { Lexeme _ (TKeyword "f64x2.floor") } -'f32x4.trunc' { Lexeme _ (TKeyword "f32x4.trunc") } -'f64x2.trunc' { Lexeme _ (TKeyword "f64x2.trunc") } -'f32x4.nearest' { Lexeme _ (TKeyword "f32x4.nearest") } -'f64x2.nearest' { Lexeme _ (TKeyword "f64x2.nearest") } -'f32x4.sqrt' { Lexeme _ (TKeyword "f32x4.sqrt") } -'f64x2.sqrt' { Lexeme _ (TKeyword "f64x2.sqrt") } -'f32x4.eq' { Lexeme _ (TKeyword "f32x4.eq") } -'f64x2.eq' { Lexeme _ (TKeyword "f64x2.eq") } -'f32x4.ne' { Lexeme _ (TKeyword "f32x4.ne") } -'f64x2.ne' { Lexeme _ (TKeyword "f64x2.ne") } -'f32x4.lt' { Lexeme _ (TKeyword "f32x4.lt") } -'f64x2.lt' { Lexeme _ (TKeyword "f64x2.lt") } -'f32x4.le' { Lexeme _ (TKeyword "f32x4.le") } -'f64x2.le' { Lexeme _ (TKeyword "f64x2.le") } -'f32x4.gt' { Lexeme _ (TKeyword "f32x4.gt") } -'f64x2.gt' { Lexeme _ (TKeyword "f64x2.gt") } -'f32x4.ge' { Lexeme _ (TKeyword "f32x4.ge") } -'f64x2.ge' { Lexeme _ (TKeyword "f64x2.ge") } -'i16x8.extend_high_i8x16_s' { Lexeme _ (TKeyword "i16x8.extend_high_i8x16_s") } -'i16x8.extend_high_i8x16_u' { Lexeme _ (TKeyword "i16x8.extend_high_i8x16_u") } -'i16x8.extend_low_i8x16_s' { Lexeme _ (TKeyword "i16x8.extend_low_i8x16_s") } -'i16x8.extend_low_i8x16_u' { Lexeme _ (TKeyword "i16x8.extend_low_i8x16_u") } -'i32x4.extend_high_i16x8_s' { Lexeme _ (TKeyword "i32x4.extend_high_i16x8_s") } -'i32x4.extend_high_i16x8_u' { Lexeme _ (TKeyword "i32x4.extend_high_i16x8_u") } -'i32x4.extend_low_i16x8_s' { Lexeme _ (TKeyword "i32x4.extend_low_i16x8_s") } -'i32x4.extend_low_i16x8_u' { Lexeme _ (TKeyword "i32x4.extend_low_i16x8_u") } -'i64x2.extend_high_i32x4_s' { Lexeme _ (TKeyword "i64x2.extend_high_i32x4_s") } -'i64x2.extend_high_i32x4_u' { Lexeme _ (TKeyword "i64x2.extend_high_i32x4_u") } -'i64x2.extend_low_i32x4_s' { Lexeme _ (TKeyword "i64x2.extend_low_i32x4_s") } -'i64x2.extend_low_i32x4_u' { Lexeme _ (TKeyword "i64x2.extend_low_i32x4_u") } -'i32x4.trunc_sat_f32x4_s' { Lexeme _ (TKeyword "i32x4.trunc_sat_f32x4_s") } -'i32x4.trunc_sat_f32x4_u' { Lexeme _ (TKeyword "i32x4.trunc_sat_f32x4_u") } +'i16x8.extmul_low_i8x16_s' { Lexeme _ (TKeyword "i16x8.extmul_low_i8x16_s") } +'i32x4.extmul_low_i16x8_s' { Lexeme _ (TKeyword "i32x4.extmul_low_i16x8_s") } +'i64x2.extmul_low_i32x4_s' { Lexeme _ (TKeyword "i64x2.extmul_low_i32x4_s") } +'i16x8.extmul_low_i8x16_u' { Lexeme _ (TKeyword "i16x8.extmul_low_i8x16_u") } +'i32x4.extmul_low_i16x8_u' { Lexeme _ (TKeyword "i32x4.extmul_low_i16x8_u") } +'i64x2.extmul_low_i32x4_u' { Lexeme _ (TKeyword "i64x2.extmul_low_i32x4_u") } +'i16x8.extmul_high_i8x16_s' { Lexeme _ (TKeyword "i16x8.extmul_high_i8x16_s") } +'i32x4.extmul_high_i16x8_s' { Lexeme _ (TKeyword "i32x4.extmul_high_i16x8_s") } +'i64x2.extmul_high_i32x4_s' { Lexeme _ (TKeyword "i64x2.extmul_high_i32x4_s") } +'i16x8.extmul_high_i8x16_u' { Lexeme _ (TKeyword "i16x8.extmul_high_i8x16_u") } +'i32x4.extmul_high_i16x8_u' { Lexeme _ (TKeyword "i32x4.extmul_high_i16x8_u") } +'i64x2.extmul_high_i32x4_u' { Lexeme _ (TKeyword "i64x2.extmul_high_i32x4_u") } +'i8x16.min_s' { Lexeme _ (TKeyword "i8x16.min_s") } +'i16x8.min_s' { Lexeme _ (TKeyword "i16x8.min_s") } +'i32x4.min_s' { Lexeme _ (TKeyword "i32x4.min_s") } +'i8x16.min_u' { Lexeme _ (TKeyword "i8x16.min_u") } +'i16x8.min_u' { Lexeme _ (TKeyword "i16x8.min_u") } +'i32x4.min_u' { Lexeme _ (TKeyword "i32x4.min_u") } +'i8x16.max_s' { Lexeme _ (TKeyword "i8x16.max_s") } +'i16x8.max_s' { Lexeme _ (TKeyword "i16x8.max_s") } +'i32x4.max_s' { Lexeme _ (TKeyword "i32x4.max_s") } +'i8x16.max_u' { Lexeme _ (TKeyword "i8x16.max_u") } +'i16x8.max_u' { Lexeme _ (TKeyword "i16x8.max_u") } +'i32x4.max_u' { Lexeme _ (TKeyword "i32x4.max_u") } +'i16x8.mul' { Lexeme _ (TKeyword "i16x8.mul") } +'i32x4.mul' { Lexeme _ (TKeyword "i32x4.mul") } +'i64x2.mul' { Lexeme _ (TKeyword "i64x2.mul") } +'i8x16.abs' { Lexeme _ (TKeyword "i8x16.abs") } +'i16x8.abs' { Lexeme _ (TKeyword "i16x8.abs") } +'i32x4.abs' { Lexeme _ (TKeyword "i32x4.abs") } +'i64x2.abs' { Lexeme _ (TKeyword "i64x2.abs") } +'i8x16.neg' { Lexeme _ (TKeyword "i8x16.neg") } +'i16x8.neg' { Lexeme _ (TKeyword "i16x8.neg") } +'i32x4.neg' { Lexeme _ (TKeyword "i32x4.neg") } +'i64x2.neg' { Lexeme _ (TKeyword "i64x2.neg") } +'i8x16.shl' { Lexeme _ (TKeyword "i8x16.shl") } +'i16x8.shl' { Lexeme _ (TKeyword "i16x8.shl") } +'i32x4.shl' { Lexeme _ (TKeyword "i32x4.shl") } +'i64x2.shl' { Lexeme _ (TKeyword "i64x2.shl") } +'i8x16.shr_u' { Lexeme _ (TKeyword "i8x16.shr_u") } +'i16x8.shr_u' { Lexeme _ (TKeyword "i16x8.shr_u") } +'i32x4.shr_u' { Lexeme _ (TKeyword "i32x4.shr_u") } +'i64x2.shr_u' { Lexeme _ (TKeyword "i64x2.shr_u") } +'i8x16.shr_s' { Lexeme _ (TKeyword "i8x16.shr_s") } +'i16x8.shr_s' { Lexeme _ (TKeyword "i16x8.shr_s") } +'i32x4.shr_s' { Lexeme _ (TKeyword "i32x4.shr_s") } +'i64x2.shr_s' { Lexeme _ (TKeyword "i64x2.shr_s") } +'i8x16.bitmask' { Lexeme _ (TKeyword "i8x16.bitmask") } +'i16x8.bitmask' { Lexeme _ (TKeyword "i16x8.bitmask") } +'i32x4.bitmask' { Lexeme _ (TKeyword "i32x4.bitmask") } +'i64x2.bitmask' { Lexeme _ (TKeyword "i64x2.bitmask") } +'i8x16.eq' { Lexeme _ (TKeyword "i8x16.eq") } +'i16x8.eq' { Lexeme _ (TKeyword "i16x8.eq") } +'i32x4.eq' { Lexeme _ (TKeyword "i32x4.eq") } +'i64x2.eq' { Lexeme _ (TKeyword "i64x2.eq") } +'i8x16.ne' { Lexeme _ (TKeyword "i8x16.ne") } +'i16x8.ne' { Lexeme _ (TKeyword "i16x8.ne") } +'i32x4.ne' { Lexeme _ (TKeyword "i32x4.ne") } +'i64x2.ne' { Lexeme _ (TKeyword "i64x2.ne") } +'i8x16.lt_s' { Lexeme _ (TKeyword "i8x16.lt_s") } +'i16x8.lt_s' { Lexeme _ (TKeyword "i16x8.lt_s") } +'i32x4.lt_s' { Lexeme _ (TKeyword "i32x4.lt_s") } +'i64x2.lt_s' { Lexeme _ (TKeyword "i64x2.lt_s") } +'i8x16.lt_u' { Lexeme _ (TKeyword "i8x16.lt_u") } +'i16x8.lt_u' { Lexeme _ (TKeyword "i16x8.lt_u") } +'i32x4.lt_u' { Lexeme _ (TKeyword "i32x4.lt_u") } +'i64x2.lt_u' { Lexeme _ (TKeyword "i64x2.lt_u") } +'i8x16.le_s' { Lexeme _ (TKeyword "i8x16.le_s") } +'i16x8.le_s' { Lexeme _ (TKeyword "i16x8.le_s") } +'i32x4.le_s' { Lexeme _ (TKeyword "i32x4.le_s") } +'i64x2.le_s' { Lexeme _ (TKeyword "i64x2.le_s") } +'i8x16.le_u' { Lexeme _ (TKeyword "i8x16.le_u") } +'i16x8.le_u' { Lexeme _ (TKeyword "i16x8.le_u") } +'i32x4.le_u' { Lexeme _ (TKeyword "i32x4.le_u") } +'i64x2.le_u' { Lexeme _ (TKeyword "i64x2.le_u") } +'i8x16.gt_s' { Lexeme _ (TKeyword "i8x16.gt_s") } +'i16x8.gt_s' { Lexeme _ (TKeyword "i16x8.gt_s") } +'i32x4.gt_s' { Lexeme _ (TKeyword "i32x4.gt_s") } +'i64x2.gt_s' { Lexeme _ (TKeyword "i64x2.gt_s") } +'i8x16.gt_u' { Lexeme _ (TKeyword "i8x16.gt_u") } +'i16x8.gt_u' { Lexeme _ (TKeyword "i16x8.gt_u") } +'i32x4.gt_u' { Lexeme _ (TKeyword "i32x4.gt_u") } +'i64x2.gt_u' { Lexeme _ (TKeyword "i64x2.gt_u") } +'i8x16.ge_s' { Lexeme _ (TKeyword "i8x16.ge_s") } +'i16x8.ge_s' { Lexeme _ (TKeyword "i16x8.ge_s") } +'i32x4.ge_s' { Lexeme _ (TKeyword "i32x4.ge_s") } +'i64x2.ge_s' { Lexeme _ (TKeyword "i64x2.ge_s") } +'i8x16.ge_u' { Lexeme _ (TKeyword "i8x16.ge_u") } +'i16x8.ge_u' { Lexeme _ (TKeyword "i16x8.ge_u") } +'i32x4.ge_u' { Lexeme _ (TKeyword "i32x4.ge_u") } +'i64x2.ge_u' { Lexeme _ (TKeyword "i64x2.ge_u") } +'f32x4.add' { Lexeme _ (TKeyword "f32x4.add") } +'f64x2.add' { Lexeme _ (TKeyword "f64x2.add") } +'f32x4.sub' { Lexeme _ (TKeyword "f32x4.sub") } +'f64x2.sub' { Lexeme _ (TKeyword "f64x2.sub") } +'f32x4.mul' { Lexeme _ (TKeyword "f32x4.mul") } +'f64x2.mul' { Lexeme _ (TKeyword "f64x2.mul") } +'f32x4.div' { Lexeme _ (TKeyword "f32x4.div") } +'f64x2.div' { Lexeme _ (TKeyword "f64x2.div") } +'f32x4.min' { Lexeme _ (TKeyword "f32x4.min") } +'f64x2.min' { Lexeme _ (TKeyword "f64x2.min") } +'f32x4.max' { Lexeme _ (TKeyword "f32x4.max") } +'f64x2.max' { Lexeme _ (TKeyword "f64x2.max") } +'f32x4.pmin' { Lexeme _ (TKeyword "f32x4.pmin") } +'f64x2.pmin' { Lexeme _ (TKeyword "f64x2.pmin") } +'f32x4.pmax' { Lexeme _ (TKeyword "f32x4.pmax") } +'f64x2.pmax' { Lexeme _ (TKeyword "f64x2.pmax") } +'f32x4.abs' { Lexeme _ (TKeyword "f32x4.abs") } +'f64x2.abs' { Lexeme _ (TKeyword "f64x2.abs") } +'f32x4.neg' { Lexeme _ (TKeyword "f32x4.neg") } +'f64x2.neg' { Lexeme _ (TKeyword "f64x2.neg") } +'f32x4.ceil' { Lexeme _ (TKeyword "f32x4.ceil") } +'f64x2.ceil' { Lexeme _ (TKeyword "f64x2.ceil") } +'f32x4.floor' { Lexeme _ (TKeyword "f32x4.floor") } +'f64x2.floor' { Lexeme _ (TKeyword "f64x2.floor") } +'f32x4.trunc' { Lexeme _ (TKeyword "f32x4.trunc") } +'f64x2.trunc' { Lexeme _ (TKeyword "f64x2.trunc") } +'f32x4.nearest' { Lexeme _ (TKeyword "f32x4.nearest") } +'f64x2.nearest' { Lexeme _ (TKeyword "f64x2.nearest") } +'f32x4.sqrt' { Lexeme _ (TKeyword "f32x4.sqrt") } +'f64x2.sqrt' { Lexeme _ (TKeyword "f64x2.sqrt") } +'f32x4.eq' { Lexeme _ (TKeyword "f32x4.eq") } +'f64x2.eq' { Lexeme _ (TKeyword "f64x2.eq") } +'f32x4.ne' { Lexeme _ (TKeyword "f32x4.ne") } +'f64x2.ne' { Lexeme _ (TKeyword "f64x2.ne") } +'f32x4.lt' { Lexeme _ (TKeyword "f32x4.lt") } +'f64x2.lt' { Lexeme _ (TKeyword "f64x2.lt") } +'f32x4.le' { Lexeme _ (TKeyword "f32x4.le") } +'f64x2.le' { Lexeme _ (TKeyword "f64x2.le") } +'f32x4.gt' { Lexeme _ (TKeyword "f32x4.gt") } +'f64x2.gt' { Lexeme _ (TKeyword "f64x2.gt") } +'f32x4.ge' { Lexeme _ (TKeyword "f32x4.ge") } +'f64x2.ge' { Lexeme _ (TKeyword "f64x2.ge") } +'i16x8.extend_high_i8x16_s' { Lexeme _ (TKeyword "i16x8.extend_high_i8x16_s") } +'i16x8.extend_high_i8x16_u' { Lexeme _ (TKeyword "i16x8.extend_high_i8x16_u") } +'i16x8.extend_low_i8x16_s' { Lexeme _ (TKeyword "i16x8.extend_low_i8x16_s") } +'i16x8.extend_low_i8x16_u' { Lexeme _ (TKeyword "i16x8.extend_low_i8x16_u") } +'i32x4.extend_high_i16x8_s' { Lexeme _ (TKeyword "i32x4.extend_high_i16x8_s") } +'i32x4.extend_high_i16x8_u' { Lexeme _ (TKeyword "i32x4.extend_high_i16x8_u") } +'i32x4.extend_low_i16x8_s' { Lexeme _ (TKeyword "i32x4.extend_low_i16x8_s") } +'i32x4.extend_low_i16x8_u' { Lexeme _ (TKeyword "i32x4.extend_low_i16x8_u") } +'i64x2.extend_high_i32x4_s' { Lexeme _ (TKeyword "i64x2.extend_high_i32x4_s") } +'i64x2.extend_high_i32x4_u' { Lexeme _ (TKeyword "i64x2.extend_high_i32x4_u") } +'i64x2.extend_low_i32x4_s' { Lexeme _ (TKeyword "i64x2.extend_low_i32x4_s") } +'i64x2.extend_low_i32x4_u' { Lexeme _ (TKeyword "i64x2.extend_low_i32x4_u") } +'i32x4.trunc_sat_f32x4_s' { Lexeme _ (TKeyword "i32x4.trunc_sat_f32x4_s") } +'i32x4.trunc_sat_f32x4_u' { Lexeme _ (TKeyword "i32x4.trunc_sat_f32x4_u") } +'i32x4.trunc_sat_f64x2_s_zero' { Lexeme _ (TKeyword "i32x4.trunc_sat_f64x2_s_zero") } +'i32x4.trunc_sat_f64x2_u_zero' { Lexeme _ (TKeyword "i32x4.trunc_sat_f64x2_u_zero") } -- script extension -'binary' { Lexeme _ (TKeyword "binary") } -'quote' { Lexeme _ (TKeyword "quote") } -'register' { Lexeme _ (TKeyword "register") } -'invoke' { Lexeme _ (TKeyword "invoke") } -'get' { Lexeme _ (TKeyword "get") } -'assert_return' { Lexeme $$ (TKeyword "assert_return") } -'assert_return_canonical_nan' { Lexeme $$ (TKeyword "assert_return_canonical_nan") } -'assert_return_arithmetic_nan' { Lexeme $$ (TKeyword "assert_return_arithmetic_nan") } -'assert_trap' { Lexeme $$ (TKeyword "assert_trap") } -'assert_malformed' { Lexeme $$ (TKeyword "assert_malformed") } -'assert_invalid' { Lexeme $$ (TKeyword "assert_invalid") } -'assert_unlinkable' { Lexeme $$ (TKeyword "assert_unlinkable") } -'assert_exhaustion' { Lexeme $$ (TKeyword "assert_exhaustion") } -'script' { Lexeme _ (TKeyword "script") } -'input' { Lexeme _ (TKeyword "input") } -'output' { Lexeme _ (TKeyword "output") } +'binary' { Lexeme _ (TKeyword "binary") } +'quote' { Lexeme _ (TKeyword "quote") } +'register' { Lexeme _ (TKeyword "register") } +'invoke' { Lexeme _ (TKeyword "invoke") } +'get' { Lexeme _ (TKeyword "get") } +'assert_return' { Lexeme $$ (TKeyword "assert_return") } +'assert_return_canonical_nan' { Lexeme $$ (TKeyword "assert_return_canonical_nan") } +'assert_return_arithmetic_nan' { Lexeme $$ (TKeyword "assert_return_arithmetic_nan") } +'assert_trap' { Lexeme $$ (TKeyword "assert_trap") } +'assert_malformed' { Lexeme $$ (TKeyword "assert_malformed") } +'assert_invalid' { Lexeme $$ (TKeyword "assert_invalid") } +'assert_unlinkable' { Lexeme $$ (TKeyword "assert_unlinkable") } +'assert_exhaustion' { Lexeme $$ (TKeyword "assert_exhaustion") } +'script' { Lexeme _ (TKeyword "script") } +'input' { Lexeme _ (TKeyword "input") } +'output' { Lexeme _ (TKeyword "output") } -- script extension end -id { Lexeme _ (TId $$) } -signed_pos { Lexeme _ (TIntLit (Just False) $$) } -signed_neg { Lexeme _ (TIntLit (Just True) $$) } -nat { Lexeme _ (TIntLit Nothing $$) } -f64 { Lexeme _ (TFloatLit $$) } -offset { Lexeme _ (TKeyword (asOffset -> Just $$)) } -align { Lexeme _ (TKeyword (asAlign -> Just $$)) } -str { Lexeme _ (TStringLit $$) } -EOF { Lexeme _ EOF } +id { Lexeme _ (TId $$) } +signed_pos { Lexeme _ (TIntLit (Just False) $$) } +signed_neg { Lexeme _ (TIntLit (Just True) $$) } +nat { Lexeme _ (TIntLit Nothing $$) } +f64 { Lexeme _ (TFloatLit $$) } +offset { Lexeme _ (TKeyword (asOffset -> Just $$)) } +align { Lexeme _ (TKeyword (asAlign -> Just $$)) } +str { Lexeme _ (TStringLit $$) } +EOF { Lexeme _ EOF } %% @@ -1202,8 +1204,10 @@ plaininstr :: { PlainInstr } | 'i64x2.extend_high_i32x4_u' { V128IExtend I64x2 I32x4 True False } | 'i64x2.extend_low_i32x4_s' { V128IExtend I64x2 I32x4 False True } | 'i64x2.extend_low_i32x4_u' { V128IExtend I64x2 I32x4 False False } - | 'i32x4.trunc_sat_f32x4_s' { I32x4TruncSatF32x4 True } - | 'i32x4.trunc_sat_f32x4_u' { I32x4TruncSatF32x4 False } + | 'i32x4.trunc_sat_f32x4_s' { I32x4TruncSatF True BS32 } + | 'i32x4.trunc_sat_f32x4_u' { I32x4TruncSatF False BS32 } + | 'i32x4.trunc_sat_f64x2_s_zero' { I32x4TruncSatF True BS64 } + | 'i32x4.trunc_sat_f64x2_u_zero' { I32x4TruncSatF False BS64 } typeuse(next) : '(' typeuse1(folded_instr_list(next), instruction_list(next)) { @@ -1938,7 +1942,7 @@ data PlainInstr = | F64x2PromoteLowF32x4 | F32x4DemoteF64x2Zero | V128IExtend SimdShape SimdShape {- high -} Bool {- signed -} Bool - | I32x4TruncSatF32x4 {- signed -} Bool + | I32x4TruncSatF {- signed -} Bool {- Float Size -} BitSize deriving (Show, Eq) data TypeDef = TypeDef (Maybe Ident) FuncType deriving (Show, Eq) @@ -2545,7 +2549,7 @@ desugarize fields = do synInstrToStruct _ (PlainInstr F32x4DemoteF64x2Zero) = return $ S.F32x4DemoteF64x2Zero synInstrToStruct _ (PlainInstr (V128Narrow t f s)) = return $ S.V128Narrow t f s synInstrToStruct _ (PlainInstr (V128IExtend t f h s)) = return $ S.V128IExtend t f h s - synInstrToStruct _ (PlainInstr (I32x4TruncSatF32x4 s)) = return $ S.I32x4TruncSatF32x4 s + synInstrToStruct _ (PlainInstr (I32x4TruncSatF s sz)) = return $ S.I32x4TruncSatF s sz synInstrToStruct ctx@FunCtx { ctxMod = Module { types } } BlockInstr {label, blockType, body} = do let ctx' = ctx { ctxLabels = label : ctxLabels ctx } bt <- case blockType of diff --git a/src/Language/Wasm/Structure.hs b/src/Language/Wasm/Structure.hs index 464ad17..2919960 100644 --- a/src/Language/Wasm/Structure.hs +++ b/src/Language/Wasm/Structure.hs @@ -276,7 +276,7 @@ data Instruction index = | F64x2PromoteLowF32x4 | F32x4DemoteF64x2Zero | V128IExtend SimdShape SimdShape {- high -} Bool {- signed -} Bool - | I32x4TruncSatF32x4 {- signed -} Bool + | I32x4TruncSatF {- signed -} Bool {- Float Size -} BitSize deriving (Show, Eq, Generic, NFData) type Expression = [Instruction Natural] diff --git a/src/Language/Wasm/Validate.hs b/src/Language/Wasm/Validate.hs index f86de3d..95bf62f 100644 --- a/src/Language/Wasm/Validate.hs +++ b/src/Language/Wasm/Validate.hs @@ -629,7 +629,7 @@ getInstrType _ F32x4DemoteF64x2Zero = return $ V128 ==> V128 getInstrType _ (V128IExtend _ _ _ _) = return $ V128 ==> V128 -getInstrType _ (I32x4TruncSatF32x4 _) = +getInstrType _ (I32x4TruncSatF _ _) = return $ V128 ==> V128 getShapeElemType :: SimdShape -> ValueType diff --git a/tests/Test.hs b/tests/Test.hs index a2fbab1..d0f120b 100644 --- a/tests/Test.hs +++ b/tests/Test.hs @@ -20,7 +20,7 @@ main = do filter (List.isPrefixOf "simd") . filter (List.isSuffixOf ".wast") <$> Directory.listDirectory "tests/spec" - -- let files = ["simd_i32x4_trunc_sat_f32x4.wast"] + -- let files = ["simd_i32x4_trunc_sat_f64x2.wast"] scriptTestCases <- (`mapM` files) $ \file -> do test <- LBS.readFile ("tests/spec/" ++ file) return $ testCase file $ do