///|
/// Wasmoon internal Wasm-to-Wasm calling convention for a target ISA.
pub fn wasm_calling_convention_for_isa(
  isa : @isa.ISA,
) -> @abi.CallConventionLayout {
  match isa {
    AArch64 =>
      {
        context_arg: { index: 0, class: Int },
        user_arg_gprs: [
          { index: 1, class: Int },
          { index: 2, class: Int },
          { index: 3, class: Int },
          { index: 4, class: Int },
          { index: 5, class: Int },
          { index: 6, class: Int },
          { index: 7, class: Int },
        ],
        arg_fprs: @aarch64.aapcs64_arg_fprs(),
        ret_gprs: @aarch64.aapcs64_ret_gprs(),
        ret_fprs: @aarch64.aapcs64_ret_fprs(),
      }
    AMD64 => {
      let arg_fprs : Array[@abi.PReg] = []
      let ret_fprs : Array[@abi.PReg] = []
      for i in 0..<8 {
        arg_fprs.push({ index: i, class: Float64 })
        ret_fprs.push({ index: i, class: Float64 })
      }
      {
        context_arg: { index: 7, class: Int },
        user_arg_gprs: [
          { index: 6, class: Int },
          { index: 2, class: Int },
          { index: 1, class: Int },
          { index: 8, class: Int },
          { index: 9, class: Int },
        ],
        arg_fprs,
        ret_gprs: [
          { index: 0, class: Int },
          { index: 2, class: Int },
          { index: 1, class: Int },
          { index: 8, class: Int },
          { index: 9, class: Int },
          { index: 6, class: Int },
          { index: 7, class: Int },
          { index: 10, class: Int },
        ],
        ret_fprs,
      }
    }
  }
}

///|
pub fn wasm_calling_convention(
  isa? : @isa.ISA = AArch64,
) -> @abi.CallConventionLayout {
  wasm_calling_convention_for_isa(isa)
}