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
`)}
`
}
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)
// 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)
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)
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)
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)
// 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)
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)
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)
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 {
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)
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²
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)
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)
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)
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)
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)
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)
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)
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)
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)