summaryrefslogtreecommitdiff
path: root/chromium/v8/src/builtins/wasm.tq
diff options
context:
space:
mode:
Diffstat (limited to 'chromium/v8/src/builtins/wasm.tq')
-rw-r--r--chromium/v8/src/builtins/wasm.tq129
1 files changed, 123 insertions, 6 deletions
diff --git a/chromium/v8/src/builtins/wasm.tq b/chromium/v8/src/builtins/wasm.tq
index 097e39d430e..690df7afecc 100644
--- a/chromium/v8/src/builtins/wasm.tq
+++ b/chromium/v8/src/builtins/wasm.tq
@@ -7,6 +7,10 @@
namespace runtime {
extern runtime WasmMemoryGrow(Context, WasmInstanceObject, Smi): Smi;
extern runtime WasmRefFunc(Context, WasmInstanceObject, Smi): JSAny;
+extern runtime WasmTableInit(
+ Context, WasmInstanceObject, Object, Object, Smi, Smi, Smi): JSAny;
+extern runtime WasmTableCopy(
+ Context, WasmInstanceObject, Object, Object, Smi, Smi, Smi): JSAny;
extern runtime WasmFunctionTableGet(
Context, WasmInstanceObject, Smi, Smi): JSAny;
extern runtime WasmFunctionTableSet(
@@ -17,11 +21,24 @@ extern runtime ReThrow(Context, Object): JSAny;
extern runtime WasmStackGuard(Context): JSAny;
extern runtime ThrowWasmStackOverflow(Context): JSAny;
extern runtime WasmTraceMemory(Context, Smi): JSAny;
+extern runtime WasmTraceEnter(Context): JSAny;
+extern runtime WasmTraceExit(Context, Smi): JSAny;
+extern runtime WasmAtomicNotify(
+ Context, WasmInstanceObject, Number, Number): Smi;
+extern runtime WasmI32AtomicWait(
+ Context, WasmInstanceObject, Number, Number, BigInt): Smi;
+extern runtime WasmI64AtomicWait(
+ Context, WasmInstanceObject, Number, BigInt, BigInt): Smi;
+}
+
+namespace unsafe {
+extern macro TimesTaggedSize(intptr): intptr;
+extern macro Allocate(intptr): HeapObject;
}
namespace wasm {
const kFuncTableType:
- constexpr int31 generates 'wasm::ValueType::Kind::kFuncRef';
+ constexpr int31 generates 'wasm::HeapType::kHeapFunc';
extern macro WasmBuiltinsAssembler::LoadInstanceFromFrame(): WasmInstanceObject;
@@ -33,6 +50,8 @@ extern macro WasmBuiltinsAssembler::LoadTablesFromInstance(WasmInstanceObject):
FixedArray;
extern macro WasmBuiltinsAssembler::LoadExternalFunctionsFromInstance(
WasmInstanceObject): FixedArray;
+extern macro WasmBuiltinsAssembler::LoadManagedObjectMapsFromInstance(
+ WasmInstanceObject): FixedArray;
macro LoadContextFromFrame(): NativeContext {
return LoadContextFromInstance(LoadInstanceFromFrame());
@@ -61,6 +80,38 @@ builtin WasmMemoryGrow(numPages: int32): int32 {
return SmiToInt32(result);
}
+builtin WasmTableInit(
+ dstRaw: uint32, srcRaw: uint32, sizeRaw: uint32, tableIndex: Smi,
+ segmentIndex: Smi): JSAny {
+ try {
+ const instance: WasmInstanceObject = LoadInstanceFromFrame();
+ const dst: Smi = Convert<PositiveSmi>(dstRaw) otherwise TableOutOfBounds;
+ const src: Smi = Convert<PositiveSmi>(srcRaw) otherwise TableOutOfBounds;
+ const size: Smi = Convert<PositiveSmi>(sizeRaw) otherwise TableOutOfBounds;
+ tail runtime::WasmTableInit(
+ LoadContextFromInstance(instance), instance, tableIndex, segmentIndex,
+ dst, src, size);
+ } label TableOutOfBounds deferred {
+ tail ThrowWasmTrapTableOutOfBounds();
+ }
+}
+
+builtin WasmTableCopy(
+ dstRaw: uint32, srcRaw: uint32, sizeRaw: uint32, dstTable: Smi,
+ srcTable: Smi): JSAny {
+ try {
+ const instance: WasmInstanceObject = LoadInstanceFromFrame();
+ const dst: Smi = Convert<PositiveSmi>(dstRaw) otherwise TableOutOfBounds;
+ const src: Smi = Convert<PositiveSmi>(srcRaw) otherwise TableOutOfBounds;
+ const size: Smi = Convert<PositiveSmi>(sizeRaw) otherwise TableOutOfBounds;
+ tail runtime::WasmTableCopy(
+ LoadContextFromInstance(instance), instance, dstTable, srcTable, dst,
+ src, size);
+ } label TableOutOfBounds deferred {
+ tail ThrowWasmTrapTableOutOfBounds();
+ }
+}
+
builtin WasmTableGet(tableIndex: intptr, index: int32): Object {
const instance: WasmInstanceObject = LoadInstanceFromFrame();
const entryIndex: intptr = ChangeInt32ToIntPtr(index);
@@ -145,7 +196,7 @@ builtin WasmThrow(exception: Object): JSAny {
}
builtin WasmRethrow(exception: Object): JSAny {
- if (exception == Null) tail ThrowWasmTrapRethrowNullRef();
+ if (exception == Null) tail ThrowWasmTrapRethrowNull();
tail runtime::ReThrow(LoadContextFromFrame(), exception);
}
@@ -161,11 +212,77 @@ builtin WasmTraceMemory(info: Smi): JSAny {
tail runtime::WasmTraceMemory(LoadContextFromFrame(), info);
}
+builtin WasmTraceEnter(): JSAny {
+ tail runtime::WasmTraceEnter(LoadContextFromFrame());
+}
+
+builtin WasmTraceExit(info: Smi): JSAny {
+ tail runtime::WasmTraceExit(LoadContextFromFrame(), info);
+}
+
builtin WasmAllocateJSArray(implicit context: Context)(size: Smi): JSArray {
const map: Map = GetFastPackedElementsJSArrayMap();
return AllocateJSArray(ElementsKind::PACKED_ELEMENTS, map, size, size);
}
+builtin WasmAllocateStruct(implicit context: Context)(mapIndex: Smi):
+ HeapObject {
+ const instance: WasmInstanceObject = LoadInstanceFromFrame();
+ const maps: FixedArray = LoadManagedObjectMapsFromInstance(instance);
+ const map: Map = %RawDownCast<Map>(LoadFixedArrayElement(maps, mapIndex));
+ const instanceSize: intptr =
+ unsafe::TimesTaggedSize(Convert<intptr>(map.instance_size_in_words));
+ const result: HeapObject = unsafe::Allocate(instanceSize);
+ * UnsafeConstCast(& result.map) = map;
+ return result;
+}
+
+builtin WasmInt32ToNumber(value: int32): Number {
+ return ChangeInt32ToTagged(value);
+}
+
+builtin WasmUint32ToNumber(value: uint32): Number {
+ return ChangeUint32ToTagged(value);
+}
+
+extern builtin I64ToBigInt(intptr): BigInt;
+
+builtin WasmAtomicNotify(address: uint32, count: uint32): uint32 {
+ const instance: WasmInstanceObject = LoadInstanceFromFrame();
+ const result: Smi = runtime::WasmAtomicNotify(
+ LoadContextFromInstance(instance), instance, WasmUint32ToNumber(address),
+ WasmUint32ToNumber(count));
+ return Unsigned(SmiToInt32(result));
+}
+
+builtin WasmI32AtomicWait64(
+ address: uint32, expectedValue: int32, timeout: intptr): uint32 {
+ if constexpr (Is64()) {
+ const instance: WasmInstanceObject = LoadInstanceFromFrame();
+ const result: Smi = runtime::WasmI32AtomicWait(
+ LoadContextFromInstance(instance), instance,
+ WasmUint32ToNumber(address), WasmInt32ToNumber(expectedValue),
+ I64ToBigInt(timeout));
+ return Unsigned(SmiToInt32(result));
+ } else {
+ unreachable;
+ }
+}
+
+builtin WasmI64AtomicWait64(
+ address: uint32, expectedValue: intptr, timeout: intptr): uint32 {
+ if constexpr (Is64()) {
+ const instance: WasmInstanceObject = LoadInstanceFromFrame();
+ const result: Smi = runtime::WasmI64AtomicWait(
+ LoadContextFromInstance(instance), instance,
+ WasmUint32ToNumber(address), I64ToBigInt(expectedValue),
+ I64ToBigInt(timeout));
+ return Unsigned(SmiToInt32(result));
+ } else {
+ unreachable;
+ }
+}
+
extern macro TryHasOwnProperty(HeapObject, Map, InstanceType, Name): never
labels Found, NotFound, Bailout;
type OnNonExistent constexpr 'OnNonExistent';
@@ -251,12 +368,12 @@ builtin ThrowWasmTrapTableOutOfBounds(): JSAny {
tail WasmTrap(SmiConstant(MessageTemplate::kWasmTrapTableOutOfBounds));
}
-builtin ThrowWasmTrapBrOnExnNullRef(): JSAny {
- tail WasmTrap(SmiConstant(MessageTemplate::kWasmTrapBrOnExnNullRef));
+builtin ThrowWasmTrapBrOnExnNull(): JSAny {
+ tail WasmTrap(SmiConstant(MessageTemplate::kWasmTrapBrOnExnNull));
}
-builtin ThrowWasmTrapRethrowNullRef(): JSAny {
- tail WasmTrap(SmiConstant(MessageTemplate::kWasmTrapRethrowNullRef));
+builtin ThrowWasmTrapRethrowNull(): JSAny {
+ tail WasmTrap(SmiConstant(MessageTemplate::kWasmTrapRethrowNull));
}
builtin ThrowWasmTrapNullDereference(): JSAny {