Let us walk on the 3-isogeny graph
Loading...
Searching...
No Matches
AsmMontRedc Namespace Reference

Functions

 rotate (l, x)
 push ()
 pop ()
 MontRedcAdd (plimbs)
 PrintMontLoop (plimbs)
 PrintMult (plimbs)
 main (argv)

Variables

 sefOfLimbs = set()
int printOut = 0

Function Documentation

◆ main()

main ( argv)

Definition at line 245 of file AsmMontRedc.py.

245def main(argv):
246 global printOut
247 if(len(argv) < 2):
248 print(
249 "\nplease specify the prime and type of execution [1 = only printing functions out, 0 = print full assembly]\n")
250 sys.exit()
251 else:
252 printOut = int(argv[1])
253 prime = argv[0]
254 length = 0
255
256 if(prime=="2047k221"):
257 length = 2048
258
259 elif(prime=="4095k256"):
260 length = 4096
261
262 elif(prime=="5119k234"):
263 length = 5120
264
265 elif(prime=="6143k256"):
266 length = 6144
267
268 elif(prime=="8191k332"):
269 length = 8192
270
271 elif(prime=="9215k384"):
272 length = 9216
273
274 else:
275 print("\nError : no prime available for this input\n")
276 sys.exit()
277
278
279 S = ".intel_syntax noprefix\n\n"
280 S = S + ".section .rodata\n\n"
281 S = S + ".section .text\n\n"
282
283 print(S)
284
285 plimbs = length//64
286
287 # S = PrintMult(plimbs)
288 # S = MontRedcAdd(plimbs)
289 S = PrintMontLoop(plimbs)
290
291 # S = ".global fp_mult_"+ str(plimbs) + "x" + str(plimbs) + "\n"
292 # S = S + "fp_mult_"+ str(plimbs) + "x" + str(plimbs) + ":\n"
293 # S = S + " mult_"+ str(plimbs) + "x" + str(plimbs) + "\n"
294 # S = S + " ret\n"
295
296 print(S)
297
298 print("\n")
299
int main(void)
Definition checkct.c:52
end if

References if, main(), and PrintMontLoop().

Here is the call graph for this function:

◆ MontRedcAdd()

MontRedcAdd ( plimbs)

Definition at line 33 of file AsmMontRedc.py.

33def MontRedcAdd(plimbs):
34
35
36 # registers reserved rdi, rsi, rdx
37 # rax, rbx = rcx, r8
38 registers = ["r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"]
39 # if(plimbs > len(registers)):
40 # print("ERROR: Index out range")
41 # exit()
42 state = registers[:plimbs]
43 #state = registers
44
45 S = ""
46 # S = ".intel_syntax noprefix\n\n"
47 # S = S + ".section .rodata\n\n"
48 # S = S + ".section .text\n\n"
49
50 # S = S + ".macro p_times_w\n"
51 # S = S + "mult_"+ str(plimbs) + "x" + str(plimbs) + ":\n"
52
53 S = S + ".global u_i_times_p\nu_i_times_p:\n"
54
55 S = S + push()
56
57 S = S + " lea rdx, [rdi + 0] ]\n"
58# intro
59 S = S + " mov rax, [rsi + 0]\n"
60 S = S + " add rax, [rdx + 0]\n"
61 S = S + " mov [rdi + 0], rax\n"
62# loop
63 S = S + " .set k, 1\n"
64 S = S + " .rept " + str(plimbs) + "\n"
65 S = S + " mov rax, [rsi + 8*k]\n"
66 S = S + " adc rax, [rdx + 8*k]\n"
67 S = S + " mov [rdi + 8*k], rax\n"
68 S = S + " .set k, k+1\n"
69 S = S + " .endr\n"
70# outro
71 S = S + " mov rax, [rdi + 8*" + str(plimbs+1) + "]\n"
72 S = S + " adc rax, 0\n"
73 S = S + " mov [rdi + 8*" + str(plimbs+1) + "], rax\n"
74 S = S + pop()
75 S = S + " ret\n"
76
77 return S
78
79

References pop(), and push().

Here is the call graph for this function:

◆ pop()

pop ( )

Definition at line 24 of file AsmMontRedc.py.

24def pop():
25 # S = "# -------------------\n"
26 S = "# pop\n"
27 # S = S + " pop r15\n pop r14\n pop r13\n pop r12\n pop rsi\n pop rdi\n pop rbp\n pop rbx\n\n"
28 S = S + " pop r15\n pop r14\n pop r13\n pop r12\n pop rsi\n pop rbp\n pop rbx\n\n"
29 # S = S + " pop rsi\n pop rdi\n pop rdx\n\n"
30 return S
31
32

Referenced by MontRedcAdd(), and PrintMult().

Here is the caller graph for this function:

◆ PrintMontLoop()

PrintMontLoop ( plimbs)

Definition at line 126 of file AsmMontRedc.py.

126def PrintMontLoop(plimbs):
127
128 S = ""
129
130 # S = S + "push rbp\n"
131 # S = S + "mov rbp, rsp\n"
132 # # allocate stack
133 # S = S + "sub rsp, " + str(plimbs*8) + "\n"
134 S = S + "lea rcx, [rsi]\n"
135 S = S + "mov r8, secsidh_internal_2047k221_p@GOTPCREL[rip]\n"
136
137
138 for k in range(0,plimbs-1):
139 S = S + "##########################\n"
140 S = S + "xor r11, r11\n\n"
141 S = S + "mov rdx, [rcx + 8*" + str(k) + "]\n"
142
143 for j in range(0,plimbs):
144 # high, low, p[i], A[i]
145 S = S + "mulx r9, r10, [r8 + 8*" + str(j) + "]\n"
146 # add low to "high - 1"
147 S = S + "adcx r10, r11\n"
148 # save new high
149 S = S + "mov r11, r9\n"
150 # S = S + "mov [rdi + 8*" + str(j) + "], r10\n\n"
151 #S = S + "mov [rsi + 8*" + str(j) + " ], r10\n\n"
152
153 S = S + "adox r10, [rcx + 8*" + str(j) + " + 8*" + str(k) + "]\n"
154 S = S + "mov [rcx + 8*" + str(j) + " + 8*" + str(k) + "], r10\n\n"
155 # S = S + "mov [rbp - 256 + 8*" + str(j) + " ], r10\n\n"
156
157 S = S + "adox r11, [rcx + 8*" + str(plimbs) + " + 8*" + str(k) + "]\n"
158 S = S + "mov [rcx + 8*" + str(plimbs) + " + 8*" + str(k) + "], r11\n"
159
160 S = S + "##########################\n"
161 S = S + "##########################\n"
162
163 S = S + "xor r11, r11\n\n"
164 S = S + "mov rdx, [rcx + 8*" + str(plimbs-1) + "]\n"
165 # high, low, p[i], A[i]
166 S = S + "mulx r9, r10, [r8]\n"
167 # add low to "high - 1"
168 S = S + "adcx r10, r11\n"
169 # save new high
170 S = S + "mov r11, r9\n"
171 # S = S + "mov [rdi + 8*" + str(j) + "], r10\n\n"
172 #S = S + "mov [rsi + 8*" + str(j) + " ], r10\n\n"
173 S = S + "adox r10, [rcx + 8*" + str(plimbs-1) + "]\n"
174
175 S = S + "##########################\n"
176
177 for j in range(1,plimbs):
178 # high, low, p[i], A[i]
179 S = S + "mulx r9, r10, [r8 + 8*" + str(j) + "]\n"
180 # add low to "high - 1"
181 S = S + "adcx r10, r11\n"
182 # save new high
183 S = S + "mov r11, r9\n"
184 # S = S + "mov [rdi + 8*" + str(j) + "], r10\n\n"
185 #S = S + "mov [rsi + 8*" + str(j) + " ], r10\n\n"
186
187 S = S + "adox r10, [rcx + 8*" + str(j) + " + 8*" + str(plimbs-1) + "]\n"
188 S = S + "mov [rdi + 8*" + str(j-1) + "], r10\n\n"
189 # S = S + "mov [rbp - 256 + 8*" + str(j) + " ], r10\n\n"
190
191 S = S + "adox r11, [rcx + 8*" + str(plimbs) + " + 8*" + str(plimbs-1) + "]\n"
192 S = S + "mov [rdi + 8*" + str(plimbs-1) + "], r11\n"
193
194
195
196 return S
197

Referenced by main().

Here is the caller graph for this function:

◆ PrintMult()

PrintMult ( plimbs)

Definition at line 198 of file AsmMontRedc.py.

198def PrintMult(plimbs):
199
200
201 # registers reserved rdi, rsi, rdx
202 # rax, rbx = rcx, r8
203 registers = ["r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"]
204 # if(plimbs > len(registers)):
205 # print("ERROR: Index out range")
206 # exit()
207 state = registers[:plimbs]
208 #state = registers
209
210 S = ""
211 # S = ".intel_syntax noprefix\n\n"
212 # S = S + ".section .rodata\n\n"
213 # S = S + ".section .text\n\n"
214
215 # S = S + ".macro p_times_w\n"
216 # S = S + "mult_"+ str(plimbs) + "x" + str(plimbs) + ":\n"
217
218 S = S + ".global p_times_w\np_times_w:\n"
219
220 S = S + push()
221
222 S = S + " mulx " + state[0] + ", rcx, [rsi + 0*8]\n"
223 S = S + " mov [rdi + 0*8], rcx\n"
224 for j in range(1,plimbs):
225 if(j == plimbs-1):
226 S = S + " mulx " + state[j%2] + ", rax, [rsi + " + str(j) + "*8]\n"
227 S = S + " adc " + state[(j+1)%2] + ", rax\n"
228 S = S + " adc " + state[j%2] + ", 0\n"
229 S = S + " mov [rdi + " + str(j) + "*8], " + state[(j+1)%2] + "\n"
230 S = S + " mov [rdi + " + str(j+1) + "*8], " + state[j%2] + "\n"
231 elif(j == 1):
232 S = S + " mulx " + state[j%2] + ", rax, [rsi + " + str(j) + "*8]\n"
233 S = S + " add " + state[(j+1)%2] + ", rax\n"
234 S = S + " mov [rdi + " + str(j) + "*8], " + state[(j+1)%2] + "\n"
235 else:
236 S = S + " mulx " + state[j%2] + ", rax, [rsi + " + str(j) + "*8]\n"
237 S = S + " adc " + state[(j+1)%2] + ", rax\n"
238 S = S + " mov [rdi + " + str(j) + "*8], " + state[(j+1)%2] + "\n"
239
240 S = S + pop()
241 return S
242
243#//+++++++++++++++ Main ++++++++++++++++++//
244

References if, pop(), and push().

Here is the call graph for this function:

◆ push()

push ( )

Definition at line 16 of file AsmMontRedc.py.

16def push():
17 # S = "# -------------------\n"
18 S = "# push\n"
19 # S = S + " push rbx\n push rbp\n push rdi\n push rsi\n push r12\n push r13\n push r14\n push r15\n\n"
20 S = S + " push rbx\n push rbp\n push rsi\n push r12\n push r13\n push r14\n push r15\n\n"
21 # S = S + " push rdx\n push rdi\n push rsi\n\n"
22 return S
23

Referenced by MontRedcAdd(), and PrintMult().

Here is the caller graph for this function:

◆ rotate()

rotate ( l,
x )

Definition at line 13 of file AsmMontRedc.py.

13def rotate(l, x):
14 return l[-x:] + l[:-x]
15

Variable Documentation

◆ printOut

int printOut = 0

Definition at line 11 of file AsmMontRedc.py.

◆ sefOfLimbs

sefOfLimbs = set()

Definition at line 10 of file AsmMontRedc.py.