From a676023c7f550ae4a367cda6eb89db6f788164a9 Mon Sep 17 00:00:00 2001 From: nickysn Date: Mon, 3 Aug 2020 12:59:18 +0000 Subject: [PATCH] [PATCH 033/188] adding wasmtext to parse text files From bec61439ee1b177d05f027ca2792a527c42f0368 Mon Sep 17 00:00:00 2001 From: Dmitry Boyarintsev Date: Tue, 19 Nov 2019 23:25:48 -0500 git-svn-id: branches/wasm@46029 - --- .gitattributes | 1 + utils/wasmbin/wasmtext.pas | 459 +++++++++++++++++++++++++++++++++++++ 2 files changed, 460 insertions(+) create mode 100644 utils/wasmbin/wasmtext.pas diff --git a/.gitattributes b/.gitattributes index 64d85af7f5..ead1a932ad 100644 --- a/.gitattributes +++ b/.gitattributes @@ -18984,6 +18984,7 @@ utils/wasmbin/wasmld.lpi svneol=native#text/plain utils/wasmbin/wasmld.lpr svneol=native#text/plain utils/wasmbin/wasmlink.pas svneol=native#text/plain utils/wasmbin/wasmlinkchange.pas svneol=native#text/plain +utils/wasmbin/wasmtext.pas svneol=native#text/plain utils/wasmbin/wasmtool.lpi svneol=native#text/plain utils/wasmbin/wasmtool.lpr svneol=native#text/plain utils/wasmbin/wasmtoolutils.pas svneol=native#text/plain diff --git a/utils/wasmbin/wasmtext.pas b/utils/wasmbin/wasmtext.pas new file mode 100644 index 0000000000..abec685e75 --- /dev/null +++ b/utils/wasmbin/wasmtext.pas @@ -0,0 +1,459 @@ +unit wasmtext; + +interface + +uses + wasmbincode; + +type + TInstText = record + text : string; + inst : byte; + end; + +const + WasmTextToInstr : array [MIN_INST..MAX_INST] of TInstText = ( + (text: 'unreachable' ; inst: inst_unreachable ) + ,(text: 'nop' ; inst: inst_nop ) + ,(text: 'block' ; inst: inst_block ) + ,(text: 'loop' ; inst: inst_loop ) + ,(text: 'if' ; inst: inst_if ) + ,(text: 'else' ; inst: inst_else ) + ,(text: '' ; inst: $06) + ,(text: '' ; inst: $07) + ,(text: '' ; inst: $08) + ,(text: '' ; inst: $09) + ,(text: '' ; inst: $0a) + ,(text: 'end' ; inst: inst_end ) + ,(text: 'br' ; inst: inst_br) + ,(text: 'br_if' ; inst: inst_br_if) + ,(text: 'br_table' ; inst: inst_br_table) + ,(text: 'return' ; inst: inst_return) + ,(text: 'call' ; inst: inst_call) + ,(text: 'call_indirect' ; inst: inst_call_indirect) + ,(text: '' ; inst: $12) + ,(text: '' ; inst: $13) + ,(text: '' ; inst: $14) + ,(text: '' ; inst: $15) + ,(text: '' ; inst: $16) + ,(text: '' ; inst: $17) + ,(text: '' ; inst: $18) + ,(text: '' ; inst: $19) + ,(text: 'drop' ; inst: inst_drop ) + ,(text: 'select' ; inst: inst_select ) + ,(text: '' ; inst: $1c) + ,(text: '' ; inst: $1d) + ,(text: '' ; inst: $1e) + ,(text: '' ; inst: $1f) + ,(text: 'local.get' ; inst: inst_local_get) + ,(text: 'local.set' ; inst: inst_local_set) + ,(text: 'local.tee' ; inst: inst_local_tee) + ,(text: 'global.get' ; inst: inst_global_get) + ,(text: 'global.set' ; inst: inst_global_set) + ,(text: '' ; inst: $25) + ,(text: '' ; inst: $26) + ,(text: '' ; inst: $27) + ,(text: 'i32.load' ; inst: inst_i32_load) + ,(text: 'i64.load' ; inst: inst_i64_load) + ,(text: 'f32.load' ; inst: inst_f32_load) + ,(text: 'f64.load' ; inst: inst_f64_load) + ,(text: 'i32.load8_s' ; inst: inst_i32_load8_s) + ,(text: 'i32.load8_u' ; inst: inst_i32_load8_u) + ,(text: 'i32.load16_s' ; inst: inst_i32_load16_s) + ,(text: 'i32.load16_u' ; inst: inst_i32_load16_u) + ,(text: 'i64.load8_s' ; inst: inst_i64_load8_s) + ,(text: 'i64.load8_u' ; inst: inst_i64_load8_u) + ,(text: 'i64.load16_s' ; inst: inst_i64_load16_s) + ,(text: 'i64.load16_u' ; inst: inst_i64_load16_u) + ,(text: 'i64.load32_s' ; inst: inst_i64_load32_s) + ,(text: 'i64.load32_u' ; inst: inst_i64_load32_u) + ,(text: 'i32.store' ; inst: inst_i32_store) + ,(text: 'i64.store' ; inst: inst_i64_store) + ,(text: 'f32.store' ; inst: inst_f32_store) + ,(text: 'f64.store' ; inst: inst_f64_store) + ,(text: 'i32.store8' ; inst: inst_i32_store8 ) + ,(text: 'i32.store16' ; inst: inst_i32_store16) + ,(text: 'i64.store8' ; inst: inst_i64_store8 ) + ,(text: 'i64.store16' ; inst: inst_i64_store16) + ,(text: 'i64.store32' ; inst: inst_i64_store32) + ,(text: 'memory.size' ; inst: inst_memory_size) + ,(text: 'memory.grow' ; inst: inst_memory_grow) + ,(text: 'i32.const' ; inst: inst_i32_const) + ,(text: 'i64.const' ; inst: inst_i64_const) + ,(text: 'f32.const' ; inst: inst_f32_const) + ,(text: 'f64.const' ; inst: inst_f64_const) + + ,(text: 'i32.eqz' ; inst: inst_i32_eqz) + ,(text: 'i32.eq' ; inst: inst_i32_eq ) + ,(text: 'i32.ne' ; inst: inst_i32_ne ) + ,(text: 'i32.lt_s' ; inst: inst_i32_lt_s) + ,(text: 'i32.lt_u' ; inst: inst_i32_lt_u) + ,(text: 'i32.gt_s' ; inst: inst_i32_gt_s) + ,(text: 'i32.gt_u' ; inst: inst_i32_gt_u) + ,(text: 'i32.le_s' ; inst: inst_i32_le_s) + ,(text: 'i32.le_u' ; inst: inst_i32_le_u) + ,(text: 'i32.ge_s' ; inst: inst_i32_ge_s) + ,(text: 'i32.ge_u' ; inst: inst_i32_ge_u) + ,(text: 'i64.eqz' ; inst: inst_i64_eqz) + ,(text: 'i64.eq' ; inst: inst_i64_eq) + ,(text: 'i64.ne' ; inst: inst_i64_ne) + ,(text: 'i64.lt_s' ; inst: inst_i64_lt_s) + ,(text: 'i64.lt_u' ; inst: inst_i64_lt_u) + ,(text: 'i64.gt_s' ; inst: inst_i64_gt_s) + ,(text: 'i64.gt_u' ; inst: inst_i64_gt_u) + ,(text: 'i64.le_s' ; inst: inst_i64_le_s) + ,(text: 'i64.le_u' ; inst: inst_i64_le_u) + ,(text: 'i64.ge_s' ; inst: inst_i64_ge_s) + ,(text: 'i64.ge_u' ; inst: inst_i64_ge_u) + ,(text: 'f32.eq' ; inst: inst_f32_eq) + ,(text: 'f32.ne' ; inst: inst_f32_ne) + ,(text: 'f32.lt' ; inst: inst_f32_lt) + ,(text: 'f32.gt' ; inst: inst_f32_gt) + ,(text: 'f32.le' ; inst: inst_f32_le) + ,(text: 'f32.ge' ; inst: inst_f32_ge) + ,(text: 'f64.eq' ; inst: inst_f64_eq) + ,(text: 'f64.ne' ; inst: inst_f64_ne) + ,(text: 'f64.lt' ; inst: inst_f64_lt) + ,(text: 'f64.gt' ; inst: inst_f64_gt) + ,(text: 'f64.le' ; inst: inst_f64_le) + ,(text: 'f64.ge' ; inst: inst_f64_ge) + + ,(text: 'i32.clz' ; inst: inst_i32_clz) + ,(text: 'i32.ctz' ; inst: inst_i32_ctz) + ,(text: 'i32.popcnt' ; inst: inst_i32_popcnt) + ,(text: 'i32.add' ; inst: inst_i32_add) + ,(text: 'i32.sub' ; inst: inst_i32_sub) + ,(text: 'i32.mul' ; inst: inst_i32_mul) + ,(text: 'i32.div_s' ; inst: inst_i32_div_s) + ,(text: 'i32.div_u' ; inst: inst_i32_div_u) + ,(text: 'i32.rem_s' ; inst: inst_i32_rem_s) + ,(text: 'i32.rem_u' ; inst: inst_i32_rem_u) + ,(text: 'i32.and' ; inst: inst_i32_and) + ,(text: 'i32.or' ; inst: inst_i32_or ) + ,(text: 'i32.xor' ; inst: inst_i32_xor) + ,(text: 'i32.shl' ; inst: inst_i32_shl) + ,(text: 'i32.shr_s' ; inst: inst_i32_shr_s) + ,(text: 'i32.shr_u' ; inst: inst_i32_shr_u) + ,(text: 'i32.rotl' ; inst: inst_i32_rotl) + ,(text: 'i32.rotr' ; inst: inst_i32_rotr) + ,(text: 'i64.clz' ; inst: inst_i64_clz) + ,(text: 'i64.ctz' ; inst: inst_i64_ctz) + ,(text: 'i64.popcnt' ; inst: inst_i64_popcnt) + ,(text: 'i64.add' ; inst: inst_i64_add) + ,(text: 'i64.sub' ; inst: inst_i64_sub) + ,(text: 'i64.mul' ; inst: inst_i64_mul) + ,(text: 'i64.div_s' ; inst: inst_i64_div_s) + ,(text: 'i64.div_u' ; inst: inst_i64_div_u) + ,(text: 'i64.rem_s' ; inst: inst_i64_rem_s) + ,(text: 'i64.rem_u' ; inst: inst_i64_rem_u) + ,(text: 'i64.and' ; inst: inst_i64_and) + ,(text: 'i64.or' ; inst: inst_i64_or ) + ,(text: 'i64.xor' ; inst: inst_i64_xor) + ,(text: 'i64.shl' ; inst: inst_i64_shl) + ,(text: 'i64.shr_s' ; inst: inst_i64_shr_s) + ,(text: 'i64.shr_u' ; inst: inst_i64_shr_u) + ,(text: 'i64.rotl' ; inst: inst_i64_rotl) + ,(text: 'i64.rotr' ; inst: inst_i64_rotr) + ,(text: 'f32.abs' ; inst: inst_f32_abs ) + ,(text: 'f32.neg' ; inst: inst_f32_neg ) + ,(text: 'f32.ceil' ; inst: inst_f32_ceil) + ,(text: 'f32.floor' ; inst: inst_f32_floor) + ,(text: 'f32.trunc' ; inst: inst_f32_trunc) + ,(text: 'f32.nearest' ; inst: inst_f32_nearest) + ,(text: 'f32.sqrt' ; inst: inst_f32_sqrt) + ,(text: 'f32.add' ; inst: inst_f32_add) + ,(text: 'f32.sub' ; inst: inst_f32_sub) + ,(text: 'f32.mul' ; inst: inst_f32_mul) + ,(text: 'f32.div' ; inst: inst_f32_div) + ,(text: 'f32.min' ; inst: inst_f32_min) + ,(text: 'f32.max' ; inst: inst_f32_max) + ,(text: 'f32.copysign' ; inst: inst_f32_copysign) + ,(text: 'f64.abs' ; inst: inst_f64_abs ) + ,(text: 'f64.neg' ; inst: inst_f64_neg ) + ,(text: 'f64.ceil' ; inst: inst_f64_ceil) + ,(text: 'f64.floor' ; inst: inst_f64_floor) + ,(text: 'f64.trunc' ; inst: inst_f64_trunc) + ,(text: 'f64.nearest' ; inst: inst_f64_nearest) + ,(text: 'f64.sqrt' ; inst: inst_f64_sqrt) + ,(text: 'f64.add' ; inst: inst_f64_add) + ,(text: 'f64.sub' ; inst: inst_f64_sub) + ,(text: 'f64.mul' ; inst: inst_f64_mul) + ,(text: 'f64.div' ; inst: inst_f64_div) + ,(text: 'f64.min' ; inst: inst_f64_min) + ,(text: 'f64.max' ; inst: inst_f64_max) + ,(text: 'f64.copysign' ; inst: inst_f64_copysign) + + ,(text: 'i32.wrap_i64' ; inst: inst_i32_wrap_i64) + ,(text: 'i32.trunc_f32_s' ; inst: inst_i32_trunc_f32_s) + ,(text: 'i32.trunc_f32_u' ; inst: inst_i32_trunc_f32_u) + ,(text: 'i32.trunc_f64_s' ; inst: inst_i32_trunc_f64_s) + ,(text: 'i32.trunc_f64_u' ; inst: inst_i32_trunc_f64_u) + ,(text: 'i64.extend_i32_s' ; inst: inst_i64_extend_i32_s) + ,(text: 'i64.extend_i32_u' ; inst: inst_i64_extend_i32_u) + ,(text: 'i64.trunc_f32_s' ; inst: inst_i64_trunc_f32_s) + ,(text: 'i64.trunc_f32_u' ; inst: inst_i64_trunc_f32_u) + ,(text: 'i64.trunc_f64_s' ; inst: inst_i64_trunc_f64_s) + ,(text: 'i64.trunc_f64_u' ; inst: inst_i64_trunc_f64_u) + ,(text: 'f32.convert_i32_s' ; inst: inst_f32_convert_i32_s) + ,(text: 'f32.convert_i32_u' ; inst: inst_f32_convert_i32_u) + ,(text: 'f32.convert_i64_s' ; inst: inst_f32_convert_i64_s) + ,(text: 'f32.convert_i64_u' ; inst: inst_f32_convert_i64_u) + ,(text: 'f32.demote_f64' ; inst: inst_f32_demote_f64) + ,(text: 'f64.convert_i32_s' ; inst: inst_f64_convert_i32_s) + ,(text: 'f64.convert_i32_u' ; inst: inst_f64_convert_i32_u) + ,(text: 'f64.convert_i64_s' ; inst: inst_f64_convert_i64_s) + ,(text: 'f64.convert_i64_u' ; inst: inst_f64_convert_i64_u) + ,(text: 'f64.promote_f32' ; inst: inst_f64_promote_f32) + ,(text: 'i32.reinterpret_f32' ; inst: inst_i32_reinterpret_f32) + ,(text: 'i64.reinterpret_f64' ; inst: inst_i64_reinterpret_f64) + ,(text: 'f32.reinterpret_i32' ; inst: inst_f32_reinterpret_i32) + ,(text: 'f64.reinterpret_i64' ; inst: inst_f64_reinterpret_i64) + ); + +function TextToInst(const t: string; out inst: byte): Boolean; + +implementation + +function floatTextToInst(const t: string; var inst: byte): Boolean; +begin + Result := length(t)>4; + if not Result then Exit; + + if (t[2]='3') and (t[3]='2') then begin + if t = 'f32.load' then inst := inst_f32_load + else if t = 'f32.store' then inst := inst_f32_store + else if t = 'f32.const' then inst := inst_f32_const + else if t = 'f32.eq' then inst := inst_f32_eq + else if t = 'f32.ne' then inst := inst_f32_ne + else if t = 'f32.lt' then inst := inst_f32_lt + else if t = 'f32.gt' then inst := inst_f32_gt + else if t = 'f32.le' then inst := inst_f32_le + else if t = 'f32.ge' then inst := inst_f32_ge + else if t = 'f32.abs' then inst := inst_f32_abs + else if t = 'f32.neg' then inst := inst_f32_neg + else if t = 'f32.ceil' then inst := inst_f32_ceil + else if t = 'f32.floor' then inst := inst_f32_floor + else if t = 'f32.trunc' then inst := inst_f32_trunc + else if t = 'f32.nearest' then inst := inst_f32_nearest + else if t = 'f32.sqrt' then inst := inst_f32_sqrt + else if t = 'f32.add' then inst := inst_f32_add + else if t = 'f32.sub' then inst := inst_f32_sub + else if t = 'f32.mul' then inst := inst_f32_mul + else if t = 'f32.div' then inst := inst_f32_div + else if t = 'f32.min' then inst := inst_f32_min + else if t = 'f32.max' then inst := inst_f32_max + else if t = 'f32.copysign' then inst := inst_f32_copysign + else if t = 'f32.convert_i32_s' then inst := inst_f32_convert_i32_s + else if t = 'f32.convert_i32_u' then inst := inst_f32_convert_i32_u + else if t = 'f32.convert_i64_s' then inst := inst_f32_convert_i64_s + else if t = 'f32.convert_i64_u' then inst := inst_f32_convert_i64_u + else if t = 'f32.demote_f64' then inst := inst_f32_demote_f64 + else if t = 'f32.reinterpret_i32' then inst := inst_f32_reinterpret_i32 + else Result := false; + + end else if (t[2]='6') and (t[3]='4') then begin + if t = 'f64.load' then inst := inst_f64_load + else if t = 'f64.store' then inst := inst_f64_store + else if t = 'f64.const' then inst := inst_f64_const + else if t = 'f64.eq' then inst := inst_f64_eq + else if t = 'f64.ne' then inst := inst_f64_ne + else if t = 'f64.lt' then inst := inst_f64_lt + else if t = 'f64.gt' then inst := inst_f64_gt + else if t = 'f64.le' then inst := inst_f64_le + else if t = 'f64.ge' then inst := inst_f64_ge + else if t = 'f64.abs' then inst := inst_f64_abs + else if t = 'f64.neg' then inst := inst_f64_neg + else if t = 'f64.ceil' then inst := inst_f64_ceil + else if t = 'f64.floor' then inst := inst_f64_floor + else if t = 'f64.trunc' then inst := inst_f64_trunc + else if t = 'f64.nearest' then inst := inst_f64_nearest + else if t = 'f64.sqrt' then inst := inst_f64_sqrt + else if t = 'f64.add' then inst := inst_f64_add + else if t = 'f64.sub' then inst := inst_f64_sub + else if t = 'f64.mul' then inst := inst_f64_mul + else if t = 'f64.div' then inst := inst_f64_div + else if t = 'f64.min' then inst := inst_f64_min + else if t = 'f64.max' then inst := inst_f64_max + else if t = 'f64.copysign' then inst := inst_f64_copysign + else if t = 'f64.convert_i32_s' then inst := inst_f64_convert_i32_s + else if t = 'f64.convert_i32_u' then inst := inst_f64_convert_i32_u + else if t = 'f64.convert_i64_s' then inst := inst_f64_convert_i64_s + else if t = 'f64.convert_i64_u' then inst := inst_f64_convert_i64_u + else if t = 'f64.promote_f32' then inst := inst_f64_promote_f32 + else if t = 'f64.reinterpret_i64' then inst := inst_f64_reinterpret_i64 + else Result := false; + end; +end; + +function intTextToInst(const t: string; var inst: byte): Boolean; +begin + Result := length(t)>4; + if not Result then Exit; + + if (t[2]='3') and (t[3]='2') then begin + if t = 'i32.load' then inst := inst_i32_load + else if t = 'i32.load8_s' then inst := inst_i32_load8_s + else if t = 'i32.load8_u' then inst := inst_i32_load8_u + else if t = 'i32.load16_s' then inst := inst_i32_load16_s + else if t = 'i32.load16_u' then inst := inst_i32_load16_u + else if t = 'i32.store' then inst := inst_i32_store + else if t = 'i32.store8' then inst := inst_i32_store8 + else if t = 'i32.store16' then inst := inst_i32_store16 + else if t = 'i32.const' then inst := inst_i32_const + else if t = 'i32.eqz' then inst := inst_i32_eqz + else if t = 'i32.eq' then inst := inst_i32_eq + else if t = 'i32.ne' then inst := inst_i32_ne + else if t = 'i32.lt_s' then inst := inst_i32_lt_s + else if t = 'i32.lt_u' then inst := inst_i32_lt_u + else if t = 'i32.gt_s' then inst := inst_i32_gt_s + else if t = 'i32.gt_u' then inst := inst_i32_gt_u + else if t = 'i32.le_s' then inst := inst_i32_le_s + else if t = 'i32.le_u' then inst := inst_i32_le_u + else if t = 'i32.ge_s' then inst := inst_i32_ge_s + else if t = 'i32.ge_u' then inst := inst_i32_ge_u + else if t = 'i32.clz' then inst := inst_i32_clz + else if t = 'i32.ctz' then inst := inst_i32_ctz + else if t = 'i32.popcnt' then inst := inst_i32_popcnt + else if t = 'i32.add' then inst := inst_i32_add + else if t = 'i32.sub' then inst := inst_i32_sub + else if t = 'i32.mul' then inst := inst_i32_mul + else if t = 'i32.div_s' then inst := inst_i32_div_s + else if t = 'i32.div_u' then inst := inst_i32_div_u + else if t = 'i32.rem_s' then inst := inst_i32_rem_s + else if t = 'i32.rem_u' then inst := inst_i32_rem_u + else if t = 'i32.and' then inst := inst_i32_and + else if t = 'i32.or' then inst := inst_i32_or + else if t = 'i32.xor' then inst := inst_i32_xor + else if t = 'i32.shl' then inst := inst_i32_shl + else if t = 'i32.shr_s' then inst := inst_i32_shr_s + else if t = 'i32.shr_u' then inst := inst_i32_shr_u + else if t = 'i32.rotl' then inst := inst_i32_rotl + else if t = 'i32.rotr' then inst := inst_i32_rotr + else if t = 'i32.wrap_i64' then inst := inst_i32_wrap_i64 + else if t = 'i32.trunc_f32_s' then inst := inst_i32_trunc_f32_s + else if t = 'i32.trunc_f32_u' then inst := inst_i32_trunc_f32_u + else if t = 'i32.trunc_f64_s' then inst := inst_i32_trunc_f64_s + else if t = 'i32.trunc_f64_u' then inst := inst_i32_trunc_f64_u + else if t = 'i32.reinterpret_f32' then inst := inst_i32_reinterpret_f32 + else Result := false; + end else if (t[2]='6') and (t[3]='4') then begin + if t = 'i64.load8_s' then inst := inst_i64_load8_s + else if t = 'i64.load8_u' then inst := inst_i64_load8_u + else if t = 'i64.load16_s' then inst := inst_i64_load16_s + else if t = 'i64.load16_u' then inst := inst_i64_load16_u + else if t = 'i64.load32_s' then inst := inst_i64_load32_s + else if t = 'i64.load32_u' then inst := inst_i64_load32_u + else if t = 'i64.store' then inst := inst_i64_store + else if t = 'i64.store8' then inst := inst_i64_store8 + else if t = 'i64.store16' then inst := inst_i64_store16 + else if t = 'i64.store32' then inst := inst_i64_store32 + else if t = 'i64.const' then inst := inst_i64_const + else if t = 'i64.eqz' then inst := inst_i64_eqz + else if t = 'i64.eq' then inst := inst_i64_eq + else if t = 'i64.ne' then inst := inst_i64_ne + else if t = 'i64.lt_s' then inst := inst_i64_lt_s + else if t = 'i64.lt_u' then inst := inst_i64_lt_u + else if t = 'i64.gt_s' then inst := inst_i64_gt_s + else if t = 'i64.gt_u' then inst := inst_i64_gt_u + else if t = 'i64.le_s' then inst := inst_i64_le_s + else if t = 'i64.le_u' then inst := inst_i64_le_u + else if t = 'i64.ge_s' then inst := inst_i64_ge_s + else if t = 'i64.ge_u' then inst := inst_i64_ge_u + else if t = 'i64.clz' then inst := inst_i64_clz + else if t = 'i64.ctz' then inst := inst_i64_ctz + else if t = 'i64.popcnt' then inst := inst_i64_popcnt + else if t = 'i64.add' then inst := inst_i64_add + else if t = 'i64.sub' then inst := inst_i64_sub + else if t = 'i64.mul' then inst := inst_i64_mul + else if t = 'i64.div_s' then inst := inst_i64_div_s + else if t = 'i64.div_u' then inst := inst_i64_div_u + else if t = 'i64.rem_s' then inst := inst_i64_rem_s + else if t = 'i64.rem_u' then inst := inst_i64_rem_u + else if t = 'i64.and' then inst := inst_i64_and + else if t = 'i64.or' then inst := inst_i64_or + else if t = 'i64.xor' then inst := inst_i64_xor + else if t = 'i64.shl' then inst := inst_i64_shl + else if t = 'i64.shr_s' then inst := inst_i64_shr_s + else if t = 'i64.shr_u' then inst := inst_i64_shr_u + else if t = 'i64.rotl' then inst := inst_i64_rotl + else if t = 'i64.rotr' then inst := inst_i64_rotr + else if t = 'i64.extend_i32_s' then inst := inst_i64_extend_i32_s + else if t = 'i64.extend_i32_u' then inst := inst_i64_extend_i32_u + else if t = 'i64.trunc_f32_s' then inst := inst_i64_trunc_f32_s + else if t = 'i64.trunc_f32_u' then inst := inst_i64_trunc_f32_u + else if t = 'i64.trunc_f64_s' then inst := inst_i64_trunc_f64_s + else if t = 'i64.trunc_f64_u' then inst := inst_i64_trunc_f64_u + else if t = 'i64.load' then inst := inst_i64_load + else if t = 'i64.reinterpret_f64' then inst := inst_i64_reinterpret_f64 + else Result := false; + end else + Result := false; +end; + +function TextToInst(const t: string; out inst: byte): Boolean; +begin + inst:=0; + Result := length(t)>0; + if not Result then Exit; + + case t[1] of + 'b': + if t = 'block' then inst := inst_block + else if t = 'br' then inst := inst_br + else if t = 'br_if' then inst := inst_br_if + else if t = 'br_table' then inst := inst_br_table + else Result := false; + 'c': + if t = 'call' then inst := inst_call + else if t = 'call_indirect' then inst := inst_call_indirect + else Result := false; + 'd': + if t = 'drop' then inst := inst_drop + else Result := false; + 'e': + if t = 'else' then inst := inst_else + else if t = 'end' then inst := inst_end + else Result := false; + 'f': + Result := floatTextToInst(t, inst); + 'g': + if t = 'global.get' then inst := inst_global_get + else if t = 'global.set' then inst := inst_global_set + // wabt + else if t = 'get_local' then inst := INST_local_get + else if t = 'get_global' then inst := INST_global_get + else Result := false; + 'i': + if t = 'if' then inst := inst_if + else Result := intTextToInst(t, inst); + 'l': + if t = 'local.get' then inst := inst_local_get + else if t = 'local.set' then inst := inst_local_set + else if t = 'local.tee' then inst := inst_local_tee + else if t = 'loop' then inst := inst_loop + else Result := false; + 'm': + if t = 'memory.size' then inst := inst_memory_size + else if t = 'memory.grow' then inst := inst_memory_grow + else Result := false; + 'n': + if t = 'nop' then inst := inst_nop + else Result := false; + 'r': + if t = 'return' then inst := inst_return + else Result := false; + 's': + if t = 'select' then inst := inst_select + // wabt + else if t = 'set_local' then inst := INST_local_set + else if t = 'set_global' then inst := INST_global_set + else Result := false; + 'u': + if t ='unreachable' then inst := inst_unreachable + else Result := false; + else + Result := false; + end; +end; + +end.