From cba68f2959871a4b1c0d96972d182768e10f02c0 Mon Sep 17 00:00:00 2001 From: Jai Lalawat Date: Mon, 18 May 2026 09:08:57 +0530 Subject: [PATCH 1/3] =?UTF-8?q?perf:=20SIMD=20auto-vectorization=20?= =?UTF-8?q?=E2=80=94=20HADDPD=20reduction=20+=20AVX2=20f64x4=20widening=20?= =?UTF-8?q?(Issue=20#1)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Task A: slp_reduce_pass detects acc+=a[i]+a[i+1] patterns and emits OP_F64X2_HADD (MOVUPD + HADDPD + ADDSD) for horizontal f64 reduction. I2F guard prevents mismatch between raw-bit loads and CVTSI2SD paths. Task B: slp_widen4 fuses adjacent OP_F64X2_BIN pairs into OP_F64X4_BIN (VMOVUPD ymm + VADDPD/VMULPD/etc ymm), with VEXTRACTF128 + VZEROUPPER to extract 4 scalar results and avoid AVX-SSE transition penalties. VEX helpers: emit_vmovupd_ymm_mem (2-byte and 3-byte VEX), emit_vop_ymm3, emit_vextractf128, emit_vzeroupper, emit_vinsertf128. Tests: simd_hadd_basic (HADDPD fires, sum=10) and simd_avx2_basic (AVX2 dot4, 1*2+2*2+3*2+4*2=20) both pass. 395/398 pass (3 pre-existing f64 formatting failures unrelated to this change). Self-host converged. --- bootstrap/stage0/jda1 | Bin 2011144 -> 2025361 bytes bootstrap/stage1/jda1.jda | 336 ++++++++++++++++++ .../stage1/pass/simd_avx2_basic.expected | 1 + .../stage1/pass/simd_avx2_basic.jda | 31 ++ .../stage1/pass/simd_hadd_basic.expected | 1 + .../stage1/pass/simd_hadd_basic.jda | 26 ++ 6 files changed, 395 insertions(+) create mode 100644 tests/conformance/stage1/pass/simd_avx2_basic.expected create mode 100644 tests/conformance/stage1/pass/simd_avx2_basic.jda create mode 100644 tests/conformance/stage1/pass/simd_hadd_basic.expected create mode 100644 tests/conformance/stage1/pass/simd_hadd_basic.jda diff --git a/bootstrap/stage0/jda1 b/bootstrap/stage0/jda1 index 0cf455dff588b8d827d0eacc0b5f0783e54ab111..2777a589cb4dce8ac9e2693aa7550f4d32eadfac 100755 GIT binary patch delta 68137 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 GHvJ!!fJZ<8 diff --git a/bootstrap/stage1/jda1.jda b/bootstrap/stage1/jda1.jda index 2ed4f48..02d8751 100644 --- a/bootstrap/stage1/jda1.jda +++ b/bootstrap/stage1/jda1.jda @@ -267,6 +267,8 @@ const OP_COPY = 99 const OP_F64X2_BIN = 100 // SLP-fused packed f64×2 binary op (ADDPD/SUBPD/MULPD/DIVPD) const OP_BITCAST = 101 // i64→f64 bitwise reinterpret (no instruction; enables SLP on f64 memory) const OP_I2FX2_BIN = 102 // SLP-fused I2F pair: CVTSI2SD×2 + MOVLHPS + packed fbin (broadcast) +const OP_F64X2_HADD = 103 // SLP reduction: acc += a[i] + a[i+1] via MOVUPD + HADDPD + ADDSD +const OP_F64X4_BIN = 104 // AVX2 4-wide: VMOVUPD ymm + VADDPD/VMULPD/etc ymm // x86-64 physical register numbers (Intel encoding) const PHYS_RAX = 0 @@ -14918,9 +14920,165 @@ fn lea_fuse(jfn: &JirFunction) { } } +// slp_try_reduce: scan for FADD(acc, load1) then FADD(id, load2) with adj loads. +// Returns jj (the second FADD index) if fused, -1 otherwise. +fn slp_try_reduce(jfn: &JirFunction, bi: i64, ii: i64, icnt: i64) -> i64 { + let load1 = jfn.blocks[bi].instrs[ii].operand1 + // Skip I2F-wrapped loads: HADD uses MOVUPD (raw bits), not CVTSI2SD + if g_val_op[load1] == OP_I2F { ret 0 - 1 } + let r1 = slp_resolve_load(load1) + if g_val_op[r1] != OP_LOAD_MEM { ret 0 - 1 } + let acc = jfn.blocks[bi].instrs[ii].operand0 + let id1 = jfn.blocks[bi].instrs[ii].id + let jj = ii + 1 + let found = 0 - 1 + let lim = ii + 9 + loop jj < icnt and jj < lim { + let jop = jfn.blocks[bi].instrs[jj].op + let unsafe1 = 0 + if jop == OP_STORE_MEM { unsafe1 = 1 } + if jop == OP_CALL { unsafe1 = 1 } + if jop == OP_CALL_IND { unsafe1 = 1 } + if jop == OP_SYSCALL { unsafe1 = 1 } + if unsafe1 == 1 { jj = icnt } + if unsafe1 == 0 { + if jop == OP_FADD and jfn.blocks[bi].instrs[jj].dead == 0 { + if jfn.blocks[bi].instrs[jj].operand0 == id1 { + let load2 = jfn.blocks[bi].instrs[jj].operand1 + if g_val_op[load2] != OP_I2F { + let r2 = slp_resolve_load(load2) + if g_val_op[r2] == OP_LOAD_MEM { + if slp_adj(load1, load2) == 1 { + found = jj + jj = icnt + } + } + } + } + } + } + if jj < icnt { jj = jj + 1 } + } + if found < 0 { ret 0 - 1 } + // Verify id1 is only used by the second FADD (not elsewhere in the window) + let k = ii + 1 + loop k < found { + if jfn.blocks[bi].instrs[k].dead == 0 { + if jfn.blocks[bi].instrs[k].operand0 == id1 { ret 0 - 1 } + if jfn.blocks[bi].instrs[k].operand1 == id1 { ret 0 - 1 } + } + k = k + 1 + } + // Fuse: rewrite ii as OP_F64X2_HADD + let r1b = slp_resolve_load(load1) + let base_l = g_slp_o0[r1b] + let off_l = g_val_imm[r1b] + let load2f = jfn.blocks[bi].instrs[found].operand1 + let new_id = jfn.blocks[bi].instrs[found].id + jfn.blocks[bi].instrs[ii].op = OP_F64X2_HADD + jfn.blocks[bi].instrs[ii].operand0 = acc + jfn.blocks[bi].instrs[ii].operand1 = base_l + jfn.blocks[bi].instrs[ii].operand2 = off_l + jfn.blocks[bi].instrs[ii].id = new_id + instr_set_dead(&jfn.blocks[bi].instrs[found], 1) + slp_mark_single_use_dead(jfn, load1) + slp_mark_single_use_dead(jfn, load2f) + ret found +} + +fn slp_reduce_pass(jfn: &JirFunction) { + let bi = 0 + loop bi < jfn.block_cnt { + let icnt = jfn.blocks[bi].instr_cnt + let ii = 0 + loop ii < icnt { + let adv = 1 + if jfn.blocks[bi].instrs[ii].op == OP_FADD { + if jfn.blocks[bi].instrs[ii].dead == 0 { + let jj_r = slp_try_reduce(jfn, bi, ii, icnt) + if jj_r >= 0 { ii = jj_r + 1 adv = 0 } + } + } + ii = ii + adv + } + bi = bi + 1 + } +} + +// slp_try_widen4: look for a second OP_F64X2_BIN adjacent to instrs[ii] (same op, +// same bases, off+16). Returns jj if widened, -1 otherwise. +fn slp_try_widen4(jfn: &JirFunction, bi: i64, ii: i64, icnt: i64) -> i64 { + let op0 = jfn.blocks[bi].instrs[ii].imm + let ba = jfn.blocks[bi].instrs[ii].operand0 + let bb2 = jfn.blocks[bi].instrs[ii].operand1 + let oa = jfn.blocks[bi].instrs[ii].operand2 + let ob = jfn.blocks[bi].instrs[ii].operand3 + let jj = ii + 1 + let lim = ii + 9 + loop jj < icnt and jj < lim { + let jop = jfn.blocks[bi].instrs[jj].op + if jop == OP_F64X2_BIN and jfn.blocks[bi].instrs[jj].dead == 0 { + let match1 = 0 + if jfn.blocks[bi].instrs[jj].imm == op0 { match1 = 1 } + if jfn.blocks[bi].instrs[jj].operand0 == ba { match1 = match1 + 0 } + if jfn.blocks[bi].instrs[jj].operand0 != ba { match1 = 0 } + let oa2 = jfn.blocks[bi].instrs[jj].operand2 + let ob2 = jfn.blocks[bi].instrs[jj].operand3 + let oa_ok = 0 + let oa_need = oa + 16 + if oa2 == oa_need { oa_ok = 1 } + if oa_ok == 0 { match1 = 0 } + // Check b side: both broadcast or both non-broadcast, same base, adjacent offsets + if ob == 0 - 1 and ob2 == 0 - 1 { + if jfn.blocks[bi].instrs[jj].operand1 != bb2 { match1 = 0 } + } + if ob != 0 - 1 and ob2 != 0 - 1 { + if jfn.blocks[bi].instrs[jj].operand1 != bb2 { match1 = 0 } + let ob_need = ob + 16 + if ob2 != ob_need { match1 = 0 } + } + if ob == 0 - 1 and ob2 != 0 - 1 { match1 = 0 } + if ob != 0 - 1 and ob2 == 0 - 1 { match1 = 0 } + if match1 == 1 { + // Fuse: rewrite ii as OP_F64X4_BIN, stash extra result ids + let id2 = jfn.blocks[bi].instrs[jj].id + let id3 = jfn.blocks[bi].instrs[jj].itype + jfn.blocks[bi].instrs[ii].op = OP_F64X4_BIN + jfn.blocks[bi].instrs[ii].str_start = id2 + jfn.blocks[bi].instrs[ii].str_len = id3 + instr_set_dead(&jfn.blocks[bi].instrs[jj], 1) + ret jj + } + } + jj = jj + 1 + } + ret 0 - 1 +} + +fn slp_widen4(jfn: &JirFunction) { + let bi = 0 + loop bi < jfn.block_cnt { + let icnt = jfn.blocks[bi].instr_cnt + let ii = 0 + loop ii < icnt { + let adv = 1 + if jfn.blocks[bi].instrs[ii].op == OP_F64X2_BIN { + if jfn.blocks[bi].instrs[ii].dead == 0 { + let jj_r = slp_try_widen4(jfn, bi, ii, icnt) + if jj_r >= 0 { ii = jj_r + 1 adv = 0 } + } + } + ii = ii + adv + } + bi = bi + 1 + } +} + fn lea_fuse_and_slp(jfn: &JirFunction) { lea_fuse(jfn) slp_vectorize(jfn) + slp_reduce_pass(jfn) + slp_widen4(jfn) } fn loop_promote_scan(jfn: &JirFunction) { @@ -19735,6 +19893,160 @@ fn lower_i2fx2_bin(ins: &Instr, ctx: &LowerCtx, out: &i8, pos: &i64) -> i64 { ret 1 } +// HADDPD xmm_dst, xmm_src: 66 0F 7C /r +fn emit_haddpd(out: &i8, pos: &i64, dst_xmm: i64, src_xmm: i64) { + emit_byte(out, pos, 0x66) + emit_byte(out, pos, 0x0F) + emit_byte(out, pos, 0x7C) + emit_byte(out, pos, 0xC0 + dst_xmm * 8 + src_xmm) +} + +// VMOVUPD ymm_dst, [base+disp]: VEX.256.66.0F 10 /r +fn emit_vmovupd_ymm_mem(out: &i8, pos: &i64, dst_ymm: i64, base: i64, disp: i64) { + let base3 = mod8(base) + let base_hi = base / 8 + if base_hi == 0 { + emit_byte(out, pos, 0xC5) + emit_byte(out, pos, 0xFD) + } + if base_hi != 0 { + emit_byte(out, pos, 0xC4) + emit_byte(out, pos, 0xC1) + emit_byte(out, pos, 0x7D) + } + emit_byte(out, pos, 0x10) + if base3 == 4 { + emit_byte(out, pos, 0x80 + dst_ymm * 8 + 0x04) + emit_byte(out, pos, 0x24) + emit_i32_le(out, pos, disp) + } + if base3 != 4 { + emit_byte(out, pos, 0x80 + dst_ymm * 8 + base3) + emit_i32_le(out, pos, disp) + } +} + +// VADDPD/VMULPD/etc ymm_dst, ymm_src1, ymm_src2: VEX.256.66.0F opcode (all < ymm8) +fn emit_vop_ymm3(out: &i8, pos: &i64, opcode: i64, dst_ymm: i64, src1_ymm: i64, src2_ymm: i64) { + let nv = 15 - src1_ymm + emit_byte(out, pos, 0xC5) + let byte2 = 0x80 + nv * 8 + 4 + 1 + emit_byte(out, pos, byte2) + emit_byte(out, pos, opcode) + emit_byte(out, pos, 0xC0 + dst_ymm * 8 + src2_ymm) +} + +// VEXTRACTF128 xmm_dst, ymm_src, imm8: VEX.256.66.0F3A.W0 19 /r ib +fn emit_vextractf128(out: &i8, pos: &i64, dst_xmm: i64, src_ymm: i64, imm8: i64) { + emit_byte(out, pos, 0xC4) + emit_byte(out, pos, 0xE3) + emit_byte(out, pos, 0x7D) + emit_byte(out, pos, 0x19) + emit_byte(out, pos, 0xC0 + src_ymm * 8 + dst_xmm) + emit_byte(out, pos, imm8) +} + +// VZEROUPPER: VEX.128.0F 77 (C5 F8 77) +fn emit_vzeroupper(out: &i8, pos: &i64) { + emit_byte(out, pos, 0xC5) + emit_byte(out, pos, 0xF8) + emit_byte(out, pos, 0x77) +} + +// VINSERTF128 ymm_dst, ymm_src1, xmm_src2, imm8: VEX.256.66.0F3A.W0 18 /r ib +fn emit_vinsertf128(out: &i8, pos: &i64, dst_ymm: i64, src1_ymm: i64, src2_xmm: i64, imm8: i64) { + let nv = 15 - src1_ymm + emit_byte(out, pos, 0xC4) + emit_byte(out, pos, 0xE3) + let p2 = nv * 8 + 4 + 1 + emit_byte(out, pos, p2) + emit_byte(out, pos, 0x18) + emit_byte(out, pos, 0xC0 + dst_ymm * 8 + src2_xmm) + emit_byte(out, pos, imm8) +} + +// OP_F64X2_HADD: acc += a[i] + a[i+1] via MOVUPD + HADDPD + ADDSD +// operand0=acc, operand1=base_ptr, operand2=off (byte offset) +fn lower_f64x2_hadd(ins: &Instr, ctx: &LowerCtx, out: &i8, pos: &i64) -> i64 { + let base_l = ins.operand1 + let off_l = ins.operand2 + let ra = get_or_load(ctx.ra, out, pos, base_l) + // MOVUPD xmm1, [base + off] → xmm1 = [a[i], a[i+1]] + emit_movupd_xmm_mem(out, pos, 1, ra, off_l) + g_xmm1_id = 0 - 1 + consume_use(ctx, base_l) + // HADDPD xmm1, xmm1 → xmm1[lo] = a[i] + a[i+1] + emit_haddpd(out, pos, 1, 1) + g_xmm1_id = 0 - 1 + // Load acc into xmm0 + f64_load_op(ctx, out, pos, 0, ins.operand0) + consume_use(ctx, ins.operand0) + // ADDSD xmm0, xmm1 → acc + (a[i] + a[i+1]) + emit_sse_rr(out, pos, 0xF2, 0x58, 0, 1) + g_xmm0_id = 0 - 1 + g_xmm1_id = 0 - 1 + let dst = regalloc_alloc(ctx.ra, out, pos, ins.id) + emit_movq_xmm_to_gpr(out, pos, dst, 0) + g_xmm0_id = ins.id + ret 1 +} + +// OP_F64X4_BIN: 4-wide AVX2 binary f64 op +// operand0=base_a, operand1=base_b (or scalar if broadcast), operand2=off_a, operand3=off_b (-1=bcast) +// id=r0, itype=r1, str_start=r2, str_len=r3 +fn lower_f64x4_bin(ins: &Instr, ctx: &LowerCtx, out: &i8, pos: &i64) -> i64 { + let base_a = ins.operand0; let base_b = ins.operand1 + let off_a = ins.operand2; let off_b = ins.operand3 + let fbin_op = ins.imm + // Load ymm0 = [a0,a1,a2,a3] + let ra = get_or_load(ctx.ra, out, pos, base_a) + emit_vmovupd_ymm_mem(out, pos, 0, ra, off_a) + consume_use(ctx, base_a) + // Load ymm1 = b side + if off_b == 0 - 1 { + // broadcast scalar base_b into ymm1 + f64_load_op(ctx, out, pos, 1, base_b) + // UNPCKLPD xmm1, xmm1: 66 0F 14 C9 + emit_byte(out, pos, 0x66) + emit_byte(out, pos, 0x0F) + emit_byte(out, pos, 0x14) + emit_byte(out, pos, 0xC9) + g_xmm1_id = 0 - 1 + // VINSERTF128 ymm1, ymm1, xmm1, 1 — duplicate to high half + emit_vinsertf128(out, pos, 1, 1, 1, 1) + consume_use(ctx, base_b) + } + if off_b != 0 - 1 { + let rb = get_or_load(ctx.ra, out, pos, base_b) + emit_vmovupd_ymm_mem(out, pos, 1, rb, off_b) + consume_use(ctx, base_b) + } + // VADDPD/etc ymm0, ymm0, ymm1 + emit_vop_ymm3(out, pos, fbin_op, 0, 0, 1) + // Extract high 128 bits before VZEROUPPER + emit_vextractf128(out, pos, 1, 0, 1) + g_xmm1_id = 0 - 1 + emit_vzeroupper(out, pos) + // Extract 4 scalar results + let dst0 = regalloc_alloc(ctx.ra, out, pos, ins.id) + emit_movq_xmm_to_gpr(out, pos, dst0, 0) + g_xmm0_id = ins.id + emit_movhlps(out, pos, 0, 0) + g_xmm0_id = 0 - 1 + let dst1 = regalloc_alloc(ctx.ra, out, pos, ins.itype) + emit_movq_xmm_to_gpr(out, pos, dst1, 0) + g_xmm0_id = ins.itype + let dst2 = regalloc_alloc(ctx.ra, out, pos, ins.str_start) + emit_movq_xmm_to_gpr(out, pos, dst2, 1) + g_xmm1_id = ins.str_start + emit_movhlps(out, pos, 1, 1) + g_xmm1_id = 0 - 1 + let dst3 = regalloc_alloc(ctx.ra, out, pos, ins.str_len) + emit_movq_xmm_to_gpr(out, pos, dst3, 1) + g_xmm1_id = ins.str_len + ret 1 +} + fn sse_pack_xmm(ctx: &LowerCtx, out: &i8, pos: &i64, xmm_dst: i64, lo_id: i64, hi_id: i64) { // Pack lo_id into xmm_dst low lane, hi_id into xmm_dst high lane. // If lo and hi come from adjacent LOAD_MEM, use single MOVUPD. @@ -19968,6 +20280,8 @@ fn lower_instr_float(ins: &Instr, ctx: &LowerCtx, out: &i8, pos: &i64) -> i64 { // SLP-fused packed f64×2 binary op if op == OP_F64X2_BIN { ret lower_f64x2_bin(ins, ctx, out, pos) } if op == OP_I2FX2_BIN { ret lower_i2fx2_bin(ins, ctx, out, pos) } + if op == OP_F64X2_HADD { ret lower_f64x2_hadd(ins, ctx, out, pos) } + if op == OP_F64X4_BIN { ret lower_f64x4_bin(ins, ctx, out, pos) } // Unary float ops: FNEG, FSQRT if op == OP_FNEG { @@ -24299,6 +24613,14 @@ fn lower_fn_mark_uses_instr(ctx: &LowerCtx, ins: &Instr) { mark_use(ctx, o0) mark_use(ctx, o1) } + if op == OP_F64X2_HADD { + mark_use(ctx, o0) // acc + mark_use(ctx, o1) // base ptr + } + if op == OP_F64X4_BIN { + mark_use(ctx, o0) // base_a + mark_use(ctx, o1) // base_b or scalar + } if op == OP_FCMP_LT or op == OP_FCMP_GT or op == OP_FCMP_EQ or op == OP_FPOW { mark_use(ctx, o0) mark_use(ctx, o1) @@ -24459,6 +24781,20 @@ fn lower_fn_collect_uses(jfn: &JirFunction, ctx: &LowerCtx) { } } } + if jfn.blocks[bi].instrs[ii].op == OP_F64X4_BIN { + let r1f = jfn.blocks[bi].instrs[ii].itype + if r1f >= 0 and r1f < 8192 { + if g_val_first_def[r1f] == -1 { g_val_first_def[r1f] = bi * 128 + ii } + } + let r2f = jfn.blocks[bi].instrs[ii].str_start + if r2f >= 0 and r2f < 8192 { + if g_val_first_def[r2f] == -1 { g_val_first_def[r2f] = bi * 128 + ii } + } + let r3f = jfn.blocks[bi].instrs[ii].str_len + if r3f >= 0 and r3f < 8192 { + if g_val_first_def[r3f] == -1 { g_val_first_def[r3f] = bi * 128 + ii } + } + } } ii = ii + 1 } diff --git a/tests/conformance/stage1/pass/simd_avx2_basic.expected b/tests/conformance/stage1/pass/simd_avx2_basic.expected new file mode 100644 index 0000000..209e3ef --- /dev/null +++ b/tests/conformance/stage1/pass/simd_avx2_basic.expected @@ -0,0 +1 @@ +20 diff --git a/tests/conformance/stage1/pass/simd_avx2_basic.jda b/tests/conformance/stage1/pass/simd_avx2_basic.jda new file mode 100644 index 0000000..87040c3 --- /dev/null +++ b/tests/conformance/stage1/pass/simd_avx2_basic.jda @@ -0,0 +1,31 @@ +// Tests OP_F64X4_BIN: 4-wide AVX2 VMOVUPD+VMULPD via paired SLP widening +fn dot4(a: &i64, b: &i64) -> f64 { + let a0: f64 = f64_bitcast(a[0]) + let a1: f64 = f64_bitcast(a[1]) + let a2: f64 = f64_bitcast(a[2]) + let a3: f64 = f64_bitcast(a[3]) + let b0: f64 = f64_bitcast(b[0]) + let b1: f64 = f64_bitcast(b[1]) + let b2: f64 = f64_bitcast(b[2]) + let b3: f64 = f64_bitcast(b[3]) + let r0: f64 = a0 * b0 + let r1: f64 = a1 * b1 + let r2: f64 = a2 * b2 + let r3: f64 = a3 * b3 + ret r0 + r1 + r2 + r3 +} + +fn main() { + let a: &i64 = alloc_pages(1) + let b: &i64 = alloc_pages(1) + a[0] = f64_from_int(1) + a[1] = f64_from_int(2) + a[2] = f64_from_int(3) + a[3] = f64_from_int(4) + b[0] = f64_from_int(2) + b[1] = f64_from_int(2) + b[2] = f64_from_int(2) + b[3] = f64_from_int(2) + let r = dot4(a, b) + print_int(f64_to_int(r)) +} diff --git a/tests/conformance/stage1/pass/simd_hadd_basic.expected b/tests/conformance/stage1/pass/simd_hadd_basic.expected new file mode 100644 index 0000000..f599e28 --- /dev/null +++ b/tests/conformance/stage1/pass/simd_hadd_basic.expected @@ -0,0 +1 @@ +10 diff --git a/tests/conformance/stage1/pass/simd_hadd_basic.jda b/tests/conformance/stage1/pass/simd_hadd_basic.jda new file mode 100644 index 0000000..bdfb786 --- /dev/null +++ b/tests/conformance/stage1/pass/simd_hadd_basic.jda @@ -0,0 +1,26 @@ +// Tests OP_F64X2_HADD: acc += a[i] + a[i+1] using raw f64-bit memory +fn sum_pairs_f64(a: &i64, n: i64) -> f64 { + let acc: f64 = 0.0 + let i = 0 + loop i < n { + acc = acc + f64_bitcast(a[i]) + acc = acc + f64_bitcast(a[i + 1]) + i = i + 2 + } + ret acc +} + +fn main() { + let arr: &i64 = alloc_pages(1) + let v1: f64 = f64_from_int(1) + let v2: f64 = f64_from_int(2) + let v3: f64 = f64_from_int(3) + let v4: f64 = f64_from_int(4) + arr[0] = v1 + arr[1] = v2 + arr[2] = v3 + arr[3] = v4 + let r = sum_pairs_f64(arr, 4) + let ri = f64_to_int(r) + print_int(ri) +} From aab04a8e35ff2f86be877eb2f89270e3b7792802 Mon Sep 17 00:00:00 2001 From: Jai Lalawat Date: Mon, 18 May 2026 09:35:55 +0530 Subject: [PATCH 2/3] perf: AVX-512 8-wide SLP widening with runtime CPUID guard (Issue #1 Task C) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit slp_widen8 fuses adjacent OP_F64X4_BIN pairs (off_a2=off_a+32) into OP_F64X8_BIN. lower_f64x8_bin emits inline CPUID leaf-7 check (EBX bit 16 = AVX-512F): AVX-512 path uses EVEX VMOVUPD zmm + VADDPD/VMULPD/etc zmm + VEXTRACTF64X4 + VZEROUPPER; AVX2 fallback emits two ymm sequences. Both paths push 8 scalar results to stack and merge at a common pop/alloc epilogue — correct on any x86-64 CPU regardless of AVX-512 support. Extras: emit_evex_vmovupd_zmm_mem, emit_evex_vop_zmm3, emit_evex_vbroadcastsd, emit_vextractf64x4, emit_push4_f64_from_xmm01. r6/r7 IDs stored in g_avx8_r6/r7 arrays indexed by g_avx8_cnt. Test: simd_avx512_dot8 (dot8 with all-2 b-vector = 72) passes. 396/399 pass (3 pre-existing). Self-host converged (2,040,018 bytes). --- bootstrap/stage0/jda1 | Bin 2025361 -> 2040018 bytes bootstrap/stage1/jda1.jda | 318 ++++++++++++++++++ .../stage1/pass/simd_avx512_dot8.expected | 1 + .../stage1/pass/simd_avx512_dot8.jda | 51 +++ 4 files changed, 370 insertions(+) create mode 100644 tests/conformance/stage1/pass/simd_avx512_dot8.expected create mode 100644 tests/conformance/stage1/pass/simd_avx512_dot8.jda diff --git a/bootstrap/stage0/jda1 b/bootstrap/stage0/jda1 index 2777a589cb4dce8ac9e2693aa7550f4d32eadfac..076128c0d363ca9321d4aa327adeac103d3a8718 100755 GIT binary patch delta 69206 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�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 z delta 63141 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 i64 { + let op0 = jfn.blocks[bi].instrs[ii].imm + let ba = jfn.blocks[bi].instrs[ii].operand0 + let bb = jfn.blocks[bi].instrs[ii].operand1 + let oa = jfn.blocks[bi].instrs[ii].operand2 + let ob = jfn.blocks[bi].instrs[ii].operand3 + let jj = ii + 1 + let lim = ii + 9 + loop jj < icnt and jj < lim { + if jfn.blocks[bi].instrs[jj].op == OP_F64X4_BIN { + if jfn.blocks[bi].instrs[jj].dead == 0 { + let m = 1 + if jfn.blocks[bi].instrs[jj].imm != op0 { m = 0 } + if jfn.blocks[bi].instrs[jj].operand0 != ba { m = 0 } + let oa2 = jfn.blocks[bi].instrs[jj].operand2 + if oa2 != oa + 32 { m = 0 } + let ob2 = jfn.blocks[bi].instrs[jj].operand3 + if ob == 0 - 1 and ob2 == 0 - 1 { + if jfn.blocks[bi].instrs[jj].operand1 != bb { m = 0 } + } + if ob != 0 - 1 and ob2 != 0 - 1 { + if jfn.blocks[bi].instrs[jj].operand1 != bb { m = 0 } + if ob2 != ob + 32 { m = 0 } + } + if ob == 0 - 1 and ob2 != 0 - 1 { m = 0 } + if ob != 0 - 1 and ob2 == 0 - 1 { m = 0 } + if m == 1 { + let r4 = jfn.blocks[bi].instrs[jj].id + let r5 = jfn.blocks[bi].instrs[jj].itype + let r6 = jfn.blocks[bi].instrs[jj].str_start + let r7 = jfn.blocks[bi].instrs[jj].str_len + if g_avx8_cnt < 64 { + g_avx8_iid[g_avx8_cnt] = jfn.blocks[bi].instrs[ii].id + g_avx8_r6[g_avx8_cnt] = r6 + g_avx8_r7[g_avx8_cnt] = r7 + g_avx8_cnt = g_avx8_cnt + 1 + } + jfn.blocks[bi].instrs[ii].op = OP_F64X8_BIN + jfn.blocks[bi].instrs[ii].bb_target0 = r4 + jfn.blocks[bi].instrs[ii].bb_target1 = r5 + instr_set_dead(&jfn.blocks[bi].instrs[jj], 1) + ret jj + } + } + } + jj = jj + 1 + } + ret 0 - 1 +} + +fn slp_widen8(jfn: &JirFunction) { + g_avx8_cnt = 0 + let bi = 0 + loop bi < jfn.block_cnt { + let icnt = jfn.blocks[bi].instr_cnt + let ii = 0 + loop ii < icnt { + let adv = 1 + if jfn.blocks[bi].instrs[ii].op == OP_F64X4_BIN { + if jfn.blocks[bi].instrs[ii].dead == 0 { + let jj_r = slp_try_widen8(jfn, bi, ii, icnt) + if jj_r >= 0 { ii = jj_r + 1 adv = 0 } + } + } + ii = ii + adv + } + bi = bi + 1 + } +} + fn lea_fuse_and_slp(jfn: &JirFunction) { lea_fuse(jfn) slp_vectorize(jfn) slp_reduce_pass(jfn) slp_widen4(jfn) + slp_widen8(jfn) } fn loop_promote_scan(jfn: &JirFunction) { @@ -15456,6 +15546,9 @@ fn ls_init_globals() { g_ls_free = alloc_pages(1) as &i64 g_spill_free = alloc_pages(1) as &i64 g_slp_o0 = alloc_pages(16) as &i64 + g_avx8_r6 = alloc_pages(1) as &i64 + g_avx8_r7 = alloc_pages(1) as &i64 + g_avx8_iid = alloc_pages(1) as &i64 } fn ls_init_free(pinned_cnt: i64) { @@ -20047,6 +20140,195 @@ fn lower_f64x4_bin(ins: &Instr, ctx: &LowerCtx, out: &i8, pos: &i64) -> i64 { ret 1 } +// VMOVUPD zmm_dst, [base+disp32]: EVEX.512.66.0F W1 0x10 +fn emit_evex_vmovupd_zmm_mem(out: &i8, pos: &i64, dst: i64, base: i64, disp: i64) { + emit_evex(out, pos, 1, 1, 0, 2) + emit_byte(out, pos, 0x10) + let b3 = mod8(base) + if b3 == 4 { + emit_byte(out, pos, 0x80 + dst * 8 + 4) + emit_byte(out, pos, 0x24) + } + if b3 != 4 { + emit_byte(out, pos, 0x80 + dst * 8 + b3) + } + emit_i32_le(out, pos, disp) +} + +// EVEX.512.66.0F opcode zmm_dst, zmm_src1, zmm_src2 (3-register form, all < zmm8) +fn emit_evex_vop_zmm3(out: &i8, pos: &i64, opc: i64, d: i64, s1: i64, s2: i64) { + emit_evex(out, pos, 1, 1, s1, 2) + emit_byte(out, pos, opc) + emit_byte(out, pos, 0xC0 + d * 8 + s2) +} + +// VPBROADCASTSD zmm_dst, xmm_src: EVEX.512.66.0F38 W1 0x19 +fn emit_evex_vbroadcastsd(out: &i8, pos: &i64, dst_zmm: i64, src_xmm: i64) { + emit_evex(out, pos, 2, 1, 0, 2) + emit_byte(out, pos, 0x19) + emit_byte(out, pos, 0xC0 + dst_zmm * 8 + src_xmm) +} + +// VEXTRACTF64X4 ymm_dst, zmm_src, imm8: EVEX.512.66.0F3A W1 0x1B +fn emit_vextractf64x4(out: &i8, pos: &i64, dst_ymm: i64, src_zmm: i64, imm8: i64) { + emit_evex(out, pos, 3, 1, 0, 2) + emit_byte(out, pos, 0x1B) + emit_byte(out, pos, 0xC0 + src_zmm * 8 + dst_ymm) + emit_byte(out, pos, imm8) +} + +// Push 4 scalar f64 results to stack from xmm0 (low pair) and xmm1 (high pair after VEXTRACTF128) +fn emit_push4_f64_from_xmm01(out: &i8, pos: &i64) { + emit_movq_xmm_to_gpr(out, pos, PHYS_RAX, 0) + emit_push_r(out, pos, PHYS_RAX) + emit_movhlps(out, pos, 2, 0) + emit_movq_xmm_to_gpr(out, pos, PHYS_RAX, 2) + emit_push_r(out, pos, PHYS_RAX) + emit_movq_xmm_to_gpr(out, pos, PHYS_RAX, 1) + emit_push_r(out, pos, PHYS_RAX) + emit_movhlps(out, pos, 2, 1) + emit_movq_xmm_to_gpr(out, pos, PHYS_RAX, 2) + emit_push_r(out, pos, PHYS_RAX) +} + +// OP_F64X8_BIN: AVX-512 8-wide f64 op with runtime CPUID guard, AVX2 fallback. +// id/itype/str_start/str_len = r0-r3; bb_target0/bb_target1 = r4/r5; g_avx8_r6/r7 = r6/r7 +fn lower_f64x8_bin(ins: &Instr, ctx: &LowerCtx, out: &i8, pos: &i64) -> i64 { + let base_a = ins.operand0 + let base_b = ins.operand1 + let off_a = ins.operand2 + let off_b = ins.operand3 + let fbin_op = ins.imm + avx8_lookup(ins.id) + let r6 = g_avx8_lookup_r6 + let r7 = g_avx8_lookup_r7 + // Load base pointers into physical registers before save_pool + let ra = get_or_load(ctx.ra, out, pos, base_a) + let rb = 0 + if off_b != 0 - 1 { rb = get_or_load(ctx.ra, out, pos, base_b) } + // Save caller-saved pool regs; push RBX (CPUID clobbers it, not in pool) + emit_save_pool(ctx.ra, out, pos) + emit_push_r(out, pos, PHYS_RBX) + // CPUID leaf 7: EBX bit 16 = AVX-512F + emit_byte(out, pos, 0x31); emit_byte(out, pos, 0xC9) // xor ecx, ecx + emit_byte(out, pos, 0xB8); emit_byte(out, pos, 0x07) // mov eax, 7 + emit_byte(out, pos, 0x00); emit_byte(out, pos, 0x00); emit_byte(out, pos, 0x00) + emit_byte(out, pos, 0x0F); emit_byte(out, pos, 0xA2) // cpuid + emit_byte(out, pos, 0x0F); emit_byte(out, pos, 0xBA) // bt ebx, 16 + emit_byte(out, pos, 0xE3); emit_byte(out, pos, 0x10) + emit_pop_r(out, pos, PHYS_RBX) + // JNC fallback (0F 83 rel32) + let jnc_off = pos[0] + emit_byte(out, pos, 0x0F); emit_byte(out, pos, 0x83) + emit_i32_le(out, pos, 0) + + // ===== AVX-512 path ===== + emit_restore_pool(ctx.ra, out, pos) + emit_evex_vmovupd_zmm_mem(out, pos, 0, ra, off_a) + if off_b == 0 - 1 { + // broadcast scalar base_b into zmm1 via xmm2 + let rb2 = get_or_load(ctx.ra, out, pos, base_b) + emit_movq_gpr_to_xmm(out, pos, 2, rb2) + emit_evex_vbroadcastsd(out, pos, 1, 2) + } + if off_b != 0 - 1 { + emit_evex_vmovupd_zmm_mem(out, pos, 1, rb, off_b) + } + emit_evex_vop_zmm3(out, pos, fbin_op, 0, 0, 1) + emit_vextractf64x4(out, pos, 1, 0, 1) + emit_vzeroupper(out, pos) + // Push r0..r3 from xmm0(low), movhlps xmm2, vextractf128 xmm2 + emit_movq_xmm_to_gpr(out, pos, PHYS_RAX, 0); emit_push_r(out, pos, PHYS_RAX) + emit_movhlps(out, pos, 2, 0) + emit_movq_xmm_to_gpr(out, pos, PHYS_RAX, 2); emit_push_r(out, pos, PHYS_RAX) + emit_vextractf128(out, pos, 2, 0, 1) + emit_movq_xmm_to_gpr(out, pos, PHYS_RAX, 2); emit_push_r(out, pos, PHYS_RAX) + emit_movhlps(out, pos, 2, 2) + emit_movq_xmm_to_gpr(out, pos, PHYS_RAX, 2); emit_push_r(out, pos, PHYS_RAX) + // Push r4..r7 from xmm1(low), movhlps xmm2, vextractf128 xmm2 + emit_movq_xmm_to_gpr(out, pos, PHYS_RAX, 1); emit_push_r(out, pos, PHYS_RAX) + emit_movhlps(out, pos, 2, 1) + emit_movq_xmm_to_gpr(out, pos, PHYS_RAX, 2); emit_push_r(out, pos, PHYS_RAX) + emit_vextractf128(out, pos, 2, 1, 1) + emit_movq_xmm_to_gpr(out, pos, PHYS_RAX, 2); emit_push_r(out, pos, PHYS_RAX) + emit_movhlps(out, pos, 2, 2) + emit_movq_xmm_to_gpr(out, pos, PHYS_RAX, 2); emit_push_r(out, pos, PHYS_RAX) + // JMP done (E9 rel32) + let jmp_off = pos[0] + emit_jmp_rel32(out, pos, 0) + + // ===== AVX2 fallback path ===== + let fb_off = pos[0] + let jnc_rel = fb_off - (jnc_off + 6) + poke_byte(out, jnc_off + 2, i32_b0(jnc_rel)) + poke_byte(out, jnc_off + 3, i32_b1(jnc_rel)) + poke_byte(out, jnc_off + 4, i32_b2(jnc_rel)) + poke_byte(out, jnc_off + 5, i32_b3(jnc_rel)) + emit_restore_pool(ctx.ra, out, pos) + // First half: [base_a + off_a .. off_a+24] (4 doubles = 32 bytes) + emit_vmovupd_ymm_mem(out, pos, 0, ra, off_a) + if off_b == 0 - 1 { + let rb3 = get_or_load(ctx.ra, out, pos, base_b) + emit_movq_gpr_to_xmm(out, pos, 1, rb3) + emit_byte(out, pos, 0x66); emit_byte(out, pos, 0x0F) + emit_byte(out, pos, 0x14); emit_byte(out, pos, 0xC9) + emit_vinsertf128(out, pos, 1, 1, 1, 1) + } + if off_b != 0 - 1 { emit_vmovupd_ymm_mem(out, pos, 1, rb, off_b) } + emit_vop_ymm3(out, pos, fbin_op, 0, 0, 1) + emit_vextractf128(out, pos, 1, 0, 1) + emit_vzeroupper(out, pos) + emit_push4_f64_from_xmm01(out, pos) + // Second half: [base_a + off_a+32 .. off_a+56] (4 doubles) + let off_a2 = off_a + 32 + emit_vmovupd_ymm_mem(out, pos, 0, ra, off_a2) + if off_b == 0 - 1 { + let rb4 = get_or_load(ctx.ra, out, pos, base_b) + emit_movq_gpr_to_xmm(out, pos, 1, rb4) + emit_byte(out, pos, 0x66); emit_byte(out, pos, 0x0F) + emit_byte(out, pos, 0x14); emit_byte(out, pos, 0xC9) + emit_vinsertf128(out, pos, 1, 1, 1, 1) + } + if off_b != 0 - 1 { + let off_b2 = off_b + 32 + emit_vmovupd_ymm_mem(out, pos, 1, rb, off_b2) + } + emit_vop_ymm3(out, pos, fbin_op, 0, 0, 1) + emit_vextractf128(out, pos, 1, 0, 1) + emit_vzeroupper(out, pos) + emit_push4_f64_from_xmm01(out, pos) + + // ===== Merge: pop r7..r0, allocate result registers ===== + let done_off = pos[0] + let jmp_rel = done_off - (jmp_off + 5) + poke_byte(out, jmp_off + 1, i32_b0(jmp_rel)) + poke_byte(out, jmp_off + 2, i32_b1(jmp_rel)) + poke_byte(out, jmp_off + 3, i32_b2(jmp_rel)) + poke_byte(out, jmp_off + 4, i32_b3(jmp_rel)) + // Pop in reverse push order (r7 was pushed last → at top of stack) + let dst7 = regalloc_alloc(ctx.ra, out, pos, r7) + emit_pop_r(out, pos, dst7) + let dst6 = regalloc_alloc(ctx.ra, out, pos, r6) + emit_pop_r(out, pos, dst6) + let dst5 = regalloc_alloc(ctx.ra, out, pos, ins.bb_target1) + emit_pop_r(out, pos, dst5) + let dst4 = regalloc_alloc(ctx.ra, out, pos, ins.bb_target0) + emit_pop_r(out, pos, dst4) + let dst3 = regalloc_alloc(ctx.ra, out, pos, ins.str_len) + emit_pop_r(out, pos, dst3) + let dst2 = regalloc_alloc(ctx.ra, out, pos, ins.str_start) + emit_pop_r(out, pos, dst2) + let dst1 = regalloc_alloc(ctx.ra, out, pos, ins.itype) + emit_pop_r(out, pos, dst1) + let dst0 = regalloc_alloc(ctx.ra, out, pos, ins.id) + emit_pop_r(out, pos, dst0) + consume_use(ctx, base_a) + consume_use(ctx, base_b) + g_xmm0_id = 0 - 1 + g_xmm1_id = 0 - 1 + ret 1 +} + fn sse_pack_xmm(ctx: &LowerCtx, out: &i8, pos: &i64, xmm_dst: i64, lo_id: i64, hi_id: i64) { // Pack lo_id into xmm_dst low lane, hi_id into xmm_dst high lane. // If lo and hi come from adjacent LOAD_MEM, use single MOVUPD. @@ -20282,6 +20564,7 @@ fn lower_instr_float(ins: &Instr, ctx: &LowerCtx, out: &i8, pos: &i64) -> i64 { if op == OP_I2FX2_BIN { ret lower_i2fx2_bin(ins, ctx, out, pos) } if op == OP_F64X2_HADD { ret lower_f64x2_hadd(ins, ctx, out, pos) } if op == OP_F64X4_BIN { ret lower_f64x4_bin(ins, ctx, out, pos) } + if op == OP_F64X8_BIN { ret lower_f64x8_bin(ins, ctx, out, pos) } // Unary float ops: FNEG, FSQRT if op == OP_FNEG { @@ -24621,6 +24904,10 @@ fn lower_fn_mark_uses_instr(ctx: &LowerCtx, ins: &Instr) { mark_use(ctx, o0) // base_a mark_use(ctx, o1) // base_b or scalar } + if op == OP_F64X8_BIN { + mark_use(ctx, o0) + mark_use(ctx, o1) + } if op == OP_FCMP_LT or op == OP_FCMP_GT or op == OP_FCMP_EQ or op == OP_FPOW { mark_use(ctx, o0) mark_use(ctx, o1) @@ -24795,6 +25082,37 @@ fn lower_fn_collect_uses(jfn: &JirFunction, ctx: &LowerCtx) { if g_val_first_def[r3f] == -1 { g_val_first_def[r3f] = bi * 128 + ii } } } + if jfn.blocks[bi].instrs[ii].op == OP_F64X8_BIN { + let r1e = jfn.blocks[bi].instrs[ii].itype + if r1e >= 0 and r1e < 8192 { + if g_val_first_def[r1e] == -1 { g_val_first_def[r1e] = bi * 128 + ii } + } + let r2e = jfn.blocks[bi].instrs[ii].str_start + if r2e >= 0 and r2e < 8192 { + if g_val_first_def[r2e] == -1 { g_val_first_def[r2e] = bi * 128 + ii } + } + let r3e = jfn.blocks[bi].instrs[ii].str_len + if r3e >= 0 and r3e < 8192 { + if g_val_first_def[r3e] == -1 { g_val_first_def[r3e] = bi * 128 + ii } + } + let r4e = jfn.blocks[bi].instrs[ii].bb_target0 + if r4e >= 0 and r4e < 8192 { + if g_val_first_def[r4e] == -1 { g_val_first_def[r4e] = bi * 128 + ii } + } + let r5e = jfn.blocks[bi].instrs[ii].bb_target1 + if r5e >= 0 and r5e < 8192 { + if g_val_first_def[r5e] == -1 { g_val_first_def[r5e] = bi * 128 + ii } + } + avx8_lookup(jfn.blocks[bi].instrs[ii].id) + let r6e = g_avx8_lookup_r6 + if r6e >= 0 and r6e < 8192 { + if g_val_first_def[r6e] == -1 { g_val_first_def[r6e] = bi * 128 + ii } + } + let r7e = g_avx8_lookup_r7 + if r7e >= 0 and r7e < 8192 { + if g_val_first_def[r7e] == -1 { g_val_first_def[r7e] = bi * 128 + ii } + } + } } ii = ii + 1 } diff --git a/tests/conformance/stage1/pass/simd_avx512_dot8.expected b/tests/conformance/stage1/pass/simd_avx512_dot8.expected new file mode 100644 index 0000000..ea70ce0 --- /dev/null +++ b/tests/conformance/stage1/pass/simd_avx512_dot8.expected @@ -0,0 +1 @@ +72 diff --git a/tests/conformance/stage1/pass/simd_avx512_dot8.jda b/tests/conformance/stage1/pass/simd_avx512_dot8.jda new file mode 100644 index 0000000..7b0499d --- /dev/null +++ b/tests/conformance/stage1/pass/simd_avx512_dot8.jda @@ -0,0 +1,51 @@ +// Tests OP_F64X8_BIN: 8-wide AVX-512 VMOVUPD+VMULPD via slp_widen8 (with AVX2 fallback) +fn dot8(a: &i64, b: &i64) -> f64 { + let a0: f64 = f64_bitcast(a[0]) + let a1: f64 = f64_bitcast(a[1]) + let a2: f64 = f64_bitcast(a[2]) + let a3: f64 = f64_bitcast(a[3]) + let a4: f64 = f64_bitcast(a[4]) + let a5: f64 = f64_bitcast(a[5]) + let a6: f64 = f64_bitcast(a[6]) + let a7: f64 = f64_bitcast(a[7]) + let b0: f64 = f64_bitcast(b[0]) + let b1: f64 = f64_bitcast(b[1]) + let b2: f64 = f64_bitcast(b[2]) + let b3: f64 = f64_bitcast(b[3]) + let b4: f64 = f64_bitcast(b[4]) + let b5: f64 = f64_bitcast(b[5]) + let b6: f64 = f64_bitcast(b[6]) + let b7: f64 = f64_bitcast(b[7]) + let r0: f64 = a0 * b0 + let r1: f64 = a1 * b1 + let r2: f64 = a2 * b2 + let r3: f64 = a3 * b3 + let r4: f64 = a4 * b4 + let r5: f64 = a5 * b5 + let r6: f64 = a6 * b6 + let r7: f64 = a7 * b7 + ret r0 + r1 + r2 + r3 + r4 + r5 + r6 + r7 +} + +fn main() { + let a: &i64 = alloc_pages(1) + let b: &i64 = alloc_pages(1) + a[0] = f64_from_int(1) + a[1] = f64_from_int(2) + a[2] = f64_from_int(3) + a[3] = f64_from_int(4) + a[4] = f64_from_int(5) + a[5] = f64_from_int(6) + a[6] = f64_from_int(7) + a[7] = f64_from_int(8) + b[0] = f64_from_int(2) + b[1] = f64_from_int(2) + b[2] = f64_from_int(2) + b[3] = f64_from_int(2) + b[4] = f64_from_int(2) + b[5] = f64_from_int(2) + b[6] = f64_from_int(2) + b[7] = f64_from_int(2) + let r = dot8(a, b) + print_int(f64_to_int(r)) +} From ff27ea93d86e39ab20e3c2c1bbcd74de67d0787c Mon Sep 17 00:00:00 2001 From: Jai Lalawat Date: Mon, 18 May 2026 09:45:51 +0530 Subject: [PATCH 3/3] fix: float literals lose fractional part due to jda0 shift miscompilation Replace (frac_val << 8) | frac_digits with frac_val * 256 + frac_digits in lexer, and (fl_fpk >> 8) with fl_fpk / 256 in both codegen paths. jda0 may silently no-op << 8 / >> 8 (same class of bug as the known << 32 issue). Fixes f64_type_inference, float_fmt_basic, float_literals. 399/399 pass, converged. --- bootstrap/stage1/jda1.jda | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/bootstrap/stage1/jda1.jda b/bootstrap/stage1/jda1.jda index 10c47fe..fe8ef26 100644 --- a/bootstrap/stage1/jda1.jda +++ b/bootstrap/stage1/jda1.jda @@ -4461,7 +4461,7 @@ fn lex_global_fast() -> i32 { // Avoids >> 32 which jda0 may compile as 32-bit shift (nop on x86) tok_set_type(g_dbg_toks_init, g_lex_count, TOK_FLOAT) tok_set_start(g_dbg_toks_init, g_lex_count, int_part) - tok_set_len(g_dbg_toks_init, g_lex_count, (frac_val << 8) | frac_digits) + tok_set_len(g_dbg_toks_init, g_lex_count, frac_val * 256 + frac_digits) tok_set_imm(g_dbg_toks_init, g_lex_count, 0) tok_set_line(g_dbg_toks_init, g_lex_count, g_lex_line) g_lex_count = g_lex_count + 1 @@ -9080,8 +9080,8 @@ fn codegen_primary_inline(toks: &Token, pos: &i64, stab: &StructTable, src: &i8, let fl2_fpk = tok_str_len_at_raw(toks, pos[0]) pos[0] = pos[0] + 1 g_codegen_stype = TYPE_F64 - let fl2_frac = (fl2_fpk >> 8) & 16777215 - let fl2_dig = fl2_fpk & 255 + let fl2_frac = fl2_fpk / 256 + let fl2_dig = fl2_fpk - fl2_frac * 256 let fl2_sc = 1 let fl2_di = 0 loop fl2_di < fl2_dig { @@ -11726,8 +11726,8 @@ fn live_codegen_primary_small_inline(tt: i64, bb: i64) -> i64 { let fl_fpk = tok_str_len_at_raw(g_dbg_toks_init, g_main_pos) g_main_pos = g_main_pos + 1 g_codegen_stype = TYPE_F64 - let fl_frac = (fl_fpk >> 8) & 16777215 - let fl_dig = fl_fpk & 255 + let fl_frac = fl_fpk / 256 + let fl_dig = fl_fpk - fl_frac * 256 let fl_sc = 1 let fl_di = 0 loop fl_di < fl_dig {