//! SPDX-FileCopyrightText: 2013-2026 Frank Denis <j@pureftpd.org>
//! SPDX-License-Identifier: ISC
-import { ge_precomp } from './p'
-
-export function base (pos: i32): StaticArray<ge_precomp> {
- const stride = 8 * 3 * 12 // 8 arrays of 3 arrays of 12 values
- const start: i32 = pos * stride
- const end: i32 = start + stride
- const ge_slice = _base.slice(start, end)
- const ge: StaticArray<ge_precomp> = new StaticArray<ge_precomp>(8)
- for (let i = 0; i < 8; i++) {
- const offset = i * 36
- ge[i] = {
- yplusx: StaticArray.fromArray<i32>(ge_slice.slice(offset, offset + 12)),
- yminusx: StaticArray.fromArray<i32>(ge_slice.slice(offset + 12, offset + 24)),
- xy2d: StaticArray.fromArray<i32>(ge_slice.slice(offset + 24, offset + 36)),
- }
- }
- return ge
+
+/** 8 arrays of 3 arrays of 12 values of 4 bytes */
+const stride = 8 * 3 * 12 * 4
+
+export function base (pos: i32): usize {
+ const start: usize = pos * stride
+ return changetype<usize>(_base) + start
}
const _base = StaticArray.fromArray<i32>([
fe_cmov(t.xy2d, u.xy2d, b)
}
+const ge_cmov8_precomp_buffer: usize = changetype<usize>(new StaticArray<i32>(1152)) // 4 bytes * 12 values * 3 fields * 8 groups
const ge_cmov8_minust: ge_precomp = new ge_precomp()
+const ge_cmov8_precomp: StaticArray<ge_precomp> = StaticArray.fromArray<ge_precomp>([
+ new ge_precomp(),
+ new ge_precomp(),
+ new ge_precomp(),
+ new ge_precomp(),
+ new ge_precomp(),
+ new ge_precomp(),
+ new ge_precomp(),
+ new ge_precomp(),
+])
//@ts-expect-error
@inline
function ge_cmov8_base (t: ge_precomp, pos: i32, b: i8): void {
const minust = ge_cmov8_minust
const bnegative: u8 = negative(b)
const babs: u8 = b - (((-bnegative) & b) * (i8(1) << 1))
- const precomp = base(pos)
+ memory.copy(ge_cmov8_precomp_buffer, base(pos), 1152)
ge_precomp_0(t)
for (let i: i8 = 0; i < 8; i++) {
- ge_cmov(t, precomp[i], equal(babs, i + 1))
+ const ptr = ge_cmov8_precomp_buffer + (i * 144) // 4 bytes * 12 values * 3 fields
+ memory.copy(changetype<usize>(ge_cmov8_precomp[i].yplusx), ptr, 48)
+ memory.copy(changetype<usize>(ge_cmov8_precomp[i].yminusx), ptr + 48, 48)
+ memory.copy(changetype<usize>(ge_cmov8_precomp[i].xy2d), ptr + 96, 48)
+ ge_cmov(t, ge_cmov8_precomp[i], equal(babs, i + 1))
}
fe_copy(minust.yplusx, t.yminusx)