github.com/kisexp/xdchain@v0.0.0-20211206025815-490d6b732aa7/crypto/bls12381/arithmetic_fallback.go (about) 1 // Native go field arithmetic code is generated with 'goff' 2 // https://github.com/ConsenSys/goff 3 // Many function signature of field operations are renamed. 4 5 // Copyright 2020 ConsenSys AG 6 // 7 // Licensed under the Apache License, Version 2.0 (the "License"); 8 // you may not use this file except in compliance with the License. 9 // You may obtain a copy of the License at 10 // 11 // http://www.apache.org/licenses/LICENSE-2.0 12 // 13 // Unless required by applicable law or agreed to in writing, software 14 // distributed under the License is distributed on an "AS IS" BASIS, 15 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 16 // See the License for the specific language governing permissions and 17 // limitations under the License. 18 19 // field modulus q = 20 // 21 // 4002409555221667393417789825735904156556882819939007885332058136124031650490837864442687629129015664037894272559787 22 // Code generated by goff DO NOT EDIT 23 // goff version: v0.1.0 - build: 790f1f56eac432441e043abff8819eacddd1d668 24 // fe are assumed to be in Montgomery form in all methods 25 26 // /!\ WARNING /!\ 27 // this code has not been audited and is provided as-is. In particular, 28 // there is no security guarantees such as constant time implementation 29 // or side-channel attack resistance 30 // /!\ WARNING /!\ 31 32 // Package bls (generated by goff) contains field arithmetics operations 33 34 // +build !amd64 !blsasm,!blsadx 35 36 package bls12381 37 38 import ( 39 "math/bits" 40 ) 41 42 func add(z, x, y *fe) { 43 var carry uint64 44 45 z[0], carry = bits.Add64(x[0], y[0], 0) 46 z[1], carry = bits.Add64(x[1], y[1], carry) 47 z[2], carry = bits.Add64(x[2], y[2], carry) 48 z[3], carry = bits.Add64(x[3], y[3], carry) 49 z[4], carry = bits.Add64(x[4], y[4], carry) 50 z[5], _ = bits.Add64(x[5], y[5], carry) 51 52 // if z > q --> z -= q 53 // note: this is NOT constant time 54 if !(z[5] < 1873798617647539866 || (z[5] == 1873798617647539866 && (z[4] < 5412103778470702295 || (z[4] == 5412103778470702295 && (z[3] < 7239337960414712511 || (z[3] == 7239337960414712511 && (z[2] < 7435674573564081700 || (z[2] == 7435674573564081700 && (z[1] < 2210141511517208575 || (z[1] == 2210141511517208575 && (z[0] < 13402431016077863595))))))))))) { 55 var b uint64 56 z[0], b = bits.Sub64(z[0], 13402431016077863595, 0) 57 z[1], b = bits.Sub64(z[1], 2210141511517208575, b) 58 z[2], b = bits.Sub64(z[2], 7435674573564081700, b) 59 z[3], b = bits.Sub64(z[3], 7239337960414712511, b) 60 z[4], b = bits.Sub64(z[4], 5412103778470702295, b) 61 z[5], _ = bits.Sub64(z[5], 1873798617647539866, b) 62 } 63 } 64 65 func addAssign(x, y *fe) { 66 var carry uint64 67 68 x[0], carry = bits.Add64(x[0], y[0], 0) 69 x[1], carry = bits.Add64(x[1], y[1], carry) 70 x[2], carry = bits.Add64(x[2], y[2], carry) 71 x[3], carry = bits.Add64(x[3], y[3], carry) 72 x[4], carry = bits.Add64(x[4], y[4], carry) 73 x[5], _ = bits.Add64(x[5], y[5], carry) 74 75 // if z > q --> z -= q 76 // note: this is NOT constant time 77 if !(x[5] < 1873798617647539866 || (x[5] == 1873798617647539866 && (x[4] < 5412103778470702295 || (x[4] == 5412103778470702295 && (x[3] < 7239337960414712511 || (x[3] == 7239337960414712511 && (x[2] < 7435674573564081700 || (x[2] == 7435674573564081700 && (x[1] < 2210141511517208575 || (x[1] == 2210141511517208575 && (x[0] < 13402431016077863595))))))))))) { 78 var b uint64 79 x[0], b = bits.Sub64(x[0], 13402431016077863595, 0) 80 x[1], b = bits.Sub64(x[1], 2210141511517208575, b) 81 x[2], b = bits.Sub64(x[2], 7435674573564081700, b) 82 x[3], b = bits.Sub64(x[3], 7239337960414712511, b) 83 x[4], b = bits.Sub64(x[4], 5412103778470702295, b) 84 x[5], _ = bits.Sub64(x[5], 1873798617647539866, b) 85 } 86 } 87 88 func ladd(z, x, y *fe) { 89 var carry uint64 90 z[0], carry = bits.Add64(x[0], y[0], 0) 91 z[1], carry = bits.Add64(x[1], y[1], carry) 92 z[2], carry = bits.Add64(x[2], y[2], carry) 93 z[3], carry = bits.Add64(x[3], y[3], carry) 94 z[4], carry = bits.Add64(x[4], y[4], carry) 95 z[5], _ = bits.Add64(x[5], y[5], carry) 96 } 97 98 func laddAssign(x, y *fe) { 99 var carry uint64 100 x[0], carry = bits.Add64(x[0], y[0], 0) 101 x[1], carry = bits.Add64(x[1], y[1], carry) 102 x[2], carry = bits.Add64(x[2], y[2], carry) 103 x[3], carry = bits.Add64(x[3], y[3], carry) 104 x[4], carry = bits.Add64(x[4], y[4], carry) 105 x[5], _ = bits.Add64(x[5], y[5], carry) 106 } 107 108 func double(z, x *fe) { 109 var carry uint64 110 111 z[0], carry = bits.Add64(x[0], x[0], 0) 112 z[1], carry = bits.Add64(x[1], x[1], carry) 113 z[2], carry = bits.Add64(x[2], x[2], carry) 114 z[3], carry = bits.Add64(x[3], x[3], carry) 115 z[4], carry = bits.Add64(x[4], x[4], carry) 116 z[5], _ = bits.Add64(x[5], x[5], carry) 117 118 // if z > q --> z -= q 119 // note: this is NOT constant time 120 if !(z[5] < 1873798617647539866 || (z[5] == 1873798617647539866 && (z[4] < 5412103778470702295 || (z[4] == 5412103778470702295 && (z[3] < 7239337960414712511 || (z[3] == 7239337960414712511 && (z[2] < 7435674573564081700 || (z[2] == 7435674573564081700 && (z[1] < 2210141511517208575 || (z[1] == 2210141511517208575 && (z[0] < 13402431016077863595))))))))))) { 121 var b uint64 122 z[0], b = bits.Sub64(z[0], 13402431016077863595, 0) 123 z[1], b = bits.Sub64(z[1], 2210141511517208575, b) 124 z[2], b = bits.Sub64(z[2], 7435674573564081700, b) 125 z[3], b = bits.Sub64(z[3], 7239337960414712511, b) 126 z[4], b = bits.Sub64(z[4], 5412103778470702295, b) 127 z[5], _ = bits.Sub64(z[5], 1873798617647539866, b) 128 } 129 } 130 131 func doubleAssign(z *fe) { 132 var carry uint64 133 134 z[0], carry = bits.Add64(z[0], z[0], 0) 135 z[1], carry = bits.Add64(z[1], z[1], carry) 136 z[2], carry = bits.Add64(z[2], z[2], carry) 137 z[3], carry = bits.Add64(z[3], z[3], carry) 138 z[4], carry = bits.Add64(z[4], z[4], carry) 139 z[5], _ = bits.Add64(z[5], z[5], carry) 140 141 // if z > q --> z -= q 142 // note: this is NOT constant time 143 if !(z[5] < 1873798617647539866 || (z[5] == 1873798617647539866 && (z[4] < 5412103778470702295 || (z[4] == 5412103778470702295 && (z[3] < 7239337960414712511 || (z[3] == 7239337960414712511 && (z[2] < 7435674573564081700 || (z[2] == 7435674573564081700 && (z[1] < 2210141511517208575 || (z[1] == 2210141511517208575 && (z[0] < 13402431016077863595))))))))))) { 144 var b uint64 145 z[0], b = bits.Sub64(z[0], 13402431016077863595, 0) 146 z[1], b = bits.Sub64(z[1], 2210141511517208575, b) 147 z[2], b = bits.Sub64(z[2], 7435674573564081700, b) 148 z[3], b = bits.Sub64(z[3], 7239337960414712511, b) 149 z[4], b = bits.Sub64(z[4], 5412103778470702295, b) 150 z[5], _ = bits.Sub64(z[5], 1873798617647539866, b) 151 } 152 } 153 154 func ldouble(z, x *fe) { 155 var carry uint64 156 157 z[0], carry = bits.Add64(x[0], x[0], 0) 158 z[1], carry = bits.Add64(x[1], x[1], carry) 159 z[2], carry = bits.Add64(x[2], x[2], carry) 160 z[3], carry = bits.Add64(x[3], x[3], carry) 161 z[4], carry = bits.Add64(x[4], x[4], carry) 162 z[5], _ = bits.Add64(x[5], x[5], carry) 163 } 164 165 func sub(z, x, y *fe) { 166 var b uint64 167 z[0], b = bits.Sub64(x[0], y[0], 0) 168 z[1], b = bits.Sub64(x[1], y[1], b) 169 z[2], b = bits.Sub64(x[2], y[2], b) 170 z[3], b = bits.Sub64(x[3], y[3], b) 171 z[4], b = bits.Sub64(x[4], y[4], b) 172 z[5], b = bits.Sub64(x[5], y[5], b) 173 if b != 0 { 174 var c uint64 175 z[0], c = bits.Add64(z[0], 13402431016077863595, 0) 176 z[1], c = bits.Add64(z[1], 2210141511517208575, c) 177 z[2], c = bits.Add64(z[2], 7435674573564081700, c) 178 z[3], c = bits.Add64(z[3], 7239337960414712511, c) 179 z[4], c = bits.Add64(z[4], 5412103778470702295, c) 180 z[5], _ = bits.Add64(z[5], 1873798617647539866, c) 181 } 182 } 183 184 func subAssign(z, x *fe) { 185 var b uint64 186 z[0], b = bits.Sub64(z[0], x[0], 0) 187 z[1], b = bits.Sub64(z[1], x[1], b) 188 z[2], b = bits.Sub64(z[2], x[2], b) 189 z[3], b = bits.Sub64(z[3], x[3], b) 190 z[4], b = bits.Sub64(z[4], x[4], b) 191 z[5], b = bits.Sub64(z[5], x[5], b) 192 if b != 0 { 193 var c uint64 194 z[0], c = bits.Add64(z[0], 13402431016077863595, 0) 195 z[1], c = bits.Add64(z[1], 2210141511517208575, c) 196 z[2], c = bits.Add64(z[2], 7435674573564081700, c) 197 z[3], c = bits.Add64(z[3], 7239337960414712511, c) 198 z[4], c = bits.Add64(z[4], 5412103778470702295, c) 199 z[5], _ = bits.Add64(z[5], 1873798617647539866, c) 200 } 201 } 202 203 func lsubAssign(z, x *fe) { 204 var b uint64 205 z[0], b = bits.Sub64(z[0], x[0], 0) 206 z[1], b = bits.Sub64(z[1], x[1], b) 207 z[2], b = bits.Sub64(z[2], x[2], b) 208 z[3], b = bits.Sub64(z[3], x[3], b) 209 z[4], b = bits.Sub64(z[4], x[4], b) 210 z[5], b = bits.Sub64(z[5], x[5], b) 211 } 212 213 func neg(z *fe, x *fe) { 214 if x.isZero() { 215 z.zero() 216 return 217 } 218 var borrow uint64 219 z[0], borrow = bits.Sub64(13402431016077863595, x[0], 0) 220 z[1], borrow = bits.Sub64(2210141511517208575, x[1], borrow) 221 z[2], borrow = bits.Sub64(7435674573564081700, x[2], borrow) 222 z[3], borrow = bits.Sub64(7239337960414712511, x[3], borrow) 223 z[4], borrow = bits.Sub64(5412103778470702295, x[4], borrow) 224 z[5], _ = bits.Sub64(1873798617647539866, x[5], borrow) 225 } 226 227 func mul(z, x, y *fe) { 228 var t [6]uint64 229 var c [3]uint64 230 { 231 // round 0 232 v := x[0] 233 c[1], c[0] = bits.Mul64(v, y[0]) 234 m := c[0] * 9940570264628428797 235 c[2] = madd0(m, 13402431016077863595, c[0]) 236 c[1], c[0] = madd1(v, y[1], c[1]) 237 c[2], t[0] = madd2(m, 2210141511517208575, c[2], c[0]) 238 c[1], c[0] = madd1(v, y[2], c[1]) 239 c[2], t[1] = madd2(m, 7435674573564081700, c[2], c[0]) 240 c[1], c[0] = madd1(v, y[3], c[1]) 241 c[2], t[2] = madd2(m, 7239337960414712511, c[2], c[0]) 242 c[1], c[0] = madd1(v, y[4], c[1]) 243 c[2], t[3] = madd2(m, 5412103778470702295, c[2], c[0]) 244 c[1], c[0] = madd1(v, y[5], c[1]) 245 t[5], t[4] = madd3(m, 1873798617647539866, c[0], c[2], c[1]) 246 } 247 { 248 // round 1 249 v := x[1] 250 c[1], c[0] = madd1(v, y[0], t[0]) 251 m := c[0] * 9940570264628428797 252 c[2] = madd0(m, 13402431016077863595, c[0]) 253 c[1], c[0] = madd2(v, y[1], c[1], t[1]) 254 c[2], t[0] = madd2(m, 2210141511517208575, c[2], c[0]) 255 c[1], c[0] = madd2(v, y[2], c[1], t[2]) 256 c[2], t[1] = madd2(m, 7435674573564081700, c[2], c[0]) 257 c[1], c[0] = madd2(v, y[3], c[1], t[3]) 258 c[2], t[2] = madd2(m, 7239337960414712511, c[2], c[0]) 259 c[1], c[0] = madd2(v, y[4], c[1], t[4]) 260 c[2], t[3] = madd2(m, 5412103778470702295, c[2], c[0]) 261 c[1], c[0] = madd2(v, y[5], c[1], t[5]) 262 t[5], t[4] = madd3(m, 1873798617647539866, c[0], c[2], c[1]) 263 } 264 { 265 // round 2 266 v := x[2] 267 c[1], c[0] = madd1(v, y[0], t[0]) 268 m := c[0] * 9940570264628428797 269 c[2] = madd0(m, 13402431016077863595, c[0]) 270 c[1], c[0] = madd2(v, y[1], c[1], t[1]) 271 c[2], t[0] = madd2(m, 2210141511517208575, c[2], c[0]) 272 c[1], c[0] = madd2(v, y[2], c[1], t[2]) 273 c[2], t[1] = madd2(m, 7435674573564081700, c[2], c[0]) 274 c[1], c[0] = madd2(v, y[3], c[1], t[3]) 275 c[2], t[2] = madd2(m, 7239337960414712511, c[2], c[0]) 276 c[1], c[0] = madd2(v, y[4], c[1], t[4]) 277 c[2], t[3] = madd2(m, 5412103778470702295, c[2], c[0]) 278 c[1], c[0] = madd2(v, y[5], c[1], t[5]) 279 t[5], t[4] = madd3(m, 1873798617647539866, c[0], c[2], c[1]) 280 } 281 { 282 // round 3 283 v := x[3] 284 c[1], c[0] = madd1(v, y[0], t[0]) 285 m := c[0] * 9940570264628428797 286 c[2] = madd0(m, 13402431016077863595, c[0]) 287 c[1], c[0] = madd2(v, y[1], c[1], t[1]) 288 c[2], t[0] = madd2(m, 2210141511517208575, c[2], c[0]) 289 c[1], c[0] = madd2(v, y[2], c[1], t[2]) 290 c[2], t[1] = madd2(m, 7435674573564081700, c[2], c[0]) 291 c[1], c[0] = madd2(v, y[3], c[1], t[3]) 292 c[2], t[2] = madd2(m, 7239337960414712511, c[2], c[0]) 293 c[1], c[0] = madd2(v, y[4], c[1], t[4]) 294 c[2], t[3] = madd2(m, 5412103778470702295, c[2], c[0]) 295 c[1], c[0] = madd2(v, y[5], c[1], t[5]) 296 t[5], t[4] = madd3(m, 1873798617647539866, c[0], c[2], c[1]) 297 } 298 { 299 // round 4 300 v := x[4] 301 c[1], c[0] = madd1(v, y[0], t[0]) 302 m := c[0] * 9940570264628428797 303 c[2] = madd0(m, 13402431016077863595, c[0]) 304 c[1], c[0] = madd2(v, y[1], c[1], t[1]) 305 c[2], t[0] = madd2(m, 2210141511517208575, c[2], c[0]) 306 c[1], c[0] = madd2(v, y[2], c[1], t[2]) 307 c[2], t[1] = madd2(m, 7435674573564081700, c[2], c[0]) 308 c[1], c[0] = madd2(v, y[3], c[1], t[3]) 309 c[2], t[2] = madd2(m, 7239337960414712511, c[2], c[0]) 310 c[1], c[0] = madd2(v, y[4], c[1], t[4]) 311 c[2], t[3] = madd2(m, 5412103778470702295, c[2], c[0]) 312 c[1], c[0] = madd2(v, y[5], c[1], t[5]) 313 t[5], t[4] = madd3(m, 1873798617647539866, c[0], c[2], c[1]) 314 } 315 { 316 // round 5 317 v := x[5] 318 c[1], c[0] = madd1(v, y[0], t[0]) 319 m := c[0] * 9940570264628428797 320 c[2] = madd0(m, 13402431016077863595, c[0]) 321 c[1], c[0] = madd2(v, y[1], c[1], t[1]) 322 c[2], z[0] = madd2(m, 2210141511517208575, c[2], c[0]) 323 c[1], c[0] = madd2(v, y[2], c[1], t[2]) 324 c[2], z[1] = madd2(m, 7435674573564081700, c[2], c[0]) 325 c[1], c[0] = madd2(v, y[3], c[1], t[3]) 326 c[2], z[2] = madd2(m, 7239337960414712511, c[2], c[0]) 327 c[1], c[0] = madd2(v, y[4], c[1], t[4]) 328 c[2], z[3] = madd2(m, 5412103778470702295, c[2], c[0]) 329 c[1], c[0] = madd2(v, y[5], c[1], t[5]) 330 z[5], z[4] = madd3(m, 1873798617647539866, c[0], c[2], c[1]) 331 } 332 333 // if z > q --> z -= q 334 // note: this is NOT constant time 335 if !(z[5] < 1873798617647539866 || (z[5] == 1873798617647539866 && (z[4] < 5412103778470702295 || (z[4] == 5412103778470702295 && (z[3] < 7239337960414712511 || (z[3] == 7239337960414712511 && (z[2] < 7435674573564081700 || (z[2] == 7435674573564081700 && (z[1] < 2210141511517208575 || (z[1] == 2210141511517208575 && (z[0] < 13402431016077863595))))))))))) { 336 var b uint64 337 z[0], b = bits.Sub64(z[0], 13402431016077863595, 0) 338 z[1], b = bits.Sub64(z[1], 2210141511517208575, b) 339 z[2], b = bits.Sub64(z[2], 7435674573564081700, b) 340 z[3], b = bits.Sub64(z[3], 7239337960414712511, b) 341 z[4], b = bits.Sub64(z[4], 5412103778470702295, b) 342 z[5], _ = bits.Sub64(z[5], 1873798617647539866, b) 343 } 344 } 345 346 func square(z, x *fe) { 347 348 var p [6]uint64 349 350 var u, v uint64 351 { 352 // round 0 353 u, p[0] = bits.Mul64(x[0], x[0]) 354 m := p[0] * 9940570264628428797 355 C := madd0(m, 13402431016077863595, p[0]) 356 var t uint64 357 t, u, v = madd1sb(x[0], x[1], u) 358 C, p[0] = madd2(m, 2210141511517208575, v, C) 359 t, u, v = madd1s(x[0], x[2], t, u) 360 C, p[1] = madd2(m, 7435674573564081700, v, C) 361 t, u, v = madd1s(x[0], x[3], t, u) 362 C, p[2] = madd2(m, 7239337960414712511, v, C) 363 t, u, v = madd1s(x[0], x[4], t, u) 364 C, p[3] = madd2(m, 5412103778470702295, v, C) 365 _, u, v = madd1s(x[0], x[5], t, u) 366 p[5], p[4] = madd3(m, 1873798617647539866, v, C, u) 367 } 368 { 369 // round 1 370 m := p[0] * 9940570264628428797 371 C := madd0(m, 13402431016077863595, p[0]) 372 u, v = madd1(x[1], x[1], p[1]) 373 C, p[0] = madd2(m, 2210141511517208575, v, C) 374 var t uint64 375 t, u, v = madd2sb(x[1], x[2], p[2], u) 376 C, p[1] = madd2(m, 7435674573564081700, v, C) 377 t, u, v = madd2s(x[1], x[3], p[3], t, u) 378 C, p[2] = madd2(m, 7239337960414712511, v, C) 379 t, u, v = madd2s(x[1], x[4], p[4], t, u) 380 C, p[3] = madd2(m, 5412103778470702295, v, C) 381 _, u, v = madd2s(x[1], x[5], p[5], t, u) 382 p[5], p[4] = madd3(m, 1873798617647539866, v, C, u) 383 } 384 { 385 // round 2 386 m := p[0] * 9940570264628428797 387 C := madd0(m, 13402431016077863595, p[0]) 388 C, p[0] = madd2(m, 2210141511517208575, p[1], C) 389 u, v = madd1(x[2], x[2], p[2]) 390 C, p[1] = madd2(m, 7435674573564081700, v, C) 391 var t uint64 392 t, u, v = madd2sb(x[2], x[3], p[3], u) 393 C, p[2] = madd2(m, 7239337960414712511, v, C) 394 t, u, v = madd2s(x[2], x[4], p[4], t, u) 395 C, p[3] = madd2(m, 5412103778470702295, v, C) 396 _, u, v = madd2s(x[2], x[5], p[5], t, u) 397 p[5], p[4] = madd3(m, 1873798617647539866, v, C, u) 398 } 399 { 400 // round 3 401 m := p[0] * 9940570264628428797 402 C := madd0(m, 13402431016077863595, p[0]) 403 C, p[0] = madd2(m, 2210141511517208575, p[1], C) 404 C, p[1] = madd2(m, 7435674573564081700, p[2], C) 405 u, v = madd1(x[3], x[3], p[3]) 406 C, p[2] = madd2(m, 7239337960414712511, v, C) 407 var t uint64 408 t, u, v = madd2sb(x[3], x[4], p[4], u) 409 C, p[3] = madd2(m, 5412103778470702295, v, C) 410 _, u, v = madd2s(x[3], x[5], p[5], t, u) 411 p[5], p[4] = madd3(m, 1873798617647539866, v, C, u) 412 } 413 { 414 // round 4 415 m := p[0] * 9940570264628428797 416 C := madd0(m, 13402431016077863595, p[0]) 417 C, p[0] = madd2(m, 2210141511517208575, p[1], C) 418 C, p[1] = madd2(m, 7435674573564081700, p[2], C) 419 C, p[2] = madd2(m, 7239337960414712511, p[3], C) 420 u, v = madd1(x[4], x[4], p[4]) 421 C, p[3] = madd2(m, 5412103778470702295, v, C) 422 _, u, v = madd2sb(x[4], x[5], p[5], u) 423 p[5], p[4] = madd3(m, 1873798617647539866, v, C, u) 424 } 425 { 426 // round 5 427 m := p[0] * 9940570264628428797 428 C := madd0(m, 13402431016077863595, p[0]) 429 C, z[0] = madd2(m, 2210141511517208575, p[1], C) 430 C, z[1] = madd2(m, 7435674573564081700, p[2], C) 431 C, z[2] = madd2(m, 7239337960414712511, p[3], C) 432 C, z[3] = madd2(m, 5412103778470702295, p[4], C) 433 u, v = madd1(x[5], x[5], p[5]) 434 z[5], z[4] = madd3(m, 1873798617647539866, v, C, u) 435 } 436 437 // if z > q --> z -= q 438 // note: this is NOT constant time 439 if !(z[5] < 1873798617647539866 || (z[5] == 1873798617647539866 && (z[4] < 5412103778470702295 || (z[4] == 5412103778470702295 && (z[3] < 7239337960414712511 || (z[3] == 7239337960414712511 && (z[2] < 7435674573564081700 || (z[2] == 7435674573564081700 && (z[1] < 2210141511517208575 || (z[1] == 2210141511517208575 && (z[0] < 13402431016077863595))))))))))) { 440 var b uint64 441 z[0], b = bits.Sub64(z[0], 13402431016077863595, 0) 442 z[1], b = bits.Sub64(z[1], 2210141511517208575, b) 443 z[2], b = bits.Sub64(z[2], 7435674573564081700, b) 444 z[3], b = bits.Sub64(z[3], 7239337960414712511, b) 445 z[4], b = bits.Sub64(z[4], 5412103778470702295, b) 446 z[5], _ = bits.Sub64(z[5], 1873798617647539866, b) 447 } 448 } 449 450 // arith.go 451 // Copyright 2020 ConsenSys AG 452 // 453 // Licensed under the Apache License, Version 2.0 (the "License"); 454 // you may not use this file except in compliance with the License. 455 // You may obtain a copy of the License at 456 // 457 // http://www.apache.org/licenses/LICENSE-2.0 458 // 459 // Unless required by applicable law or agreed to in writing, software 460 // distributed under the License is distributed on an "AS IS" BASIS, 461 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 462 // See the License for the specific language governing permissions and 463 // limitations under the License. 464 465 // Code generated by goff DO NOT EDIT 466 467 func madd(a, b, t, u, v uint64) (uint64, uint64, uint64) { 468 var carry uint64 469 hi, lo := bits.Mul64(a, b) 470 v, carry = bits.Add64(lo, v, 0) 471 u, carry = bits.Add64(hi, u, carry) 472 t, _ = bits.Add64(t, 0, carry) 473 return t, u, v 474 } 475 476 // madd0 hi = a*b + c (discards lo bits) 477 func madd0(a, b, c uint64) (hi uint64) { 478 var carry, lo uint64 479 hi, lo = bits.Mul64(a, b) 480 _, carry = bits.Add64(lo, c, 0) 481 hi, _ = bits.Add64(hi, 0, carry) 482 return 483 } 484 485 // madd1 hi, lo = a*b + c 486 func madd1(a, b, c uint64) (hi uint64, lo uint64) { 487 var carry uint64 488 hi, lo = bits.Mul64(a, b) 489 lo, carry = bits.Add64(lo, c, 0) 490 hi, _ = bits.Add64(hi, 0, carry) 491 return 492 } 493 494 // madd2 hi, lo = a*b + c + d 495 func madd2(a, b, c, d uint64) (hi uint64, lo uint64) { 496 var carry uint64 497 hi, lo = bits.Mul64(a, b) 498 c, carry = bits.Add64(c, d, 0) 499 hi, _ = bits.Add64(hi, 0, carry) 500 lo, carry = bits.Add64(lo, c, 0) 501 hi, _ = bits.Add64(hi, 0, carry) 502 return 503 } 504 505 // madd2s superhi, hi, lo = 2*a*b + c + d + e 506 func madd2s(a, b, c, d, e uint64) (superhi, hi, lo uint64) { 507 var carry, sum uint64 508 509 hi, lo = bits.Mul64(a, b) 510 lo, carry = bits.Add64(lo, lo, 0) 511 hi, superhi = bits.Add64(hi, hi, carry) 512 513 sum, carry = bits.Add64(c, e, 0) 514 hi, _ = bits.Add64(hi, 0, carry) 515 lo, carry = bits.Add64(lo, sum, 0) 516 hi, _ = bits.Add64(hi, 0, carry) 517 hi, _ = bits.Add64(hi, 0, d) 518 return 519 } 520 521 func madd1s(a, b, d, e uint64) (superhi, hi, lo uint64) { 522 var carry uint64 523 524 hi, lo = bits.Mul64(a, b) 525 lo, carry = bits.Add64(lo, lo, 0) 526 hi, superhi = bits.Add64(hi, hi, carry) 527 lo, carry = bits.Add64(lo, e, 0) 528 hi, _ = bits.Add64(hi, 0, carry) 529 hi, _ = bits.Add64(hi, 0, d) 530 return 531 } 532 533 func madd2sb(a, b, c, e uint64) (superhi, hi, lo uint64) { 534 var carry, sum uint64 535 536 hi, lo = bits.Mul64(a, b) 537 lo, carry = bits.Add64(lo, lo, 0) 538 hi, superhi = bits.Add64(hi, hi, carry) 539 540 sum, carry = bits.Add64(c, e, 0) 541 hi, _ = bits.Add64(hi, 0, carry) 542 lo, carry = bits.Add64(lo, sum, 0) 543 hi, _ = bits.Add64(hi, 0, carry) 544 return 545 } 546 547 func madd1sb(a, b, e uint64) (superhi, hi, lo uint64) { 548 var carry uint64 549 550 hi, lo = bits.Mul64(a, b) 551 lo, carry = bits.Add64(lo, lo, 0) 552 hi, superhi = bits.Add64(hi, hi, carry) 553 lo, carry = bits.Add64(lo, e, 0) 554 hi, _ = bits.Add64(hi, 0, carry) 555 return 556 } 557 558 func madd3(a, b, c, d, e uint64) (hi uint64, lo uint64) { 559 var carry uint64 560 hi, lo = bits.Mul64(a, b) 561 c, carry = bits.Add64(c, d, 0) 562 hi, _ = bits.Add64(hi, 0, carry) 563 lo, carry = bits.Add64(lo, c, 0) 564 hi, _ = bits.Add64(hi, e, carry) 565 return 566 }