123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513 |
- { This file is part of wasmbin - a collection of WebAssembly binary utils.
- Copyright (C) 2019, 2020 Dmitry Boyarintsev <[email protected]>
- Copyright (C) 2020 by the Free Pascal development team
- This source is free software; you can redistribute it and/or modify it under
- the terms of the GNU General Public License as published by the Free
- Software Foundation; either version 2 of the License, or (at your option)
- any later version.
- This code is distributed in the hope that it will be useful, but WITHOUT ANY
- WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
- FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
- details.
- A copy of the GNU General Public License is available on the World Wide Web
- at <http://www.gnu.org/copyleft/gpl.html>. You can also obtain it by writing
- to the Free Software Foundation, Inc., 51 Franklin Street - Fifth Floor,
- Boston, MA 02110-1335, USA.
- }
- unit wasmtext;
- interface
- // WebAssembly Wabt text utilities
- {$mode objfpc}{$H+}
- 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_s/i32' 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_u/i32' 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_s/i64' 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.convert_u/i64' then inst := inst_f32_convert_i64_u
- else if t = 'f32.demote_f64' then inst := inst_f32_demote_f64
- 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 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_s/i32' 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_u/i32' 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_s/i64' 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.convert_u/i64' then inst := inst_f64_convert_i64_u
- else if t = 'f64.promote_f32' then inst := inst_f64_promote_f32
- 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 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.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_s/f32' 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_u/f32' 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_s/f64' 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.trunc_u/f64' then inst := inst_i32_trunc_f64_u
- else if t = 'i32.reinterpret_f32' then inst := inst_i32_reinterpret_f32
- 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_s/i32' 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.extend_u/i32' 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_s/f32' 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_u/f32' 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_s/f64' 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.trunc_u/f64' 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 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 if t = 'current_memory' then inst := INST_memory_size
- 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 if t = 'grow_memory' then inst := inst_memory_grow
- 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;
- 't':
- if t = 'tee_local' then inst := INST_local_tee;
- 'u':
- if t ='unreachable' then inst := inst_unreachable
- else Result := false;
- else
- Result := false;
- end;
- end;
- end.
|