Skip to content

Commit 70e4060

Browse files
andrea-caforionasahlpa
authored andcommitted
[crypto] ML-DSA-87: Polynomial arithmetic (mul, add, sub)
Pointwise multiplication (Montgomery) and pointwise modular addition/subtraction are the fundamental polynomial transformations in ML-DSA. Signed-off-by: Andrea Caforio <andrea.caforio@lowrisc.org>
1 parent 3e05c56 commit 70e4060

File tree

9 files changed

+441
-0
lines changed

9 files changed

+441
-0
lines changed

sw/otbn/crypto/mldsa87/BUILD

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,3 +12,10 @@ otbn_library(
1212
"mldsa87_ntt.s",
1313
],
1414
)
15+
16+
otbn_library(
17+
name = "mldsa87_arith",
18+
srcs = [
19+
"mldsa87_arith.s",
20+
],
21+
)
Lines changed: 160 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,160 @@
1+
/* Copyright lowRISC contributors (OpenTitan project). */
2+
/* Licensed under the Apache License, Version 2.0, see LICENSE for details. */
3+
/* SPDX-License-Identifier: Apache-2.0 */
4+
5+
/* Polynomial arithmetic over Z_q[X] / (X^256 + 1). */
6+
7+
.globl poly_mul
8+
.globl poly_add
9+
.globl poly_sub
10+
11+
.text
12+
13+
/**
14+
* Pointwise Montgomery multiplication of two polynomials a(X) and b(X) over
15+
* Z_q[X] / (X^256 + 1).
16+
*
17+
* Both a and b are assumed to be stored in 1024-byte (256 32-bit coefficient
18+
* slots) regions in DMEM. Depending on whether {x2, x3} == x4, this routine is
19+
* either in-place or not.
20+
*
21+
* The caller must ensure that the modulus q and the corresponding Montgomery
22+
* multiplication constant have been correctly prepared (see the `MOD` register
23+
* and usage of the `bn.{add,sub,mul}vm` instructions) prior to invoking this
24+
* routine.
25+
*
26+
* CAUTION: The coefficients of a(X) and b(X) are not mapped into the
27+
* Montgomery space nor are the output coefficients converted back. It is the
28+
* responsibility of the caller to appropriately adjust the input/output
29+
* polynomials. For example, if two coefficients x and y are given as is, then
30+
* the resulting Montgomery mulplication will result in x * y * R^-1 mod q,
31+
* where R = 2^32.
32+
*
33+
* @param[in] x2: DMEM address of the polynomial a(X).
34+
* @param[in] x3: DMEM address of the polynomial b(X).
35+
* @param[in] x4: DMEM address of the result a(X) * b(X) * R^-1 mod q.
36+
*/
37+
poly_mul:
38+
/* Push clobbered general-purpose registers onto the stack. */
39+
.irp reg, x2, x3, x4, x5
40+
sw \reg, 0(x31)
41+
addi x31, x31, 4
42+
.endr
43+
44+
/* WDR pointer for the coefficients of b(X). */
45+
addi x5, x0, 1
46+
47+
/* Each iteration calculates the modular addition of 8 coefficients. */
48+
loopi 32, 5
49+
/* Load 8 coefficients of a(X) and b(X) into w0 and w1. */
50+
bn.lid x0, 0(x2++)
51+
bn.lid x5, 0(x3++)
52+
53+
/* Execute the vectorized Montgomery multiplication. */
54+
bn.mulvm.8S w0, w0, w1
55+
bn.addvm.8S w0, w0, w31 /* cond sub */
56+
57+
/* Store the result back to DMEM. */
58+
bn.sid x0, 0(x4++)
59+
/* End of loop */
60+
61+
/* Restore clobbered general-purpose registers. */
62+
.irp reg, x5, x4, x3, x2
63+
addi x31, x31, -4
64+
lw \reg, 0(x31)
65+
.endr
66+
67+
ret
68+
69+
/**
70+
* Modular addition of two polynomials a(X) and b(X) over Z_q[X] / (X^256 + 1).
71+
*
72+
* Both a and b are assumed to be stored in 1024-byte (256 32-bit coefficient
73+
* slots) regions in DMEM. Depending on whether {x2, x3} == x4, this routine is
74+
* either in-place or not.
75+
*
76+
* The caller must ensure that the modulus q has been correctly prepared (see
77+
* the `MOD` register and usage of the `bn.{add,sub,mul}vm` instructions) prior
78+
* to invoking this routine.
79+
*
80+
* @param[in] x2: DMEM address of the polynomial a(X).
81+
* @param[in] x3: DMEM address of the polynomial b(X).
82+
* @param[in] x4: DMEM address of the result a(X) + b(X) mod q.
83+
*/
84+
poly_add:
85+
/* Push clobbered general-purpose registers onto the stack. */
86+
.irp reg, x2, x3, x4, x5
87+
sw \reg, 0(x31)
88+
addi x31, x31, 4
89+
.endr
90+
91+
/* WDR pointer for the coefficients of b(X). */
92+
addi x5, x0, 1
93+
94+
/* Each iteration calculates the modular addition of 8 coefficients. */
95+
loopi 32, 4
96+
/* Load 8 coefficients of a(X) and b(X) into w0 and w1. */
97+
bn.lid x0, 0(x2++)
98+
bn.lid x5, 0(x3++)
99+
100+
/* Execute the vectorized modular addition. */
101+
bn.addvm.8S w0, w0, w1
102+
103+
/* Store the result back to DMEM. */
104+
bn.sid x0, 0(x4++)
105+
/* End of loop */
106+
107+
/* Restore clobbered general-purpose registers. */
108+
.irp reg, x5, x4, x3, x2
109+
addi x31, x31, -4
110+
lw \reg, 0(x31)
111+
.endr
112+
113+
ret
114+
115+
/**
116+
* Modular subtraction of two polynomials a(X) and b(X) over
117+
* Z_q[X] / (X^256 + 1).
118+
*
119+
* Both a and b are assumed to be stored in 1024-byte (256 32-bit coefficient
120+
* slots) regions in DMEM. Depending on whether {x2, x3} == x4, this routine is
121+
* either in-place or not.
122+
*
123+
* The caller must ensure that the modulus q has been correctly prepared (see
124+
* the `MOD` register and usage of the `bn.{add,sub,mul}vm` instructions) prior
125+
* to invoking this routine.
126+
*
127+
* @param[in] x2: DMEM address of the polynomial a(X).
128+
* @param[in] x3: DMEM address of the polynomial b(X).
129+
* @param[in] x4: DMEM address of the result a(X) - b(X) mod q.
130+
*/
131+
poly_sub:
132+
/* Push clobbered general-purpose registers onto the stack. */
133+
.irp reg, x2, x3, x4, x5
134+
sw \reg, 0(x31)
135+
addi x31, x31, 4
136+
.endr
137+
138+
/* WDR pointer for the coefficients of b(X). */
139+
addi x5, x0, 1
140+
141+
/* Each iteration calculates the modular addition of 8 coefficients. */
142+
loopi 32, 4
143+
/* Load 8 coefficients of a(X) and b(X) into w0 and w1. */
144+
bn.lid x0, 0(x2++)
145+
bn.lid x5, 0(x3++)
146+
147+
/* Execute the vectorized modular subtraction. */
148+
bn.subvm.8S w0, w0, w1
149+
150+
/* Store the result back to DMEM. */
151+
bn.sid x0, 0(x4++)
152+
/* End of loop */
153+
154+
/* Restore clobbered general-purpose registers. */
155+
.irp reg, x5, x4, x3, x2
156+
addi x31, x31, -4
157+
lw \reg, 0(x31)
158+
.endr
159+
160+
ret

sw/otbn/crypto/mldsa87/tests/BUILD

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ package(default_visibility = ["//visibility:public"])
88

99
mldsa87_srcs = [
1010
"//sw/otbn/crypto/mldsa87:mldsa87_ntt.s",
11+
"//sw/otbn/crypto/mldsa87:mldsa87_arith.s",
1112
]
1213

1314
# Naming convention for the unit tests: Test, *.s and *.hjson files
@@ -16,6 +17,9 @@ mldsa87_unit_tests = [
1617
"mldsa87_ntt_test",
1718
"mldsa87_intt_test",
1819
"mldsa87_ntt_intt_test",
20+
"mldsa87_poly_mul_test",
21+
"mldsa87_poly_add_test",
22+
"mldsa87_poly_sub_test",
1923
]
2024

2125
[
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
// Copyright lowRISC contributors (OpenTitan project).
2+
// Licensed under the Apache License, Version 2.0, see LICENSE for details.
3+
// SPDX-License-Identifier: Apache-2.0
4+
5+
// Check that x + x mod q = 2 * x (base case) and
6+
// check that q - 1 + x mod q = x (overflow)
7+
// for x in [1, 256] and q = 8380417.
8+
9+
{
10+
"entrypoint": "main",
11+
"input": {
12+
"dmem": {
13+
// [1, 2, ..., 256]
14+
"_poly_add_a_base": "0x00000100000000ff000000fe000000fd000000fc000000fb000000fa000000f9000000f8000000f7000000f6000000f5000000f4000000f3000000f2000000f1000000f0000000ef000000ee000000ed000000ec000000eb000000ea000000e9000000e8000000e7000000e6000000e5000000e4000000e3000000e2000000e1000000e0000000df000000de000000dd000000dc000000db000000da000000d9000000d8000000d7000000d6000000d5000000d4000000d3000000d2000000d1000000d0000000cf000000ce000000cd000000cc000000cb000000ca000000c9000000c8000000c7000000c6000000c5000000c4000000c3000000c2000000c1000000c0000000bf000000be000000bd000000bc000000bb000000ba000000b9000000b8000000b7000000b6000000b5000000b4000000b3000000b2000000b1000000b0000000af000000ae000000ad000000ac000000ab000000aa000000a9000000a8000000a7000000a6000000a5000000a4000000a3000000a2000000a1000000a00000009f0000009e0000009d0000009c0000009b0000009a000000990000009800000097000000960000009500000094000000930000009200000091000000900000008f0000008e0000008d0000008c0000008b0000008a000000890000008800000087000000860000008500000084000000830000008200000081000000800000007f0000007e0000007d0000007c0000007b0000007a000000790000007800000077000000760000007500000074000000730000007200000071000000700000006f0000006e0000006d0000006c0000006b0000006a000000690000006800000067000000660000006500000064000000630000006200000061000000600000005f0000005e0000005d0000005c0000005b0000005a000000590000005800000057000000560000005500000054000000530000005200000051000000500000004f0000004e0000004d0000004c0000004b0000004a000000490000004800000047000000460000004500000044000000430000004200000041000000400000003f0000003e0000003d0000003c0000003b0000003a000000390000003800000037000000360000003500000034000000330000003200000031000000300000002f0000002e0000002d0000002c0000002b0000002a000000290000002800000027000000260000002500000024000000230000002200000021000000200000001f0000001e0000001d0000001c0000001b0000001a000000190000001800000017000000160000001500000014000000130000001200000011000000100000000f0000000e0000000d0000000c0000000b0000000a000000090000000800000007000000060000000500000004000000030000000200000001",
15+
// [1, 2, ..., 256]
16+
"_poly_add_b_base": "0x00000100000000ff000000fe000000fd000000fc000000fb000000fa000000f9000000f8000000f7000000f6000000f5000000f4000000f3000000f2000000f1000000f0000000ef000000ee000000ed000000ec000000eb000000ea000000e9000000e8000000e7000000e6000000e5000000e4000000e3000000e2000000e1000000e0000000df000000de000000dd000000dc000000db000000da000000d9000000d8000000d7000000d6000000d5000000d4000000d3000000d2000000d1000000d0000000cf000000ce000000cd000000cc000000cb000000ca000000c9000000c8000000c7000000c6000000c5000000c4000000c3000000c2000000c1000000c0000000bf000000be000000bd000000bc000000bb000000ba000000b9000000b8000000b7000000b6000000b5000000b4000000b3000000b2000000b1000000b0000000af000000ae000000ad000000ac000000ab000000aa000000a9000000a8000000a7000000a6000000a5000000a4000000a3000000a2000000a1000000a00000009f0000009e0000009d0000009c0000009b0000009a000000990000009800000097000000960000009500000094000000930000009200000091000000900000008f0000008e0000008d0000008c0000008b0000008a000000890000008800000087000000860000008500000084000000830000008200000081000000800000007f0000007e0000007d0000007c0000007b0000007a000000790000007800000077000000760000007500000074000000730000007200000071000000700000006f0000006e0000006d0000006c0000006b0000006a000000690000006800000067000000660000006500000064000000630000006200000061000000600000005f0000005e0000005d0000005c0000005b0000005a000000590000005800000057000000560000005500000054000000530000005200000051000000500000004f0000004e0000004d0000004c0000004b0000004a000000490000004800000047000000460000004500000044000000430000004200000041000000400000003f0000003e0000003d0000003c0000003b0000003a000000390000003800000037000000360000003500000034000000330000003200000031000000300000002f0000002e0000002d0000002c0000002b0000002a000000290000002800000027000000260000002500000024000000230000002200000021000000200000001f0000001e0000001d0000001c0000001b0000001a000000190000001800000017000000160000001500000014000000130000001200000011000000100000000f0000000e0000000d0000000c0000000b0000000a000000090000000800000007000000060000000500000004000000030000000200000001",
17+
18+
// [1, 2, ..., 256]
19+
"_poly_add_a_overflow": "0x00000100000000ff000000fe000000fd000000fc000000fb000000fa000000f9000000f8000000f7000000f6000000f5000000f4000000f3000000f2000000f1000000f0000000ef000000ee000000ed000000ec000000eb000000ea000000e9000000e8000000e7000000e6000000e5000000e4000000e3000000e2000000e1000000e0000000df000000de000000dd000000dc000000db000000da000000d9000000d8000000d7000000d6000000d5000000d4000000d3000000d2000000d1000000d0000000cf000000ce000000cd000000cc000000cb000000ca000000c9000000c8000000c7000000c6000000c5000000c4000000c3000000c2000000c1000000c0000000bf000000be000000bd000000bc000000bb000000ba000000b9000000b8000000b7000000b6000000b5000000b4000000b3000000b2000000b1000000b0000000af000000ae000000ad000000ac000000ab000000aa000000a9000000a8000000a7000000a6000000a5000000a4000000a3000000a2000000a1000000a00000009f0000009e0000009d0000009c0000009b0000009a000000990000009800000097000000960000009500000094000000930000009200000091000000900000008f0000008e0000008d0000008c0000008b0000008a000000890000008800000087000000860000008500000084000000830000008200000081000000800000007f0000007e0000007d0000007c0000007b0000007a000000790000007800000077000000760000007500000074000000730000007200000071000000700000006f0000006e0000006d0000006c0000006b0000006a000000690000006800000067000000660000006500000064000000630000006200000061000000600000005f0000005e0000005d0000005c0000005b0000005a000000590000005800000057000000560000005500000054000000530000005200000051000000500000004f0000004e0000004d0000004c0000004b0000004a000000490000004800000047000000460000004500000044000000430000004200000041000000400000003f0000003e0000003d0000003c0000003b0000003a000000390000003800000037000000360000003500000034000000330000003200000031000000300000002f0000002e0000002d0000002c0000002b0000002a000000290000002800000027000000260000002500000024000000230000002200000021000000200000001f0000001e0000001d0000001c0000001b0000001a000000190000001800000017000000160000001500000014000000130000001200000011000000100000000f0000000e0000000d0000000c0000000b0000000a000000090000000800000007000000060000000500000004000000030000000200000001",
20+
// [q-1, q-1, ..., q-1]
21+
"_poly_add_b_overflow": "0x007fe000007fe000007fe000007fe000007fe000007fe000007fe000007fe000007fe000007fe000007fe000007fe000007fe000007fe000007fe000007fe000007fe000007fe000007fe000007fe000007fe000007fe000007fe000007fe000007fe000007fe000007fe000007fe000007fe000007fe000007fe000007fe000007fe000007fe000007fe000007fe000007fe000007fe000007fe000007fe000007fe000007fe000007fe000007fe000007fe000007fe000007fe000007fe000007fe000007fe000007fe000007fe000007fe000007fe000007fe000007fe000007fe000007fe000007fe000007fe000007fe000007fe000007fe000007fe000007fe000007fe000007fe000007fe000007fe000007fe000007fe000007fe000007fe000007fe000007fe000007fe000007fe000007fe000007fe000007fe000007fe000007fe000007fe000007fe000007fe000007fe000007fe000007fe000007fe000007fe000007fe000007fe000007fe000007fe000007fe000007fe000007fe000007fe000007fe000007fe000007fe000007fe000007fe000007fe000007fe000007fe000007fe000007fe000007fe000007fe000007fe000007fe000007fe000007fe000007fe000007fe000007fe000007fe000007fe000007fe000007fe000007fe000007fe000007fe000007fe000007fe000007fe000007fe000007fe000007fe000007fe000007fe000007fe000007fe000007fe000007fe000007fe000007fe000007fe000007fe000007fe000007fe000007fe000007fe000007fe000007fe000007fe000007fe000007fe000007fe000007fe000007fe000007fe000007fe000007fe000007fe000007fe000007fe000007fe000007fe000007fe000007fe000007fe000007fe000007fe000007fe000007fe000007fe000007fe000007fe000007fe000007fe000007fe000007fe000007fe000007fe000007fe000007fe000007fe000007fe000007fe000007fe000007fe000007fe000007fe000007fe000007fe000007fe000007fe000007fe000007fe000007fe000007fe000007fe000007fe000007fe000007fe000007fe000007fe000007fe000007fe000007fe000007fe000007fe000007fe000007fe000007fe000007fe000007fe000007fe000007fe000007fe000007fe000007fe000007fe000007fe000007fe000007fe000007fe000007fe000007fe000007fe000007fe000007fe000007fe000007fe000007fe000007fe000007fe000007fe000007fe000007fe000007fe000007fe000007fe000007fe000007fe000007fe000007fe000007fe000007fe000007fe000007fe000007fe000007fe000007fe000007fe000007fe000007fe000007fe000007fe000007fe000007fe000007fe000007fe000007fe000"
22+
}
23+
},
24+
"output": {
25+
"dmem": {
26+
// [2, 4, ..., 512]
27+
"_poly_add_c_base": "0x00000200000001fe000001fc000001fa000001f8000001f6000001f4000001f2000001f0000001ee000001ec000001ea000001e8000001e6000001e4000001e2000001e0000001de000001dc000001da000001d8000001d6000001d4000001d2000001d0000001ce000001cc000001ca000001c8000001c6000001c4000001c2000001c0000001be000001bc000001ba000001b8000001b6000001b4000001b2000001b0000001ae000001ac000001aa000001a8000001a6000001a4000001a2000001a00000019e0000019c0000019a00000198000001960000019400000192000001900000018e0000018c0000018a00000188000001860000018400000182000001800000017e0000017c0000017a00000178000001760000017400000172000001700000016e0000016c0000016a00000168000001660000016400000162000001600000015e0000015c0000015a00000158000001560000015400000152000001500000014e0000014c0000014a00000148000001460000014400000142000001400000013e0000013c0000013a00000138000001360000013400000132000001300000012e0000012c0000012a00000128000001260000012400000122000001200000011e0000011c0000011a00000118000001160000011400000112000001100000010e0000010c0000010a0000010800000106000001040000010200000100000000fe000000fc000000fa000000f8000000f6000000f4000000f2000000f0000000ee000000ec000000ea000000e8000000e6000000e4000000e2000000e0000000de000000dc000000da000000d8000000d6000000d4000000d2000000d0000000ce000000cc000000ca000000c8000000c6000000c4000000c2000000c0000000be000000bc000000ba000000b8000000b6000000b4000000b2000000b0000000ae000000ac000000aa000000a8000000a6000000a4000000a2000000a00000009e0000009c0000009a00000098000000960000009400000092000000900000008e0000008c0000008a00000088000000860000008400000082000000800000007e0000007c0000007a00000078000000760000007400000072000000700000006e0000006c0000006a00000068000000660000006400000062000000600000005e0000005c0000005a00000058000000560000005400000052000000500000004e0000004c0000004a00000048000000460000004400000042000000400000003e0000003c0000003a00000038000000360000003400000032000000300000002e0000002c0000002a00000028000000260000002400000022000000200000001e0000001c0000001a00000018000000160000001400000012000000100000000e0000000c0000000a00000008000000060000000400000002",
28+
29+
// [0, 1, ..., 255]
30+
"_poly_add_c_overflow": "0x000000ff000000fe000000fd000000fc000000fb000000fa000000f9000000f8000000f7000000f6000000f5000000f4000000f3000000f2000000f1000000f0000000ef000000ee000000ed000000ec000000eb000000ea000000e9000000e8000000e7000000e6000000e5000000e4000000e3000000e2000000e1000000e0000000df000000de000000dd000000dc000000db000000da000000d9000000d8000000d7000000d6000000d5000000d4000000d3000000d2000000d1000000d0000000cf000000ce000000cd000000cc000000cb000000ca000000c9000000c8000000c7000000c6000000c5000000c4000000c3000000c2000000c1000000c0000000bf000000be000000bd000000bc000000bb000000ba000000b9000000b8000000b7000000b6000000b5000000b4000000b3000000b2000000b1000000b0000000af000000ae000000ad000000ac000000ab000000aa000000a9000000a8000000a7000000a6000000a5000000a4000000a3000000a2000000a1000000a00000009f0000009e0000009d0000009c0000009b0000009a000000990000009800000097000000960000009500000094000000930000009200000091000000900000008f0000008e0000008d0000008c0000008b0000008a000000890000008800000087000000860000008500000084000000830000008200000081000000800000007f0000007e0000007d0000007c0000007b0000007a000000790000007800000077000000760000007500000074000000730000007200000071000000700000006f0000006e0000006d0000006c0000006b0000006a000000690000006800000067000000660000006500000064000000630000006200000061000000600000005f0000005e0000005d0000005c0000005b0000005a000000590000005800000057000000560000005500000054000000530000005200000051000000500000004f0000004e0000004d0000004c0000004b0000004a000000490000004800000047000000460000004500000044000000430000004200000041000000400000003f0000003e0000003d0000003c0000003b0000003a000000390000003800000037000000360000003500000034000000330000003200000031000000300000002f0000002e0000002d0000002c0000002b0000002a000000290000002800000027000000260000002500000024000000230000002200000021000000200000001f0000001e0000001d0000001c0000001b0000001a000000190000001800000017000000160000001500000014000000130000001200000011000000100000000f0000000e0000000d0000000c0000000b0000000a00000009000000080000000700000006000000050000000400000003000000020000000100000000"
31+
}
32+
}
33+
}
Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
/* Copyright lowRISC contributors (OpenTitan project). */
2+
/* Licensed under the Apache License, Version 2.0, see LICENSE for details. */
3+
/* SPDX-License-Identifier: Apache-2.0 */
4+
5+
/* Test that the polynomial modular addition is correct. */
6+
7+
.section .text.start
8+
9+
main:
10+
/* Setup stack pointer and all-zero WDR. */
11+
la x31, _stack
12+
bn.xor w31, w31, w31
13+
14+
/* Load the parameters into the MOD WSR. */
15+
la x2, _params
16+
bn.lid x0, 0(x2)
17+
bn.wsrw MOD, w0
18+
19+
la x2, _poly_add_a_base
20+
la x3, _poly_add_b_base
21+
la x4, _poly_add_c_base
22+
jal x1, poly_add
23+
24+
la x2, _poly_add_a_overflow
25+
la x3, _poly_add_b_overflow
26+
la x4, _poly_add_c_overflow
27+
jal x1, poly_add
28+
29+
ecall
30+
31+
.data
32+
.balign 32
33+
34+
/*
35+
* q = 8380417 = 2^23 - 2^13 + 1 (ML-DSA modulus)
36+
* mu = -q^-1 mod R (Montgomery constant)
37+
* f = 256^-1 * R mod q (INTT divisor in Montgomery domain)
38+
*/
39+
_params:
40+
.word 0x007fe001 /* q */
41+
.word 0xfc7fdfff /* mu */
42+
.word 0x00003ffe /* f */
43+
.word 0x00000000
44+
.word 0x00000000
45+
.word 0x00000000
46+
.word 0x00000000
47+
.word 0x00000000
48+
49+
_poly_add_a_base:
50+
.zero 1024
51+
_poly_add_b_base:
52+
.zero 1024
53+
_poly_add_c_base:
54+
.zero 1024
55+
56+
_poly_add_a_overflow:
57+
.zero 1024
58+
_poly_add_b_overflow:
59+
.zero 1024
60+
_poly_add_c_overflow:
61+
.zero 1024
62+
63+
_stack:
64+
.zero 4

0 commit comments

Comments
 (0)