78def PrintMult(plimbs):
79
80
81
82
83 registers = ["r8d", "r9d", "r10d", "r11d", "r12d", "r13d", "r14d", "r15d"]
84 registers64 = ["r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"]
85
86
87
88
89 state = registers[:plimbs]
90 state64 = registers64[:plimbs]
91
92 S = ""
93
94
95
96
97
98
99
100 S = S + ".global secsidh_internal_2047k221_p_times_w\nsecsidh_internal_2047k221_p_times_w:\n"
101
102 S = S + push()
103
104 S = S + " mov r15d, edx\n"
105 S = S + " mov eax, r15d\n"
106 S = S + " mov " + state[0] + ", [esi + 0*4]\n"
107 S = S + " imul " + state[0] + "\n"
108 S = S + " mov rbx, rax\n"
109 S = S + " and ebx, 67108863\n"
110 S = S + " mov [rdi + 0*4], rbx\n"
111 S = S + " shr rax, 26\n";
112 S = S + " add rdx, rax\n"
113 S = S + " mov " + state64[0] + ", rdx\n"
114 S = S + "#############################\n"
115 for j in range(1,plimbs):
117 S = S + " mov " + state[j%2] + ", [esi + " + str(j) + "*4]\n"
118 S = S + " mov eax, r15d\n"
119 S = S + " imul " + state[j%2] + "\n"
120 S = S + " mov rbx, rax\n"
121 S = S + " add ebx, " + state[(j+1)%2] + "\n";
122 S = S + " and ebx, 67108863\n"
123 S = S + " mov [rdi + " + str(j) + "*4], rbx\n"
124 S = S + " shr rax, 26\n";
125 S = S + " add rdx, rax\n"
126 S = S + " mov " + state64[j%2] + ", rdx\n"
127 S = S + " adc " + state[j%2] + ", 0\n"
128 S = S + " mov [rdi + " + str(j) + "*4], " + state64[(j+1)%2] + "\n"
129 S = S + " mov [rdi + " + str(j+1) + "*4], " + state64[j%2] + "\n"
130 S = S + "#############################\n"
131 elif(j == 1):
132 S = S + " mov " + state[j%2] + ", [esi + " + str(j) + "*4]\n"
133 S = S + " mov eax, r15d\n"
134 S = S + " imul " + state[j%2] + "\n"
135 S = S + " mov rbx, rax\n"
136 S = S + " add ebx, " + state[(j+1)%2] + "\n";
137 S = S + " and ebx, 67108863\n"
138 S = S + " mov [rdi + " + str(j) + "*4], rbx\n"
139 S = S + " shr rax, 26\n";
140 S = S + " add rdx, rax\n"
141 S = S + " mov " + state64[j%2] + ", rdx\n"
142 S = S + "#############################\n"
143 else:
144 S = S + " mov " + state[j%2] + ", [esi + " + str(j) + "*4]\n"
145 S = S + " mov eax, r15d\n"
146 S = S + " imul " + state[j%2] + "\n"
147 S = S + " mov rbx, rax\n"
148 S = S + " add ebx, " + state[(j+1)%2] + "\n";
149 S = S + " and ebx, 67108863\n"
150 S = S + " mov [rdi + " + str(j) + "*4], rbx\n"
151 S = S + " shr rax, 26\n";
152 S = S + " add rdx, rax\n"
153 S = S + " mov " + state64[j%2] + ", rdx\n"
154 S = S + "#############################\n"
155
156 S = S + pop()
157
158 S = S + " ret\n"
159 return S
160
161
162