@@ -3400,6 +3400,28 @@ public class ProgramBuilder {
34003400 b. emit ( WasmDropDataSegment ( ) , withInputs: [ dataSegment] , types: [ . wasmDataSegment( ) ] )
34013401 }
34023402
3403+ public func wasmDropElementSegment( elementSegment: Variable ) {
3404+ b. emit ( WasmDropElementSegment ( ) , withInputs: [ elementSegment] , types: [ . wasmElementSegment( ) ] )
3405+ }
3406+
3407+ public func wasmTableInit( elementSegment: Variable , table: Variable , tableOffset: Variable , elementSegmentOffset: Variable , nrOfElementsToUpdate: Variable ) {
3408+ // TODO: b/427115604 - assert that table.elemType IS_SUBTYPE_OF elementSegment.elemType (depending on refactor outcome).
3409+ let addrType = b. type ( of: table) . wasmTableType!. isTable64 ? ILType . wasmi64 : ILType . wasmi32
3410+ b. emit ( WasmTableInit ( ) , withInputs: [ elementSegment, table, tableOffset, elementSegmentOffset, nrOfElementsToUpdate] ,
3411+ types: [ . wasmElementSegment( ) , . object( ofGroup: " WasmTable " ) , addrType, addrType, addrType] )
3412+ }
3413+
3414+ public func wasmTableCopy( dstTable: Variable , srcTable: Variable , dstOffset: Variable , srcOffset: Variable , count: Variable ) {
3415+ // TODO: b/427115604 - assert that srcTable.elemType IS_SUBTYPE_OF dstTable.elemType (depending on refactor outcome).
3416+ let dstTableType = b. type ( of: dstTable) . wasmTableType!
3417+ let srcTableType = b. type ( of: srcTable) . wasmTableType!
3418+ assert ( dstTableType. isTable64 == srcTableType. isTable64)
3419+
3420+ let addrType = dstTableType. isTable64 ? ILType . wasmi64 : ILType . wasmi32
3421+ b. emit ( WasmTableCopy ( ) , withInputs: [ dstTable, srcTable, dstOffset, srcOffset, count] ,
3422+ types: [ . object( ofGroup: " WasmTable " ) , . object( ofGroup: " WasmTable " ) , addrType, addrType, addrType] )
3423+ }
3424+
34033425 public func wasmReassign( variable: Variable , to: Variable ) {
34043426 assert ( b. type ( of: variable) == b. type ( of: to) )
34053427 b. emit ( WasmReassign ( variableType: b. type ( of: variable) ) , withInputs: [ variable, to] )
@@ -3922,6 +3944,12 @@ public class ProgramBuilder {
39223944 withInputs: definedEntryValues, types: inputTypes) . output
39233945 }
39243946
3947+ @discardableResult
3948+ public func addElementSegment( elementsType: ILType , elements: [ Variable ] ) -> Variable {
3949+ let inputTypes = Array ( repeating: elementsType, count: elements. count)
3950+ return b. emit ( WasmDefineElementSegment ( size: UInt32 ( elements. count) ) , withInputs: elements, types: inputTypes) . output
3951+ }
3952+
39253953 // This result can be ignored right now, as we can only define one memory per module
39263954 // Also this should be tracked like a global / table.
39273955 @discardableResult
@@ -4292,7 +4320,8 @@ public class ProgramBuilder {
42924320 case . wasmDefineGlobal( _) ,
42934321 . wasmDefineTable( _) ,
42944322 . wasmDefineMemory( _) ,
4295- . wasmDefineDataSegment( _) :
4323+ . wasmDefineDataSegment( _) ,
4324+ . wasmDefineElementSegment( _) :
42964325 break
42974326 case . wasmDefineTag( _) :
42984327 break
0 commit comments