// Wasm 底层原语(内联 WAT)。寻址约定:FixedArray 经 #borrow 传入内联 WAT 时,
// i32 参数即数据区首地址(wasm 后端装箱传递表示,数据前头部在负偏移)——内核缓冲一律静态容量
// FixedArray,宿主以导出地址建 typed view 零拷贝读写。该约定非文档化 ABI,由宿主握手测试
// 由宿主握手测试(tests/engine-wasm.test.ts)与引擎位稳定性基线(tests/engine-golden.test.ts)守护,
// 工具链升级若变更布局会响亮失败,绝不静默。

///|
#borrow(a)
extern "wasm" fn addr_of_f32(a : FixedArray[Float]) -> Int =
  #|(func (param i32) (result i32) local.get 0)

///|
#borrow(a)
extern "wasm" fn addr_of_i32(a : FixedArray[Int]) -> Int =
  #|(func (param i32) (result i32) local.get 0)

///|
#borrow(a)
extern "wasm" fn addr_of_u8(a : FixedArray[Byte]) -> Int =
  #|(func (param i32) (result i32) local.get 0)

///|
#borrow(a)
extern "wasm" fn addr_of_f64(a : FixedArray[Double]) -> Int =
  #|(func (param i32) (result i32) local.get 0)

///|
extern "wasm" fn mem_fill(dst : Int, c : Int, n : Int) -> Unit =
  #|(func (param i32 i32 i32)
  #|  local.get 0
  #|  local.get 1
  #|  local.get 2
  #|  memory.fill)

///|
extern "wasm" fn mem_copy(dst : Int, src : Int, n : Int) -> Unit =
  #|(func (param i32 i32 i32)
  #|  local.get 0
  #|  local.get 1
  #|  local.get 2
  #|  memory.copy)

// SIMD 位精确内存原语(GS 双格快路径):v128.load 系指令全部支持非对齐访问。
// 入参 off 为字节偏移(调用方按元素宽 ×4/×8 折算);地址 = 数组数据区首 + off

///|
#borrow(a)
extern "wasm" fn v128_load4_f32(a : FixedArray[Float], off : Int) -> V128 =
  #|(func (param i32 i32) (result v128)
  #|  local.get 0
  #|  local.get 1
  #|  i32.add
  #|  v128.load)

///|
#borrow(a)
extern "wasm" fn v128_load1_f64(a : FixedArray[Double], off : Int) -> V128 =
  #|(func (param i32 i32) (result v128)
  #|  local.get 0
  #|  local.get 1
  #|  i32.add
  #|  v128.load64_zero)

///|
#borrow(a)
extern "wasm" fn v128_load1_f64_lane1(
  a : FixedArray[Double],
  off : Int,
  v : V128,
) -> V128 =
  #|(func (param i32 i32 v128) (result v128)
  #|  local.get 0
  #|  local.get 1
  #|  i32.add
  #|  local.get 2
  #|  v128.load64_lane 1)

///|
#borrow(a)
extern "wasm" fn v128_store1_f32_lane0(
  a : FixedArray[Float],
  off : Int,
  v : V128,
) -> Unit =
  #|(func (param i32 i32 v128)
  #|  local.get 0
  #|  local.get 1
  #|  i32.add
  #|  local.get 2
  #|  v128.store32_lane 0)

///|
#borrow(a)
extern "wasm" fn v128_store1_f32_lane1(
  a : FixedArray[Float],
  off : Int,
  v : V128,
) -> Unit =
  #|(func (param i32 i32 v128)
  #|  local.get 0
  #|  local.get 1
  #|  i32.add
  #|  local.get 2
  #|  v128.store32_lane 1)