]> git.codecow.com Git - nano25519.git/commitdiff
Remove dead code and initialize additional scratch vectors. next/fe-vectors
authorChris Duncan <chris@codecow.com>
Wed, 30 Sep 2026 21:20:25 +0000 (14:20 -0700)
committerChris Duncan <chris@codecow.com>
Wed, 30 Sep 2026 21:20:25 +0000 (14:20 -0700)
scripts/fe.gen.mjs
scripts/p.gen.mjs
src/assembly/ed25519/fe.ts
src/assembly/ed25519/p.ts

index 6a36597ad36b6f64eb0a30ae8e39e0117e0f4638..77beb53252fdc7a832576abdd5bff9128ed84cb2 100644 (file)
@@ -20,7 +20,10 @@ export function fe_init_v128 (...fe) {
        let ${fe.map(fe => `
        ${fe.replaceAll('.', '_')}_0123: v128,
        ${fe.replaceAll('.', '_')}_4567: v128,
-       ${fe.replaceAll('.', '_')}_89xx: v128
+       ${fe.replaceAll('.', '_')}_89xx: v128,
+       ${fe.replaceAll('.', '_')}_0123_19: v128,
+       ${fe.replaceAll('.', '_')}_4567_19: v128,
+       ${fe.replaceAll('.', '_')}_89xx_19: v128
 `)}
 `
 }
@@ -189,9 +192,9 @@ export function fe_mul (h, f, g) {
        const g_name = g.replaceAll('.', '_')
        return `
        // ${h} = ${f} * ${g}
-       const ${g_name}_0123_19: v128 = i32x4.mul(${g_name}_0123, v19)
-       const ${g_name}_4567_19: v128 = i32x4.mul(${g_name}_4567, v19)
-       const ${g_name}_89xx_19: v128 = i32x4.mul(${g_name}_89xx, v19)
+       ${g_name}_0123_19 = i32x4.mul(${g_name}_0123, v19)
+       ${g_name}_4567_19 = i32x4.mul(${g_name}_4567, v19)
+       ${g_name}_89xx_19 = i32x4.mul(${g_name}_89xx, v19)
 
        // f[0]
        fi = v128.extract_lane<i32>(${f_name}_0123, 0)
@@ -1130,9 +1133,10 @@ export function fe_mul (h: FieldElement, f: FieldElement, g: FieldElement): void
 
        // factor of 19 for wrap from h9 to h0
        const v19: v128 = i32x4.splat(19)
-       const g_0123_19: v128 = i32x4.mul(g_0123, v19)
-       const g_4567_19: v128 = i32x4.mul(g_4567, v19)
-       const g_89xx_19: v128 = i32x4.mul(g_89xx, v19)
+
+       g_0123_19 = i32x4.mul(g_0123, v19)
+       g_4567_19 = i32x4.mul(g_4567, v19)
+       g_89xx_19 = i32x4.mul(g_89xx, v19)
 
        // f[0]
        let fi: i32 = load<i32>(f_ptr, 0)
index a4936e6c855069a864291a55b9108c3be63eb256..339755b64c452ec7b83c6312abe25f623a7cb268 100644 (file)
@@ -60,7 +60,6 @@ export function ge_p2_0 (h: ge_p2): void {
        fe_1(h.Z)
 }
 
-const ge_p2_dbl_t: FieldElement = fe()
 //@ts-expect-error
 @inline
 export function ge_p2_dbl (r: ge_p1p1, p: ge_p2): void {
@@ -74,9 +73,6 @@ export function ge_p2_dbl (r: ge_p1p1, p: ge_p2): void {
        ${fe_load('r.Z')}
        ${fe_load('r.T')}
 
-       const rY2 = ge_p2_dbl_t
-       ${fe_load('rY2')}
-
        // could swap below with fe_sq_vec(r.X, r.Z, p.X, p.Y) // rX = pX²; rZ = pY²
        ${fe_sq('r.X', 'p.X')}
        ${fe_sq('r.Z', 'p.Y')}
index f4ab1c3e7095e0a7b5bbef1e75fb521af5225b94..3f505420534a57f6929b286f1f56e01cbac4d579 100644 (file)
@@ -69,15 +69,24 @@ export function fe_add (h: FieldElement, f: FieldElement, g: FieldElement): void
        let 
        h_0123: v128,
        h_4567: v128,
-       h_89xx: v128
+       h_89xx: v128,
+       h_0123_19: v128,
+       h_4567_19: v128,
+       h_89xx_19: v128
 ,
        f_0123: v128,
        f_4567: v128,
-       f_89xx: v128
+       f_89xx: v128,
+       f_0123_19: v128,
+       f_4567_19: v128,
+       f_89xx_19: v128
 ,
        g_0123: v128,
        g_4567: v128,
-       g_89xx: v128
+       g_89xx: v128,
+       g_0123_19: v128,
+       g_4567_19: v128,
+       g_89xx_19: v128
 
        // [0..3, 4..7, 8..11] = h
        h_0123 = v128.load(changetype<usize>(h), 0)
@@ -149,11 +158,17 @@ export function fe_dbl (h: FieldElement, f: FieldElement): void {
        let 
        h_0123: v128,
        h_4567: v128,
-       h_89xx: v128
+       h_89xx: v128,
+       h_0123_19: v128,
+       h_4567_19: v128,
+       h_89xx_19: v128
 ,
        f_0123: v128,
        f_4567: v128,
-       f_89xx: v128
+       f_89xx: v128,
+       f_0123_19: v128,
+       f_4567_19: v128,
+       f_89xx_19: v128
 
        // [0..3, 4..7, 8..11] = h
        h_0123 = v128.load(changetype<usize>(h), 0)
@@ -346,15 +361,24 @@ export function fe_mul (h: FieldElement, f: FieldElement, g: FieldElement): void
        let 
        h_0123: v128,
        h_4567: v128,
-       h_89xx: v128
+       h_89xx: v128,
+       h_0123_19: v128,
+       h_4567_19: v128,
+       h_89xx_19: v128
 ,
        f_0123: v128,
        f_4567: v128,
-       f_89xx: v128
+       f_89xx: v128,
+       f_0123_19: v128,
+       f_4567_19: v128,
+       f_89xx_19: v128
 ,
        g_0123: v128,
        g_4567: v128,
-       g_89xx: v128
+       g_89xx: v128,
+       g_0123_19: v128,
+       g_4567_19: v128,
+       g_89xx_19: v128
 
        const f_ptr: usize = changetype<usize>(f)
        
@@ -371,9 +395,10 @@ export function fe_mul (h: FieldElement, f: FieldElement, g: FieldElement): void
 
        // factor of 19 for wrap from h9 to h0
        const v19: v128 = i32x4.splat(19)
-       const g_0123_19: v128 = i32x4.mul(g_0123, v19)
-       const g_4567_19: v128 = i32x4.mul(g_4567, v19)
-       const g_89xx_19: v128 = i32x4.mul(g_89xx, v19)
+
+       g_0123_19 = i32x4.mul(g_0123, v19)
+       g_4567_19 = i32x4.mul(g_4567, v19)
+       g_89xx_19 = i32x4.mul(g_89xx, v19)
 
        // f[0]
        let fi: i32 = load<i32>(f_ptr, 0)
@@ -622,11 +647,17 @@ export function fe_neg (h: FieldElement, f: FieldElement): void {
        let 
        h_0123: v128,
        h_4567: v128,
-       h_89xx: v128
+       h_89xx: v128,
+       h_0123_19: v128,
+       h_4567_19: v128,
+       h_89xx_19: v128
 ,
        f_0123: v128,
        f_4567: v128,
-       f_89xx: v128
+       f_89xx: v128,
+       f_0123_19: v128,
+       f_4567_19: v128,
+       f_89xx_19: v128
 
        // [0..3, 4..7, 8..11] = h
        h_0123 = v128.load(changetype<usize>(h), 0)
@@ -1494,15 +1525,24 @@ export function fe_sub (h: FieldElement, f: FieldElement, g: FieldElement): void
        let 
        h_0123: v128,
        h_4567: v128,
-       h_89xx: v128
+       h_89xx: v128,
+       h_0123_19: v128,
+       h_4567_19: v128,
+       h_89xx_19: v128
 ,
        f_0123: v128,
        f_4567: v128,
-       f_89xx: v128
+       f_89xx: v128,
+       f_0123_19: v128,
+       f_4567_19: v128,
+       f_89xx_19: v128
 ,
        g_0123: v128,
        g_4567: v128,
-       g_89xx: v128
+       g_89xx: v128,
+       g_0123_19: v128,
+       g_4567_19: v128,
+       g_89xx_19: v128
 
        // [0..3, 4..7, 8..11] = h
        h_0123 = v128.load(changetype<usize>(h), 0)
index 9b030f2fd4e3ec59a88978b07fa35c397bd1edf4..e7de970cc0933e3c2b528908d9cc34293da5891c 100644 (file)
@@ -47,7 +47,6 @@ export function ge_p2_0 (h: ge_p2): void {
        fe_1(h.Z)
 }
 
-const ge_p2_dbl_t: FieldElement = fe()
 //@ts-expect-error
 @inline
 export function ge_p2_dbl (r: ge_p1p1, p: ge_p2): void {
@@ -55,35 +54,59 @@ export function ge_p2_dbl (r: ge_p1p1, p: ge_p2): void {
        let 
        p_X_0123: v128,
        p_X_4567: v128,
-       p_X_89xx: v128
+       p_X_89xx: v128,
+       p_X_0123_19: v128,
+       p_X_4567_19: v128,
+       p_X_89xx_19: v128
 ,
        p_Y_0123: v128,
        p_Y_4567: v128,
-       p_Y_89xx: v128
+       p_Y_89xx: v128,
+       p_Y_0123_19: v128,
+       p_Y_4567_19: v128,
+       p_Y_89xx_19: v128
 ,
        p_Z_0123: v128,
        p_Z_4567: v128,
-       p_Z_89xx: v128
+       p_Z_89xx: v128,
+       p_Z_0123_19: v128,
+       p_Z_4567_19: v128,
+       p_Z_89xx_19: v128
 ,
        r_X_0123: v128,
        r_X_4567: v128,
-       r_X_89xx: v128
+       r_X_89xx: v128,
+       r_X_0123_19: v128,
+       r_X_4567_19: v128,
+       r_X_89xx_19: v128
 ,
        r_Y_0123: v128,
        r_Y_4567: v128,
-       r_Y_89xx: v128
+       r_Y_89xx: v128,
+       r_Y_0123_19: v128,
+       r_Y_4567_19: v128,
+       r_Y_89xx_19: v128
 ,
        r_Z_0123: v128,
        r_Z_4567: v128,
-       r_Z_89xx: v128
+       r_Z_89xx: v128,
+       r_Z_0123_19: v128,
+       r_Z_4567_19: v128,
+       r_Z_89xx_19: v128
 ,
        r_T_0123: v128,
        r_T_4567: v128,
-       r_T_89xx: v128
+       r_T_89xx: v128,
+       r_T_0123_19: v128,
+       r_T_4567_19: v128,
+       r_T_89xx_19: v128
 ,
        rY2_0123: v128,
        rY2_4567: v128,
-       rY2_89xx: v128
+       rY2_89xx: v128,
+       rY2_0123_19: v128,
+       rY2_4567_19: v128,
+       rY2_89xx_19: v128
 
        // mask to select even lane from first vector and odd lane from second
        const m: v128 = i32x4(-1, 0, -1, 0)
@@ -203,13 +226,6 @@ export function ge_p2_dbl (r: ge_p1p1, p: ge_p2): void {
        r_T_4567 = v128.load(changetype<usize>(r.T), 16)
        r_T_89xx = v128.load(changetype<usize>(r.T), 32)
 
-       const rY2 = ge_p2_dbl_t
-       
-       // [0..3, 4..7, 8..11] = rY2
-       rY2_0123 = v128.load(changetype<usize>(rY2), 0)
-       rY2_4567 = v128.load(changetype<usize>(rY2), 16)
-       rY2_89xx = v128.load(changetype<usize>(rY2), 32)
-
        // could swap below with fe_sq_vec(r.X, r.Z, p.X, p.Y) // rX = pX²; rZ = pY²
        
        // r.X = p.X²
@@ -952,51 +968,87 @@ export function ge_add_cached (r: ge_p1p1, p: ge_p3, q: ge_cached): void {
        let 
        r_X_0123: v128,
        r_X_4567: v128,
-       r_X_89xx: v128
+       r_X_89xx: v128,
+       r_X_0123_19: v128,
+       r_X_4567_19: v128,
+       r_X_89xx_19: v128
 ,
        r_Y_0123: v128,
        r_Y_4567: v128,
-       r_Y_89xx: v128
+       r_Y_89xx: v128,
+       r_Y_0123_19: v128,
+       r_Y_4567_19: v128,
+       r_Y_89xx_19: v128
 ,
        r_Z_0123: v128,
        r_Z_4567: v128,
-       r_Z_89xx: v128
+       r_Z_89xx: v128,
+       r_Z_0123_19: v128,
+       r_Z_4567_19: v128,
+       r_Z_89xx_19: v128
 ,
        r_T_0123: v128,
        r_T_4567: v128,
-       r_T_89xx: v128
+       r_T_89xx: v128,
+       r_T_0123_19: v128,
+       r_T_4567_19: v128,
+       r_T_89xx_19: v128
 ,
        p_X_0123: v128,
        p_X_4567: v128,
-       p_X_89xx: v128
+       p_X_89xx: v128,
+       p_X_0123_19: v128,
+       p_X_4567_19: v128,
+       p_X_89xx_19: v128
 ,
        p_Y_0123: v128,
        p_Y_4567: v128,
-       p_Y_89xx: v128
+       p_Y_89xx: v128,
+       p_Y_0123_19: v128,
+       p_Y_4567_19: v128,
+       p_Y_89xx_19: v128
 ,
        p_Z_0123: v128,
        p_Z_4567: v128,
-       p_Z_89xx: v128
+       p_Z_89xx: v128,
+       p_Z_0123_19: v128,
+       p_Z_4567_19: v128,
+       p_Z_89xx_19: v128
 ,
        p_T_0123: v128,
        p_T_4567: v128,
-       p_T_89xx: v128
+       p_T_89xx: v128,
+       p_T_0123_19: v128,
+       p_T_4567_19: v128,
+       p_T_89xx_19: v128
 ,
        q_YplusX_0123: v128,
        q_YplusX_4567: v128,
-       q_YplusX_89xx: v128
+       q_YplusX_89xx: v128,
+       q_YplusX_0123_19: v128,
+       q_YplusX_4567_19: v128,
+       q_YplusX_89xx_19: v128
 ,
        q_YminusX_0123: v128,
        q_YminusX_4567: v128,
-       q_YminusX_89xx: v128
+       q_YminusX_89xx: v128,
+       q_YminusX_0123_19: v128,
+       q_YminusX_4567_19: v128,
+       q_YminusX_89xx_19: v128
 ,
        q_Z_0123: v128,
        q_Z_4567: v128,
-       q_Z_89xx: v128
+       q_Z_89xx: v128,
+       q_Z_0123_19: v128,
+       q_Z_4567_19: v128,
+       q_Z_89xx_19: v128
 ,
        q_T2d_0123: v128,
        q_T2d_4567: v128,
-       q_T2d_89xx: v128
+       q_T2d_89xx: v128,
+       q_T2d_0123_19: v128,
+       q_T2d_4567_19: v128,
+       q_T2d_89xx_19: v128
 
        // mask to select even lane from first vector and odd lane from second
        const m: v128 = i32x4(-1, 0, -1, 0)
@@ -1152,9 +1204,9 @@ export function ge_add_cached (r: ge_p1p1, p: ge_p3, q: ge_cached): void {
        r_Y_89xx = v128.sub<i32>(p_Y_89xx, p_X_89xx)
 
        // r.Z = r.X * q.YplusX
-       const q_YplusX_0123_19: v128 = i32x4.mul(q_YplusX_0123, v19)
-       const q_YplusX_4567_19: v128 = i32x4.mul(q_YplusX_4567, v19)
-       const q_YplusX_89xx_19: v128 = i32x4.mul(q_YplusX_89xx, v19)
+       q_YplusX_0123_19 = i32x4.mul(q_YplusX_0123, v19)
+       q_YplusX_4567_19 = i32x4.mul(q_YplusX_4567, v19)
+       q_YplusX_89xx_19 = i32x4.mul(q_YplusX_89xx, v19)
 
        // f[0]
        fi = v128.extract_lane<i32>(r_X_0123, 0)
@@ -1371,9 +1423,9 @@ export function ge_add_cached (r: ge_p1p1, p: ge_p3, q: ge_cached): void {
        r_Z_89xx = i32x4(<i32>h8, <i32>h9, 0, 0)
 
        // r.Y = r.Y * q.YminusX
-       const q_YminusX_0123_19: v128 = i32x4.mul(q_YminusX_0123, v19)
-       const q_YminusX_4567_19: v128 = i32x4.mul(q_YminusX_4567, v19)
-       const q_YminusX_89xx_19: v128 = i32x4.mul(q_YminusX_89xx, v19)
+       q_YminusX_0123_19 = i32x4.mul(q_YminusX_0123, v19)
+       q_YminusX_4567_19 = i32x4.mul(q_YminusX_4567, v19)
+       q_YminusX_89xx_19 = i32x4.mul(q_YminusX_89xx, v19)
 
        // f[0]
        fi = v128.extract_lane<i32>(r_Y_0123, 0)
@@ -1590,9 +1642,9 @@ export function ge_add_cached (r: ge_p1p1, p: ge_p3, q: ge_cached): void {
        r_Y_89xx = i32x4(<i32>h8, <i32>h9, 0, 0)
 
        // r.T = q.T2d * p.T
-       const p_T_0123_19: v128 = i32x4.mul(p_T_0123, v19)
-       const p_T_4567_19: v128 = i32x4.mul(p_T_4567, v19)
-       const p_T_89xx_19: v128 = i32x4.mul(p_T_89xx, v19)
+       p_T_0123_19 = i32x4.mul(p_T_0123, v19)
+       p_T_4567_19 = i32x4.mul(p_T_4567, v19)
+       p_T_89xx_19 = i32x4.mul(p_T_89xx, v19)
 
        // f[0]
        fi = v128.extract_lane<i32>(q_T2d_0123, 0)
@@ -1809,9 +1861,9 @@ export function ge_add_cached (r: ge_p1p1, p: ge_p3, q: ge_cached): void {
        r_T_89xx = i32x4(<i32>h8, <i32>h9, 0, 0)
 
        // r.X = p.Z * q.Z
-       const q_Z_0123_19: v128 = i32x4.mul(q_Z_0123, v19)
-       const q_Z_4567_19: v128 = i32x4.mul(q_Z_4567, v19)
-       const q_Z_89xx_19: v128 = i32x4.mul(q_Z_89xx, v19)
+       q_Z_0123_19 = i32x4.mul(q_Z_0123, v19)
+       q_Z_4567_19 = i32x4.mul(q_Z_4567, v19)
+       q_Z_89xx_19 = i32x4.mul(q_Z_89xx, v19)
 
        // f[0]
        fi = v128.extract_lane<i32>(p_Z_0123, 0)
@@ -2086,47 +2138,80 @@ export function ge_add_precomp (r: ge_p1p1, p: ge_p3, q: ge_precomp): void {
        let 
        r_X_0123: v128,
        r_X_4567: v128,
-       r_X_89xx: v128
+       r_X_89xx: v128,
+       r_X_0123_19: v128,
+       r_X_4567_19: v128,
+       r_X_89xx_19: v128
 ,
        r_Y_0123: v128,
        r_Y_4567: v128,
-       r_Y_89xx: v128
+       r_Y_89xx: v128,
+       r_Y_0123_19: v128,
+       r_Y_4567_19: v128,
+       r_Y_89xx_19: v128
 ,
        r_Z_0123: v128,
        r_Z_4567: v128,
-       r_Z_89xx: v128
+       r_Z_89xx: v128,
+       r_Z_0123_19: v128,
+       r_Z_4567_19: v128,
+       r_Z_89xx_19: v128
 ,
        r_T_0123: v128,
        r_T_4567: v128,
-       r_T_89xx: v128
+       r_T_89xx: v128,
+       r_T_0123_19: v128,
+       r_T_4567_19: v128,
+       r_T_89xx_19: v128
 ,
        p_X_0123: v128,
        p_X_4567: v128,
-       p_X_89xx: v128
+       p_X_89xx: v128,
+       p_X_0123_19: v128,
+       p_X_4567_19: v128,
+       p_X_89xx_19: v128
 ,
        p_Y_0123: v128,
        p_Y_4567: v128,
-       p_Y_89xx: v128
+       p_Y_89xx: v128,
+       p_Y_0123_19: v128,
+       p_Y_4567_19: v128,
+       p_Y_89xx_19: v128
 ,
        p_Z_0123: v128,
        p_Z_4567: v128,
-       p_Z_89xx: v128
+       p_Z_89xx: v128,
+       p_Z_0123_19: v128,
+       p_Z_4567_19: v128,
+       p_Z_89xx_19: v128
 ,
        p_T_0123: v128,
        p_T_4567: v128,
-       p_T_89xx: v128
+       p_T_89xx: v128,
+       p_T_0123_19: v128,
+       p_T_4567_19: v128,
+       p_T_89xx_19: v128
 ,
        q_yplusx_0123: v128,
        q_yplusx_4567: v128,
-       q_yplusx_89xx: v128
+       q_yplusx_89xx: v128,
+       q_yplusx_0123_19: v128,
+       q_yplusx_4567_19: v128,
+       q_yplusx_89xx_19: v128
 ,
        q_yminusx_0123: v128,
        q_yminusx_4567: v128,
-       q_yminusx_89xx: v128
+       q_yminusx_89xx: v128,
+       q_yminusx_0123_19: v128,
+       q_yminusx_4567_19: v128,
+       q_yminusx_89xx_19: v128
 ,
        q_xy2d_0123: v128,
        q_xy2d_4567: v128,
-       q_xy2d_89xx: v128
+       q_xy2d_89xx: v128,
+       q_xy2d_0123_19: v128,
+       q_xy2d_4567_19: v128,
+       q_xy2d_89xx_19: v128
 
        // mask to select even lane from first vector and odd lane from second
        const m: v128 = i32x4(-1, 0, -1, 0)
@@ -2277,9 +2362,9 @@ export function ge_add_precomp (r: ge_p1p1, p: ge_p3, q: ge_precomp): void {
        r_Y_89xx = v128.sub<i32>(p_Y_89xx, p_X_89xx)
 
        // r.Z = r.X * q.yplusx
-       const q_yplusx_0123_19: v128 = i32x4.mul(q_yplusx_0123, v19)
-       const q_yplusx_4567_19: v128 = i32x4.mul(q_yplusx_4567, v19)
-       const q_yplusx_89xx_19: v128 = i32x4.mul(q_yplusx_89xx, v19)
+       q_yplusx_0123_19 = i32x4.mul(q_yplusx_0123, v19)
+       q_yplusx_4567_19 = i32x4.mul(q_yplusx_4567, v19)
+       q_yplusx_89xx_19 = i32x4.mul(q_yplusx_89xx, v19)
 
        // f[0]
        fi = v128.extract_lane<i32>(r_X_0123, 0)
@@ -2496,9 +2581,9 @@ export function ge_add_precomp (r: ge_p1p1, p: ge_p3, q: ge_precomp): void {
        r_Z_89xx = i32x4(<i32>h8, <i32>h9, 0, 0)
 
        // r.Y = r.Y * q.yminusx
-       const q_yminusx_0123_19: v128 = i32x4.mul(q_yminusx_0123, v19)
-       const q_yminusx_4567_19: v128 = i32x4.mul(q_yminusx_4567, v19)
-       const q_yminusx_89xx_19: v128 = i32x4.mul(q_yminusx_89xx, v19)
+       q_yminusx_0123_19 = i32x4.mul(q_yminusx_0123, v19)
+       q_yminusx_4567_19 = i32x4.mul(q_yminusx_4567, v19)
+       q_yminusx_89xx_19 = i32x4.mul(q_yminusx_89xx, v19)
 
        // f[0]
        fi = v128.extract_lane<i32>(r_Y_0123, 0)
@@ -2715,9 +2800,9 @@ export function ge_add_precomp (r: ge_p1p1, p: ge_p3, q: ge_precomp): void {
        r_Y_89xx = i32x4(<i32>h8, <i32>h9, 0, 0)
 
        // r.T = q.xy2d * p.T
-       const p_T_0123_19: v128 = i32x4.mul(p_T_0123, v19)
-       const p_T_4567_19: v128 = i32x4.mul(p_T_4567, v19)
-       const p_T_89xx_19: v128 = i32x4.mul(p_T_89xx, v19)
+       p_T_0123_19 = i32x4.mul(p_T_0123, v19)
+       p_T_4567_19 = i32x4.mul(p_T_4567, v19)
+       p_T_89xx_19 = i32x4.mul(p_T_89xx, v19)
 
        // f[0]
        fi = v128.extract_lane<i32>(q_xy2d_0123, 0)