Skip to content

Commit 56c9e4d

Browse files
committed
fix tree bugs
1 parent 42cec7f commit 56c9e4d

2 files changed

Lines changed: 125 additions & 64 deletions

File tree

lib/num/code.c

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1067,7 +1067,6 @@ static num_p num_mul_classic_buffer(num_p num_res, num_p num_1, num_p num_2)
10671067

10681068
uint64_t target_count = n1 + n2;
10691069

1070-
// THE CRASH FIX: Safely zero the ENTIRE capacity to prevent trash memory
10711070
num_set_count(num_res, 0);
10721071
num_res->count = target_count;
10731072

@@ -1088,12 +1087,10 @@ static num_p num_mul_classic_buffer(num_p num_res, num_p num_1, num_p num_2)
10881087
{
10891088
uint64_t dest_idx = i + j;
10901089

1091-
// 128-bit multiplication maps cleanly to the hardware (mul + umulh)
10921090
uint128_t u = MUL(src1[j], v2);
10931091
uint64_t p_low = LOW(u);
10941092
uint64_t p_high = HIGH(u);
10951093

1096-
// THE SPEED FIX: Force 64-bit native ALU additions (Kills 128-bit software emulation)
10971094
uint64_t sum;
10981095
uint64_t c1 = (uint64_t)__builtin_add_overflow(p_low, dest[dest_idx], &sum);
10991096
uint64_t c2 = (uint64_t)__builtin_add_overflow(sum, carry, &dest[dest_idx]);
@@ -1648,7 +1645,7 @@ STATIC void num_ssm_pad(num_p num_fft, num_p num, ssm_params_p p)
16481645

16491646
if(num->count == (p->M * p->K) + 1)
16501647
{
1651-
dest[(p->n * p->K) - 1] = src[num->count - 1];
1648+
dest[(p->n * (p->K - 1)) + p->M] = src[num->count - 1];
16521649
return;
16531650
}
16541651

@@ -1825,6 +1822,7 @@ STATIC void num_ssm_shl_mod(
18251822
return;
18261823
}
18271824

1825+
num_set_count(num_aux, 0);
18281826
num_ssm_shr(num_aux, 0, num, pos, n, (chunk_bits * n) - chunk_bits - bits);
18291827
num_ssm_shl(num_aux, n, num, pos, n, bits);
18301828
num_aux->chunk[(2 * n) - 1] = 0;
@@ -1852,6 +1850,7 @@ STATIC void num_ssm_shr_mod(
18521850
return;
18531851
}
18541852

1853+
num_set_count(num_aux, 0);
18551854
num_ssm_shl(num_aux, 0, num, pos, n, (chunk_bits * n) - chunk_bits - bits);
18561855
num_ssm_shr(num_aux, n, num, pos, n, bits);
18571856
num_aux->chunk[n - 1] = 0;

lib/num/test/behavior.c

Lines changed: 122 additions & 60 deletions
Original file line numberDiff line numberDiff line change
@@ -990,8 +990,8 @@ static void test_num_ssm_add_mod(bool show)
990990
TEST_CASE_OPEN(TAG) \
991991
{ \
992992
num_p num = num_create_immed(ARG_OPEN NUM); \
993-
num_p num_res = num_create(CLU_ARGS(N, N)); \
994-
num_ssm_add_mod(num_res, 0, num, POS_1, num, POS_2, N); \
993+
num_p num_res = num_create_rand(N); \
994+
num_ssm_add_mod(num_res, 0, num, POS_1, num, POS_2, N); \
995995
assert(num_immed(num_res, ARG_OPEN RES)); \
996996
assert(num_immed(num, ARG_OPEN NUM)); \
997997
} \
@@ -1037,7 +1037,7 @@ static void test_num_ssm_sub_mod(bool show)
10371037
TEST_CASE_OPEN(TAG) \
10381038
{ \
10391039
num_p num = num_create_immed(ARG_OPEN NUM); \
1040-
num_p num_res = num_create(CLU_ARGS(N, N)); \
1040+
num_p num_res = num_create_rand(N); \
10411041
num_ssm_sub_mod(num_res, 0, num, POS_1, num, POS_2, N); \
10421042
assert(num_immed(num_res, ARG_OPEN RES)); \
10431043
assert(num_immed(num, ARG_OPEN NUM)); \
@@ -1134,24 +1134,24 @@ static void test_num_ssm_pad(bool show)
11341134
{
11351135
TEST_FN_OPEN
11361136

1137-
#define TEST_SSM_PAD(TAG, NUM, Mv, Nv, Kv, RES) \
1138-
{ \
1139-
TEST_CASE_OPEN(TAG) \
1140-
{ \
1141-
num_p num = num_create_immed(ARG_OPEN NUM); \
1142-
num_p num_res = num_create(CLU_ARGS((Nv) * (Kv), (Nv) * (Kv))); \
1143-
ssm_params_t p = (ssm_params_t) \
1144-
{ \
1145-
.M = (Mv), \
1146-
.K = (Kv), \
1147-
.n = (Nv) \
1148-
}; \
1149-
num_ssm_pad(num_res, num, &p); \
1150-
num_res->count = (Nv) * (Kv); \
1151-
assert(num_immed(num_res, ARG_OPEN RES)) \
1152-
assert(num_immed(num, ARG_OPEN NUM)) \
1153-
} \
1154-
TEST_CASE_CLOSE \
1137+
#define TEST_SSM_PAD(TAG, NUM, Mv, Nv, Kv, RES) \
1138+
{ \
1139+
TEST_CASE_OPEN(TAG) \
1140+
{ \
1141+
num_p num = num_create_immed(ARG_OPEN NUM); \
1142+
num_p num_res = num_create_rand((Nv) * (Kv)); \
1143+
ssm_params_t p = (ssm_params_t) \
1144+
{ \
1145+
.M = (Mv), \
1146+
.K = (Kv), \
1147+
.n = (Nv) \
1148+
}; \
1149+
num_ssm_pad(num_res, num, &p); \
1150+
num_res->count = (Nv) * (Kv); \
1151+
assert(num_immed(num_res, ARG_OPEN RES)) \
1152+
assert(num_immed(num, ARG_OPEN NUM)) \
1153+
} \
1154+
TEST_CASE_CLOSE \
11551155
}
11561156

11571157
TEST_SSM_PAD(1,
@@ -1182,6 +1182,20 @@ static void test_num_ssm_pad(bool show)
11821182
(3, 0, UINT64_MAX, UINT64_MAX), 1, 2, 2,
11831183
(4, 0, UINT64_MAX, 0, UINT64_MAX)
11841184
)
1185+
TEST_SSM_PAD(8,
1186+
(9, 1, 0, 0, 0, 0, 0, 0, 0, 0),
1187+
1, 4, 8,
1188+
(32,
1189+
0, 0, 1, 0,
1190+
0, 0, 0, 0,
1191+
0, 0, 0, 0,
1192+
0, 0, 0, 0,
1193+
0, 0, 0, 0,
1194+
0, 0, 0, 0,
1195+
0, 0, 0, 0,
1196+
0, 0, 0, 0
1197+
)
1198+
)
11851199

11861200
#undef TEST_SSM_PAD
11871201

@@ -1197,7 +1211,7 @@ static void test_num_ssm_shl(bool show)
11971211
TEST_CASE_OPEN(TAG) \
11981212
{ \
11991213
num_p num = num_create_immed(ARG_OPEN NUM); \
1200-
num_p num_res = num_create(CLU_ARGS(N, N)); \
1214+
num_p num_res = num_create_rand(N); \
12011215
num_ssm_shl(num_res, 0, num, POS, N, BITS); \
12021216
assert(num_immed(num_res, ARG_OPEN RES)); \
12031217
assert(num_immed(num, ARG_OPEN NUM)); \
@@ -1268,7 +1282,7 @@ static void test_num_ssm_shr(bool show)
12681282
TEST_CASE_OPEN(TAG) \
12691283
{ \
12701284
num_p num = num_create_immed(ARG_OPEN NUM); \
1271-
num_p num_res = num_create(CLU_ARGS(N, N)); \
1285+
num_p num_res = num_create_rand(N); \
12721286
num_ssm_shr(num_res, 0, num, POS, N, BITS); \
12731287
assert(num_immed(num_res, ARG_OPEN RES)); \
12741288
assert(num_immed(num, ARG_OPEN NUM)); \
@@ -1339,7 +1353,7 @@ static void test_num_ssm_shl_mod(bool show)
13391353
TEST_CASE_OPEN(TAG) \
13401354
{ \
13411355
num_p num = num_create_immed(ARG_OPEN NUM); \
1342-
num_p num_aux = num_create(CLU_ARGS(6, 0)); \
1356+
num_p num_aux = num_create_rand(6); \
13431357
num_ssm_shl_mod(num_aux, num, 0, 3, BITS); \
13441358
num_free(num_aux); \
13451359
assert(num_immed(num, ARG_OPEN RES)); \
@@ -1418,7 +1432,7 @@ static void test_num_ssm_shr_mod(bool show)
14181432
TEST_CASE_OPEN(TAG) \
14191433
{ \
14201434
num_p num = num_create_immed(ARG_OPEN NUM); \
1421-
num_p num_aux = num_create(CLU_ARGS(6, 0)); \
1435+
num_p num_aux = num_create_rand(6); \
14221436
num_ssm_shr_mod(num_aux, num, 0, 3, BITS); \
14231437
num_free(num_aux); \
14241438
assert(num_immed(num, ARG_OPEN RES)); \
@@ -1496,24 +1510,24 @@ static void test_num_ssm_fft(bool show)
14961510
{
14971511
TEST_FN_OPEN
14981512

1499-
#define TEST_SSM_FFT(TAG, NUM, Nv, Kv, RES) \
1500-
{ \
1501-
TEST_CASE_OPEN(TAG) \
1502-
{ \
1503-
num_p num = num_create_immed(ARG_OPEN NUM); \
1504-
uint64_t Q = 64 * ((Nv) - 1) / (Kv); \
1505-
ssm_params_t p = (ssm_params_t) \
1506-
{ \
1507-
.K = (Kv), \
1508-
.Q = Q, \
1509-
.n = (Nv), \
1510-
}; \
1511-
num_p num_aux = num_create(CLU_ARGS(2 * (Nv), 0)); \
1512-
num_ssm_fft_fwd(num_aux, num, &p); \
1513-
num_free(num_aux); \
1514-
assert(num_immed(num, ARG_OPEN RES)); \
1515-
} \
1516-
TEST_CASE_CLOSE \
1513+
#define TEST_SSM_FFT(TAG, NUM, Nv, Kv, RES) \
1514+
{ \
1515+
TEST_CASE_OPEN(TAG) \
1516+
{ \
1517+
num_p num = num_create_immed(ARG_OPEN NUM); \
1518+
uint64_t Q = 64 * ((Nv) - 1) / (Kv); \
1519+
ssm_params_t p = (ssm_params_t) \
1520+
{ \
1521+
.K = (Kv), \
1522+
.Q = Q, \
1523+
.n = (Nv), \
1524+
}; \
1525+
num_p num_aux = num_create_rand(2 * (Nv)); \
1526+
num_ssm_fft_fwd(num_aux, num, &p); \
1527+
num_free(num_aux); \
1528+
assert(num_immed(num, ARG_OPEN RES)); \
1529+
} \
1530+
TEST_CASE_CLOSE \
15171531
}
15181532

15191533
TEST_SSM_FFT(1,
@@ -1550,15 +1564,15 @@ static void test_num_ssm_depad_wrap(bool show)
15501564
{
15511565
TEST_FN_OPEN
15521566

1553-
#define TEST_NUM_SSM_FFT(TAG, NUM_FFT, N, NUM_RES) \
1567+
#define TEST_NUM_SSM_DEPAD_WRAP(TAG, NUM_FFT, N, NUM_RES) \
15541568
{ \
15551569
TEST_CASE_OPEN(TAG) \
15561570
{ \
15571571
num_p num_fft = num_create_immed(ARG_OPEN NUM_FFT); \
15581572
ssm_params_t p = ssm_get_params_wrap(N); \
1559-
num_p num_aux_1 = num_create(CLU_ARGS(N, 0)); \
1560-
num_p num_aux_2 = num_create(CLU_ARGS(2 * (N), 0)); \
1561-
num_p num_res = num_create(CLU_ARGS(N, 0)); \
1573+
num_p num_aux_1 = num_create_rand(N); \
1574+
num_p num_aux_2 = num_create_rand(2 * (N)); \
1575+
num_p num_res = num_create_rand(N); \
15621576
num_ssm_depad_wrap(num_aux_1, num_aux_2, num_res, num_fft, &p, N); \
15631577
assert(num_immed(num_res, ARG_OPEN NUM_RES)); \
15641578
num_free(num_aux_1); \
@@ -1568,7 +1582,7 @@ static void test_num_ssm_depad_wrap(bool show)
15681582
TEST_CASE_CLOSE \
15691583
}
15701584

1571-
TEST_NUM_SSM_FFT(1,
1585+
TEST_NUM_SSM_DEPAD_WRAP(1,
15721586
(32,
15731587
0, 0, 0, 0,
15741588
0, 0, 0, 0,
@@ -1582,7 +1596,7 @@ static void test_num_ssm_depad_wrap(bool show)
15821596
9,
15831597
(1, 1)
15841598
)
1585-
TEST_NUM_SSM_FFT(2,
1599+
TEST_NUM_SSM_DEPAD_WRAP(2,
15861600
(32,
15871601
0, 0, 0, 1,
15881602
0, 0, 0, 1,
@@ -1596,6 +1610,37 @@ static void test_num_ssm_depad_wrap(bool show)
15961610
9,
15971611
(8, 1, 1, 1, 1, 1, 1, 1, 1)
15981612
)
1613+
TEST_NUM_SSM_DEPAD_WRAP(3,
1614+
(32,
1615+
0, 0, 0, 8,
1616+
0, 0, 0, 7,
1617+
0, 0, 0, 6,
1618+
0, 0, 0, 5,
1619+
0, 0, 0, 4,
1620+
0, 0, 0, 3,
1621+
0, 0, 0, 2,
1622+
0, 0, 0, 1
1623+
),
1624+
9,
1625+
(8, 8, 7, 6, 5, 4, 3, 2, 1)
1626+
)
1627+
TEST_NUM_SSM_DEPAD_WRAP(4,
1628+
(32,
1629+
0, 0, 1, 0,
1630+
0, 0, 0, 0,
1631+
0, 0, 0, 0,
1632+
0, 0, 0, 0,
1633+
0, 0, 0, 0,
1634+
0, 0, 0, 0,
1635+
0, 0, 0, 0,
1636+
0, 0, 0, 0
1637+
),
1638+
9,
1639+
(9, 1, 0, 0, 0, 0, 0, 0, 0, 0)
1640+
)
1641+
1642+
TEST_CASE_OPEN(6)
1643+
TEST_CASE_CLOSE
15991644

16001645
TEST_FN_CLOSE
16011646
}
@@ -1623,8 +1668,6 @@ static void test_num_mul_ssm_wrap(bool show)
16231668
{
16241669
TEST_FN_OPEN
16251670

1626-
show = true;
1627-
16281671
#define TEST_NUM_MUL_SSM_WRAP(TAG, NUM_1, NUM_2, N, RES) \
16291672
{ \
16301673
TEST_CASE_OPEN(TAG) \
@@ -2595,7 +2638,7 @@ static void test_fuzz_num_ssm_sh(bool show)
25952638
num_p num = num_create_rand(N); \
25962639
num->chunk[(N) - 1] = 0; \
25972640
num_p num_res = num_copy(num); \
2598-
num_p num_aux = num_create(CLU_ARGS(2 *(N), 0)); \
2641+
num_p num_aux = num_create_rand(2 *(N)); \
25992642
num_ssm_shl_mod(num_aux, num_res, 0, N, BITS); \
26002643
num_ssm_shr_mod(num_aux, num_res, 0, N, BITS); \
26012644
num_free(num_aux); \
@@ -2604,7 +2647,7 @@ static void test_fuzz_num_ssm_sh(bool show)
26042647
printf("\ncase: (n: %d) (bits: %d)", N, BITS); \
26052648
printf("\nentrie"); \
26062649
num_display_span_full("num", num, N, 1); \
2607-
printf("\nroundrip results in"); \
2650+
printf("\nround trip results in"); \
26082651
num_display_span_full("num_res", num_res, N, 1); \
26092652
assert(false); \
26102653
} \
@@ -2649,6 +2692,25 @@ static void test_fuzz_num_ssm_pad_wrap_round_trip(bool show)
26492692
{
26502693
TEST_FN_OPEN
26512694

2695+
TEST_CASE_OPEN(1)
2696+
{
2697+
uint64_t N = 9;
2698+
num_p num_in = num_create_immed(9, 1, 0, 0, 0, 0, 0, 0, 0, 0);
2699+
ssm_params_t p = ssm_get_params_wrap(N);
2700+
num_p num_middle = num_create_dirty(CLU_ARGS(p.n * p.K, 0));
2701+
num_ssm_pad(num_middle, num_in, &p);
2702+
num_p num_aux_1 = num_create_rand(N);
2703+
num_p num_aux_2 = num_create_rand(2 * (N));
2704+
num_p num_out = num_create_rand(N);
2705+
num_ssm_depad_wrap(num_aux_1, num_aux_2, num_out, num_middle, &p, N);
2706+
num_out->count = N;
2707+
assert(num_eq_dbg(num_in, num_out));
2708+
num_free(num_aux_1);
2709+
num_free(num_aux_2);
2710+
num_free(num_middle);
2711+
}
2712+
TEST_CASE_CLOSE
2713+
26522714
#define TEST_FUZZ_NUM_SSM_PAD_WRAP_ROUND_TRIP(TAG, N, RUNS) \
26532715
{ \
26542716
TEST_FUZZ_CASE_OPEN(TAG, RUNS) \
@@ -2658,9 +2720,9 @@ static void test_fuzz_num_ssm_pad_wrap_round_trip(bool show)
26582720
ssm_params_t p = ssm_get_params_wrap(N); \
26592721
num_p num_middle = num_create_dirty(CLU_ARGS(p.n * p.K, 0)); \
26602722
num_ssm_pad(num_middle, num_in, &p); \
2661-
num_p num_aux_1 = num_create_dirty(CLU_ARGS(N, 0)); \
2662-
num_p num_aux_2 = num_create_dirty(CLU_ARGS(2 * (N), 0)); \
2663-
num_p num_out = num_create_dirty(CLU_ARGS(N, 0)); \
2723+
num_p num_aux_1 = num_create_rand(N); \
2724+
num_p num_aux_2 = num_create_rand(2 * (N)); \
2725+
num_p num_out = num_create_rand(N); \
26642726
num_ssm_depad_wrap(num_aux_1, num_aux_2, num_out, num_middle, &p, N); \
26652727
num_out->count = N; \
26662728
assert(num_eq_dbg(num_in, num_out)); \
@@ -2671,9 +2733,9 @@ static void test_fuzz_num_ssm_pad_wrap_round_trip(bool show)
26712733
TEST_FUZZ_CASE_CLOSE \
26722734
}
26732735

2674-
TEST_FUZZ_NUM_SSM_PAD_WRAP_ROUND_TRIP(1, 9, 100);
2675-
TEST_FUZZ_NUM_SSM_PAD_WRAP_ROUND_TRIP(2, 17, 100);
2676-
// TEST_FUZZ_NUM_SSM_PAD_WRAP_ROUND_TRIP(3, 257, 100);
2736+
TEST_FUZZ_NUM_SSM_PAD_WRAP_ROUND_TRIP(2, 9, 100);
2737+
TEST_FUZZ_NUM_SSM_PAD_WRAP_ROUND_TRIP(3, 17, 100);
2738+
TEST_FUZZ_NUM_SSM_PAD_WRAP_ROUND_TRIP(4, 257, 100);
26772739

26782740
TEST_FN_CLOSE
26792741
}
@@ -2699,7 +2761,7 @@ static void test_fuzz_num_ssm_fft(bool show)
26992761
num_ssm_pad(num, num_0, &p); \
27002762
num_free(num_0); \
27012763
num_p num_res = num_copy(num); \
2702-
num_p num_aux = num_create(CLU_ARGS(2 * (Nv), 0)); \
2764+
num_p num_aux = num_create_rand(2 * (Nv)); \
27032765
num_ssm_fft_fwd(num_aux, num_res, &p); \
27042766
num_ssm_fft_inv(num_aux, num_res, &p); \
27052767
num_free(num_aux); \

0 commit comments

Comments
 (0)