CN117008971B - WebAssembly指令集的转换方法及装置 - Google Patents
WebAssembly指令集的转换方法及装置 Download PDFInfo
- Publication number
- CN117008971B CN117008971B CN202311270091.6A CN202311270091A CN117008971B CN 117008971 B CN117008971 B CN 117008971B CN 202311270091 A CN202311270091 A CN 202311270091A CN 117008971 B CN117008971 B CN 117008971B
- Authority
- CN
- China
- Prior art keywords
- instruction
- operation code
- conversion
- converted
- conversion information
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Active
Links
- 238000006243 chemical reaction Methods 0.000 title claims abstract description 355
- 238000000034 method Methods 0.000 title claims abstract description 38
- 230000006870 function Effects 0.000 claims description 58
- 238000013519 translation Methods 0.000 claims description 7
- 238000010586 diagram Methods 0.000 description 3
- 238000004364 calculation method Methods 0.000 description 2
- 238000005516 engineering process Methods 0.000 description 2
- 238000012545 processing Methods 0.000 description 2
- 230000006978 adaptation Effects 0.000 description 1
- 230000001413 cellular effect Effects 0.000 description 1
- 238000004891 communication Methods 0.000 description 1
- 238000004590 computer program Methods 0.000 description 1
- JEIPFZHSYJVQDO-UHFFFAOYSA-N iron(III) oxide Inorganic materials O=[Fe]O[Fe]=O JEIPFZHSYJVQDO-UHFFFAOYSA-N 0.000 description 1
- 230000001343 mnemonic effect Effects 0.000 description 1
- 238000012986 modification Methods 0.000 description 1
- 230000004048 modification Effects 0.000 description 1
- 230000000750 progressive effect Effects 0.000 description 1
- 230000004044 response Effects 0.000 description 1
- 239000007787 solid Substances 0.000 description 1
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/30—Arrangements for executing machine instructions, e.g. instruction decode
- G06F9/30003—Arrangements for executing specific machine instructions
- G06F9/30007—Arrangements for executing specific machine instructions to perform operations on data operands
- G06F9/30025—Format conversion instructions, e.g. Floating-Point to Integer, decimal conversion
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/22—Microcontrol or microprogram arrangements
- G06F9/226—Microinstruction function, e.g. input/output microinstruction; diagnostic microinstruction; microinstruction format
-
- Y—GENERAL TAGGING OF NEW TECHNOLOGICAL DEVELOPMENTS; GENERAL TAGGING OF CROSS-SECTIONAL TECHNOLOGIES SPANNING OVER SEVERAL SECTIONS OF THE IPC; TECHNICAL SUBJECTS COVERED BY FORMER USPC CROSS-REFERENCE ART COLLECTIONS [XRACs] AND DIGESTS
- Y02—TECHNOLOGIES OR APPLICATIONS FOR MITIGATION OR ADAPTATION AGAINST CLIMATE CHANGE
- Y02D—CLIMATE CHANGE MITIGATION TECHNOLOGIES IN INFORMATION AND COMMUNICATION TECHNOLOGIES [ICT], I.E. INFORMATION AND COMMUNICATION TECHNOLOGIES AIMING AT THE REDUCTION OF THEIR OWN ENERGY USE
- Y02D10/00—Energy efficient computing, e.g. low power processors, power management or thermal management
Abstract
本说明书提供有WebAssembly指令集的转换方法及装置。应用于资源受限设备,所述方法包括:响应于资源受限设备待执行的函数,为所述待执行的函数分配新的指令存储空间;遍历标准WebAssembly指令集,获取用于执行所述待执行的函数的目标指令,并确定所述目标指令中是否存在需要转换的待转换指令;响应于确定出的待转换指令,为所述待执行的函数记录指令转换信息;根据所述指令转换信息执行指令转换,以将所述待转换指令转换为适用于所述资源受限设备的自定义指令;将转换得到的自定义指令存储到所述指令存储空间,以使所述资源受限设备基于所述自定义指令执行所述待执行的函数。
Description
技术领域
本说明书实施例涉及计算机领域,尤其涉及一WebAssembly指令集的转换方法及装置。
背景技术
WebAssembly(也可以简称为wasm)是一种可以运行在浏览器的新型代码技术,其可以为诸如C、C++和Rust等低级源语言提供一个高效的编译目标;且具有快速、高效、可移植的特点,可以在不同平台上以接近本地速度运行。
由于标准的WebAssembly指令集面向并非资源受限设备,导致资源受限设备在使用标准的WebAssembly指令集执行字节码时执行效率较低。
发明内容
本说明书实施例提供的一种WebAssembly指令集的转换方法及装置。用以解决资源受限设备在使用标准的WebAssembly指令集执行字节码时执行效率较低的问题。
根据本说明书实施例的第一方面,提供一种WebAssembly指令集的转换方法,应用于资源受限设备,所述方法包括:
响应于资源受限设备待执行的函数,为所述待执行的函数分配新的指令存储空间;
遍历标准WebAssembly指令集,获取用于执行所述待执行的函数的目标指令,并确定所述目标指令中是否存在需要转换的待转换指令;
响应于确定出的待转换指令,为所述待执行的函数记录指令转换信息;
根据所述指令转换信息执行指令转换,以将所述待转换指令转换为适用于所述资源受限设备的自定义指令;
将转换得到的自定义指令存储到所述指令存储空间,以使所述资源受限设备基于所述自定义指令执行所述待执行的函数。
可选的,所述待转换指令包括常数指令,所述确定所述目标指令中是否存在需要转换的待转换指令,包括:
确定所述目标指令中是否存在i32.const指令;
如果存在i32.const指令,进一步确定该i32.const指令的操作数的取值是否位于[-32768,32767]之间;
如果该i32.const指令的操作数的取值位于[-32768,32767]之间,则确定所述目标指令中的i32.const指令是需要转换的常数指令。
可选的,所述待转换指令包括位运算指令,所述确定所述目标指令中是否存在需要转换的待转换指令,包括:
确定所述目标指令中是否存在i16.const指令、i32.load8_s指令、i32.load8_u指令、i32.load16_s指令、i32.load16_u指令中的任一种;
如果存在i16.const指令,且该i16.const指令之后的第一条指令为i32.and指令、i32.or指令、i32.xor指令中的任一种,则确定所述目标指令中的i16.const指令是需要转换的位运算指令;
如果存在i32.load8_s指令、i32.load8_u指令、i32.load16_s指令或i32.load16_u指令,且其后第一条指令为i16.const指令、其后第二条指令为32.shl指令、i32.shr_s指令、i32.shr_u指令、i32.rotl指令、i32.rotr指令中的任一种,则确定其是所述目标指令中需要转换的位运算指令。
可选的,所述待转换指令包括算术运算指令,所述确定所述目标指令中是否存在需要转换的待转换指令,包括:
确定所述目标指令中是否存在i32.load8_s指令、i32.load8_u指令、i32.load16_s指令、i32.load16_u指令中的任一种,
如果存在i32.load8_s指令、i32.load8_u指令、i32.load16_s指令、i32.load16_u指令中的任一种,且其后第一条指令为i32.clz指令、i32.ctz指令、i32.popcnt指令中的任一种,或者
其后第一条指令为i16.const指令,其后第二条指令为i32.add指令、i32.sub指令、i32.mul指令、i32.div_s指令、i32.div_u指令、i32.rem_s指令、i32.rem_u指令中的任一种;
则确定其是所述目标指令中需要转换的算术运算指令。
可选的,所述待转换指令包括比较运算指令,所述确定所述目标指令中是否存在需要转换的待转换指令,包括:
确定所述目标指令中是否存在i32.load8_s指令、i32.load8_u指令、i32.load16_s指令、i32.load16_u指令中的任一种;
如果存在i32.load8_s指令、i32.load8_u指令、i32.load16_s指令、i32.load16_u指令中的任一种,且其后第一条指令为i32.eqz指令,或者
其后第一条指令为i16.const指令,其后第二条指令为i32.eq指令、i32.ne指令、i32.lt_s指令、i32.lt_u指令、i32.gt_s指令、i32.gt_u指令、i32.le_s指令、i32.le_u指令、i32.ge_s指令、i32.ge_u指令中的任一种;
则确定其是所述目标指令中需要转换的比较运算指令。
可选的,所述待转换指令包括类型转换指令,所述确定所述目标指令中是否存在需要转换的待转换指令,包括:
确定所述目标指令中是否存在i32.load8_s指令、i32.load8_u指令、i32.load16_s指令、i32.load16_u指令中的任一种;
如果存在i32.load8_s指令或i32.load8_u指令,且其后第一条指令为i32.extend8_s指令,则确定所述i32.load8_s指令或i32.load8_u指令是所述目标指令中需要转换的类型转换指令;
如果存在i32.load8_s指令、i32.load8_u指令、i32.load16_s指令、i32.load16_u指令中的任一种,且其后第一条指令为i32.wrap_i64指令,则确定其是所述目标指令中需要转换的类型转换指令。
可选的,所述待转换指令包括高频指令,所述确定所述目标指令中是否存在需要转换的待转换指令,包括:
确定所述目标指令中是否存在i16.const指令、local.get指令、local.set指令、local.tee指令、global.get指令、global.set指令中的任一种;
如果存在i16.const指令,且该i16.const指令的操作数的取值为[0,5]之间的常数,则确定该i16.const指令是所述目标指令中需要转换的高频指令;
如果存在local.get指令、local.set指令、local.tee指令中的任一种,且其操作数的取值为[0,3]之间的常数,则确定其是所述目标指令中需要转换的高频指令;
如果存在global.get指令或global.set指令,且global.get指令或global.set指令的操作数的取值为0,则确定global.get指令或global.set指令是所述目标指令中需要转换的高频指令。
可选的,所述待转换指令包括控制指令,所述确定所述目标指令中是否存在需要转换的待转换指令,包括:
确定所述目标指令中是否存在block,loop指令或if指令;
如果存在block,loop指令或if指令,且block,loop指令或if指令的操作数的第一个字节不是0x40、0x7C、0x7D、0x7E或0x7F,则确定block,loop指令或if指令是所述目标指令中需要转换的控制指令。
可选的,所述指令转换信息由每个待转换指令对应的指令转换信息单元构成,每个指令转换信息单元包括与待转换指令相关的转换类型标识、数据位置、数据长度;所述指令转换信息单元之间按照待转换指令在执行所述待执行函数时的先后顺序排列;
其中,所述转换类型标识用于记录待转换指令的指令转换类型;
所述数据位置用于记录待转换指令在函数中的位置;
所述数据长度用于记录待转换指令的长度。
可选的,所述根据所述指令转换信息执行指令转换,包括:
步骤A1,获取所述指令转换信息中的第一个指令转换信息单元,基于所述第一个指令转换信息单元中记录的数据位置,将待执行的函数的函数起始位置至所述数据位置之间的指令,拷贝到所述新的指令存储空间;
步骤A2,将第一个指令转换信息单元确定为当前转换信息单元;
步骤A3,根据当前指令转换信息单元的转换类型标识执行对应的转换操作;
步骤A4,计算当前指令转换信息单元的数据位置与数据长度之和,并将计算得到的和值作为当前指令转换信息单元的结尾位置;
步骤A5,获取当前指令转换信息单元之后的下一个指令转换信息单元,计算所述下一个指令转换信息单元记录的数据位置与所述当前指令转换信息单元的结尾位置之间的差值;
步骤A6,如果计算得到的差值不为零,则将所述当前指令转换信息单元的结尾位置至所述下一个指令转换信息单元记录的数据位置之间的指令拷贝至所述新的指令存储空间;
步骤A7,将下一个指令转换信息单元作为新的当前指令转换信息单元,重复执行上述步骤A3-A6;
步骤A8,在最后一个指令转换信息单元处理后,计算所述待执行的函数的函数结尾位置与最后一个转换单元的结尾位置之间的差值;并在计算的差值不为零时,将最后一个转换单元的结尾位置至所述待执行的函数的函数结尾位置的指令拷贝至所述新的指令存储空间。
可选的,所述根据当前指令转换信息单元的转换类型标识执行对应转换操作,包括:
在当前指令转换信息单元的转换类型标识表示常量指令转换时,根据当前指令转换信息单元记录的数据位置查询对应的指令的位置,并进一步根据当前指令转换信息单元记录的数据长度从所述指令的位置开始拷贝数据到新的指令存储空间,将i32.const指令的操作码修改为i16.const指令的操作码;
在当前指令转换信息单元的转换类型标识表示位运算指令转换时,根据当前指令转换信息单元记录的数据位置查询对应的指令的位置,并进一步根据当前指令转换信息单元记录的数据长度从所述指令的位置开始拷贝数据到新的指令存储空间,将i32.and指令的操作码修改为i16.and指令的操作码、将i32.or指令的操作码修改为i16.or指令的操作码、将i32.xor指令的操作码修改为i16.xor指令的操作码、将i32.shl指令的操作码修改为i16.shl指令的操作码、将i32.shr_s指令的操作码修改为i16.shr_s指令的操作码、将i32.shr_u指令的操作码修改为i16.shr_u指令的操作码、将i32.rotl指令的操作码修改为i16.rotl指令的操作码、将i32.rotr指令的操作码修改为i16.rotr指令的操作码;
在当前指令转换信息单元的转换类型标识表示算术运算指令转换时,根据当前指令转换信息单元记录的数据位置查询对应的指令的位置,并进一步根据当前指令转换信息单元记录的数据长度从所述指令的位置开始拷贝数据到新的指令存储空间,将i32.clz指令的操作码修改为i16.clz指令的操作码、将i32.ctz指令的操作码修改为i16.ctz指令的操作码、将i32.popcnt指令的操作码修改为i16.popcnt指令的操作码、将i32.add指令的操作码修改为i16.add指令的操作码、将i32.sub指令的操作码修改为i16.sub指令的操作码、将i32.mul指令的操作码修改为i16.mul指令的操作码、将i32.div_s指令的操作码修改为i16.div_s指令的操作码、将i32.div_u指令的操作码修改为i16.div_u指令的操作码、将i32.rem_s指令的操作码修改为i16.rem_s指令的操作码、将i32.rem_u指令的操作码修改为i16.rem_u指令的操作码;
在当前指令转换信息单元的转换类型标识表示比较运算指令转换时,根据当前指令转换信息单元记录的数据位置查询对应的指令的位置,并进一步根据当前指令转换信息单元记录的数据长度从所述指令的位置开始拷贝数据到新的指令存储空间,将i32.eqz指令的操作码修改为i16.eqz指令的操作码、将i32.eq指令的操作码修改为i16.eq指令的操作码、将i32.ne指令的操作码修改为i16.ne指令的操作码、将i32.lt_s指令的操作码修改为i16.lt_s指令的操作码、将i32.lt_u指令的操作码修改为i16.lt_u指令的操作码、将i32.gt_s指令的操作码修改为i16.gt_s指令的操作码、将i32.gt_u指令的操作码修改为i16.gt_u指令的操作码、将i32.le_s指令的操作码修改为i16.le_s指令的操作码、将i32.le_u指令的操作码修改为i16.le_u指令的操作码、将i32.ge_s指令的操作码修改为i16.ge_s指令的操作码、将i32.ge_u指令的操作码修改为i16.ge_u指令的操作码;
在当前指令转换信息单元的转换类型标识表示类型转换指令转换时,根据当前指令转换信息单元记录的数据位置查询对应的指令的位置,并进一步根据当前指令转换信息单元记录的数据长度从所述指令的位置开始拷贝数据到新的指令存储空间,将i32.extend8_s指令的操作码修改为i16.extend8_s指令的操作码、将i32.wrap_i64指令的操作码修改为i16.wrap_i32指令的操作码;
在当前指令转换信息单元的转换类型标识表示高频指令转换时,根据当前指令转换信息单元记录的数据位置查询对应的指令的位置,并进一步将1字节指令码写到新的指令存储空间,将local.get指令的操作码修改为local.get_[C]指令的操作码、将local.set指令的操作码修改为local.set_[C]指令的操作码、将local.tee指令的操作码修改为local.tee_[C],指令的操作码、将global.get指令的操作码修改为global.get_0指令的操作码、将global.set指令的操作码修改为global.set_0指令的操作码;以及,如果i16.const后第一条指令是i16开头的指令,则将i16.const指令的操作码修改为i16.const_[C]指令的操作码,否则将i16.const指令的操作码修改为i32.const_[C]指令的操作码;其中[C]是被修改的指令的操作数。
在当前指令转换信息单元的转换类型标识表示控制指令转换时,根据当前指令转换信息单元记录的数据位置查询对应的指令的位置,并进一步根据当前指令转换信息单元记录的数据长度从所述指令的位置开始拷贝数据到新的指令存储空间,将block指令的操作码修改为block_with_blocktype指令的操作码、将loop指令的操作码修改为loop_with_blocktype指令的操作码、将if指令的操作码修改为if_with_blocktype指令的操作码。
根据本说明书实施例的第二方面,提供一种WebAssembly指令集的转换装置,应用于资源受限设备,所述装置包括:
分配单元,响应于资源受限设备待执行的函数,为所述待执行的函数分配新的指令存储空间;
遍历单元,遍历标准WebAssembly指令集,获取用于执行所述待执行的函数的目标指令,并确定所述目标指令中是否存在需要转换的待转换指令;
记录单元,响应于确定出的待转换指令,为所述待执行的函数记录指令转换信息;
转换单元,根据所述指令转换信息执行指令转换,以将所述待转换指令转换为适用于所述资源受限设备的自定义指令;
执行单元,将转换得到的自定义指令存储到所述指令存储空间,以使所述资源受限设备基于所述自定义指令执行所述待执行的函数。
根据本说明书实施例的第三方面,提供一种电子设备,包括:
处理器;
用于存储处理器可执行指令的存储器;
其中,所述处理器被配置为上述任一项WebAssembly指令集的转换方法。
本说明书实施例,提供了一种WebAssembly指令集的转换方案,将标准WebAssembly指令集中不符合资源受限设备的指令转换为适用于资源受限设备的自定义指令,从而使得资源受限设备通过转换后的自定义指令执行字节码时,可以减少字节码的大小,提升字节码的执行效率。
附图说明
图1是本说明书一实施例提供资源受限设备中WebAssembly指令集的转换方法的流程图;
图2是本说明书一实施例提供的资源受限设备中WebAssembly指令集的转换装置的硬件结构图;
图3是本说明书一实施例提供的资源受限设备中WebAssembly指令集的转换装置的模块。
具体实施方式
这里将详细地对示例性实施例进行说明,其示例表示在附图中。下面的描述涉及附图时,除非另有表示,不同附图中的相同数字表示相同或相似的要素。以下示例性实施例中所描述的实施方式并不代表与本说明书相一致的所有实施方式。相反,它们仅是与如所附权利要求书中所详述的、本说明书的一些方面相一致的装置和方法的例子。
在本说明书使用的术语是仅仅出于描述特定实施例的目的,而非旨在限制本说明书。在本说明书和所附权利要求书中所使用的单数形式的“一种”、“所述”和“该”也旨在包括多数形式,除非上下文清楚地表示其他含义。还应当理解,本文中使用的术语“和/或”是指并包含一个或多个相关联的列出项目的任何或所有可能组合。
应当理解,尽管在本说明书可能采用术语第一、第二、第三等来描述各种信息,但这些信息不应限于这些术语。这些术语仅用来将同一类型的信息彼此区分开。例如,在不脱离本说明书范围的情况下,第一信息也可以被称为第二信息,类似地,第二信息也可以被称为第一信息。取决于语境,如在此所使用的词语“如果”可以被解释成为“在……时”或“当……时”或“响应于确定”。
本说明书中,WebAssembly字节码是一种中间代码格式,可以在所有支持WebAssembly的运行时中解释执行。它是一种类似于汇编语言的低级别语言,由一系列指令组成,这些指令被称为操作码(opcode)。
WebAssembly字节码的指令集(下面简称为WebAssembly指令集)非常简洁,并且可以轻松地被翻译成各种不同的机器语言。这使得WebAssembly成为一个高效、可移植和安全的虚拟机技术,可以用于Web浏览器以外的各种应用程序和平台。
WebAssembly字节码也具有可读性,可以使用文本格式(.wat文件)描述。这种文本格式可以帮助开发人员更好地理解和分析WebAssembly代码,以及进行手动调试或反汇编。
由于标准的WebAssembly指令集面向32位和64位操作系统,指令集中的字节码最小的位宽也是32位的,而资源受限设备通常是基于16位处理器的,因此资源受限设备中在使用标准的WebAssembly指令集执行字节码是往往效率不高。
为了解决上述问题,本说明书设计了一种适合资源受限设备使用的WebAssembly指令集,该WebAssembly指令集可以是在标准WebAssembly指令集基础上进行转换而成。具体可以是将标准WebAssembly指令集中不符合资源受限设备的指令转换为适用于资源受限设备的自定义指令,从而生成适用于资源受限设备的WebAssembly指令集。
下面请参考表1所示的适用于资源受限设备的WebAssembly指令集的总表示意图,具体每种指令的助记符和操作码请详见表1,这里不再进行赘述。
表1
该表1所示的WebAssembly指令集相当于标准WebAssembly指令集,将标准WebAssembly指令集中,资源受限设备不需要的64位位宽的常数指令、位运算指令、算术运算指令、比较运算指令、类型转换指令、高频指令、控制指令指令,替换为资源受限设备能够使用的16位位宽的常数指令、位运算指令、算术运算指令、比较运算指令、类型转换指令、高频指令、控制指令指。
在设计了适用于资源受限设备使用的WebAssembly指令集之后,本说明书还提供了将标准WebAssembly指令集转换为上述表1所示适用于资源受限设备使用的WebAssembly指令集的实施例。
以下请参考图1所示的资源受限设备中WebAssembly指令集的转换方法流程示意图,该方法可以应用于资源受限设备,该方法可以包括以下步骤:
步骤110,响应于资源受限设备待执行的函数,为所述待执行的函数分配新的指令存储空间。所述指令存储空间可以用于存储转换后的自定义指令。
步骤120,遍历标准WebAssembly指令集,获取用于执行所述待执行的函数的目标指令,并确定所述目标指令中是否存在需要转换的待转换指令;
示例性的,在标准WebAssembly指令集存在一些无法被资源受限设备使用的指令,例如常数指令、位运算指令、算术运算指令、比较运算指令、类型转换指令、高频指令、控制指令指令等不同类型的指令。
下面针对每种类型的指令,依次进行说明。
在一示例性的实施例中,针对待转换指令为常数指令,上述步骤120在确定所述目标指令中是否存在需要转换的待转换指令时,可以包括:
确定所述目标指令中是否存在i32.const指令;
如果存在i32.const指令,进一步确定该i32.const指令的操作数的取值是否位于[-32768,32767]之间;
如果该i32.const指令的操作数的取值位于[-32768,32767]之间,则确定所述目标指令中的i32.const指令是需要转换的常数指令。
在一示例性的实施例中,针对待转换指令为位运算指令,上述步骤120在确定所述目标指令中是否存在需要转换的待转换指令时,可以包括:
确定所述目标指令中是否存在i16.const指令、i32.load8_s指令、i32.load8_u指令、i32.load16_s指令、i32.load16_u指令中的任一种;
如果存在i16.const指令,且该i16.const指令之后的第一条指令为i32.and指令、i32.or指令、i32.xor指令中的任一种,则确定所述目标指令中的i16.const指令是需要转换的位运算指令;
如果存在i32.load8_s指令、i32.load8_u指令、i32.load16_s指令或i32.load16_u指令,且其后第一条指令为i16.const指令、其后第二条指令为32.shl指令、i32.shr_s指令、i32.shr_u指令、i32.rotl指令、i32.rotr指令中的任一种,则确定其是所述目标指令中需要转换的位运算指令。
在一示例性的实施例中,针对待转换指令为算术运算指令,上述步骤120在确定所述目标指令中是否存在需要转换的待转换指令时,可以包括:
确定所述目标指令中是否存在i32.load8_s指令、i32.load8_u指令、i32.load16_s指令、i32.load16_u指令中的任一种,
如果存在i32.load8_s指令、i32.load8_u指令、i32.load16_s指令、i32.load16_u指令中的任一种,且其后第一条指令为i32.clz指令、i32.ctz指令、i32.popcnt指令中的任一种,或者
其后第一条指令为i16.const指令,其后第二条指令为i32.add指令、i32.sub指令、i32.mul指令、i32.div_s指令、i32.div_u指令、i32.rem_s指令、i32.rem_u指令中的任一种;
则确定其是所述目标指令中需要转换的算术运算指令。
在一示例性的实施例中,针对待转换指令为比较运算指令,上述步骤120在确定所述目标指令中是否存在需要转换的待转换指令时,可以包括:
确定所述目标指令中是否存在i32.load8_s指令、i32.load8_u指令、i32.load16_s指令、i32.load16_u指令中的任一种;
如果存在i32.load8_s指令、i32.load8_u指令、i32.load16_s指令、i32.load16_u指令中的任一种,且其后第一条指令为i32.eqz指令,或者
其后第一条指令为i16.const指令,其后第二条指令为i32.eq指令、i32.ne指令、i32.lt_s指令、i32.lt_u指令、i32.gt_s指令、i32.gt_u指令、i32.le_s指令、i32.le_u指令、i32.ge_s指令、i32.ge_u指令中的任一种;
则确定其是所述目标指令中需要转换的比较运算指令。
在一示例性的实施例中,针对待转换指令为类型转换指令,上述步骤120在确定所述目标指令中是否存在需要转换的待转换指令时,可以包括:
确定所述目标指令中是否存在i32.load8_s指令、i32.load8_u指令、i32.load16_s指令、i32.load16_u指令中的任一种;
如果存在i32.load8_s指令或i32.load8_u指令,且其后第一条指令为i32.extend8_s指令,则确定所述i32.load8_s指令或i32.load8_u指令是所述目标指令中需要转换的类型转换指令;
如果存在i32.load8_s指令、i32.load8_u指令、i32.load16_s指令、i32.load16_u指令中的任一种,且其后第一条指令为i32.wrap_i64指令,则确定其是所述目标指令中需要转换的类型转换指令。
在一示例性的实施例中,针对待转换指令包括高频指令,上述步骤120在确定所述目标指令中是否存在需要转换的待转换指令时,可以包括:
确定所述目标指令中是否存在i16.const指令、local.get指令、local.set指令、local.tee指令、global.get指令、global.set指令中的任一种;
如果存在i16.const指令,且该i16.const指令的操作数的取值为[0,5]之间的常数,则确定该i16.const指令是所述目标指令中需要转换的高频指令;
如果存在local.get指令、local.set指令、local.tee指令中的任一种,且其操作数的取值为[0,3]之间的常数,则确定其是所述目标指令中需要转换的高频指令;
如果存在global.get指令或global.set指令,且global.get指令或global.set指令的操作数的取值为0,则确定global.get指令或global.set指令是所述目标指令中需要转换的高频指令。
在一示例性的实施例中,针对待转换指令包括控制指令,上述步骤120在确定所述目标指令中是否存在需要转换的待转换指令时,可以包括:
确定所述目标指令中是否存在block,loop指令或if指令;
如果存在block,loop指令或if指令,且block,loop指令或if指令的操作数的第一个字节不是0x40、0x7C、0x7D、0x7E或0x7F,则确定block,loop指令或if指令是所述目标指令中需要转换的控制指令。
步骤130,响应于确定出的待转换指令,为所述待执行的函数记录指令转换信息。
所述指令转换信息可以是由每个待转换指令对应的指令转换信息单元构成。
每个指令转换信息单元进一步可以包括与待转换指令相关的转换类型标识、数据位置、数据长度。
其中,所述转换类型标识用于记录待转换指令的指令转换类型;例如常量指令转换标识、位运算指令转换标识、算术运算指令转换标识、比较运算指令转换标识、类型转换指令转换标识、高频指令转换标识或控制指令转换标识。
所述数据位置用于记录待转换指令在函数中的位置。
所述数据长度用于记录待转换指令的长度。
另外,所述指令转换信息单元之间可以按照待转换指令在执行所述待执行函数时的先后顺序排列。
步骤140,根据所述指令转换信息执行指令转换,以将所述待转换指令转换为适用于所述资源受限设备的自定义指令。
针对从标准WebAssembly指令集中确定出的需要转换的待转换指令,可以基于指令转换信息将待转换指令转换为用于所述资源受限设备的自定义指令。
如前所述的,指令转换信息可以是由每个待转换指令对应的指令转换信息单元构成,那么在执行指令转换时,可以按照指令转换信息单元的先后顺序依次对各个待转换指令进行转换。
即上述根据所述指令转换信息执行指令转换,可以包括:
步骤A1,获取所述指令转换信息中的第一个指令转换信息单元,基于所述第一个指令转换信息单元中记录的数据位置,将待执行的函数的函数起始位置至所述数据位置之间的指令,拷贝到所述新的指令存储空间;
步骤A2,将第一个指令转换信息单元确定为当前转换信息单元;
步骤A3,根据当前指令转换信息单元的转换类型标识执行对应的转换操作;
步骤A4,计算当前指令转换信息单元的数据位置与数据长度之和,并将计算得到的和值作为当前指令转换信息单元的结尾位置;
步骤A5,获取当前指令转换信息单元之后的下一个指令转换信息单元,计算所述下一个指令转换信息单元记录的数据位置与所述当前指令转换信息单元的结尾位置之间的差值;
步骤A6,如果计算得到的差值不为零,则将所述当前指令转换信息单元的结尾位置至所述下一个指令转换信息单元记录的数据位置之间的指令拷贝至所述新的指令存储空间;
步骤A7,将下一个指令转换信息单元作为新的当前指令转换信息单元,重复执行上述步骤A3-A6;
步骤A8,在最后一个指令转换信息单元处理后,计算所述待执行的函数的函数结尾位置与最后一个转换单元的结尾位置之间的差值;并在计算的差值不为零时,将最后一个转换单元的结尾位置至所述待执行的函数的函数结尾位置的指令拷贝至所述新的指令存储空间。
示例性的,如前所述,由于待转换指令可以包括如常数指令、位运算指令、算术运算指令、比较运算指令、类型转换指令、高频指令、控制指令指令等不同类型的指令;因此,下面分别针对每种类型的指令,分别介绍对应的转换过程。
即上述根据当前指令转换信息单元的转换类型标识执行对应转换操作,可以包括:
在当前指令转换信息单元的转换类型标识表示常量指令转换时,根据当前指令转换信息单元记录的数据位置查询对应的指令的位置,并进一步根据当前指令转换信息单元记录的数据长度从所述指令的位置开始拷贝数据到新的指令存储空间,将i32.const指令的操作码修改为i16.const指令的操作码;
在当前指令转换信息单元的转换类型标识表示位运算指令转换时,根据当前指令转换信息单元记录的数据位置查询对应的指令的位置,并进一步根据当前指令转换信息单元记录的数据长度从所述指令的位置开始拷贝数据到新的指令存储空间,将i32.and指令的操作码修改为i16.and指令的操作码、将i32.or指令的操作码修改为i16.or指令的操作码、将i32.xor指令的操作码修改为i16.xor指令的操作码、将i32.shl指令的操作码修改为i16.shl指令的操作码、将i32.shr_s指令的操作码修改为i16.shr_s指令的操作码、将i32.shr_u指令的操作码修改为i16.shr_u指令的操作码、将i32.rotl指令的操作码修改为i16.rotl指令的操作码、将i32.rotr指令的操作码修改为i16.rotr指令的操作码;
在当前指令转换信息单元的转换类型标识表示算术运算指令转换时,根据当前指令转换信息单元记录的数据位置查询对应的指令的位置,并进一步根据当前指令转换信息单元记录的数据长度从所述指令的位置开始拷贝数据到新的指令存储空间,将i32.clz指令的操作码修改为i16.clz指令的操作码、将i32.ctz指令的操作码修改为i16.ctz指令的操作码、将i32.popcnt指令的操作码修改为i16.popcnt指令的操作码、将i32.add指令的操作码修改为i16.add指令的操作码、将i32.sub指令的操作码修改为i16.sub指令的操作码、将i32.mul指令的操作码修改为i16.mul指令的操作码、将i32.div_s指令的操作码修改为i16.div_s指令的操作码、将i32.div_u指令的操作码修改为i16.div_u指令的操作码、将i32.rem_s指令的操作码修改为i16.rem_s指令的操作码、将i32.rem_u指令的操作码修改为i16.rem_u指令的操作码;
在当前指令转换信息单元的转换类型标识表示比较运算指令转换时,根据当前指令转换信息单元记录的数据位置查询对应的指令的位置,并进一步根据当前指令转换信息单元记录的数据长度从所述指令的位置开始拷贝数据到新的指令存储空间,将i32.eqz指令的操作码修改为i16.eqz指令的操作码、将i32.eq指令的操作码修改为i16.eq指令的操作码、将i32.ne指令的操作码修改为i16.ne指令的操作码、将i32.lt_s指令的操作码修改为i16.lt_s指令的操作码、将i32.lt_u指令的操作码修改为i16.lt_u指令的操作码、将i32.gt_s指令的操作码修改为i16.gt_s指令的操作码、将i32.gt_u指令的操作码修改为i16.gt_u指令的操作码、将i32.le_s指令的操作码修改为i16.le_s指令的操作码、将i32.le_u指令的操作码修改为i16.le_u指令的操作码、将i32.ge_s指令的操作码修改为i16.ge_s指令的操作码、将i32.ge_u指令的操作码修改为i16.ge_u指令的操作码;
在当前指令转换信息单元的转换类型标识表示类型转换指令转换时,根据当前指令转换信息单元记录的数据位置查询对应的指令的位置,并进一步根据当前指令转换信息单元记录的数据长度从所述指令的位置开始拷贝数据到新的指令存储空间,将i32.extend8_s指令的操作码修改为i16.extend8_s指令的操作码、将i32.wrap_i64指令的操作码修改为i16.wrap_i32指令的操作码;
在当前指令转换信息单元的转换类型标识表示高频指令转换时,根据当前指令转换信息单元记录的数据位置查询对应的指令的位置,并进一步将1字节指令码写到新的指令存储空间,将local.get指令的操作码修改为local.get_[C]指令的操作码、将local.set指令的操作码修改为local.set_[C]指令的操作码、将local.tee指令的操作码修改为local.tee_[C],指令的操作码、将global.get指令的操作码修改为global.get_0指令的操作码、将global.set指令的操作码修改为global.set_0指令的操作码;以及,如果i16.const后第一条指令是i16开头的指令,则将i16.const指令的操作码修改为i16.const_[C]指令的操作码,否则将i16.const指令的操作码修改为i32.const_[C]指令的操作码;其中[C]是被修改的指令的操作数。
在当前指令转换信息单元的转换类型标识表示控制指令转换时,根据当前指令转换信息单元记录的数据位置查询对应的指令的位置,并进一步根据当前指令转换信息单元记录的数据长度从所述指令的位置开始拷贝数据到新的指令存储空间,将block指令的操作码修改为block_with_blocktype指令的操作码、将loop指令的操作码修改为loop_with_blocktype指令的操作码、将if指令的操作码修改为if_with_blocktype指令的操作码。
步骤150,将转换得到的自定义指令存储到所述指令存储空间,以使所述资源受限设备基于所述自定义指令执行所述待执行的函数。
通过上述实施例可以提供一种适合资源受限设备使用的WebAssembly指令集,该WebAssembly指令集可以是在标准WebAssembly指令集基础上进行转换而成。具体可以是将标准WebAssembly指令集中不符合资源受限设备的指令转换为适用于资源受限设备的自定义指令,从而使得资源受限设备通过转换后的自定义指令执行字节码时,可以减少字节码的大小,提升字节码的执行效率。
与前述资源受限设备中WebAssembly指令集的转换方法实施例相对应,本说明书还提供了资源受限设备中WebAssembly指令集的转换装置的实施例。所述装置实施例可以通过软件实现,也可以通过硬件或者软硬件结合的方式实现。以软件实现为例,作为一个逻辑意义上的装置,是通过其所在设备的处理器将非易失性存储器中对应的计算机程序读取到内存中运行形成的。从硬件层面而言,如图2所示,为本说明书资源受限设备中WebAssembly指令集的转换装置所在设备的一种硬件结构图,除了图2所示的处理器、网络接口、内存以及非易失性存储器之外,实施例中装置所在的设备通常根据通信实际功能,还可以包括其他硬件,对此不再赘述。
请参见图3,为本说明书一实施例提供的资源受限设备中WebAssembly指令集的转换装置,所述装置对应了图1所示实施例,应用于资源受限设备,所述装置包括:
分配单元710,响应于资源受限设备待执行的函数,为所述待执行的函数分配新的指令存储空间;
遍历单元720,遍历标准WebAssembly指令集,获取用于执行所述待执行的函数的目标指令,并确定所述目标指令中是否存在需要转换的待转换指令;
记录单元730,响应于确定出的待转换指令,为所述待执行的函数记录指令转换信息;
转换单元740,根据所述指令转换信息执行指令转换,以将所述待转换指令转换为适用于所述资源受限设备的自定义指令;
执行单元750,将转换得到的自定义指令存储到所述指令存储空间,以使所述资源受限设备基于所述自定义指令执行所述待执行的函数。
在一示例性的实施例中,所述待转换指令包括常数指令,所述遍历单元720在确定所述目标指令中是否存在需要转换的待转换指令,进一步包括:
常数指令确定子单元,确定所述目标指令中是否存在i32.const指令;如果存在i32.const指令,进一步确定该i32.const指令的操作数的取值是否位于[-32768,32767]之间;如果该i32.const指令的操作数的取值位于[-32768,32767]之间,则确定所述目标指令中的i32.const指令是需要转换的常数指令。
在一示例性的实施例中,所述待转换指令包括位运算指令,所述遍历单元720在确定所述目标指令中是否存在需要转换的待转换指令,进一步包括:
位运算指令确定子单元,确定所述目标指令中是否存在i16.const指令、i32.load8_s指令、i32.load8_u指令、i32.load16_s指令、i32.load16_u指令中的任一种;如果存在i16.const指令,且该i16.const指令之后的第一条指令为i32.and指令、i32.or指令、i32.xor指令中的任一种,则确定所述目标指令中的i16.const指令是需要转换的位运算指令;如果存在i32.load8_s指令、i32.load8_u指令、i32.load16_s指令或i32.load16_u指令,且其后第一条指令为i16.const指令、其后第二条指令为32.shl指令、i32.shr_s指令、i32.shr_u指令、i32.rotl指令、i32.rotr指令中的任一种,则确定其是所述目标指令中需要转换的位运算指令。
在一示例性的实施例中,所述待转换指令包括算术运算指令,所述遍历单元720在确定所述目标指令中是否存在需要转换的待转换指令,进一步包括:
算术运算指令确定子单元,确定所述目标指令中是否存在i32.load8_s指令、i32.load8_u指令、i32.load16_s指令、i32.load16_u指令中的任一种,如果存在i32.load8_s指令、i32.load8_u指令、i32.load16_s指令、i32.load16_u指令中的任一种,且其后第一条指令为i32.clz指令、i32.ctz指令、i32.popcnt指令中的任一种,或者,其后第一条指令为i16.const指令,其后第二条指令为i32.add指令、i32.sub指令、i32.mul指令、i32.div_s指令、i32.div_u指令、i32.rem_s指令、i32.rem_u指令中的任一种;则确定其是所述目标指令中需要转换的算术运算指令。
在一示例性的实施例中,所述待转换指令包括比较运算指令,所述遍历单元720在确定所述目标指令中是否存在需要转换的待转换指令,进一步包括:
比较运算指令确定子单元,确定所述目标指令中是否存在i32.load8_s指令、i32.load8_u指令、i32.load16_s指令、i32.load16_u指令中的任一种;如果存在i32.load8_s指令、i32.load8_u指令、i32.load16_s指令、i32.load16_u指令中的任一种,且其后第一条指令为i32.eqz指令;或者,其后第一条指令为i16.const指令,其后第二条指令为i32.eq指令、i32.ne指令、i32.lt_s指令、i32.lt_u指令、i32.gt_s指令、i32.gt_u指令、i32.le_s指令、i32.le_u指令、i32.ge_s指令、i32.ge_u指令中的任一种;则确定其是所述目标指令中需要转换的比较运算指令。
在一示例性的实施例中,所述待转换指令包括类型转换指令,所述遍历单元720在确定所述目标指令中是否存在需要转换的待转换指令,进一步包括:
类型转换指令确定子单元,确定所述目标指令中是否存在i32.load8_s指令、i32.load8_u指令、i32.load16_s指令、i32.load16_u指令中的任一种;如果存在i32.load8_s指令或i32.load8_u指令,且其后第一条指令为i32.extend8_s指令,则确定所述i32.load8_s指令或i32.load8_u指令是所述目标指令中需要转换的类型转换指令;如果存在i32.load8_s指令、i32.load8_u指令、i32.load16_s指令、i32.load16_u指令中的任一种,且其后第一条指令为i32.wrap_i64指令,则确定其是所述目标指令中需要转换的类型转换指令。
在一示例性的实施例中,所述待转换指令包括高频指令,所述遍历单元720在确定所述目标指令中是否存在需要转换的待转换指令,进一步包括:
高频指令确定子单元,确定所述目标指令中是否存在i16.const指令、local.get指令、local.set指令、local.tee指令、global.get指令、global.set指令中的任一种;如果存在i16.const指令,且该i16.const指令的操作数的取值为[0,5]之间的常数,则确定该i16.const指令是所述目标指令中需要转换的高频指令;如果存在local.get指令、local.set指令、local.tee指令中的任一种,且其操作数的取值为[0,3]之间的常数,则确定其是所述目标指令中需要转换的高频指令;如果存在global.get指令或global.set指令,且global.get指令或global.set指令的操作数的取值为0,则确定global.get指令或global.set指令是所述目标指令中需要转换的高频指令。
在一示例性的实施例中,所述待转换指令包括控制指令,所述遍历单元720在确定所述目标指令中是否存在需要转换的待转换指令,进一步包括:
控制指令确定子单元,确定所述目标指令中是否存在block,loop指令或if指令;如果存在block,loop指令或if指令,且block,loop指令或if指令的操作数的第一个字节不是0x40、0x7C、0x7D、0x7E或0x7F,则确定block,loop指令或if指令是所述目标指令中需要转换的控制指令。
在一示例性的实施例中,所述指令转换信息由每个待转换指令对应的指令转换信息单元构成,每个指令转换信息单元包括与待转换指令相关的转换类型标识、数据位置、数据长度;所述指令转换信息单元之间按照待转换指令在执行所述待执行函数时的先后顺序排列;
其中,所述转换类型标识用于记录待转换指令的指令转换类型;
所述数据位置用于记录待转换指令在函数中的位置;
所述数据长度用于记录待转换指令的长度。
在一示例性的实施例中,所述转换单元740,进一步包括:
获取子单元,获取所述指令转换信息中的第一个指令转换信息单元,基于所述第一个指令转换信息单元中记录的数据位置,将待执行的函数的函数起始位置至所述数据位置之间的指令,拷贝到所述新的指令存储空间;
确定子单元,将第一个指令转换信息单元确定为当前转换信息单元;
转换子单元,根据当前指令转换信息单元的转换类型标识执行对应的转换操作;
第一计算子单元,计算当前指令转换信息单元的数据位置与数据长度之和,并将计算得到的和值作为当前指令转换信息单元的结尾位置;
第二计算子单元,获取当前指令转换信息单元之后的下一个指令转换信息单元,计算所述下一个指令转换信息单元记录的数据位置与所述当前指令转换信息单元的结尾位置之间的差值;
拷贝子单元,如果计算得到的差值不为零,则将所述当前指令转换信息单元的结尾位置至所述下一个指令转换信息单元记录的数据位置之间的指令拷贝至所述新的指令存储空间;
循环子单元,将下一个指令转换信息单元作为新的当前指令转换信息单元,重新执行上述转换子单元;
第三计算子单元,在最后一个指令转换信息单元处理后,计算所述待执行的函数的函数结尾位置与最后一个转换单元的结尾位置之间的差值;并在计算的差值不为零时,将最后一个转换单元的结尾位置至所述待执行的函数的函数结尾位置的指令拷贝至所述新的指令存储空间。
在一示例性的实施例中,所述转换子单元,进一步包括:
常量指令转换子单元,在当前指令转换信息单元的转换类型标识表示常量指令转换时,根据当前指令转换信息单元记录的数据位置查询对应的指令的位置,并进一步根据当前指令转换信息单元记录的数据长度从所述指令的位置开始拷贝数据到新的指令存储空间,将i32.const指令的操作码修改为i16.const指令的操作码;
位运算指令转换子单元,在当前指令转换信息单元的转换类型标识表示位运算指令转换时,根据当前指令转换信息单元记录的数据位置查询对应的指令的位置,并进一步根据当前指令转换信息单元记录的数据长度从所述指令的位置开始拷贝数据到新的指令存储空间,将i32.and指令的操作码修改为i16.and指令的操作码、将i32.or指令的操作码修改为i16.or指令的操作码、将i32.xor指令的操作码修改为i16.xor指令的操作码、将i32.shl指令的操作码修改为i16.shl指令的操作码、将i32.shr_s指令的操作码修改为i16.shr_s指令的操作码、将i32.shr_u指令的操作码修改为i16.shr_u指令的操作码、将i32.rotl指令的操作码修改为i16.rotl指令的操作码、将i32.rotr指令的操作码修改为i16.rotr指令的操作码;
算术运算指令转换子单元,在当前指令转换信息单元的转换类型标识表示算术运算指令转换时,根据当前指令转换信息单元记录的数据位置查询对应的指令的位置,并进一步根据当前指令转换信息单元记录的数据长度从所述指令的位置开始拷贝数据到新的指令存储空间,将i32.clz指令的操作码修改为i16.clz指令的操作码、将i32.ctz指令的操作码修改为i16.ctz指令的操作码、将i32.popcnt指令的操作码修改为i16.popcnt指令的操作码、将i32.add指令的操作码修改为i16.add指令的操作码、将i32.sub指令的操作码修改为i16.sub指令的操作码、将i32.mul指令的操作码修改为i16.mul指令的操作码、将i32.div_s指令的操作码修改为i16.div_s指令的操作码、将i32.div_u指令的操作码修改为i16.div_u指令的操作码、将i32.rem_s指令的操作码修改为i16.rem_s指令的操作码、将i32.rem_u指令的操作码修改为i16.rem_u指令的操作码;
比较运算指令转换子单元,在当前指令转换信息单元的转换类型标识表示比较运算指令转换时,根据当前指令转换信息单元记录的数据位置查询对应的指令的位置,并进一步根据当前指令转换信息单元记录的数据长度从所述指令的位置开始拷贝数据到新的指令存储空间,将i32.eqz指令的操作码修改为i16.eqz指令的操作码、将i32.eq指令的操作码修改为i16.eq指令的操作码、将i32.ne指令的操作码修改为i16.ne指令的操作码、将i32.lt_s指令的操作码修改为i16.lt_s指令的操作码、将i32.lt_u指令的操作码修改为i16.lt_u指令的操作码、将i32.gt_s指令的操作码修改为i16.gt_s指令的操作码、将i32.gt_u指令的操作码修改为i16.gt_u指令的操作码、将i32.le_s指令的操作码修改为i16.le_s指令的操作码、将i32.le_u指令的操作码修改为i16.le_u指令的操作码、将i32.ge_s指令的操作码修改为i16.ge_s指令的操作码、将i32.ge_u指令的操作码修改为i16.ge_u指令的操作码;
类型转换指令转换子单元,在当前指令转换信息单元的转换类型标识表示类型转换指令转换时,根据当前指令转换信息单元记录的数据位置查询对应的指令的位置,并进一步根据当前指令转换信息单元记录的数据长度从所述指令的位置开始拷贝数据到新的指令存储空间,将i32.extend8_s指令的操作码修改为i16.extend8_s指令的操作码、将i32.wrap_i64指令的操作码修改为i16.wrap_i32指令的操作码;
高频指令转换子单元,在当前指令转换信息单元的转换类型标识表示高频指令转换时,根据当前指令转换信息单元记录的数据位置查询对应的指令的位置,并进一步将1字节指令码写到新的指令存储空间,将local.get指令的操作码修改为local.get_[C]指令的操作码、将local.set指令的操作码修改为local.set_[C]指令的操作码、将local.tee指令的操作码修改为local.tee_[C],指令的操作码、将global.get指令的操作码修改为global.get_0指令的操作码、将global.set指令的操作码修改为global.set_0指令的操作码;以及,如果i16.const后第一条指令是i16开头的指令,则将i16.const指令的操作码修改为i16.const_[C]指令的操作码,否则将i16.const指令的操作码修改为i32.const_[C]指令的操作码;其中[C]是被修改的指令的操作数。
控制指令转换子单元,在当前指令转换信息单元的转换类型标识表示控制指令转换时,根据当前指令转换信息单元记录的数据位置查询对应的指令的位置,并进一步根据当前指令转换信息单元记录的数据长度从所述指令的位置开始拷贝数据到新的指令存储空间,将block指令的操作码修改为block_with_blocktype指令的操作码、将loop指令的操作码修改为loop_with_blocktype指令的操作码、将if指令的操作码修改为if_with_blocktype指令的操作码。上述实施例阐明的系统、装置、模块或单元,具体可以由计算机芯片或实体实现,或者由具有某种功能的产品来实现。一种典型的实现设备为计算机,计算机的具体形式可以是个人计算机、膝上型计算机、蜂窝电话、相机电话、智能电话、个人数字助理、媒体播放器、导航设备、电子邮件收发设备、游戏控制台、平板计算机、可穿戴设备或者这些设备中的任意几种设备的组合。
上述装置中各个单元的功能和作用的实现过程具体详见上述方法中对应步骤的实现过程,在此不再赘述。
对于装置实施例而言,由于其基本对应于方法实施例,所以相关之处参见方法实施例的部分说明即可。以上所描述的装置实施例仅仅是示意性的,其中所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部模块来实现本说明书方案的目的。本领域普通技术人员在不付出创造性劳动的情况下,即可以理解并实施。
以上图3描述了资源受限设备中WebAssembly指令集的转换装置的内部功能模块和结构示意,其实质上的执行主体可以为一种电子设备,包括:
处理器;
用于存储处理器可执行指令的存储器;
其中,所述处理器被配置为执行上述任一资源受限设备中WebAssembly指令集的转换方法的实施例。
在上述电子设备的实施例中,应理解,该处理器可以是中央处理单元(英文:Central Processing Unit,简称:CPU),还可以是其他通用处理器、数字信号处理器(英文:Digital Signal Processor,简称:DSP)、专用集成电路(英文:Application SpecificIntegrated Circuit,简称:ASIC)等。通用处理器可以是微处理器或者该处理器也可以是任何常规的处理器等,而前述的存储器可以是只读存储器(英文:read-only memory,缩写:ROM)、随机存取存储器(英文:random access memory,简称:RAM)、快闪存储器、硬盘或者固态硬盘。结合本发明实施例所公开的方法的步骤可以直接体现为硬件处理器执行完成,或者用处理器中的硬件及软件模块组合执行完成。
本说明书中的各个实施例均采用递进的方式描述,各个实施例之间相同相似的部分互相参见即可,每个实施例重点说明的都是与其他实施例的不同之处。尤其,对于电子设备实施例而言,由于其基本相似于方法实施例,所以描述的比较简单,相关之处参见方法实施例的部分说明即可。
本领域技术人员在考虑说明书及实践这里公开的发明后,将容易想到本说明书的其它实施方案。本说明书旨在涵盖本说明书的任何变型、用途或者适应性变化,这些变型、用途或者适应性变化遵循本说明书的一般性原理并包括本说明书未公开的本技术领域中的公知常识或惯用技术手段。说明书和实施例仅被视为示例性的,本说明书的真正范围和精神由下面的权利要求指出。
应当理解的是,本说明书并不局限于上面已经描述并在附图中示出的精确结构,并且可以在不脱离其范围进行各种修改和改变。本说明书的范围仅由所附的权利要求来限制。
Claims (12)
1.一种WebAssembly指令集的转换方法,其特征在于,应用于资源受限设备,所述方法包括:
响应于资源受限设备待执行的函数,为所述待执行的函数分配新的指令存储空间;
遍历标准WebAssembly指令集,获取用于执行所述待执行的函数的目标指令,并确定所述目标指令中是否存在需要转换的待转换指令;
响应于确定出的待转换指令,为所述待执行的函数记录指令转换信息;
根据所述指令转换信息执行指令转换,以将所述待转换指令转换为适用于所述资源受限设备的自定义指令;
将转换得到的自定义指令存储到所述指令存储空间,以使所述资源受限设备基于所述自定义指令执行所述待执行的函数;
其中,所述待转换指令包括常数指令,所述确定所述目标指令中是否存在需要转换的待转换指令,包括:
确定所述目标指令中是否存在i32.const指令;
如果存在i32.const指令,进一步确定该i32.const指令的操作数的取值是否位于[-32768,32767]之间;
如果该i32.const指令的操作数的取值位于[-32768,32767]之间,则确定所述目标指令中的i32.const指令是需要转换的常数指令。
2.根据权利要求1所述的方法,其特征在于,所述待转换指令还包括位运算指令,所述确定所述目标指令中是否存在需要转换的待转换指令,还包括:
确定所述目标指令中是否存在i16.const指令、i32.load8_s指令、i32.load8_u指令、i32.load16_s指令、i32.load16_u指令中的任一种;
如果存在i16.const指令,且该i16.const指令之后的第一条指令为i32.and指令、i32.or指令、i32.xor指令中的任一种,则确定所述目标指令中的i16.const指令是需要转换的位运算指令;
如果存在i32.load8_s指令、i32.load8_u指令、i32.load16_s指令或i32.load16_u指令,且其后第一条指令为i16.const指令、其后第二条指令为32.shl指令、i32.shr_s指令、i32.shr_u指令、i32.rotl指令、i32.rotr指令中的任一种,则确定其是所述目标指令中需要转换的位运算指令。
3.根据权利要求1所述的方法,其特征在于,所述待转换指令还包括算术运算指令,所述确定所述目标指令中是否存在需要转换的待转换指令,还包括:
确定所述目标指令中是否存在i32.load8_s指令、i32.load8_u指令、i32.load16_s指令、i32.load16_u指令中的任一种,
如果存在i32.load8_s指令、i32.load8_u指令、i32.load16_s指令、i32.load16_u指令中的任一种,且其后第一条指令为i32.clz指令、i32.ctz指令、i32.popcnt指令中的任一种,或者
其后第一条指令为i16.const指令,其后第二条指令为i32.add指令、i32.sub指令、i32.mul指令、i32.div_s指令、i32.div_u指令、i32.rem_s指令、i32.rem_u指令中的任一种;
则确定其是所述目标指令中需要转换的算术运算指令。
4.根据权利要求1所述的方法,其特征在于,所述待转换指令还包括比较运算指令,所述确定所述目标指令中是否存在需要转换的待转换指令,还包括:
确定所述目标指令中是否存在i32.load8_s指令、i32.load8_u指令、i32.load16_s指令、i32.load16_u指令中的任一种;
如果存在i32.load8_s指令、i32.load8_u指令、i32.load16_s指令、i32.load16_u指令中的任一种,且其后第一条指令为i32.eqz指令,或者
其后第一条指令为i16.const指令,其后第二条指令为i32.eq指令、i32.ne指令、i32.lt_s指令、i32.lt_u指令、i32.gt_s指令、i32.gt_u指令、i32.le_s指令、i32.le_u指令、i32.ge_s指令、i32.ge_u指令中的任一种;
则确定其是所述目标指令中需要转换的比较运算指令。
5.根据权利要求1所述的方法,其特征在于,所述待转换指令还包括类型转换指令,所述确定所述目标指令中是否存在需要转换的待转换指令,还包括:
确定所述目标指令中是否存在i32.load8_s指令、i32.load8_u指令、i32.load16_s指令、i32.load16_u指令中的任一种;
如果存在i32.load8_s指令或i32.load8_u指令,且其后第一条指令为i32.extend8_s指令,则确定所述i32.load8_s指令或i32.load8_u指令是所述目标指令中需要转换的类型转换指令;
如果存在i32.load8_s指令、i32.load8_u指令、i32.load16_s指令、i32.load16_u指令中的任一种,且其后第一条指令为i32.wrap_i64指令,则确定其是所述目标指令中需要转换的类型转换指令。
6.根据权利要求1所述的方法,其特征在于,所述待转换指令还包括高频指令,所述确定所述目标指令中是否存在需要转换的待转换指令,还包括:
确定所述目标指令中是否存在i16.const指令、local.get指令、local.set指令、local.tee指令、global.get指令、global.set指令中的任一种;
如果存在i16.const指令,且该i16.const指令的操作数的取值为[0,5]之间的常数,则确定该i16.const指令是所述目标指令中需要转换的高频指令;
如果存在local.get指令、local.set指令、local.tee指令中的任一种,且其操作数的取值为[0,3]之间的常数,则确定其是所述目标指令中需要转换的高频指令;
如果存在global.get指令或global.set指令,且global.get指令或global.set指令的操作数的取值为0,则确定global.get指令或global.set指令是所述目标指令中需要转换的高频指令。
7.根据权利要求1所述的方法,其特征在于,所述待转换指令还包括控制指令,所述确定所述目标指令中是否存在需要转换的待转换指令,还包括:
确定所述目标指令中是否存在block,loop指令或if指令;
如果存在block,loop指令或if指令,且block,loop指令或if指令的操作数的第一个字节不是0x40、0x7C、0x7D、0x7E或0x7F,则确定block,loop指令或if指令是所述目标指令中需要转换的控制指令。
8.根据权利要求1-7中任一项所述的方法,其特征在于,所述指令转换信息由每个待转换指令对应的指令转换信息单元构成,每个指令转换信息单元包括与待转换指令相关的转换类型标识、数据位置、数据长度;所述指令转换信息单元之间按照待转换指令在执行所述待执行函数时的先后顺序排列;
其中,所述转换类型标识用于记录待转换指令的指令转换类型;
所述数据位置用于记录待转换指令在函数中的位置;
所述数据长度用于记录待转换指令的长度。
9.根据权利要求8所述的方法,其特征在于,所述根据所述指令转换信息执行指令转换,包括:
步骤A1,获取所述指令转换信息中的第一个指令转换信息单元,基于所述第一个指令转换信息单元中记录的数据位置,将待执行的函数的函数起始位置至所述数据位置之间的指令,拷贝到所述新的指令存储空间;
步骤A2,将第一个指令转换信息单元确定为当前转换信息单元;
步骤A3,根据当前指令转换信息单元的转换类型标识执行对应的转换操作;
步骤A4,计算当前指令转换信息单元的数据位置与数据长度之和,并将计算得到的和值作为当前指令转换信息单元的结尾位置;
步骤A5,获取当前指令转换信息单元之后的下一个指令转换信息单元,计算所述下一个指令转换信息单元记录的数据位置与所述当前指令转换信息单元的结尾位置之间的差值;
步骤A6,如果计算得到的差值不为零,则将所述当前指令转换信息单元的结尾位置至所述下一个指令转换信息单元记录的数据位置之间的指令拷贝至所述新的指令存储空间;
步骤A7,将下一个指令转换信息单元作为新的当前指令转换信息单元,重复执行上述步骤A3-A6;
步骤A8,在最后一个指令转换信息单元处理后,计算所述待执行的函数的函数结尾位置与最后一个转换单元的结尾位置之间的差值;并在计算的差值不为零时,将最后一个转换单元的结尾位置至所述待执行的函数的函数结尾位置的指令拷贝至所述新的指令存储空间。
10.根据权利要求9所述的方法,其特征在于,所述根据当前指令转换信息单元的转换类型标识执行对应转换操作,包括:
在当前指令转换信息单元的转换类型标识表示常量指令转换时,根据当前指令转换信息单元记录的数据位置查询对应的指令的位置,并进一步根据当前指令转换信息单元记录的数据长度从所述指令的位置开始拷贝数据到新的指令存储空间,将i32.const指令的操作码修改为i16.const指令的操作码;
在当前指令转换信息单元的转换类型标识表示位运算指令转换时,根据当前指令转换信息单元记录的数据位置查询对应的指令的位置,并进一步根据当前指令转换信息单元记录的数据长度从所述指令的位置开始拷贝数据到新的指令存储空间,将i32.and指令的操作码修改为i16.and指令的操作码、将i32.or指令的操作码修改为i16.or指令的操作码、将i32.xor指令的操作码修改为i16.xor指令的操作码、将i32.shl指令的操作码修改为i16.shl指令的操作码、将i32.shr_s指令的操作码修改为i16.shr_s指令的操作码、将i32.shr_u指令的操作码修改为i16.shr_u指令的操作码、将i32.rotl指令的操作码修改为i16.rotl指令的操作码、将i32.rotr指令的操作码修改为i16.rotr指令的操作码;
在当前指令转换信息单元的转换类型标识表示算术运算指令转换时,根据当前指令转换信息单元记录的数据位置查询对应的指令的位置,并进一步根据当前指令转换信息单元记录的数据长度从所述指令的位置开始拷贝数据到新的指令存储空间,将i32.clz指令的操作码修改为i16.clz指令的操作码、将i32.ctz指令的操作码修改为i16.ctz指令的操作码、将i32.popcnt指令的操作码修改为i16.popcnt指令的操作码、将i32.add指令的操作码修改为i16.add指令的操作码、将i32.sub指令的操作码修改为i16.sub指令的操作码、将i32.mul指令的操作码修改为i16.mul指令的操作码、将i32.div_s指令的操作码修改为i16.div_s指令的操作码、将i32.div_u指令的操作码修改为i16.div_u指令的操作码、将i32.rem_s指令的操作码修改为i16.rem_s指令的操作码、将i32.rem_u指令的操作码修改为i16.rem_u指令的操作码;
在当前指令转换信息单元的转换类型标识表示比较运算指令转换时,根据当前指令转换信息单元记录的数据位置查询对应的指令的位置,并进一步根据当前指令转换信息单元记录的数据长度从所述指令的位置开始拷贝数据到新的指令存储空间,将i32.eqz指令的操作码修改为i16.eqz指令的操作码、将i32.eq指令的操作码修改为i16.eq指令的操作码、将i32.ne指令的操作码修改为i16.ne指令的操作码、将i32.lt_s指令的操作码修改为i16.lt_s指令的操作码、将i32.lt_u指令的操作码修改为i16.lt_u指令的操作码、将i32.gt_s指令的操作码修改为i16.gt_s指令的操作码、将i32.gt_u指令的操作码修改为i16.gt_u指令的操作码、将i32.le_s指令的操作码修改为i16.le_s指令的操作码、将i32.le_u指令的操作码修改为i16.le_u指令的操作码、将i32.ge_s指令的操作码修改为i16.ge_s指令的操作码、将i32.ge_u指令的操作码修改为i16.ge_u指令的操作码;
在当前指令转换信息单元的转换类型标识表示类型转换指令转换时,根据当前指令转换信息单元记录的数据位置查询对应的指令的位置,并进一步根据当前指令转换信息单元记录的数据长度从所述指令的位置开始拷贝数据到新的指令存储空间,将i32.extend8_s指令的操作码修改为i16.extend8_s指令的操作码、将i32.wrap_i64指令的操作码修改为i16.wrap_i32指令的操作码;
在当前指令转换信息单元的转换类型标识表示高频指令转换时,根据当前指令转换信息单元记录的数据位置查询对应的指令的位置,并进一步将1字节指令码写到新的指令存储空间,将local.get指令的操作码修改为local.get_[C]指令的操作码、将local.set指令的操作码修改为local.set_[C]指令的操作码、将local.tee指令的操作码修改为local.tee_[C],指令的操作码、将global.get指令的操作码修改为global.get_0指令的操作码、将global.set指令的操作码修改为global.set_0指令的操作码;以及,如果i16.const后第一条指令是i16开头的指令,则将i16.const指令的操作码修改为i16.const_[C]指令的操作码,否则将i16.const指令的操作码修改为i32.const_[C]指令的操作码;其中[C]是被修改的指令的操作数;
在当前指令转换信息单元的转换类型标识表示控制指令转换时,根据当前指令转换信息单元记录的数据位置查询对应的指令的位置,并进一步根据当前指令转换信息单元记录的数据长度从所述指令的位置开始拷贝数据到新的指令存储空间,将block指令的操作码修改为block_with_blocktype指令的操作码、将loop指令的操作码修改为loop_with_blocktype指令的操作码、将if指令的操作码修改为if_with_blocktype指令的操作码。
11.一种WebAssembly指令集的转换装置,其特征在于,应用于资源受限设备,所述装置包括:
分配单元,响应于资源受限设备待执行的函数,为所述待执行的函数分配新的指令存储空间;
遍历单元,遍历标准WebAssembly指令集,获取用于执行所述待执行的函数的目标指令,并确定所述目标指令中是否存在需要转换的待转换指令;
记录单元,响应于确定出的待转换指令,为所述待执行的函数记录指令转换信息;
转换单元,根据所述指令转换信息执行指令转换,以将所述待转换指令转换为适用于所述资源受限设备的自定义指令;
执行单元,将转换得到的自定义指令存储到所述指令存储空间,以使所述资源受限设备基于所述自定义指令执行所述待执行的函数;
其中,所述待转换指令包括常数指令,所述遍历单元在确定所述目标指令中是否存在需要转换的待转换指令,进一步包括:
常数指令确定子单元,确定所述目标指令中是否存在i32.const指令;如果存在i32.const指令,进一步确定该i32.const指令的操作数的取值是否位于[-32768,32767]之间;如果该i32.const指令的操作数的取值位于[-32768,32767]之间,则确定所述目标指令中的i32.const指令是需要转换的常数指令。
12.一种电子设备,其特征在于,包括:
处理器;
用于存储处理器可执行指令的存储器;
其中,所述处理器被配置为执行上述权利要求1-10中任一项所述的方法。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202311270091.6A CN117008971B (zh) | 2023-09-27 | 2023-09-27 | WebAssembly指令集的转换方法及装置 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202311270091.6A CN117008971B (zh) | 2023-09-27 | 2023-09-27 | WebAssembly指令集的转换方法及装置 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN117008971A CN117008971A (zh) | 2023-11-07 |
CN117008971B true CN117008971B (zh) | 2023-12-29 |
Family
ID=88565753
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202311270091.6A Active CN117008971B (zh) | 2023-09-27 | 2023-09-27 | WebAssembly指令集的转换方法及装置 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN117008971B (zh) |
Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN113094667A (zh) * | 2021-04-09 | 2021-07-09 | 每日互动股份有限公司 | 一种防止java程序被反编译的系统 |
CN115982784A (zh) * | 2023-03-21 | 2023-04-18 | 紫光同芯微电子有限公司 | 一种WebAssembly模块调用函数的方法及装置 |
CN116466995A (zh) * | 2023-06-16 | 2023-07-21 | 紫光同芯微电子有限公司 | 基于复合指令的指令及其操作数的优化方法及装置 |
CN116680015A (zh) * | 2023-08-03 | 2023-09-01 | 北京中电华大电子设计有限责任公司 | 函数调用方法、装置、电子设备及可读存储介质 |
Family Cites Families (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20230026369A1 (en) * | 2022-09-30 | 2023-01-26 | Intel Corporation | Hardware acceleration for interface type conversions |
-
2023
- 2023-09-27 CN CN202311270091.6A patent/CN117008971B/zh active Active
Patent Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN113094667A (zh) * | 2021-04-09 | 2021-07-09 | 每日互动股份有限公司 | 一种防止java程序被反编译的系统 |
CN115982784A (zh) * | 2023-03-21 | 2023-04-18 | 紫光同芯微电子有限公司 | 一种WebAssembly模块调用函数的方法及装置 |
CN116466995A (zh) * | 2023-06-16 | 2023-07-21 | 紫光同芯微电子有限公司 | 基于复合指令的指令及其操作数的优化方法及装置 |
CN116680015A (zh) * | 2023-08-03 | 2023-09-01 | 北京中电华大电子设计有限责任公司 | 函数调用方法、装置、电子设备及可读存储介质 |
Also Published As
Publication number | Publication date |
---|---|
CN117008971A (zh) | 2023-11-07 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
EP2758891B1 (en) | Vector find element equal instruction | |
US9588763B2 (en) | Vector find element not equal instruction | |
GB2514062B (en) | Comparing sets of character data having termination characters | |
KR101642556B1 (ko) | 이진 번역을 수행하기 위한 방법 및 시스템 | |
US9454366B2 (en) | Copying character data having a termination character from one memory location to another | |
CN111290952B (zh) | 一种动态链接库函数的跟踪方法及装置 | |
US20130246758A1 (en) | Vector string range compare | |
CN107025480B (zh) | 图像生成方法及其设备 | |
JP6399522B2 (ja) | Vector element rotate and insert under mask命令を処理するためのコンピュータ・プログラム、コンピュータ・システム及び方法 | |
EP1966685A1 (en) | User configurable software libraries | |
JP2016512627A (ja) | Vectorfloatingpointtestdataclassimmediate命令を処理するためのコンピュータ・システム、コンピュータ・プログラム及び方法 | |
CN113885936A (zh) | 一种定制镜像中软件包依赖的解决方法 | |
TW201732561A (zh) | 用於控制流向終止的模式特定結束分支 | |
CN117008971B (zh) | WebAssembly指令集的转换方法及装置 | |
US6484314B1 (en) | Exception handling method and system | |
CN110308933B (zh) | 访问指令确定方法、装置及存储介质 | |
US20130262910A1 (en) | Time keeping in unknown and unstable clock architecture | |
EP1700208B1 (en) | Apparatus and method to avoid floating point control instructions in floating point to integer conversion | |
CN113703753A (zh) | 用于产品开发的方法、装置和产品开发系统 | |
CN117130721B (zh) | WebAssembly代码的执行方法及装置 | |
CN117130722A (zh) | WebAssembly指令集的优化方法及装置 | |
CN107451050B (zh) | 函数获取方法和装置、服务器 | |
CN112346780B (zh) | 一种信息处理方法、装置和存储介质 | |
CN111045657B (zh) | 程序代码的运行方法和运行装置以及编译方法和编译装置 | |
US20050149913A1 (en) | Apparatus and methods to optimize code in view of masking status of exceptions |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |