Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add some assembly tests from BoringSSL p256 #1187

Draft
wants to merge 8 commits into
base: master
Choose a base branch
from
Draft

Conversation

JasonGross
Copy link
Collaborator

Towards better equivalence checking

cc @davidben @andres-erbsen

We don't support these instructions yet:

$ src/ExtractionOCaml/word_by_word_montgomery p256 64 '2^256 - 2^224 + 2^192 + 2^96 - 1' mul --no-wide-int --shiftr-avoid-uint1 --hints-file fiat-amd64/boringssl_intel_manual_mul_p256.asm
[...]
In parsing:
Error while parsing assembly:
mul    r9
mul    r10
mul    r11
mul    r12
mul    r15
mov    rax,QWORD PTR [rbx+0x8]
mul    QWORD PTR [rsi]
mul    QWORD PTR [rsi+0x8]
mul    QWORD PTR [rsi+0x10]
mul    QWORD PTR [rsi+0x18]
mul    r15
mov    rax,QWORD PTR [rbx+0x10]
mul    QWORD PTR [rsi]
mul    QWORD PTR [rsi+0x8]
mul    QWORD PTR [rsi+0x10]
mul    QWORD PTR [rsi+0x18]
mul    r15
mov    rax,QWORD PTR [rbx+0x18]
mul    QWORD PTR [rsi]
mul    QWORD PTR [rsi+0x8]
mul    QWORD PTR [rsi+0x10]
mul    QWORD PTR [rsi+0x18]
mul    r15
cmovb  r12,rcx
cmovb  r13,rbp
mov    QWORD PTR [rdi],r12
cmovb  r8,rbx
mov    QWORD PTR [rdi+0x8],r13
cmovb  r9,rdx
mov    QWORD PTR [rdi+0x10],r8
mov    QWORD PTR [rdi+0x18],r9
repz ret

Fatal error: exception Failure("Synthesis failed")

@JasonGross
Copy link
Collaborator Author

@davidben @andres-erbsen I'm staring at the equation that we want to hold:
(addcarry₆₄, [(#24 >>₆₄ 32), (addcarry₆₄, [#27, (#24 *₆₄ 2^32)])])
=?
(addcarry₆₄, [((#24 *ℤ 2^32-1) >>₆₄ 64), (addcarry₆₄, [(#24 *₆₄ 2^32-1), ((#24 *ℤ 2^64-1) >>₆₄ 64)]), (addcarry₆₄, [#27, ((#24 *₆₄ 2^32-1) +₆₄ ((#24 *ℤ 2^64-1) >>₆₄ 64)), (addcarry₆₄, [#24, (#24 *₆₄ 2^64-1)])])])

(Note that the parentheses are a bit off; we're multiplying by 2^k-1, not multiplying by 2^k and then subtracting 1)

I guess we need a rule for (addcarry₆₄, [#24, (#24 *₆₄ 2^64-1)]) = 0

What's up with (x * (2^32-1)) >> 64? It seems like this is almost but not quite computing x >> 32? And what does (x * (2^64-1)) >> 64 compute?

@davidben
Copy link
Collaborator

Where in the assembly does that correspond to?

Towards better equivalence checking

We don't support these instructions yet:
```
$ src/ExtractionOCaml/word_by_word_montgomery p256 64 '2^256 - 2^224 + 2^192 + 2^96 - 1' mul --no-wide-int --shiftr-avoid-uint1 --hints-file fiat-amd64/boringssl_intel_manual_mul_p256.asm
[...]
In parsing:
Error while parsing assembly:
mul    r9
mul    r10
mul    r11
mul    r12
mul    r15
mov    rax,QWORD PTR [rbx+0x8]
mul    QWORD PTR [rsi]
mul    QWORD PTR [rsi+0x8]
mul    QWORD PTR [rsi+0x10]
mul    QWORD PTR [rsi+0x18]
mul    r15
mov    rax,QWORD PTR [rbx+0x10]
mul    QWORD PTR [rsi]
mul    QWORD PTR [rsi+0x8]
mul    QWORD PTR [rsi+0x10]
mul    QWORD PTR [rsi+0x18]
mul    r15
mov    rax,QWORD PTR [rbx+0x18]
mul    QWORD PTR [rsi]
mul    QWORD PTR [rsi+0x8]
mul    QWORD PTR [rsi+0x10]
mul    QWORD PTR [rsi+0x18]
mul    r15
cmovb  r12,rcx
cmovb  r13,rbp
mov    QWORD PTR [rdi],r12
cmovb  r8,rbx
mov    QWORD PTR [rdi+0x8],r13
cmovb  r9,rdx
mov    QWORD PTR [rdi+0x10],r8
mov    QWORD PTR [rdi+0x18],r9
repz ret

Fatal error: exception Failure("Synthesis failed")
```
```
check_args
/* Autogenerated: 'src/ExtractionOCaml/word_by_word_montgomery' p256 64 '2^256 - 2^224 + 2^192 + 2^96 - 1' mul --no-wide-int --shiftr-avoid-uint1 --hints-file 'fiat-amd64/boringssl_intel_manual_mul_p256.asm' */
/* curve description: p256 */
/* machine_wordsize = 64 (from "64") */
/* requested operations: mul */
/* m = 0xffffffff00000001000000000000000000000000ffffffffffffffffffffffff (from "2^256 - 2^224 + 2^192 + 2^96 - 1") */
/*                                                                    */
/* NOTE: In addition to the bounds specified above each function, all */
/*   functions synthesized for this Montgomery arithmetic require the */
/*   input to be strictly less than the prime modulus (m), and also   */
/*   require the input to be in the unique saturated representation.  */
/*   All functions also ensure that these two properties are true of  */
/*   return values.                                                   */
/*  */
/* Computed values: */
/*   eval z = z[0] + (z[1] << 64) + (z[2] << 128) + (z[3] << 192) */
/*   bytes_eval z = z[0] + (z[1] << 8) + (z[2] << 16) + (z[3] << 24) + (z[4] << 32) + (z[5] << 40) + (z[6] << 48) + (z[7] << 56) + (z[8] << 64) + (z[9] << 72) + (z[10] << 80) + (z[11] << 88) + (z[12] << 96) + (z[13] << 104) + (z[14] << 112) + (z[15] << 120) + (z[16] << 128) + (z[17] << 136) + (z[18] << 144) + (z[19] << 152) + (z[20] << 160) + (z[21] << 168) + (z[22] << 176) + (z[23] << 184) + (z[24] << 192) + (z[25] << 200) + (z[26] << 208) + (z[27] << 216) + (z[28] << 224) + (z[29] << 232) + (z[30] << 240) + (z[31] << 248) */
/*   twos_complement_eval z = let x1 := z[0] + (z[1] << 64) + (z[2] << 128) + (z[3] << 192) in */
/*                            if x1 & (2^256-1) < 2^255 then x1 & (2^256-1) else (x1 & (2^256-1)) - 2^256 */

In fiat_p256_mul:
Error while checking for equivalence of syntax tree and assembly:
The syntax tree:
(λ x1 x2,
  let x3 := x1[1] (* : uint64_t *) in
  let x4 := x1[2] (* : uint64_t *) in
  let x5 := x1[3] (* : uint64_t *) in
  let x6 := x1[0] (* : uint64_t *) in
  let x7 := Z.mul_split(2^64, None, (x6, Some [0x0 ~> 0xffffffffffffffff], (x2[3], Some [0x0 ~> 0xffffffffffffffff]))) in
  let x8 := Z.mul_split(2^64, None, (x6, Some [0x0 ~> 0xffffffffffffffff], (x2[2], Some [0x0 ~> 0xffffffffffffffff]))) in
  let x9 := Z.mul_split(2^64, None, (x6, Some [0x0 ~> 0xffffffffffffffff], (x2[1], Some [0x0 ~> 0xffffffffffffffff]))) in
  let x10 := Z.mul_split(2^64, None, (x6, Some [0x0 ~> 0xffffffffffffffff], (x2[0], Some [0x0 ~> 0xffffffffffffffff]))) in
  let x11 := Z.add_get_carry(2^64, None, (x10₂, Some [0x0 ~> 0xffffffffffffffff], (x9₁, Some [0x0 ~> 0xffffffffffffffff]))) in
  let x12 := Z.add_with_get_carry(2^64, None, (x11₂, Some [0x0 ~> 0x1], (x9₂, Some [0x0 ~> 0xffffffffffffffff], (x8₁, Some [0x0 ~> 0xffffffffffffffff])))) in
  let x13 := Z.add_with_get_carry(2^64, None, (x12₂, Some [0x0 ~> 0x1], (x8₂, Some [0x0 ~> 0xffffffffffffffff], (x7₁, Some [0x0 ~> 0xffffffffffffffff])))) in
  let x14 := x13₂ + x7₂ (* : uint64_t *) in
  let x15 := Z.mul_split(2^64, None, (x10₁, Some [0x0 ~> 0xffffffffffffffff], (0xffffffff00000001, None))) in
  let x16 := Z.mul_split(2^64, None, (x10₁, Some [0x0 ~> 0xffffffffffffffff], (2^32-1, None))) in
  let x17 := Z.mul_split(2^64, None, (x10₁, Some [0x0 ~> 0xffffffffffffffff], (2^64-1, None))) in
  let x18 := Z.add_get_carry(2^64, None, (x17₂, Some [0x0 ~> 0xffffffffffffffff], (x16₁, Some [0x0 ~> 0xffffffffffffffff]))) in
  let x19 := x18₂ + x16₂ (* : uint64_t *) in
  let x20 := Z.add_get_carry(2^64, None, (x10₁, Some [0x0 ~> 0xffffffffffffffff], (x17₁, Some [0x0 ~> 0xffffffffffffffff]))) in
  let x21 := Z.add_with_get_carry(2^64, None, (x20₂, Some [0x0 ~> 0x1], (x11₁, Some [0x0 ~> 0xffffffffffffffff], (x18₁, Some [0x0 ~> 0xffffffffffffffff])))) in
  let x22 := Z.add_with_get_carry(2^64, None, (x21₂, Some [0x0 ~> 0x1], (x12₁, Some [0x0 ~> 0xffffffffffffffff], (x19, Some [0x0 ~> 0xffffffffffffffff])))) in
  let x23 := Z.add_with_get_carry(2^64, None, (x22₂, Some [0x0 ~> 0x1], (x13₁, Some [0x0 ~> 0xffffffffffffffff], (x15₁, Some [0x0 ~> 0xffffffffffffffff])))) in
  let x24 := Z.add_with_get_carry(2^64, None, (x23₂, Some [0x0 ~> 0x1], (x14, Some [0x0 ~> 0xffffffffffffffff], (x15₂, Some [0x0 ~> 0xffffffffffffffff])))) in
  let x25 := Z.mul_split(2^64, None, (x3, Some [0x0 ~> 0xffffffffffffffff], (x2[3], Some [0x0 ~> 0xffffffffffffffff]))) in
  let x26 := Z.mul_split(2^64, None, (x3, Some [0x0 ~> 0xffffffffffffffff], (x2[2], Some [0x0 ~> 0xffffffffffffffff]))) in
  let x27 := Z.mul_split(2^64, None, (x3, Some [0x0 ~> 0xffffffffffffffff], (x2[1], Some [0x0 ~> 0xffffffffffffffff]))) in
  let x28 := Z.mul_split(2^64, None, (x3, Some [0x0 ~> 0xffffffffffffffff], (x2[0], Some [0x0 ~> 0xffffffffffffffff]))) in
  let x29 := Z.add_get_carry(2^64, None, (x28₂, Some [0x0 ~> 0xffffffffffffffff], (x27₁, Some [0x0 ~> 0xffffffffffffffff]))) in
  let x30 := Z.add_with_get_carry(2^64, None, (x29₂, Some [0x0 ~> 0x1], (x27₂, Some [0x0 ~> 0xffffffffffffffff], (x26₁, Some [0x0 ~> 0xffffffffffffffff])))) in
  let x31 := Z.add_with_get_carry(2^64, None, (x30₂, Some [0x0 ~> 0x1], (x26₂, Some [0x0 ~> 0xffffffffffffffff], (x25₁, Some [0x0 ~> 0xffffffffffffffff])))) in
  let x32 := x31₂ + x25₂ (* : uint64_t *) in
  let x33 := Z.add_get_carry(2^64, None, (x21₁, Some [0x0 ~> 0xffffffffffffffff], (x28₁, Some [0x0 ~> 0xffffffffffffffff]))) in
  let x34 := Z.add_with_get_carry(2^64, None, (x33₂, Some [0x0 ~> 0x1], (x22₁, Some [0x0 ~> 0xffffffffffffffff], (x29₁, Some [0x0 ~> 0xffffffffffffffff])))) in
  let x35 := Z.add_with_get_carry(2^64, None, (x34₂, Some [0x0 ~> 0x1], (x23₁, Some [0x0 ~> 0xffffffffffffffff], (x30₁, Some [0x0 ~> 0xffffffffffffffff])))) in
  let x36 := Z.add_with_get_carry(2^64, None, (x35₂, Some [0x0 ~> 0x1], (x24₁, Some [0x0 ~> 0xffffffffffffffff], (x31₁, Some [0x0 ~> 0xffffffffffffffff])))) in
  let x37 := Z.add_with_get_carry(2^64, None, (x36₂, Some [0x0 ~> 0x1], (x24₂, Some [0x0 ~> 0x1], (x32, Some [0x0 ~> 0xffffffffffffffff])))) in
  let x38 := Z.mul_split(2^64, None, (x33₁, Some [0x0 ~> 0xffffffffffffffff], (0xffffffff00000001, None))) in
  let x39 := Z.mul_split(2^64, None, (x33₁, Some [0x0 ~> 0xffffffffffffffff], (2^32-1, None))) in
  let x40 := Z.mul_split(2^64, None, (x33₁, Some [0x0 ~> 0xffffffffffffffff], (2^64-1, None))) in
  let x41 := Z.add_get_carry(2^64, None, (x40₂, Some [0x0 ~> 0xffffffffffffffff], (x39₁, Some [0x0 ~> 0xffffffffffffffff]))) in
  let x42 := x41₂ + x39₂ (* : uint64_t *) in
  let x43 := Z.add_get_carry(2^64, None, (x33₁, Some [0x0 ~> 0xffffffffffffffff], (x40₁, Some [0x0 ~> 0xffffffffffffffff]))) in
  let x44 := Z.add_with_get_carry(2^64, None, (x43₂, Some [0x0 ~> 0x1], (x34₁, Some [0x0 ~> 0xffffffffffffffff], (x41₁, Some [0x0 ~> 0xffffffffffffffff])))) in
  let x45 := Z.add_with_get_carry(2^64, None, (x44₂, Some [0x0 ~> 0x1], (x35₁, Some [0x0 ~> 0xffffffffffffffff], (x42, Some [0x0 ~> 0xffffffffffffffff])))) in
  let x46 := Z.add_with_get_carry(2^64, None, (x45₂, Some [0x0 ~> 0x1], (x36₁, Some [0x0 ~> 0xffffffffffffffff], (x38₁, Some [0x0 ~> 0xffffffffffffffff])))) in
  let x47 := Z.add_with_get_carry(2^64, None, (x46₂, Some [0x0 ~> 0x1], (x37₁, Some [0x0 ~> 0xffffffffffffffff], (x38₂, Some [0x0 ~> 0xffffffffffffffff])))) in
  let x48 := x47₂ + x37₂ (* : uint64_t *) in
  let x49 := Z.mul_split(2^64, None, (x4, Some [0x0 ~> 0xffffffffffffffff], (x2[3], Some [0x0 ~> 0xffffffffffffffff]))) in
  let x50 := Z.mul_split(2^64, None, (x4, Some [0x0 ~> 0xffffffffffffffff], (x2[2], Some [0x0 ~> 0xffffffffffffffff]))) in
  let x51 := Z.mul_split(2^64, None, (x4, Some [0x0 ~> 0xffffffffffffffff], (x2[1], Some [0x0 ~> 0xffffffffffffffff]))) in
  let x52 := Z.mul_split(2^64, None, (x4, Some [0x0 ~> 0xffffffffffffffff], (x2[0], Some [0x0 ~> 0xffffffffffffffff]))) in
  let x53 := Z.add_get_carry(2^64, None, (x52₂, Some [0x0 ~> 0xffffffffffffffff], (x51₁, Some [0x0 ~> 0xffffffffffffffff]))) in
  let x54 := Z.add_with_get_carry(2^64, None, (x53₂, Some [0x0 ~> 0x1], (x51₂, Some [0x0 ~> 0xffffffffffffffff], (x50₁, Some [0x0 ~> 0xffffffffffffffff])))) in
  let x55 := Z.add_with_get_carry(2^64, None, (x54₂, Some [0x0 ~> 0x1], (x50₂, Some [0x0 ~> 0xffffffffffffffff], (x49₁, Some [0x0 ~> 0xffffffffffffffff])))) in
  let x56 := x55₂ + x49₂ (* : uint64_t *) in
  let x57 := Z.add_get_carry(2^64, None, (x44₁, Some [0x0 ~> 0xffffffffffffffff], (x52₁, Some [0x0 ~> 0xffffffffffffffff]))) in
  let x58 := Z.add_with_get_carry(2^64, None, (x57₂, Some [0x0 ~> 0x1], (x45₁, Some [0x0 ~> 0xffffffffffffffff], (x53₁, Some [0x0 ~> 0xffffffffffffffff])))) in
  let x59 := Z.add_with_get_carry(2^64, None, (x58₂, Some [0x0 ~> 0x1], (x46₁, Some [0x0 ~> 0xffffffffffffffff], (x54₁, Some [0x0 ~> 0xffffffffffffffff])))) in
  let x60 := Z.add_with_get_carry(2^64, None, (x59₂, Some [0x0 ~> 0x1], (x47₁, Some [0x0 ~> 0xffffffffffffffff], (x55₁, Some [0x0 ~> 0xffffffffffffffff])))) in
  let x61 := Z.add_with_get_carry(2^64, None, (x60₂, Some [0x0 ~> 0x1], (x48, Some [0x0 ~> 0xffffffffffffffff], (x56, Some [0x0 ~> 0xffffffffffffffff])))) in
  let x62 := Z.mul_split(2^64, None, (x57₁, Some [0x0 ~> 0xffffffffffffffff], (0xffffffff00000001, None))) in
  let x63 := Z.mul_split(2^64, None, (x57₁, Some [0x0 ~> 0xffffffffffffffff], (2^32-1, None))) in
  let x64 := Z.mul_split(2^64, None, (x57₁, Some [0x0 ~> 0xffffffffffffffff], (2^64-1, None))) in
  let x65 := Z.add_get_carry(2^64, None, (x64₂, Some [0x0 ~> 0xffffffffffffffff], (x63₁, Some [0x0 ~> 0xffffffffffffffff]))) in
  let x66 := x65₂ + x63₂ (* : uint64_t *) in
  let x67 := Z.add_get_carry(2^64, None, (x57₁, Some [0x0 ~> 0xffffffffffffffff], (x64₁, Some [0x0 ~> 0xffffffffffffffff]))) in
  let x68 := Z.add_with_get_carry(2^64, None, (x67₂, Some [0x0 ~> 0x1], (x58₁, Some [0x0 ~> 0xffffffffffffffff], (x65₁, Some [0x0 ~> 0xffffffffffffffff])))) in
  let x69 := Z.add_with_get_carry(2^64, None, (x68₂, Some [0x0 ~> 0x1], (x59₁, Some [0x0 ~> 0xffffffffffffffff], (x66, Some [0x0 ~> 0xffffffffffffffff])))) in
  let x70 := Z.add_with_get_carry(2^64, None, (x69₂, Some [0x0 ~> 0x1], (x60₁, Some [0x0 ~> 0xffffffffffffffff], (x62₁, Some [0x0 ~> 0xffffffffffffffff])))) in
  let x71 := Z.add_with_get_carry(2^64, None, (x70₂, Some [0x0 ~> 0x1], (x61₁, Some [0x0 ~> 0xffffffffffffffff], (x62₂, Some [0x0 ~> 0xffffffffffffffff])))) in
  let x72 := x71₂ + x61₂ (* : uint64_t *) in
  let x73 := Z.mul_split(2^64, None, (x5, Some [0x0 ~> 0xffffffffffffffff], (x2[3], Some [0x0 ~> 0xffffffffffffffff]))) in
  let x74 := Z.mul_split(2^64, None, (x5, Some [0x0 ~> 0xffffffffffffffff], (x2[2], Some [0x0 ~> 0xffffffffffffffff]))) in
  let x75 := Z.mul_split(2^64, None, (x5, Some [0x0 ~> 0xffffffffffffffff], (x2[1], Some [0x0 ~> 0xffffffffffffffff]))) in
  let x76 := Z.mul_split(2^64, None, (x5, Some [0x0 ~> 0xffffffffffffffff], (x2[0], Some [0x0 ~> 0xffffffffffffffff]))) in
  let x77 := Z.add_get_carry(2^64, None, (x76₂, Some [0x0 ~> 0xffffffffffffffff], (x75₁, Some [0x0 ~> 0xffffffffffffffff]))) in
  let x78 := Z.add_with_get_carry(2^64, None, (x77₂, Some [0x0 ~> 0x1], (x75₂, Some [0x0 ~> 0xffffffffffffffff], (x74₁, Some [0x0 ~> 0xffffffffffffffff])))) in
  let x79 := Z.add_with_get_carry(2^64, None, (x78₂, Some [0x0 ~> 0x1], (x74₂, Some [0x0 ~> 0xffffffffffffffff], (x73₁, Some [0x0 ~> 0xffffffffffffffff])))) in
  let x80 := x79₂ + x73₂ (* : uint64_t *) in
  let x81 := Z.add_get_carry(2^64, None, (x68₁, Some [0x0 ~> 0xffffffffffffffff], (x76₁, Some [0x0 ~> 0xffffffffffffffff]))) in
  let x82 := Z.add_with_get_carry(2^64, None, (x81₂, Some [0x0 ~> 0x1], (x69₁, Some [0x0 ~> 0xffffffffffffffff], (x77₁, Some [0x0 ~> 0xffffffffffffffff])))) in
  let x83 := Z.add_with_get_carry(2^64, None, (x82₂, Some [0x0 ~> 0x1], (x70₁, Some [0x0 ~> 0xffffffffffffffff], (x78₁, Some [0x0 ~> 0xffffffffffffffff])))) in
  let x84 := Z.add_with_get_carry(2^64, None, (x83₂, Some [0x0 ~> 0x1], (x71₁, Some [0x0 ~> 0xffffffffffffffff], (x79₁, Some [0x0 ~> 0xffffffffffffffff])))) in
  let x85 := Z.add_with_get_carry(2^64, None, (x84₂, Some [0x0 ~> 0x1], (x72, Some [0x0 ~> 0xffffffffffffffff], (x80, Some [0x0 ~> 0xffffffffffffffff])))) in
  let x86 := Z.mul_split(2^64, None, (x81₁, Some [0x0 ~> 0xffffffffffffffff], (0xffffffff00000001, None))) in
  let x87 := Z.mul_split(2^64, None, (x81₁, Some [0x0 ~> 0xffffffffffffffff], (2^32-1, None))) in
  let x88 := Z.mul_split(2^64, None, (x81₁, Some [0x0 ~> 0xffffffffffffffff], (2^64-1, None))) in
  let x89 := Z.add_get_carry(2^64, None, (x88₂, Some [0x0 ~> 0xffffffffffffffff], (x87₁, Some [0x0 ~> 0xffffffffffffffff]))) in
  let x90 := x89₂ + x87₂ (* : uint64_t *) in
  let x91 := Z.add_get_carry(2^64, None, (x81₁, Some [0x0 ~> 0xffffffffffffffff], (x88₁, Some [0x0 ~> 0xffffffffffffffff]))) in
  let x92 := Z.add_with_get_carry(2^64, None, (x91₂, Some [0x0 ~> 0x1], (x82₁, Some [0x0 ~> 0xffffffffffffffff], (x89₁, Some [0x0 ~> 0xffffffffffffffff])))) in
  let x93 := Z.add_with_get_carry(2^64, None, (x92₂, Some [0x0 ~> 0x1], (x83₁, Some [0x0 ~> 0xffffffffffffffff], (x90, Some [0x0 ~> 0xffffffffffffffff])))) in
  let x94 := Z.add_with_get_carry(2^64, None, (x93₂, Some [0x0 ~> 0x1], (x84₁, Some [0x0 ~> 0xffffffffffffffff], (x86₁, Some [0x0 ~> 0xffffffffffffffff])))) in
  let x95 := Z.add_with_get_carry(2^64, None, (x94₂, Some [0x0 ~> 0x1], (x85₁, Some [0x0 ~> 0xffffffffffffffff], (x86₂, Some [0x0 ~> 0xffffffffffffffff])))) in
  let x96 := x95₂ + x85₂ (* : uint64_t *) in
  let x97 := Z.sub_with_get_borrow(2^64, None, (0, None, (x92₁, Some [0x0 ~> 0xffffffffffffffff], (2^64-1, None)))) in
  let x98 := Z.sub_with_get_borrow(2^64, None, (x97₂, Some [0x0 ~> 0x1], (x93₁, Some [0x0 ~> 0xffffffffffffffff], (2^32-1, None)))) in
  let x99 := Z.sub_with_get_borrow(2^64, None, (x98₂, Some [0x0 ~> 0x1], (x94₁, Some [0x0 ~> 0xffffffffffffffff], (0, None)))) in
  let x100 := Z.sub_with_get_borrow(2^64, None, (x99₂, Some [0x0 ~> 0x1], (x95₁, Some [0x0 ~> 0xffffffffffffffff], (0xffffffff00000001, None)))) in
  let x101 := Z.sub_with_get_borrow(2^64, None, (x100₂, Some [0x0 ~> 0x1], (x96, Some [0x0 ~> 0xffffffffffffffff], (0, None)))) in
  let x102 := Z.zselect(x101₂, Some [0x0 ~> 0x1], (x97₁, Some [0x0 ~> 0xffffffffffffffff], (x92₁, Some [0x0 ~> 0xffffffffffffffff]))) (* : uint64_t *) in
  let x103 := Z.zselect(x101₂, Some [0x0 ~> 0x1], (x98₁, Some [0x0 ~> 0xffffffffffffffff], (x93₁, Some [0x0 ~> 0xffffffffffffffff]))) (* : uint64_t *) in
  let x104 := Z.zselect(x101₂, Some [0x0 ~> 0x1], (x99₁, Some [0x0 ~> 0xffffffffffffffff], (x94₁, Some [0x0 ~> 0xffffffffffffffff]))) (* : uint64_t *) in
  let x105 := Z.zselect(x101₂, Some [0x0 ~> 0x1], (x100₁, Some [0x0 ~> 0xffffffffffffffff], (x95₁, Some [0x0 ~> 0xffffffffffffffff]))) (* : uint64_t *) in
  x102 :: x103 :: x104 :: x105 :: []
)

which can be pretty-printed as:
/*
 * Input Bounds:
 *   arg1: [[0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff]]
 *   arg2: [[0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff]]
 * Output Bounds:
 *   out1: None
 */
void f(uint64_t out1[4], const uint64_t arg1[4], const uint64_t arg2[4]) {
  uint64_t x1;
  uint64_t x2;
  uint64_t x3;
  uint64_t x4;
  uint64_t x5;
  uint64_t x6;
  uint64_t x7;
  uint64_t x8;
  uint64_t x9;
  uint64_t x10;
  uint64_t x11;
  uint64_t x12;
  uint64_t x13;
  uint1 x14;
  uint64_t x15;
  uint1 x16;
  uint64_t x17;
  uint1 x18;
  uint64_t x19;
  uint64_t x20;
  uint64_t x21;
  uint64_t x22;
  uint64_t x23;
  uint64_t x24;
  uint64_t x25;
  uint64_t x26;
  uint1 x27;
  uint64_t x28;
  uint64_t x29;
  uint1 x30;
  uint64_t x31;
  uint1 x32;
  uint64_t x33;
  uint1 x34;
  uint64_t x35;
  uint1 x36;
  uint64_t x37;
  uint1 x38;
  uint64_t x39;
  uint64_t x40;
  uint64_t x41;
  uint64_t x42;
  uint64_t x43;
  uint64_t x44;
  uint64_t x45;
  uint64_t x46;
  uint64_t x47;
  uint1 x48;
  uint64_t x49;
  uint1 x50;
  uint64_t x51;
  uint1 x52;
  uint64_t x53;
  uint64_t x54;
  uint1 x55;
  uint64_t x56;
  uint1 x57;
  uint64_t x58;
  uint1 x59;
  uint64_t x60;
  uint1 x61;
  uint64_t x62;
  uint1 x63;
  uint64_t x64;
  uint64_t x65;
  uint64_t x66;
  uint64_t x67;
  uint64_t x68;
  uint64_t x69;
  uint64_t x70;
  uint1 x71;
  uint64_t x72;
  uint64_t x73;
  uint1 x74;
  uint64_t x75;
  uint1 x76;
  uint64_t x77;
  uint1 x78;
  uint64_t x79;
  uint1 x80;
  uint64_t x81;
  uint1 x82;
  uint64_t x83;
  uint64_t x84;
  uint64_t x85;
  uint64_t x86;
  uint64_t x87;
  uint64_t x88;
  uint64_t x89;
  uint64_t x90;
  uint64_t x91;
  uint64_t x92;
  uint1 x93;
  uint64_t x94;
  uint1 x95;
  uint64_t x96;
  uint1 x97;
  uint64_t x98;
  uint64_t x99;
  uint1 x100;
  uint64_t x101;
  uint1 x102;
  uint64_t x103;
  uint1 x104;
  uint64_t x105;
  uint1 x106;
  uint64_t x107;
  uint1 x108;
  uint64_t x109;
  uint64_t x110;
  uint64_t x111;
  uint64_t x112;
  uint64_t x113;
  uint64_t x114;
  uint64_t x115;
  uint1 x116;
  uint64_t x117;
  uint64_t x118;
  uint1 x119;
  uint64_t x120;
  uint1 x121;
  uint64_t x122;
  uint1 x123;
  uint64_t x124;
  uint1 x125;
  uint64_t x126;
  uint1 x127;
  uint64_t x128;
  uint64_t x129;
  uint64_t x130;
  uint64_t x131;
  uint64_t x132;
  uint64_t x133;
  uint64_t x134;
  uint64_t x135;
  uint64_t x136;
  uint64_t x137;
  uint1 x138;
  uint64_t x139;
  uint1 x140;
  uint64_t x141;
  uint1 x142;
  uint64_t x143;
  uint64_t x144;
  uint1 x145;
  uint64_t x146;
  uint1 x147;
  uint64_t x148;
  uint1 x149;
  uint64_t x150;
  uint1 x151;
  uint64_t x152;
  uint1 x153;
  uint64_t x154;
  uint64_t x155;
  uint64_t x156;
  uint64_t x157;
  uint64_t x158;
  uint64_t x159;
  uint64_t x160;
  uint1 x161;
  uint64_t x162;
  uint64_t x163;
  uint1 x164;
  uint64_t x165;
  uint1 x166;
  uint64_t x167;
  uint1 x168;
  uint64_t x169;
  uint1 x170;
  uint64_t x171;
  uint1 x172;
  uint64_t x173;
  uint64_t x174;
  uint1 x175;
  uint64_t x176;
  uint1 x177;
  uint64_t x178;
  uint1 x179;
  uint64_t x180;
  uint1 x181;
  uint64_t x182;
  uint1 x183;
  uint64_t x184;
  uint64_t x185;
  uint64_t x186;
  uint64_t x187;
  x1 = (arg1[1]);
  x2 = (arg1[2]);
  x3 = (arg1[3]);
  x4 = (arg1[0]);
  mulx_u64(&x5, &x6, x4, (arg2[3]));
  mulx_u64(&x7, &x8, x4, (arg2[2]));
  mulx_u64(&x9, &x10, x4, (arg2[1]));
  mulx_u64(&x11, &x12, x4, (arg2[0]));
  addcarryx_u64(&x13, &x14, 0x0, x12, x9);
  addcarryx_u64(&x15, &x16, x14, x10, x7);
  addcarryx_u64(&x17, &x18, x16, x8, x5);
  x19 = (x18 + x6);
  mulx_u64(&x20, &x21, x11, UINT64_C(0xffffffff00000001));
  mulx_u64(&x22, &x23, x11, UINT32_C(0xffffffff));
  mulx_u64(&x24, &x25, x11, UINT64_C(0xffffffffffffffff));
  addcarryx_u64(&x26, &x27, 0x0, x25, x22);
  x28 = (x27 + x23);
  addcarryx_u64(&x29, &x30, 0x0, x11, x24);
  addcarryx_u64(&x31, &x32, x30, x13, x26);
  addcarryx_u64(&x33, &x34, x32, x15, x28);
  addcarryx_u64(&x35, &x36, x34, x17, x20);
  addcarryx_u64(&x37, &x38, x36, x19, x21);
  mulx_u64(&x39, &x40, x1, (arg2[3]));
  mulx_u64(&x41, &x42, x1, (arg2[2]));
  mulx_u64(&x43, &x44, x1, (arg2[1]));
  mulx_u64(&x45, &x46, x1, (arg2[0]));
  addcarryx_u64(&x47, &x48, 0x0, x46, x43);
  addcarryx_u64(&x49, &x50, x48, x44, x41);
  addcarryx_u64(&x51, &x52, x50, x42, x39);
  x53 = (x52 + x40);
  addcarryx_u64(&x54, &x55, 0x0, x31, x45);
  addcarryx_u64(&x56, &x57, x55, x33, x47);
  addcarryx_u64(&x58, &x59, x57, x35, x49);
  addcarryx_u64(&x60, &x61, x59, x37, x51);
  addcarryx_u64(&x62, &x63, x61, x38, x53);
  mulx_u64(&x64, &x65, x54, UINT64_C(0xffffffff00000001));
  mulx_u64(&x66, &x67, x54, UINT32_C(0xffffffff));
  mulx_u64(&x68, &x69, x54, UINT64_C(0xffffffffffffffff));
  addcarryx_u64(&x70, &x71, 0x0, x69, x66);
  x72 = (x71 + x67);
  addcarryx_u64(&x73, &x74, 0x0, x54, x68);
  addcarryx_u64(&x75, &x76, x74, x56, x70);
  addcarryx_u64(&x77, &x78, x76, x58, x72);
  addcarryx_u64(&x79, &x80, x78, x60, x64);
  addcarryx_u64(&x81, &x82, x80, x62, x65);
  x83 = ((uint64_t)x82 + x63);
  mulx_u64(&x84, &x85, x2, (arg2[3]));
  mulx_u64(&x86, &x87, x2, (arg2[2]));
  mulx_u64(&x88, &x89, x2, (arg2[1]));
  mulx_u64(&x90, &x91, x2, (arg2[0]));
  addcarryx_u64(&x92, &x93, 0x0, x91, x88);
  addcarryx_u64(&x94, &x95, x93, x89, x86);
  addcarryx_u64(&x96, &x97, x95, x87, x84);
  x98 = (x97 + x85);
  addcarryx_u64(&x99, &x100, 0x0, x75, x90);
  addcarryx_u64(&x101, &x102, x100, x77, x92);
  addcarryx_u64(&x103, &x104, x102, x79, x94);
  addcarryx_u64(&x105, &x106, x104, x81, x96);
  addcarryx_u64(&x107, &x108, x106, x83, x98);
  mulx_u64(&x109, &x110, x99, UINT64_C(0xffffffff00000001));
  mulx_u64(&x111, &x112, x99, UINT32_C(0xffffffff));
  mulx_u64(&x113, &x114, x99, UINT64_C(0xffffffffffffffff));
  addcarryx_u64(&x115, &x116, 0x0, x114, x111);
  x117 = (x116 + x112);
  addcarryx_u64(&x118, &x119, 0x0, x99, x113);
  addcarryx_u64(&x120, &x121, x119, x101, x115);
  addcarryx_u64(&x122, &x123, x121, x103, x117);
  addcarryx_u64(&x124, &x125, x123, x105, x109);
  addcarryx_u64(&x126, &x127, x125, x107, x110);
  x128 = ((uint64_t)x127 + x108);
  mulx_u64(&x129, &x130, x3, (arg2[3]));
  mulx_u64(&x131, &x132, x3, (arg2[2]));
  mulx_u64(&x133, &x134, x3, (arg2[1]));
  mulx_u64(&x135, &x136, x3, (arg2[0]));
  addcarryx_u64(&x137, &x138, 0x0, x136, x133);
  addcarryx_u64(&x139, &x140, x138, x134, x131);
  addcarryx_u64(&x141, &x142, x140, x132, x129);
  x143 = (x142 + x130);
  addcarryx_u64(&x144, &x145, 0x0, x120, x135);
  addcarryx_u64(&x146, &x147, x145, x122, x137);
  addcarryx_u64(&x148, &x149, x147, x124, x139);
  addcarryx_u64(&x150, &x151, x149, x126, x141);
  addcarryx_u64(&x152, &x153, x151, x128, x143);
  mulx_u64(&x154, &x155, x144, UINT64_C(0xffffffff00000001));
  mulx_u64(&x156, &x157, x144, UINT32_C(0xffffffff));
  mulx_u64(&x158, &x159, x144, UINT64_C(0xffffffffffffffff));
  addcarryx_u64(&x160, &x161, 0x0, x159, x156);
  x162 = (x161 + x157);
  addcarryx_u64(&x163, &x164, 0x0, x144, x158);
  addcarryx_u64(&x165, &x166, x164, x146, x160);
  addcarryx_u64(&x167, &x168, x166, x148, x162);
  addcarryx_u64(&x169, &x170, x168, x150, x154);
  addcarryx_u64(&x171, &x172, x170, x152, x155);
  x173 = ((uint64_t)x172 + x153);
  subborrowx_u64(&x174, &x175, 0x0, x165, UINT64_C(0xffffffffffffffff));
  subborrowx_u64(&x176, &x177, x175, x167, UINT32_C(0xffffffff));
  subborrowx_u64(&x178, &x179, x177, x169, 0x0);
  subborrowx_u64(&x180, &x181, x179, x171, UINT64_C(0xffffffff00000001));
  subborrowx_u64(&x182, &x183, x181, x173, 0x0);
  cmovznz_u64(&x184, x183, x174, x165);
  cmovznz_u64(&x185, x183, x176, x167);
  cmovznz_u64(&x186, x183, x178, x169);
  cmovznz_u64(&x187, x183, x180, x171);
  out1[0] = x184;
  out1[1] = x185;
  out1[2] = x186;
  out1[3] = x187;
}

Assembly:
ecp_nistz256_mul_mont:
;push   rbp
;push   rbx
;push   r12
;push   r13
;push   r14
;push   r15
mov rbx, rdx
mov rax, QWORD PTR [rbx]
mov r9, QWORD PTR [rsi]
mov r10, QWORD PTR [rsi + 0x08 * 1]
mov r11, QWORD PTR [rsi + 0x08 * 2]
mov r12, QWORD PTR [rsi + 0x08 * 3]
mov rbp, rax
mul r9
mov r14, 4294967295
mov r8, rax
mov rax, rbp
mov r9, rdx
mul r10
mov r15, 18446744069414584321
add r9, rax
mov rax, rbp
adc rdx, 0
mov r10, rdx
mul r11
add r10, rax
mov rax, rbp
adc rdx, 0
mov r11, rdx
mul r12
add r11, rax
mov rax, r8
adc rdx, 0
xor r13, r13
mov r12, rdx
mov rbp, r8
shl r8, 32
mul r15
shr rbp, 32
add r9, r8
adc r10, rbp
adc r11, rax
mov rax, QWORD PTR [rbx + 0x08 * 1]
adc r12, rdx
adc r13, 0
xor r8, r8
mov rbp, rax
mul QWORD PTR [rsi]
add r9, rax
mov rax, rbp
adc rdx, 0
mov rcx, rdx
mul QWORD PTR [rsi + 0x08 * 1]
add r10, rcx
adc rdx, 0
add r10, rax
mov rax, rbp
adc rdx, 0
mov rcx, rdx
mul QWORD PTR [rsi + 0x08 * 2]
add r11, rcx
adc rdx, 0
add r11, rax
mov rax, rbp
adc rdx, 0
mov rcx, rdx
mul QWORD PTR [rsi + 0x08 * 3]
add r12, rcx
adc rdx, 0
add r12, rax
mov rax, r9
adc r13, rdx
adc r8, 0
mov rbp, r9
shl r9, 32
mul r15
shr rbp, 32
add r10, r9
adc r11, rbp
adc r12, rax
mov rax, QWORD PTR [rbx + 0x08 * 2]
adc r13, rdx
adc r8, 0
xor r9, r9
mov rbp, rax
mul QWORD PTR [rsi]
add r10, rax
mov rax, rbp
adc rdx, 0
mov rcx, rdx
mul QWORD PTR [rsi + 0x08 * 1]
add r11, rcx
adc rdx, 0
add r11, rax
mov rax, rbp
adc rdx, 0
mov rcx, rdx
mul QWORD PTR [rsi + 0x08 * 2]
add r12, rcx
adc rdx, 0
add r12, rax
mov rax, rbp
adc rdx, 0
mov rcx, rdx
mul QWORD PTR [rsi + 0x08 * 3]
add r13, rcx
adc rdx, 0
add r13, rax
mov rax, r10
adc r8, rdx
adc r9, 0
mov rbp, r10
shl r10, 32
mul r15
shr rbp, 32
add r11, r10
adc r12, rbp
adc r13, rax
mov rax, QWORD PTR [rbx + 0x08 * 3]
adc r8, rdx
adc r9, 0
xor r10, r10
mov rbp, rax
mul QWORD PTR [rsi]
add r11, rax
mov rax, rbp
adc rdx, 0
mov rcx, rdx
mul QWORD PTR [rsi + 0x08 * 1]
add r12, rcx
adc rdx, 0
add r12, rax
mov rax, rbp
adc rdx, 0
mov rcx, rdx
mul QWORD PTR [rsi + 0x08 * 2]
add r13, rcx
adc rdx, 0
add r13, rax
mov rax, rbp
adc rdx, 0
mov rcx, rdx
mul QWORD PTR [rsi + 0x08 * 3]
add r8, rcx
adc rdx, 0
add r8, rax
mov rax, r11
adc r9, rdx
adc r10, 0
mov rbp, r11
shl r11, 32
mul r15
shr rbp, 32
add r12, r11
adc r13, rbp
mov rcx, r12
adc r8, rax
adc r9, rdx
mov rbp, r13
adc r10, 0
sub r12, 18446744073709551615
mov rbx, r8
sbb r13, r14
sbb r8, 0
mov rdx, r9
sbb r9, r15
sbb r10, 0
cmovb r12, rcx
cmovb r13, rbp
mov QWORD PTR [rdi], r12
cmovb r8, rbx
mov QWORD PTR [rdi + 0x08 * 1], r13
cmovb r9, rdx
mov QWORD PTR [rdi + 0x08 * 2], r8
mov QWORD PTR [rdi + 0x08 * 3], r9
;mov    r15,QWORD PTR [rsp]
;mov    r14,QWORD PTR [rsp+0x8]
;mov    r13,QWORD PTR [rsp+0x10]
;mov    r12,QWORD PTR [rsp+0x18]
;mov    rbx,QWORD PTR [rsp+0x20]
;mov    rbp,QWORD PTR [rsp+0x28]
;lea    rsp,[rsp+0x30]
ret

Equivalence checking error:
Unable to unify:
In environment:
(*symbolic_state*) {|
  dag_state :=
(*dag*)[
(*0*) (old 64 0, []);
(*1*) (old 64 1, []);
(*2*) (old 64 2, []);
(*3*) (old 64 3, []);
(*4*) (old 64 4, []);
(*5*) (old 64 5, []);
(*6*) (old 64 6, []);
(*7*) (old 64 7, []);
(*8*) (const 0, []);
(*9*) (const 18446744073709551616, []);
(*10*) (const 64, []);
(*11*) (mulZ, [3, 4]);
(*12*) (mul 64, [3, 4]);
(*13*) (shrZ, [11, 10]);
(*14*) (shr 64, [11, 10]);
(*15*) (mulZ, [3, 5]);
(*16*) (mul 64, [3, 5]);
(*17*) (shrZ, [15, 10]);
(*18*) (shr 64, [15, 10]);
(*19*) (mulZ, [3, 6]);
(*20*) (mul 64, [3, 6]);
(*21*) (shrZ, [19, 10]);
(*22*) (shr 64, [19, 10]);
(*23*) (mulZ, [3, 7]);
(*24*) (mul 64, [3, 7]);
(*25*) (shrZ, [23, 10]);
(*26*) (shr 64, [23, 10]);
(*27*) (add 64, [20, 26]);
(*28*) (addcarryZ 64, [26, 20]);
(*29*) (addcarry 64, [20, 26]);
(*30*) (add 64, [16, 22, 29]);
(*31*) (addcarryZ 64, [29, 22, 16]);
(*32*) (addcarry 64, [16, 22, 29]);
(*33*) (add 64, [12, 18, 32]);
(*34*) (addcarryZ 64, [32, 18, 12]);
(*35*) (addcarry 64, [12, 18, 32]);
(*36*) (addZ, [35, 14]);
(*37*) (add 64, [14, 35]);
(*38*) (const 18446744069414584321, []);
(*39*) (mulZ, [24, 38]);
(*40*) (mul 64, [3, 7, 38]);
(*41*) (shrZ, [39, 10]);
(*42*) (shr 64, [39, 10]);
(*43*) (const 4294967295, []);
(*44*) (mulZ, [24, 43]);
(*45*) (mul 64, [3, 7, 43]);
(*46*) (shrZ, [44, 10]);
(*47*) (shr 64, [44, 10]);
(*48*) (const 18446744073709551615, []);
(*49*) (mulZ, [24, 48]);
(*50*) (mul 64, [3, 7, 48]);
(*51*) (shrZ, [49, 10]);
(*52*) (shr 64, [49, 10]);
(*53*) (add 64, [45, 52]);
(*54*) (addcarryZ 64, [52, 45]);
(*55*) (addcarry 64, [45, 52]);
(*56*) (addZ, [55, 47]);
(*57*) (add 64, [47, 55]);
(*58*) (mul 64, [3, 7, 8]);
(*59*) (add 64, [58]);
(*60*) (addcarryZ 64, [24, 50]);
(*61*) (addcarry 64, [24, 50]);
(*62*) (add 64, [20, 26, 45, 52, 61]);
(*63*) (addcarryZ 64, [61, 27, 53]);
(*64*) (addcarry 64, [27, 53, 61]);
(*65*) (add 64, [16, 22, 29, 47, 55, 64]);
(*66*) (addcarryZ 64, [64, 30, 57]);
(*67*) (addcarry 64, [30, 57, 64]);
(*68*) (add 64, [12, 18, 32, 40, 67]);
(*69*) (addcarryZ 64, [67, 33, 40]);
(*70*) (addcarry 64, [33, 40, 67]);
(*71*) (add 64, [14, 35, 42, 70]);
(*72*) (addcarryZ 64, [70, 37, 42]);
(*73*) (addcarry 64, [37, 42, 70]);
(*74*) (mulZ, [2, 4]);
(*75*) (mul 64, [2, 4]);
(*76*) (shrZ, [74, 10]);
(*77*) (shr 64, [74, 10]);
(*78*) (mulZ, [2, 5]);
(*79*) (mul 64, [2, 5]);
(*80*) (shrZ, [78, 10]);
(*81*) (shr 64, [78, 10]);
(*82*) (mulZ, [2, 6]);
(*83*) (mul 64, [2, 6]);
(*84*) (shrZ, [82, 10]);
(*85*) (shr 64, [82, 10]);
(*86*) (mulZ, [2, 7]);
(*87*) (mul 64, [2, 7]);
(*88*) (shrZ, [86, 10]);
(*89*) (shr 64, [86, 10]);
(*90*) (add 64, [83, 89]);
(*91*) (addcarryZ 64, [89, 83]);
(*92*) (addcarry 64, [83, 89]);
(*93*) (add 64, [79, 85, 92]);
(*94*) (addcarryZ 64, [92, 85, 79]);
(*95*) (addcarry 64, [79, 85, 92]);
(*96*) (add 64, [75, 81, 95]);
(*97*) (addcarryZ 64, [95, 81, 75]);
(*98*) (addcarry 64, [75, 81, 95]);
(*99*) (addZ, [98, 77]);
(*100*) (add 64, [77, 98]);
(*101*) (add 64, [20, 26, 45, 52, 61, 87]);
(*102*) (addcarryZ 64, [62, 87]);
(*103*) (addcarry 64, [62, 87]);
(*104*) (add 64, [16, 22, 29, 47, 55, 64, 83, 89, 103]);
(*105*) (addcarryZ 64, [103, 65, 90]);
(*106*) (addcarry 64, [65, 90, 103]);
(*107*) (add 64, [12, 18, 32, 40, 67, 79, 85, 92, 106]);
(*108*) (addcarryZ 64, [106, 68, 93]);
(*109*) (addcarry 64, [68, 93, 106]);
(*110*) (add 64, [14, 35, 42, 70, 75, 81, 95, 109]);
(*111*) (addcarryZ 64, [109, 71, 96]);
(*112*) (addcarry 64, [71, 96, 109]);
(*113*) (add 64, [73, 77, 98, 112]);
(*114*) (addcarryZ 64, [112, 73, 100]);
(*115*) (addcarry 64, [73, 100, 112]);
(*116*) (mulZ, [38, 101]);
(*117*) (mul 64, [38, 101]);
(*118*) (shrZ, [116, 10]);
(*119*) (shr 64, [116, 10]);
(*120*) (mulZ, [43, 101]);
(*121*) (mul 64, [43, 101]);
(*122*) (shrZ, [120, 10]);
(*123*) (shr 64, [120, 10]);
(*124*) (mulZ, [48, 101]);
(*125*) (mul 64, [48, 101]);
(*126*) (shrZ, [124, 10]);
(*127*) (shr 64, [124, 10]);
(*128*) (add 64, [121, 127]);
(*129*) (addcarryZ 64, [127, 121]);
(*130*) (addcarry 64, [121, 127]);
(*131*) (addZ, [130, 123]);
(*132*) (add 64, [123, 130]);
(*133*) (add 64, [20, 26, 45, 52, 61, 87, 125]);
(*134*) (addcarryZ 64, [101, 125]);
(*135*) (addcarry 64, [101, 125]);
(*136*) (add 64, [16, 22, 29, 47, 55, 64, 83, 89, 103, 121, 127, 135]);
(*137*) (addcarryZ 64, [135, 104, 128]);
(*138*) (addcarry 64, [104, 128, 135]);
(*139*) (add 64, [12, 18, 32, 40, 67, 79, 85, 92, 106, 123, 130, 138]);
(*140*) (addcarryZ 64, [138, 107, 132]);
(*141*) (addcarry 64, [107, 132, 138]);
(*142*) (add 64, [14, 35, 42, 70, 75, 81, 95, 109, 117, 141]);
(*143*) (addcarryZ 64, [141, 110, 117]);
(*144*) (addcarry 64, [110, 117, 141]);
(*145*) (add 64, [73, 77, 98, 112, 119, 144]);
(*146*) (addcarryZ 64, [144, 113, 119]);
(*147*) (addcarry 64, [113, 119, 144]);
(*148*) (addZ, [147, 115]);
(*149*) (add 64, [115, 147]);
(*150*) (mulZ, [1, 4]);
(*151*) (mul 64, [1, 4]);
(*152*) (shrZ, [150, 10]);
(*153*) (shr 64, [150, 10]);
(*154*) (mulZ, [1, 5]);
(*155*) (mul 64, [1, 5]);
(*156*) (shrZ, [154, 10]);
(*157*) (shr 64, [154, 10]);
(*158*) (mulZ, [1, 6]);
(*159*) (mul 64, [1, 6]);
(*160*) (shrZ, [158, 10]);
(*161*) (shr 64, [158, 10]);
(*162*) (mulZ, [1, 7]);
(*163*) (mul 64, [1, 7]);
(*164*) (shrZ, [162, 10]);
(*165*) (shr 64, [162, 10]);
(*166*) (add 64, [159, 165]);
(*167*) (addcarryZ 64, [165, 159]);
(*168*) (addcarry 64, [159, 165]);
(*169*) (add 64, [155, 161, 168]);
(*170*) (addcarryZ 64, [168, 161, 155]);
(*171*) (addcarry 64, [155, 161, 168]);
(*172*) (add 64, [151, 157, 171]);
(*173*) (addcarryZ 64, [171, 157, 151]);
(*174*) (addcarry 64, [151, 157, 171]);
(*175*) (addZ, [174, 153]);
(*176*) (add 64, [153, 174]);
(*177*) (add 64, [16, 22, 29, 47, 55, 64, 83, 89, 103, 121, 127, 135, 163]);
(*178*) (addcarryZ 64, [136, 163]);
(*179*) (addcarry 64, [136, 163]);
(*180*) (add 64, [12, 18, 32, 40, 67, 79, 85, 92, 106, 123, 130, 138, 159, 165, 179]);
(*181*) (addcarryZ 64, [179, 139, 166]);
(*182*) (addcarry 64, [139, 166, 179]);
(*183*) (add 64, [14, 35, 42, 70, 75, 81, 95, 109, 117, 141, 155, 161, 168, 182]);
(*184*) (addcarryZ 64, [182, 142, 169]);
(*185*) (addcarry 64, [142, 169, 182]);
(*186*) (add 64, [73, 77, 98, 112, 119, 144, 151, 157, 171, 185]);
(*187*) (addcarryZ 64, [185, 145, 172]);
(*188*) (addcarry 64, [145, 172, 185]);
(*189*) (add 64, [115, 147, 153, 174, 188]);
(*190*) (addcarryZ 64, [188, 149, 176]);
(*191*) (addcarry 64, [149, 176, 188]);
(*192*) (mulZ, [38, 177]);
(*193*) (mul 64, [38, 177]);
(*194*) (shrZ, [192, 10]);
(*195*) (shr 64, [192, 10]);
(*196*) (mulZ, [43, 177]);
(*197*) (mul 64, [43, 177]);
(*198*) (shrZ, [196, 10]);
(*199*) (shr 64, [196, 10]);
(*200*) (mulZ, [48, 177]);
(*201*) (mul 64, [48, 177]);
(*202*) (shrZ, [200, 10]);
(*203*) (shr 64, [200, 10]);
(*204*) (add 64, [197, 203]);
(*205*) (addcarryZ 64, [203, 197]);
(*206*) (addcarry 64, [197, 203]);
(*207*) (addZ, [206, 199]);
(*208*) (add 64, [199, 206]);
(*209*) (add 64, [16, 22, 29, 47, 55, 64, 83, 89, 103, 121, 127, 135, 163, 201]);
(*210*) (addcarryZ 64, [177, 201]);
(*211*) (addcarry 64, [177, 201]);
(*212*) (add 64, [12, 18, 32, 40, 67, 79, 85, 92, 106, 123, 130, 138, 159, 165, 179, 197, 203, 211]);
(*213*) (addcarryZ 64, [211, 180, 204]);
(*214*) (addcarry 64, [180, 204, 211]);
(*215*) (add 64, [14, 35, 42, 70, 75, 81, 95, 109, 117, 141, 155, 161, 168, 182, 199, 206, 214]);
(*216*) (addcarryZ 64, [214, 183, 208]);
(*217*) (addcarry 64, [183, 208, 214]);
(*218*) (add 64, [73, 77, 98, 112, 119, 144, 151, 157, 171, 185, 193, 217]);
(*219*) (addcarryZ 64, [217, 186, 193]);
(*220*) (addcarry 64, [186, 193, 217]);
(*221*) (add 64, [115, 147, 153, 174, 188, 195, 220]);
(*222*) (addcarryZ 64, [220, 189, 195]);
(*223*) (addcarry 64, [189, 195, 220]);
(*224*) (addZ, [223, 191]);
(*225*) (add 64, [191, 223]);
(*226*) (mulZ, [0, 4]);
(*227*) (mul 64, [0, 4]);
(*228*) (shrZ, [226, 10]);
(*229*) (shr 64, [226, 10]);
(*230*) (mulZ, [0, 5]);
(*231*) (mul 64, [0, 5]);
(*232*) (shrZ, [230, 10]);
(*233*) (shr 64, [230, 10]);
(*234*) (mulZ, [0, 6]);
(*235*) (mul 64, [0, 6]);
(*236*) (shrZ, [234, 10]);
(*237*) (shr 64, [234, 10]);
(*238*) (mulZ, [0, 7]);
(*239*) (mul 64, [0, 7]);
(*240*) (shrZ, [238, 10]);
(*241*) (shr 64, [238, 10]);
(*242*) (add 64, [235, 241]);
(*243*) (addcarryZ 64, [241, 235]);
(*244*) (addcarry 64, [235, 241]);
(*245*) (add 64, [231, 237, 244]);
(*246*) (addcarryZ 64, [244, 237, 231]);
(*247*) (addcarry 64, [231, 237, 244]);
(*248*) (add 64, [227, 233, 247]);
(*249*) (addcarryZ 64, [247, 233, 227]);
(*250*) (addcarry 64, [227, 233, 247]);
(*251*) (addZ, [250, 229]);
(*252*) (add 64, [229, 250]);
(*253*) (add 64, [12, 18, 32, 40, 67, 79, 85, 92, 106, 123, 130, 138, 159, 165, 179, 197, 203, 211, 239]);
(*254*) (addcarryZ 64, [212, 239]);
(*255*) (addcarry 64, [212, 239]);
(*256*) (add 64, [14, 35, 42, 70, 75, 81, 95, 109, 117, 141, 155, 161, 168, 182, 199, 206, 214, 235, 241, 255]);
(*257*) (addcarryZ 64, [255, 215, 242]);
(*258*) (addcarry 64, [215, 242, 255]);
(*259*) (add 64, [73, 77, 98, 112, 119, 144, 151, 157, 171, 185, 193, 217, 231, 237, 244, 258]);
(*260*) (addcarryZ 64, [258, 218, 245]);
(*261*) (addcarry 64, [218, 245, 258]);
(*262*) (add 64, [115, 147, 153, 174, 188, 195, 220, 227, 233, 247, 261]);
(*263*) (addcarryZ 64, [261, 221, 248]);
(*264*) (addcarry 64, [221, 248, 261]);
(*265*) (add 64, [191, 223, 229, 250, 264]);
(*266*) (addcarryZ 64, [264, 225, 252]);
(*267*) (addcarry 64, [225, 252, 264]);
(*268*) (mulZ, [38, 253]);
(*269*) (mul 64, [38, 253]);
(*270*) (shrZ, [268, 10]);
(*271*) (shr 64, [268, 10]);
(*272*) (mulZ, [43, 253]);
(*273*) (mul 64, [43, 253]);
(*274*) (shrZ, [272, 10]);
(*275*) (shr 64, [272, 10]);
(*276*) (mulZ, [48, 253]);
(*277*) (mul 64, [48, 253]);
(*278*) (shrZ, [276, 10]);
(*279*) (shr 64, [276, 10]);
(*280*) (add 64, [273, 279]);
(*281*) (addcarryZ 64, [279, 273]);
(*282*) (addcarry 64, [273, 279]);
(*283*) (addZ, [282, 275]);
(*284*) (add 64, [275, 282]);
(*285*) (add 64, [12, 18, 32, 40, 67, 79, 85, 92, 106, 123, 130, 138, 159, 165, 179, 197, 203, 211, 239, 277]);
(*286*) (addcarryZ 64, [253, 277]);
(*287*) (addcarry 64, [253, 277]);
(*288*) (add 64, [14, 35, 42, 70, 75, 81, 95, 109, 117, 141, 155, 161, 168, 182, 199, 206, 214, 235, 241, 255, 273, 279, 287]);
(*289*) (addcarryZ 64, [287, 256, 280]);
(*290*) (addcarry 64, [256, 280, 287]);
(*291*) (add 64, [73, 77, 98, 112, 119, 144, 151, 157, 171, 185, 193, 217, 231, 237, 244, 258, 275, 282, 290]);
(*292*) (addcarryZ 64, [290, 259, 284]);
(*293*) (addcarry 64, [259, 284, 290]);
(*294*) (add 64, [115, 147, 153, 174, 188, 195, 220, 227, 233, 247, 261, 269, 293]);
(*295*) (addcarryZ 64, [293, 262, 269]);
(*296*) (addcarry 64, [262, 269, 293]);
(*297*) (add 64, [191, 223, 229, 250, 264, 271, 296]);
(*298*) (addcarryZ 64, [296, 265, 271]);
(*299*) (addcarry 64, [265, 271, 296]);
(*300*) (addZ, [299, 267]);
(*301*) (add 64, [267, 299]);
(*302*) (const 1, []);
(*303*) (add 64, [14, 35, 42, 70, 75, 81, 95, 109, 117, 141, 155, 161, 168, 182, 199, 206, 214, 235, 241, 255, 273, 279, 287, 302]);
(*304*) (subborrowZ 64, [288, 48]);
(*305*) (subborrow 64, [288, 48]);
(*306*) (neg 64, [305]);
(*307*) (add 64, [38, 73, 77, 98, 112, 119, 144, 151, 157, 171, 185, 193, 217, 231, 237, 244, 258, 275, 282, 290, 306]);
(*308*) (subborrowZ 64, [291, 43, 305]);
(*309*) (subborrow 64, [291, 43, 305]);
(*310*) (neg 64, [309]);
(*311*) (add 64, [115, 147, 153, 174, 188, 195, 220, 227, 233, 247, 261, 269, 293, 310]);
(*312*) (subborrowZ 64, [294, 309]);
(*313*) (subborrow 64, [294, 309]);
(*314*) (neg 64, [313]);
(*315*) (add 64, [43, 191, 223, 229, 250, 264, 271, 296, 314]);
(*316*) (subborrowZ 64, [297, 38, 313]);
(*317*) (subborrow 64, [297, 38, 313]);
(*318*) (neg 64, [317]);
(*319*) (add 64, [267, 299, 318]);
(*320*) (subborrowZ 64, [301, 317]);
(*321*) (subborrow 64, [301, 317]);
(*322*) (selectznz, [321, 303, 288]);
(*323*) (selectznz, [321, 307, 291]);
(*324*) (selectznz, [321, 311, 294]);
(*325*) (selectznz, [321, 315, 297]);
(*326*) (old 64 326, []);
(*327*) (old 64 327, []);
(*328*) (old 64 328, []);
(*329*) (old 64 329, []);
(*330*) (old 64 330, []);
(*331*) (old 64 331, []);
(*332*) (old 64 332, []);
(*333*) (old 64 333, []);
(*334*) (old 64 334, []);
(*335*) (old 64 335, []);
(*336*) (old 64 336, []);
(*337*) (old 64 337, []);
(*338*) (old 64 338, []);
(*339*) (old 64 339, []);
(*340*) (old 64 340, []);
(*341*) (old 64 341, []);
(*342*) (old 64 342, []);
(*343*) (old 64 343, []);
(*344*) (old 64 344, []);
(*345*) (old 64 345, []);
(*346*) (old 64 346, []);
(*347*) (const 8, []);
(*348*) (add 64, [346, 347]);
(*349*) (const 16, []);
(*350*) (add 64, [346, 349]);
(*351*) (const 24, []);
(*352*) (add 64, [346, 351]);
(*353*) (old 64 353, []);
(*354*) (add 64, [347, 353]);
(*355*) (add 64, [349, 353]);
(*356*) (add 64, [351, 353]);
(*357*) (old 64 357, []);
(*358*) (add 64, [347, 357]);
(*359*) (add 64, [349, 357]);
(*360*) (add 64, [351, 357]);
(*361*) (old 64 361, []);
(*362*) (add 64, [26, 87]);
(*363*) (addcarry 64, [26, 87]);
(*364*) (addoverflow 64, [26, 87]);
(*365*) (add 64, [89, 363]);
(*366*) (addcarry 64, [89, 363]);
(*367*) (addoverflow 64, [89, 363]);
(*368*) (add 64, [89, 163, 363]);
(*369*) (addcarry 64, [163, 365]);
(*370*) (addoverflow 64, [163, 365]);
(*371*) (add 64, [165, 369]);
(*372*) (addcarry 64, [165, 369]);
(*373*) (addoverflow 64, [165, 369]);
(*374*) (add 64, [165, 239, 369]);
(*375*) (addcarry 64, [239, 371]);
(*376*) (addoverflow 64, [239, 371]);
(*377*) (add 64, [241, 375]);
(*378*) (addcarry 64, [241, 375]);
(*379*) (addoverflow 64, [241, 375]);
(*380*) (xorZ, [339, 339]);
(*381*) (const 32, []);
(*382*) (const 63, []);
(*383*) (const 4294967296, []);
(*384*) (mul 64, [3, 7, 383]);
(*385*) (shr 64, [24, 381]);
(*386*) (add 64, [26, 87, 384]);
(*387*) (addcarry 64, [362, 384]);
(*388*) (addoverflow 64, [362, 384]);
(*389*) (add 64, [89, 163, 363, 385, 387]);
(*390*) (addcarry 64, [368, 385, 387]);
(*391*) (addoverflow 64, [368, 385, 387]);
(*392*) (add 64, [40, 165, 239, 369, 390]);
(*393*) (addcarry 64, [40, 374, 390]);
(*394*) (addoverflow 64, [40, 374, 390]);
(*395*) (add 64, [42, 241, 375, 393]);
(*396*) (addcarry 64, [42, 377, 393]);
(*397*) (addoverflow 64, [42, 377, 393]);
(*398*) (xorZ, [384, 384]);
(*399*) (add 64, [20, 26, 87, 384]);
(*400*) (addcarry 64, [20, 386]);
(*401*) (addoverflow 64, [20, 386]);
(*402*) (add 64, [22, 400]);
(*403*) (addcarry 64, [22, 400]);
(*404*) (addoverflow 64, [22, 400]);
(*405*) (add 64, [22, 89, 163, 363, 385, 387, 400]);
(*406*) (addcarry 64, [389, 402]);
(*407*) (addoverflow 64, [389, 402]);
(*408*) (add 64, [85, 406]);
(*409*) (addcarry 64, [85, 406]);
(*410*) (addoverflow 64, [85, 406]);
(*411*) (add 64, [22, 83, 89, 163, 363, 385, 387, 400]);
(*412*) (addcarry 64, [83, 405]);
(*413*) (addoverflow 64, [83, 405]);
(*414*) (add 64, [85, 406, 412]);
(*415*) (addcarry 64, [408, 412]);
(*416*) (addoverflow 64, [408, 412]);
(*417*) (add 64, [40, 85, 165, 239, 369, 390, 406, 412]);
(*418*) (addcarry 64, [392, 414]);
(*419*) (addoverflow 64, [392, 414]);
(*420*) (add 64, [161, 418]);
(*421*) (addcarry 64, [161, 418]);
(*422*) (addoverflow 64, [161, 418]);
(*423*) (add 64, [40, 85, 159, 165, 239, 369, 390, 406, 412]);
(*424*) (addcarry 64, [159, 417]);
(*425*) (addoverflow 64, [159, 417]);
(*426*) (add 64, [161, 418, 424]);
(*427*) (addcarry 64, [420, 424]);
(*428*) (addoverflow 64, [420, 424]);
(*429*) (add 64, [42, 161, 241, 375, 393, 418, 424]);
(*430*) (addcarry 64, [395, 426]);
(*431*) (addoverflow 64, [395, 426]);
(*432*) (add 64, [237, 430]);
(*433*) (addcarry 64, [237, 430]);
(*434*) (addoverflow 64, [237, 430]);
(*435*) (add 64, [42, 161, 235, 241, 375, 393, 418, 424]);
(*436*) (addcarry 64, [235, 429]);
(*437*) (addoverflow 64, [235, 429]);
(*438*) (add 64, [237, 396, 430, 436]);
(*439*) (addcarry 64, [396, 432, 436]);
(*440*) (addoverflow 64, [396, 432, 436]);
(*441*) (mul 64, [383, 399]);
(*442*) (mulZ, [38, 399]);
(*443*) (shrZ, [442, 10]);
(*444*) (mul 64, [38, 399]);
(*445*) (shr 64, [442, 10]);
(*446*) (shr 64, [399, 381]);
(*447*) (add 64, [22, 83, 89, 163, 363, 385, 387, 400, 441]);
(*448*) (addcarry 64, [411, 441]);
(*449*) (addoverflow 64, [411, 441]);
(*450*) (add 64, [40, 85, 159, 165, 239, 369, 390, 406, 412, 446, 448]);
(*451*) (addcarry 64, [423, 446, 448]);
(*452*) (addoverflow 64, [423, 446, 448]);
(*453*) (add 64, [42, 161, 235, 241, 375, 393, 418, 424, 444, 451]);
(*454*) (addcarry 64, [435, 444, 451]);
(*455*) (addoverflow 64, [435, 444, 451]);
(*456*) (add 64, [237, 396, 430, 436, 445, 454]);
(*457*) (addcarry 64, [438, 445, 454]);
(*458*) (addoverflow 64, [438, 445, 454]);
(*459*) (add 64, [439, 457]);
(*460*) (xorZ, [441, 441]);
(*461*) (add 64, [16, 22, 83, 89, 163, 363, 385, 387, 400, 441]);
(*462*) (addcarry 64, [16, 447]);
(*463*) (addoverflow 64, [16, 447]);
(*464*) (add 64, [18, 462]);
(*465*) (addcarry 64, [18, 462]);
(*466*) (addoverflow 64, [18, 462]);
(*467*) (add 64, [18, 40, 85, 159, 165, 239, 369, 390, 406, 412, 446, 448, 462]);
(*468*) (addcarry 64, [450, 464]);
(*469*) (addoverflow 64, [450, 464]);
(*470*) (add 64, [81, 468]);
(*471*) (addcarry 64, [81, 468]);
(*472*) (addoverflow 64, [81, 468]);
(*473*) (add 64, [18, 40, 79, 85, 159, 165, 239, 369, 390, 406, 412, 446, 448, 462]);
(*474*) (addcarry 64, [79, 467]);
(*475*) (addoverflow 64, [79, 467]);
(*476*) (add 64, [81, 468, 474]);
(*477*) (addcarry 64, [470, 474]);
(*478*) (addoverflow 64, [470, 474]);
(*479*) (add 64, [42, 81, 161, 235, 241, 375, 393, 418, 424, 444, 451, 468, 474]);
(*480*) (addcarry 64, [453, 476]);
(*481*) (addoverflow 64, [453, 476]);
(*482*) (add 64, [157, 480]);
(*483*) (addcarry 64, [157, 480]);
(*484*) (addoverflow 64, [157, 480]);
(*485*) (add 64, [42, 81, 155, 161, 235, 241, 375, 393, 418, 424, 444, 451, 468, 474]);
(*486*) (addcarry 64, [155, 479]);
(*487*) (addoverflow 64, [155, 479]);
(*488*) (add 64, [157, 480, 486]);
(*489*) (addcarry 64, [482, 486]);
(*490*) (addoverflow 64, [482, 486]);
(*491*) (add 64, [157, 237, 396, 430, 436, 445, 454, 480, 486]);
(*492*) (addcarry 64, [456, 488]);
(*493*) (addoverflow 64, [456, 488]);
(*494*) (add 64, [233, 492]);
(*495*) (addcarry 64, [233, 492]);
(*496*) (addoverflow 64, [233, 492]);
(*497*) (add 64, [157, 231, 237, 396, 430, 436, 445, 454, 480, 486]);
(*498*) (addcarry 64, [231, 491]);
(*499*) (addoverflow 64, [231, 491]);
(*500*) (add 64, [233, 439, 457, 492, 498]);
(*501*) (addcarry 64, [459, 494, 498]);
(*502*) (addoverflow 64, [459, 494, 498]);
(*503*) (mul 64, [383, 461]);
(*504*) (mulZ, [38, 461]);
(*505*) (shrZ, [504, 10]);
(*506*) (mul 64, [38, 461]);
(*507*) (shr 64, [504, 10]);
(*508*) (shr 64, [461, 381]);
(*509*) (add 64, [18, 40, 79, 85, 159, 165, 239, 369, 390, 406, 412, 446, 448, 462, 503]);
(*510*) (addcarry 64, [473, 503]);
(*511*) (addoverflow 64, [473, 503]);
(*512*) (add 64, [42, 81, 155, 161, 235, 241, 375, 393, 418, 424, 444, 451, 468, 474, 508, 510]);
(*513*) (addcarry 64, [485, 508, 510]);
(*514*) (addoverflow 64, [485, 508, 510]);
(*515*) (add 64, [157, 231, 237, 396, 430, 436, 445, 454, 480, 486, 506, 513]);
(*516*) (addcarry 64, [497, 506, 513]);
(*517*) (addoverflow 64, [497, 506, 513]);
(*518*) (add 64, [233, 439, 457, 492, 498, 507, 516]);
(*519*) (addcarry 64, [500, 507, 516]);
(*520*) (addoverflow 64, [500, 507, 516]);
(*521*) (add 64, [501, 519]);
(*522*) (xorZ, [503, 503]);
(*523*) (add 64, [12, 18, 40, 79, 85, 159, 165, 239, 369, 390, 406, 412, 446, 448, 462, 503]);
(*524*) (addcarry 64, [12, 509]);
(*525*) (addoverflow 64, [12, 509]);
(*526*) (add 64, [14, 524]);
(*527*) (addcarry 64, [14, 524]);
(*528*) (addoverflow 64, [14, 524]);
(*529*) (add 64, [14, 42, 81, 155, 161, 235, 241, 375, 393, 418, 424, 444, 451, 468, 474, 508, 510, 524]);
(*530*) (addcarry 64, [512, 526]);
(*531*) (addoverflow 64, [512, 526]);
(*532*) (add 64, [77, 530]);
(*533*) (addcarry 64, [77, 530]);
(*534*) (addoverflow 64, [77, 530]);
(*535*) (add 64, [14, 42, 75, 81, 155, 161, 235, 241, 375, 393, 418, 424, 444, 451, 468, 474, 508, 510, 524]);
(*536*) (addcarry 64, [75, 529]);
(*537*) (addoverflow 64, [75, 529]);
(*538*) (add 64, [77, 530, 536]);
(*539*) (addcarry 64, [532, 536]);
(*540*) (addoverflow 64, [532, 536]);
(*541*) (add 64, [77, 157, 231, 237, 396, 430, 436, 445, 454, 480, 486, 506, 513, 530, 536]);
(*542*) (addcarry 64, [515, 538]);
(*543*) (addoverflow 64, [515, 538]);
(*544*) (add 64, [153, 542]);
(*545*) (addcarry 64, [153, 542]);
(*546*) (addoverflow 64, [153, 542]);
(*547*) (add 64, [77, 151, 157, 231, 237, 396, 430, 436, 445, 454, 480, 486, 506, 513, 530, 536]);
(*548*) (addcarry 64, [151, 541]);
(*549*) (addoverflow 64, [151, 541]);
(*550*) (add 64, [153, 542, 548]);
(*551*) (addcarry 64, [544, 548]);
(*552*) (addoverflow 64, [544, 548]);
(*553*) (add 64, [153, 233, 439, 457, 492, 498, 507, 516, 542, 548]);
(*554*) (addcarry 64, [518, 550]);
(*555*) (addoverflow 64, [518, 550]);
(*556*) (add 64, [229, 554]);
(*557*) (addcarry 64, [229, 554]);
(*558*) (addoverflow 64, [229, 554]);
(*559*) (add 64, [153, 227, 233, 439, 457, 492, 498, 507, 516, 542, 548]);
(*560*) (addcarry 64, [227, 553]);
(*561*) (addoverflow 64, [227, 553]);
(*562*) (add 64, [229, 501, 519, 554, 560]);
(*563*) (addcarry 64, [521, 556, 560]);
(*564*) (addoverflow 64, [521, 556, 560]);
(*565*) (mul 64, [383, 523]);
(*566*) (mulZ, [38, 523]);
(*567*) (shrZ, [566, 10]);
(*568*) (mul 64, [38, 523]);
(*569*) (shr 64, [566, 10]);
(*570*) (shr 64, [523, 381]);
(*571*) (add 64, [14, 42, 75, 81, 155, 161, 235, 241, 375, 393, 418, 424, 444, 451, 468, 474, 508, 510, 524, 565]);
(*572*) (addcarry 64, [535, 565]);
(*573*) (addoverflow 64, [535, 565]);
(*574*) (add 64, [77, 151, 157, 231, 237, 396, 430, 436, 445, 454, 480, 486, 506, 513, 530, 536, 570, 572]);
(*575*) (addcarry 64, [547, 570, 572]);
(*576*) (addoverflow 64, [547, 570, 572]);
(*577*) (add 64, [153, 227, 233, 439, 457, 492, 498, 507, 516, 542, 548, 568, 575]);
(*578*) (addcarry 64, [559, 568, 575]);
(*579*) (addoverflow 64, [559, 568, 575]);
(*580*) (add 64, [229, 501, 519, 554, 560, 569, 578]);
(*581*) (addcarry 64, [562, 569, 578]);
(*582*) (addoverflow 64, [562, 569, 578]);
(*583*) (add 64, [563, 581]);
(*584*) (add 64, [14, 42, 75, 81, 155, 161, 235, 241, 302, 375, 393, 418, 424, 444, 451, 468, 474, 508, 510, 524, 565]);
(*585*) (subborrow 64, [571, 48]);
(*586*) (neg 64, [585]);
(*587*) (add 64, [38, 77, 151, 157, 231, 237, 396, 430, 436, 445, 454, 480, 486, 506, 513, 530, 536, 570, 572, 586]);
(*588*) (subborrow 64, [574, 43, 585]);
(*589*) (neg 64, [588]);
(*590*) (add 64, [153, 227, 233, 439, 457, 492, 498, 507, 516, 542, 548, 568, 575, 589]);
(*591*) (subborrow 64, [577, 588]);
(*592*) (neg 64, [591]);
(*593*) (add 64, [43, 229, 501, 519, 554, 560, 569, 578, 592]);
(*594*) (subborrow 64, [580, 38, 591]);
(*595*) (neg 64, [594]);
(*596*) (add 64, [563, 581, 595]);
(*597*) (subborrow 64, [583, 594]);
(*598*) (selectznz, [597, 584, 571]);
(*599*) (selectznz, [597, 587, 574]);
(*600*) (selectznz, [597, 590, 577]);
(*601*) (selectznz, [597, 593, 580]);
]
;
  symbolic_reg_state := [(rax, 568), (rcx, 571), (rdx, 580), (rbx, 577), (rsp, 361), (rbp, 574), (rsi, 346), (rdi, 357), (r8, 600), (r9, 601), (r10, 596), (r11, 565), (r12, 598), (r13, 599), (r14, 43), (r15, 38)];
  symbolic_flag_state := (*flag_state*)(CF=Some 597 PF=None AF=None ZF=None SF=None ZF=None OF=None);
  symbolic_mem_state :=
[]
;
|}
Unable to unify: [inr [598, 599, 600, 601]] == [inr [322, 323, 324, 325]]
Could not unify the values at index 0: [#598, #599, #600, #601] ≠ [#322, #323, #324, #325]
index 0: #598#322
(selectznz, [#597, #584, #571]) ≠ (selectznz, [#321, #303, #288])
index 0: #597#321
(subborrow 64, [#583, #594]) ≠ (subborrow 64, [#301, #317])
index 0: #583#301
(add 64, [#563, #581]) ≠ (add 64, [#267, #299])
index 0: #563#267
(addcarry 64, [#521, #556, #560]) ≠ (addcarry 64, [#225, #252, #264])
index 0: #521#225
(add 64, [#501, #519]) ≠ (add 64, [#191, #223])
index 0: #501#191
(addcarry 64, [#459, #494, #498]) ≠ (addcarry 64, [#149, #176, #188])
index 0: #459#149
(add 64, [#439, #457]) ≠ (add 64, [#115, #147])
index 0: #439#115
(addcarry 64, [#396, #432, #436]) ≠ (addcarry 64, [#73, #100, #112])
index 0: #396#73
(addcarry 64, [#42, #377, #393]) ≠ (addcarry 64, [#37, #42, #70])
index 1: #377#37
(add 64, [#241, #375]) ≠ (add 64, [#14, #35])
index 0: #241#14
(shr 64, [#238, #10]) ≠ (shr 64, [#11, #10])
index 0: #238#11
(mulZ, [#0, #7]) ≠ (mulZ, [#3, #4])
index 0: #0 ≠ #3
(old 64 0, []) ≠ (old 64 3, [])
(old 64 0, []) ≠ (old 64 3, [])
Operation mismatch: old 64 0 ≠ old 64 3
0 is a special value no longer present in the symbolic machine state at the end of execution.
3 is a special value no longer present in the symbolic machine state at the end of execution.

Fatal error: exception Failure("Synthesis failed")
```
WIP bounds
This reverts commit e4dea33.
I guess we need some way to deal with
`(addcarry₆₄, [((#3 *₆₄ #7) >>₆₄ 32), (addcarry₆₄, [(#20 +₆₄ #26), (#3 *₆₄ #7 *₆₄ 2^32)])])`
≠
`(addcarry₆₄, [(((#3 *₆₄ #7) *ℤ 2^32-1) >>₆₄ 64), (addcarry₆₄, [(#3 *₆₄ #7 *₆₄ 2^32-1), (((#3 *₆₄ #7) *ℤ 2^64-1) >>₆₄ 64)]), (addcarry₆₄, [(#20 +₆₄ #26), ((#3 *₆₄ #7 *₆₄ 2^32-1) +₆₄ (((#3 *₆₄ #7) *ℤ 2^64-1) >>₆₄ 64)), (addcarry₆₄, [(#3 *₆₄ #7), (#3 *₆₄ #7 *₆₄ 2^64-1)])])])`

```
check_args
/* Autogenerated: 'src/ExtractionOCaml/word_by_word_montgomery' p256 64 '2^256 - 2^224 + 2^192 + 2^96 - 1' mul --no-wide-int --shiftr-avoid-uint1 --hints-file 'fiat-amd64/boringssl_intel_manual_mul_p256.asm' */
/* curve description: p256 */
/* machine_wordsize = 64 (from "64") */
/* requested operations: mul */
/* m = 0xffffffff00000001000000000000000000000000ffffffffffffffffffffffff (from "2^256 - 2^224 + 2^192 + 2^96 - 1") */
/*                                                                    */
/* NOTE: In addition to the bounds specified above each function, all */
/*   functions synthesized for this Montgomery arithmetic require the */
/*   input to be strictly less than the prime modulus (m), and also   */
/*   require the input to be in the unique saturated representation.  */
/*   All functions also ensure that these two properties are true of  */
/*   return values.                                                   */
/*  */
/* Computed values: */
/*   eval z = z[0] + (z[1] << 64) + (z[2] << 128) + (z[3] << 192) */
/*   bytes_eval z = z[0] + (z[1] << 8) + (z[2] << 16) + (z[3] << 24) + (z[4] << 32) + (z[5] << 40) + (z[6] << 48) + (z[7] << 56) + (z[8] << 64) + (z[9] << 72) + (z[10] << 80) + (z[11] << 88) + (z[12] << 96) + (z[13] << 104) + (z[14] << 112) + (z[15] << 120) + (z[16] << 128) + (z[17] << 136) + (z[18] << 144) + (z[19] << 152) + (z[20] << 160) + (z[21] << 168) + (z[22] << 176) + (z[23] << 184) + (z[24] << 192) + (z[25] << 200) + (z[26] << 208) + (z[27] << 216) + (z[28] << 224) + (z[29] << 232) + (z[30] << 240) + (z[31] << 248) */
/*   twos_complement_eval z = let x1 := z[0] + (z[1] << 64) + (z[2] << 128) + (z[3] << 192) in */
/*                            if x1 & (2^256-1) < 2^255 then x1 & (2^256-1) else (x1 & (2^256-1)) - 2^256 */

#include <stdint.h>
#if defined(__GNUC__) || defined(__clang__)
#  define FIAT_P256_FIAT_INLINE __inline__
#else
#  define FIAT_P256_FIAT_INLINE
#endif

#if (-1 & 3) != 3
#error "This code only works on a two's complement system"
#endif

After rewriting PartialEvaluate:
(λ x1 x2,
  let x3 := x1[1] in
  let x4 := x1[2] in
  let x5 := x1[3] in
  let x6 := x1[0] in
  let x7 := Z.mul_split((2^64), (0, x2[3])) in
  let x8 := Z.mul_split((2^64), (0, x2[2])) in
  let x9 := Z.mul_split((2^64), (0, x2[1])) in
  let x10 := Z.mul_split((2^64), (0, x2[0])) in
  let x11 := Z.mul_split((2^64), (0, x2[3])) in
  let x12 := Z.mul_split((2^64), (0, x2[2])) in
  let x13 := Z.mul_split((2^64), (0, x2[1])) in
  let x14 := Z.mul_split((2^64), (0, x2[0])) in
  let x15 := Z.mul_split((2^64), (0, x2[3])) in
  let x16 := Z.mul_split((2^64), (0, x2[2])) in
  let x17 := Z.mul_split((2^64), (0, x2[1])) in
  let x18 := Z.mul_split((2^64), (0, x2[0])) in
  let x19 := Z.mul_split((2^64), (x6, x2[3])) in
  let x20 := Z.mul_split((2^64), (x6, x2[2])) in
  let x21 := Z.mul_split((2^64), (x6, x2[1])) in
  let x22 := Z.mul_split((2^64), (x6, x2[0])) in
  let x23 := 2^192 * x7₂ in
  let x24 := 2^128 * x7₁ in
  let x25 := 2^128 * x8₂ in
  let x26 := 2^64 * x8₁ in
  let x27 := 2^64 * x9₂ in
  let x28 := 1 * x9₁ in
  let x29 := 1 * x10₂ in
  let x30 := 1 * x10₁ in
  let x31 := 2^128 * x11₂ in
  let x32 := 2^64 * x11₁ in
  let x33 := 2^64 * x12₂ in
  let x34 := 1 * x12₁ in
  let x35 := 1 * x13₂ in
  let x36 := 1 * x13₁ in
  let x37 := 1 * x14₂ in
  let x38 := 1 * x14₁ in
  let x39 := 2^64 * x15₂ in
  let x40 := 1 * x15₁ in
  let x41 := 1 * x16₂ in
  let x42 := 1 * x16₁ in
  let x43 := 1 * x17₂ in
  let x44 := 1 * x17₁ in
  let x45 := 1 * x18₂ in
  let x46 := 1 * x18₁ in
  let x47 := 1 * x19₂ in
  let x48 := 1 * x19₁ in
  let x49 := 1 * x20₂ in
  let x50 := 1 * x20₁ in
  let x51 := 1 * x21₂ in
  let x52 := 1 * x21₁ in
  let x53 := 1 * x22₂ in
  let x54 := 1 * x22₁ in
  let x55 := Z.add_with_get_carry((2^64), (0, (x54, 0))) in
  let x56 := Z.add_with_get_carry((2^64), (x55₂, (x53, 0))) in
  let x57 := Z.add_with_get_carry((2^64), (x56₂, (x51, 0))) in
  let x58 := Z.add_with_get_carry((2^64), (x57₂, (x49, 0))) in
  let x59 := Z.add_with_get_carry((2^64), (x58₂, (x47, x23))) in
  let x60 := Z.add_with_get_carry((2^64), (0, (x55₁, 0))) in
  let x61 := Z.add_with_get_carry((2^64), (x60₂, (x56₁, 0))) in
  let x62 := Z.add_with_get_carry((2^64), (x61₂, (x57₁, 0))) in
  let x63 := Z.add_with_get_carry((2^64), (x62₂, (x58₁, 0))) in
  let x64 := Z.add_with_get_carry((2^64), (x63₂, (x59₁, x24))) in
  let x65 := Z.add_with_get_carry((2^64), (0, (x60₁, 0))) in
  let x66 := Z.add_with_get_carry((2^64), (x65₂, (x61₁, 0))) in
  let x67 := Z.add_with_get_carry((2^64), (x66₂, (x62₁, 0))) in
  let x68 := Z.add_with_get_carry((2^64), (x67₂, (x63₁, 0))) in
  let x69 := Z.add_with_get_carry((2^64), (x68₂, (x64₁, x25))) in
  let x70 := Z.add_with_get_carry((2^64), (0, (x65₁, 0))) in
  let x71 := Z.add_with_get_carry((2^64), (x70₂, (x66₁, 0))) in
  let x72 := Z.add_with_get_carry((2^64), (x71₂, (x67₁, 0))) in
  let x73 := Z.add_with_get_carry((2^64), (x72₂, (x68₁, 0))) in
  let x74 := Z.add_with_get_carry((2^64), (x73₂, (x69₁, x26))) in
  let x75 := Z.add_with_get_carry((2^64), (0, (x70₁, 0))) in
  let x76 := Z.add_with_get_carry((2^64), (x75₂, (x71₁, 0))) in
  let x77 := Z.add_with_get_carry((2^64), (x76₂, (x72₁, 0))) in
  let x78 := Z.add_with_get_carry((2^64), (x77₂, (x73₁, 0))) in
  let x79 := Z.add_with_get_carry((2^64), (x78₂, (x74₁, x27))) in
  let x80 := Z.add_with_get_carry((2^64), (0, (x75₁, 0))) in
  let x81 := Z.add_with_get_carry((2^64), (x80₂, (x76₁, 0))) in
  let x82 := Z.add_with_get_carry((2^64), (x81₂, (x77₁, 0))) in
  let x83 := Z.add_with_get_carry((2^64), (x82₂, (x78₁, 0))) in
  let x84 := Z.add_with_get_carry((2^64), (x83₂, (x79₁, x28))) in
  let x85 := Z.add_with_get_carry((2^64), (0, (x80₁, 0))) in
  let x86 := Z.add_with_get_carry((2^64), (x85₂, (x81₁, 0))) in
  let x87 := Z.add_with_get_carry((2^64), (x86₂, (x82₁, 0))) in
  let x88 := Z.add_with_get_carry((2^64), (x87₂, (x83₁, 0))) in
  let x89 := Z.add_with_get_carry((2^64), (x88₂, (x84₁, x29))) in
  let x90 := Z.add_with_get_carry((2^64), (0, (x85₁, 0))) in
  let x91 := Z.add_with_get_carry((2^64), (x90₂, (x86₁, 0))) in
  let x92 := Z.add_with_get_carry((2^64), (x91₂, (x87₁, 0))) in
  let x93 := Z.add_with_get_carry((2^64), (x92₂, (x88₁, 0))) in
  let x94 := Z.add_with_get_carry((2^64), (x93₂, (x89₁, x31))) in
  let x95 := Z.add_with_get_carry((2^64), (0, (x90₁, 0))) in
  let x96 := Z.add_with_get_carry((2^64), (x95₂, (x91₁, 0))) in
  let x97 := Z.add_with_get_carry((2^64), (x96₂, (x92₁, 0))) in
  let x98 := Z.add_with_get_carry((2^64), (x97₂, (x93₁, 0))) in
  let x99 := Z.add_with_get_carry((2^64), (x98₂, (x94₁, x32))) in
  let x100 := Z.add_with_get_carry((2^64), (0, (x95₁, 0))) in
  let x101 := Z.add_with_get_carry((2^64), (x100₂, (x96₁, 0))) in
  let x102 := Z.add_with_get_carry((2^64), (x101₂, (x97₁, 0))) in
  let x103 := Z.add_with_get_carry((2^64), (x102₂, (x98₁, x30))) in
  let x104 := Z.add_with_get_carry((2^64), (x103₂, (x99₁, x33))) in
  let x105 := Z.add_with_get_carry((2^64), (0, (x100₁, 0))) in
  let x106 := Z.add_with_get_carry((2^64), (x105₂, (x101₁, 0))) in
  let x107 := Z.add_with_get_carry((2^64), (x106₂, (x102₁, 0))) in
  let x108 := Z.add_with_get_carry((2^64), (x107₂, (x103₁, x36))) in
  let x109 := Z.add_with_get_carry((2^64), (x108₂, (x104₁, x34))) in
  let x110 := Z.add_with_get_carry((2^64), (0, (x105₁, 0))) in
  let x111 := Z.add_with_get_carry((2^64), (x110₂, (x106₁, 0))) in
  let x112 := Z.add_with_get_carry((2^64), (x111₂, (x107₁, x38))) in
  let x113 := Z.add_with_get_carry((2^64), (x112₂, (x108₁, x37))) in
  let x114 := Z.add_with_get_carry((2^64), (x113₂, (x109₁, x35))) in
  let x115 := Z.add_with_get_carry((2^64), (0, (x110₁, 0))) in
  let x116 := Z.add_with_get_carry((2^64), (x115₂, (x111₁, 0))) in
  let x117 := Z.add_with_get_carry((2^64), (x116₂, (x112₁, x44))) in
  let x118 := Z.add_with_get_carry((2^64), (x117₂, (x113₁, x42))) in
  let x119 := Z.add_with_get_carry((2^64), (x118₂, (x114₁, x39))) in
  let x120 := Z.add_with_get_carry((2^64), (0, (x115₁, 0))) in
  let x121 := Z.add_with_get_carry((2^64), (x120₂, (x116₁, x46))) in
  let x122 := Z.add_with_get_carry((2^64), (x121₂, (x117₁, x45))) in
  let x123 := Z.add_with_get_carry((2^64), (x122₂, (x118₁, x43))) in
  let x124 := Z.add_with_get_carry((2^64), (x123₂, (x119₁, x40))) in
  let x125 := Z.add_with_get_carry((2^64), (0, (x120₁, 0))) in
  let x126 := Z.add_with_get_carry((2^64), (x125₂, (x121₁, x52))) in
  let x127 := Z.add_with_get_carry((2^64), (x126₂, (x122₁, x50))) in
  let x128 := Z.add_with_get_carry((2^64), (x127₂, (x123₁, x48))) in
  let x129 := Z.add_with_get_carry((2^64), (x128₂, (x124₁, x41))) in
  let x130 := Z.add_with_get_carry((2^64), (0, (0, x125₁))) in
  let x131 := Z.add_with_get_carry((2^64), (x130₂, (0, x126₁))) in
  let x132 := Z.add_with_get_carry((2^64), (x131₂, (0, x127₁))) in
  let x133 := Z.add_with_get_carry((2^64), (x132₂, (0, x128₁))) in
  let x134 := Z.add_with_get_carry((2^64), (x133₂, (0, x129₁))) in
  let x135 := 0 + x134₂ in
  let x136 := (Z.mul_split((2^64), (x130₁, 1)))₁ in
  let x137 := Z.mul_split((2^64), (x136, 0xffffffff00000001)) in
  let x138 := Z.mul_split((2^64), (x136, 0)) in
  let x139 := Z.mul_split((2^64), (x136, (2^32-1))) in
  let x140 := Z.mul_split((2^64), (x136, (2^64-1))) in
  let x141 := 1 * x137₂ in
  let x142 := 1 * x137₁ in
  let x143 := 1 * x138₂ in
  let x144 := 1 * x138₁ in
  let x145 := 1 * x139₂ in
  let x146 := 1 * x139₁ in
  let x147 := 1 * x140₂ in
  let x148 := 1 * x140₁ in
  let x149 := Z.add_with_get_carry((2^64), (0, (x148, 0))) in
  let x150 := Z.add_with_get_carry((2^64), (x149₂, (x147, 0))) in
  let x151 := Z.add_with_get_carry((2^64), (x150₂, (x145, 0))) in
  let x152 := Z.add_with_get_carry((2^64), (x151₂, (x143, 0))) in
  let x153 := Z.add_with_get_carry((2^64), (x152₂, (x141, 0))) in
  let x154 := Z.add_with_get_carry((2^64), (0, (x149₁, 0))) in
  let x155 := Z.add_with_get_carry((2^64), (x154₂, (x150₁, 0))) in
  let x156 := Z.add_with_get_carry((2^64), (x155₂, (x151₁, 0))) in
  let x157 := Z.add_with_get_carry((2^64), (x156₂, (x152₁, 0))) in
  let x158 := Z.add_with_get_carry((2^64), (x157₂, (x153₁, 0))) in
  let x159 := Z.add_with_get_carry((2^64), (0, (x154₁, 0))) in
  let x160 := Z.add_with_get_carry((2^64), (x159₂, (x155₁, 0))) in
  let x161 := Z.add_with_get_carry((2^64), (x160₂, (x156₁, 0))) in
  let x162 := Z.add_with_get_carry((2^64), (x161₂, (x157₁, 0))) in
  let x163 := Z.add_with_get_carry((2^64), (x162₂, (x158₁, 0))) in
  let x164 := Z.add_with_get_carry((2^64), (0, (x159₁, 0))) in
  let x165 := Z.add_with_get_carry((2^64), (x164₂, (x160₁, 0))) in
  let x166 := Z.add_with_get_carry((2^64), (x165₂, (x161₁, 0))) in
  let x167 := Z.add_with_get_carry((2^64), (x166₂, (x162₁, 0))) in
  let x168 := Z.add_with_get_carry((2^64), (x167₂, (x163₁, 0))) in
  let x169 := Z.add_with_get_carry((2^64), (0, (x164₁, 0))) in
  let x170 := Z.add_with_get_carry((2^64), (x169₂, (x165₁, 0))) in
  let x171 := Z.add_with_get_carry((2^64), (x170₂, (x166₁, 0))) in
  let x172 := Z.add_with_get_carry((2^64), (x171₂, (x167₁, 0))) in
  let x173 := Z.add_with_get_carry((2^64), (x172₂, (x168₁, 0))) in
  let x174 := Z.add_with_get_carry((2^64), (0, (x169₁, 0))) in
  let x175 := Z.add_with_get_carry((2^64), (x174₂, (x170₁, 0))) in
  let x176 := Z.add_with_get_carry((2^64), (x175₂, (x171₁, 0))) in
  let x177 := Z.add_with_get_carry((2^64), (x176₂, (x172₁, 0))) in
  let x178 := Z.add_with_get_carry((2^64), (x177₂, (x173₁, 0))) in
  let x179 := Z.add_with_get_carry((2^64), (0, (x174₁, 0))) in
  let x180 := Z.add_with_get_carry((2^64), (x179₂, (x175₁, 0))) in
  let x181 := Z.add_with_get_carry((2^64), (x180₂, (x176₁, 0))) in
  let x182 := Z.add_with_get_carry((2^64), (x181₂, (x177₁, 0))) in
  let x183 := Z.add_with_get_carry((2^64), (x182₂, (x178₁, 0))) in
  let x184 := Z.add_with_get_carry((2^64), (0, (x179₁, 0))) in
  let x185 := Z.add_with_get_carry((2^64), (x184₂, (x180₁, 0))) in
  let x186 := Z.add_with_get_carry((2^64), (x185₂, (x181₁, 0))) in
  let x187 := Z.add_with_get_carry((2^64), (x186₂, (x182₁, 0))) in
  let x188 := Z.add_with_get_carry((2^64), (x187₂, (x183₁, 0))) in
  let x189 := Z.add_with_get_carry((2^64), (0, (x184₁, 0))) in
  let x190 := Z.add_with_get_carry((2^64), (x189₂, (x185₁, 0))) in
  let x191 := Z.add_with_get_carry((2^64), (x190₂, (x186₁, 0))) in
  let x192 := Z.add_with_get_carry((2^64), (x191₂, (x187₁, 0))) in
  let x193 := Z.add_with_get_carry((2^64), (x192₂, (x188₁, 0))) in
  let x194 := Z.add_with_get_carry((2^64), (0, (x189₁, 0))) in
  let x195 := Z.add_with_get_carry((2^64), (x194₂, (x190₁, 0))) in
  let x196 := Z.add_with_get_carry((2^64), (x195₂, (x191₁, 0))) in
  let x197 := Z.add_with_get_carry((2^64), (x196₂, (x192₁, 0))) in
  let x198 := Z.add_with_get_carry((2^64), (x197₂, (x193₁, 0))) in
  let x199 := Z.add_with_get_carry((2^64), (0, (x194₁, 0))) in
  let x200 := Z.add_with_get_carry((2^64), (x199₂, (x195₁, 0))) in
  let x201 := Z.add_with_get_carry((2^64), (x200₂, (x196₁, 0))) in
  let x202 := Z.add_with_get_carry((2^64), (x201₂, (x197₁, 0))) in
  let x203 := Z.add_with_get_carry((2^64), (x202₂, (x198₁, 0))) in
  let x204 := Z.add_with_get_carry((2^64), (0, (x199₁, 0))) in
  let x205 := Z.add_with_get_carry((2^64), (x204₂, (x200₁, 0))) in
  let x206 := Z.add_with_get_carry((2^64), (x205₂, (x201₁, 0))) in
  let x207 := Z.add_with_get_carry((2^64), (x206₂, (x202₁, 0))) in
  let x208 := Z.add_with_get_carry((2^64), (x207₂, (x203₁, 0))) in
  let x209 := Z.add_with_get_carry((2^64), (0, (x204₁, 0))) in
  let x210 := Z.add_with_get_carry((2^64), (x209₂, (x205₁, 0))) in
  let x211 := Z.add_with_get_carry((2^64), (x210₂, (x206₁, 0))) in
  let x212 := Z.add_with_get_carry((2^64), (x211₂, (x207₁, 0))) in
  let x213 := Z.add_with_get_carry((2^64), (x212₂, (x208₁, 0))) in
  let x214 := Z.add_with_get_carry((2^64), (0, (x209₁, 0))) in
  let x215 := Z.add_with_get_carry((2^64), (x214₂, (x210₁, 0))) in
  let x216 := Z.add_with_get_carry((2^64), (x215₂, (x211₁, 0))) in
  let x217 := Z.add_with_get_carry((2^64), (x216₂, (x212₁, 0))) in
  let x218 := Z.add_with_get_carry((2^64), (x217₂, (x213₁, 0))) in
  let x219 := Z.add_with_get_carry((2^64), (0, (x214₁, 0))) in
  let x220 := Z.add_with_get_carry((2^64), (x219₂, (x215₁, x146))) in
  let x221 := Z.add_with_get_carry((2^64), (x220₂, (x216₁, x144))) in
  let x222 := Z.add_with_get_carry((2^64), (x221₂, (x217₁, x142))) in
  let x223 := Z.add_with_get_carry((2^64), (x222₂, (x218₁, 0))) in
  let x224 := Z.add_with_get_carry((2^64), (0, (x130₁, x219₁))) in
  let x225 := Z.add_with_get_carry((2^64), (x224₂, (x131₁, x220₁))) in
  let x226 := Z.add_with_get_carry((2^64), (x225₂, (x132₁, x221₁))) in
  let x227 := Z.add_with_get_carry((2^64), (x226₂, (x133₁, x222₁))) in
  let x228 := Z.add_with_get_carry((2^64), (x227₂, (x134₁, x223₁))) in
  let x229 := Z.add_with_get_carry((2^64), (x228₂, (x135, 0))) in
  let x230 := Z.mul_split((2^64), (0, x2[3])) in
  let x231 := Z.mul_split((2^64), (0, x2[2])) in
  let x232 := Z.mul_split((2^64), (0, x2[1])) in
  let x233 := Z.mul_split((2^64), (0, x2[0])) in
  let x234 := Z.mul_split((2^64), (0, x2[3])) in
  let x235 := Z.mul_split((2^64), (0, x2[2])) in
  let x236 := Z.mul_split((2^64), (0, x2[1])) in
  let x237 := Z.mul_split((2^64), (0, x2[0])) in
  let x238 := Z.mul_split((2^64), (0, x2[3])) in
  let x239 := Z.mul_split((2^64), (0, x2[2])) in
  let x240 := Z.mul_split((2^64), (0, x2[1])) in
  let x241 := Z.mul_split((2^64), (0, x2[0])) in
  let x242 := Z.mul_split((2^64), (x3, x2[3])) in
  let x243 := Z.mul_split((2^64), (x3, x2[2])) in
  let x244 := Z.mul_split((2^64), (x3, x2[1])) in
  let x245 := Z.mul_split((2^64), (x3, x2[0])) in
  let x246 := 2^192 * x230₂ in
  let x247 := 2^128 * x230₁ in
  let x248 := 2^128 * x231₂ in
  let x249 := 2^64 * x231₁ in
  let x250 := 2^64 * x232₂ in
  let x251 := 1 * x232₁ in
  let x252 := 1 * x233₂ in
  let x253 := 1 * x233₁ in
  let x254 := 2^128 * x234₂ in
  let x255 := 2^64 * x234₁ in
  let x256 := 2^64 * x235₂ in
  let x257 := 1 * x235₁ in
  let x258 := 1 * x236₂ in
  let x259 := 1 * x236₁ in
  let x260 := 1 * x237₂ in
  let x261 := 1 * x237₁ in
  let x262 := 2^64 * x238₂ in
  let x263 := 1 * x238₁ in
  let x264 := 1 * x239₂ in
  let x265 := 1 * x239₁ in
  let x266 := 1 * x240₂ in
  let x267 := 1 * x240₁ in
  let x268 := 1 * x241₂ in
  let x269 := 1 * x241₁ in
  let x270 := 1 * x242₂ in
  let x271 := 1 * x242₁ in
  let x272 := 1 * x243₂ in
  let x273 := 1 * x243₁ in
  let x274 := 1 * x244₂ in
  let x275 := 1 * x244₁ in
  let x276 := 1 * x245₂ in
  let x277 := 1 * x245₁ in
  let x278 := Z.add_with_get_carry((2^64), (0, (x277, 0))) in
  let x279 := Z.add_with_get_carry((2^64), (x278₂, (x276, 0))) in
  let x280 := Z.add_with_get_carry((2^64), (x279₂, (x274, 0))) in
  let x281 := Z.add_with_get_carry((2^64), (x280₂, (x272, 0))) in
  let x282 := Z.add_with_get_carry((2^64), (x281₂, (x270, x246))) in
  let x283 := Z.add_with_get_carry((2^64), (0, (x278₁, 0))) in
  let x284 := Z.add_with_get_carry((2^64), (x283₂, (x279₁, 0))) in
  let x285 := Z.add_with_get_carry((2^64), (x284₂, (x280₁, 0))) in
  let x286 := Z.add_with_get_carry((2^64), (x285₂, (x281₁, 0))) in
  let x287 := Z.add_with_get_carry((2^64), (x286₂, (x282₁, x247))) in
  let x288 := Z.add_with_get_carry((2^64), (0, (x283₁, 0))) in
  let x289 := Z.add_with_get_carry((2^64), (x288₂, (x284₁, 0))) in
  let x290 := Z.add_with_get_carry((2^64), (x289₂, (x285₁, 0))) in
  let x291 := Z.add_with_get_carry((2^64), (x290₂, (x286₁, 0))) in
  let x292 := Z.add_with_get_carry((2^64), (x291₂, (x287₁, x248))) in
  let x293 := Z.add_with_get_carry((2^64), (0, (x288₁, 0))) in
  let x294 := Z.add_with_get_carry((2^64), (x293₂, (x289₁, 0))) in
  let x295 := Z.add_with_get_carry((2^64), (x294₂, (x290₁, 0))) in
  let x296 := Z.add_with_get_carry((2^64), (x295₂, (x291₁, 0))) in
  let x297 := Z.add_with_get_carry((2^64), (x296₂, (x292₁, x249))) in
  let x298 := Z.add_with_get_carry((2^64), (0, (x293₁, 0))) in
  let x299 := Z.add_with_get_carry((2^64), (x298₂, (x294₁, 0))) in
  let x300 := Z.add_with_get_carry((2^64), (x299₂, (x295₁, 0))) in
  let x301 := Z.add_with_get_carry((2^64), (x300₂, (x296₁, 0))) in
  let x302 := Z.add_with_get_carry((2^64), (x301₂, (x297₁, x250))) in
  let x303 := Z.add_with_get_carry((2^64), (0, (x298₁, 0))) in
  let x304 := Z.add_with_get_carry((2^64), (x303₂, (x299₁, 0))) in
  let x305 := Z.add_with_get_carry((2^64), (x304₂, (x300₁, 0))) in
  let x306 := Z.add_with_get_carry((2^64), (x305₂, (x301₁, 0))) in
  let x307 := Z.add_with_get_carry((2^64), (x306₂, (x302₁, x251))) in
  let x308 := Z.add_with_get_carry((2^64), (0, (x303₁, 0))) in
  let x309 := Z.add_with_get_carry((2^64), (x308₂, (x304₁, 0))) in
  let x310 := Z.add_with_get_carry((2^64), (x309₂, (x305₁, 0))) in
  let x311 := Z.add_with_get_carry((2^64), (x310₂, (x306₁, 0))) in
  let x312 := Z.add_with_get_carry((2^64), (x311₂, (x307₁, x252))) in
  let x313 := Z.add_with_get_carry((2^64), (0, (x308₁, 0))) in
  let x314 := Z.add_with_get_carry((2^64), (x313₂, (x309₁, 0))) in
  let x315 := Z.add_with_get_carry((2^64), (x314₂, (x310₁, 0))) in
  let x316 := Z.add_with_get_carry((2^64), (x315₂, (x311₁, 0))) in
  let x317 := Z.add_with_get_carry((2^64), (x316₂, (x312₁, x254))) in
  let x318 := Z.add_with_get_carry((2^64), (0, (x313₁, 0))) in
  let x319 := Z.add_with_get_carry((2^64), (x318₂, (x314₁, 0))) in
  let x320 := Z.add_with_get_carry((2^64), (x319₂, (x315₁, 0))) in
  let x321 := Z.add_with_get_carry((2^64), (x320₂, (x316₁, 0))) in
  let x322 := Z.add_with_get_carry((2^64), (x321₂, (x317₁, x255))) in
  let x323 := Z.add_with_get_carry((2^64), (0, (x318₁, 0))) in
  let x324 := Z.add_with_get_carry((2^64), (x323₂, (x319₁, 0))) in
  let x325 := Z.add_with_get_carry((2^64), (x324₂, (x320₁, 0))) in
  let x326 := Z.add_with_get_carry((2^64), (x325₂, (x321₁, x253))) in
  let x327 := Z.add_with_get_carry((2^64), (x326₂, (x322₁, x256))) in
  let x328 := Z.add_with_get_carry((2^64), (0, (x323₁, 0))) in
  let x329 := Z.add_with_get_carry((2^64), (x328₂, (x324₁, 0))) in
  let x330 := Z.add_with_get_carry((2^64), (x329₂, (x325₁, 0))) in
  let x331 := Z.add_with_get_carry((2^64), (x330₂, (x326₁, x259))) in
  let x332 := Z.add_with_get_carry((2^64), (x331₂, (x327₁, x257))) in
  let x333 := Z.add_with_get_carry((2^64), (0, (x328₁, 0))) in
  let x334 := Z.add_with_get_carry((2^64), (x333₂, (x329₁, 0))) in
  let x335 := Z.add_with_get_carry((2^64), (x334₂, (x330₁, x261))) in
  let x336 := Z.add_with_get_carry((2^64), (x335₂, (x331₁, x260))) in
  let x337 := Z.add_with_get_carry((2^64), (x336₂, (x332₁, x258))) in
  let x338 := Z.add_with_get_carry((2^64), (0, (x333₁, 0))) in
  let x339 := Z.add_with_get_carry((2^64), (x338₂, (x334₁, 0))) in
  let x340 := Z.add_with_get_carry((2^64), (x339₂, (x335₁, x267))) in
  let x341 := Z.add_with_get_carry((2^64), (x340₂, (x336₁, x265))) in
  let x342 := Z.add_with_get_carry((2^64), (x341₂, (x337₁, x262))) in
  let x343 := Z.add_with_get_carry((2^64), (0, (x338₁, 0))) in
  let x344 := Z.add_with_get_carry((2^64), (x343₂, (x339₁, x269))) in
  let x345 := Z.add_with_get_carry((2^64), (x344₂, (x340₁, x268))) in
  let x346 := Z.add_with_get_carry((2^64), (x345₂, (x341₁, x266))) in
  let x347 := Z.add_with_get_carry((2^64), (x346₂, (x342₁, x263))) in
  let x348 := Z.add_with_get_carry((2^64), (0, (x343₁, 0))) in
  let x349 := Z.add_with_get_carry((2^64), (x348₂, (x344₁, x275))) in
  let x350 := Z.add_with_get_carry((2^64), (x349₂, (x345₁, x273))) in
  let x351 := Z.add_with_get_carry((2^64), (x350₂, (x346₁, x271))) in
  let x352 := Z.add_with_get_carry((2^64), (x351₂, (x347₁, x264))) in
  let x353 := Z.add_with_get_carry((2^64), (0, (x225₁, x348₁))) in
  let x354 := Z.add_with_get_carry((2^64), (x353₂, (x226₁, x349₁))) in
  let x355 := Z.add_with_get_carry((2^64), (x354₂, (x227₁, x350₁))) in
  let x356 := Z.add_with_get_carry((2^64), (x355₂, (x228₁, x351₁))) in
  let x357 := Z.add_with_get_carry((2^64), (x356₂, (x229₁, x352₁))) in
  let x358 := 0 + x357₂ in
  let x359 := (Z.mul_split((2^64), (x353₁, 1)))₁ in
  let x360 := Z.mul_split((2^64), (x359, 0xffffffff00000001)) in
  let x361 := Z.mul_split((2^64), (x359, 0)) in
  let x362 := Z.mul_split((2^64), (x359, (2^32-1))) in
  let x363 := Z.mul_split((2^64), (x359, (2^64-1))) in
  let x364 := 1 * x360₂ in
  let x365 := 1 * x360₁ in
  let x366 := 1 * x361₂ in
  let x367 := 1 * x361₁ in
  let x368 := 1 * x362₂ in
  let x369 := 1 * x362₁ in
  let x370 := 1 * x363₂ in
  let x371 := 1 * x363₁ in
  let x372 := Z.add_with_get_carry((2^64), (0, (x371, 0))) in
  let x373 := Z.add_with_get_carry((2^64), (x372₂, (x370, 0))) in
  let x374 := Z.add_with_get_carry((2^64), (x373₂, (x368, 0))) in
  let x375 := Z.add_with_get_carry((2^64), (x374₂, (x366, 0))) in
  let x376 := Z.add_with_get_carry((2^64), (x375₂, (x364, 0))) in
  let x377 := Z.add_with_get_carry((2^64), (0, (x372₁, 0))) in
  let x378 := Z.add_with_get_carry((2^64), (x377₂, (x373₁, 0))) in
  let x379 := Z.add_with_get_carry((2^64), (x378₂, (x374₁, 0))) in
  let x380 := Z.add_with_get_carry((2^64), (x379₂, (x375₁, 0))) in
  let x381 := Z.add_with_get_carry((2^64), (x380₂, (x376₁, 0))) in
  let x382 := Z.add_with_get_carry((2^64), (0, (x377₁, 0))) in
  let x383 := Z.add_with_get_carry((2^64), (x382₂, (x378₁, 0))) in
  let x384 := Z.add_with_get_carry((2^64), (x383₂, (x379₁, 0))) in
  let x385 := Z.add_with_get_carry((2^64), (x384₂, (x380₁, 0))) in
  let x386 := Z.add_with_get_carry((2^64), (x385₂, (x381₁, 0))) in
  let x387 := Z.add_with_get_carry((2^64), (0, (x382₁, 0))) in
  let x388 := Z.add_with_get_carry((2^64), (x387₂, (x383₁, 0))) in
  let x389 := Z.add_with_get_carry((2^64), (x388₂, (x384₁, 0))) in
  let x390 := Z.add_with_get_carry((2^64), (x389₂, (x385₁, 0))) in
  let x391 := Z.add_with_get_carry((2^64), (x390₂, (x386₁, 0))) in
  let x392 := Z.add_with_get_carry((2^64), (0, (x387₁, 0))) in
  let x393 := Z.add_with_get_carry((2^64), (x392₂, (x388₁, 0))) in
  let x394 := Z.add_with_get_carry((2^64), (x393₂, (x389₁, 0))) in
  let x395 := Z.add_with_get_carry((2^64), (x394₂, (x390₁, 0))) in
  let x396 := Z.add_with_get_carry((2^64), (x395₂, (x391₁, 0))) in
  let x397 := Z.add_with_get_carry((2^64), (0, (x392₁, 0))) in
  let x398 := Z.add_with_get_carry((2^64), (x397₂, (x393₁, 0))) in
  let x399 := Z.add_with_get_carry((2^64), (x398₂, (x394₁, 0))) in
  let x400 := Z.add_with_get_carry((2^64), (x399₂, (x395₁, 0))) in
  let x401 := Z.add_with_get_carry((2^64), (x400₂, (x396₁, 0))) in
  let x402 := Z.add_with_get_carry((2^64), (0, (x397₁, 0))) in
  let x403 := Z.add_with_get_carry((2^64), (x402₂, (x398₁, 0))) in
  let x404 := Z.add_with_get_carry((2^64), (x403₂, (x399₁, 0))) in
  let x405 := Z.add_with_get_carry((2^64), (x404₂, (x400₁, 0))) in
  let x406 := Z.add_with_get_carry((2^64), (x405₂, (x401₁, 0))) in
  let x407 := Z.add_with_get_carry((2^64), (0, (x402₁, 0))) in
  let x408 := Z.add_with_get_carry((2^64), (x407₂, (x403₁, 0))) in
  let x409 := Z.add_with_get_carry((2^64), (x408₂, (x404₁, 0))) in
  let x410 := Z.add_with_get_carry((2^64), (x409₂, (x405₁, 0))) in
  let x411 := Z.add_with_get_carry((2^64), (x410₂, (x406₁, 0))) in
  let x412 := Z.add_with_get_carry((2^64), (0, (x407₁, 0))) in
  let x413 := Z.add_with_get_carry((2^64), (x412₂, (x408₁, 0))) in
  let x414 := Z.add_with_get_carry((2^64), (x413₂, (x409₁, 0))) in
  let x415 := Z.add_with_get_carry((2^64), (x414₂, (x410₁, 0))) in
  let x416 := Z.add_with_get_carry((2^64), (x415₂, (x411₁, 0))) in
  let x417 := Z.add_with_get_carry((2^64), (0, (x412₁, 0))) in
  let x418 := Z.add_with_get_carry((2^64), (x417₂, (x413₁, 0))) in
  let x419 := Z.add_with_get_carry((2^64), (x418₂, (x414₁, 0))) in
  let x420 := Z.add_with_get_carry((2^64), (x419₂, (x415₁, 0))) in
  let x421 := Z.add_with_get_carry((2^64), (x420₂, (x416₁, 0))) in
  let x422 := Z.add_with_get_carry((2^64), (0, (x417₁, 0))) in
  let x423 := Z.add_with_get_carry((2^64), (x422₂, (x418₁, 0))) in
  let x424 := Z.add_with_get_carry((2^64), (x423₂, (x419₁, 0))) in
  let x425 := Z.add_with_get_carry((2^64), (x424₂, (x420₁, 0))) in
  let x426 := Z.add_with_get_carry((2^64), (x425₂, (x421₁, 0))) in
  let x427 := Z.add_with_get_carry((2^64), (0, (x422₁, 0))) in
  let x428 := Z.add_with_get_carry((2^64), (x427₂, (x423₁, 0))) in
  let x429 := Z.add_with_get_carry((2^64), (x428₂, (x424₁, 0))) in
  let x430 := Z.add_with_get_carry((2^64), (x429₂, (x425₁, 0))) in
  let x431 := Z.add_with_get_carry((2^64), (x430₂, (x426₁, 0))) in
  let x432 := Z.add_with_get_carry((2^64), (0, (x427₁, 0))) in
  let x433 := Z.add_with_get_carry((2^64), (x432₂, (x428₁, 0))) in
  let x434 := Z.add_with_get_carry((2^64), (x433₂, (x429₁, 0))) in
  let x435 := Z.add_with_get_carry((2^64), (x434₂, (x430₁, 0))) in
  let x436 := Z.add_with_get_carry((2^64), (x435₂, (x431₁, 0))) in
  let x437 := Z.add_with_get_carry((2^64), (0, (x432₁, 0))) in
  let x438 := Z.add_with_get_carry((2^64), (x437₂, (x433₁, 0))) in
  let x439 := Z.add_with_get_carry((2^64), (x438₂, (x434₁, 0))) in
  let x440 := Z.add_with_get_carry((2^64), (x439₂, (x435₁, 0))) in
  let x441 := Z.add_with_get_carry((2^64), (x440₂, (x436₁, 0))) in
  let x442 := Z.add_with_get_carry((2^64), (0, (x437₁, 0))) in
  let x443 := Z.add_with_get_carry((2^64), (x442₂, (x438₁, x369))) in
  let x444 := Z.add_with_get_carry((2^64), (x443₂, (x439₁, x367))) in
  let x445 := Z.add_with_get_carry((2^64), (x444₂, (x440₁, x365))) in
  let x446 := Z.add_with_get_carry((2^64), (x445₂, (x441₁, 0))) in
  let x447 := Z.add_with_get_carry((2^64), (0, (x353₁, x442₁))) in
  let x448 := Z.add_with_get_carry((2^64), (x447₂, (x354₁, x443₁))) in
  let x449 := Z.add_with_get_carry((2^64), (x448₂, (x355₁, x444₁))) in
  let x450 := Z.add_with_get_carry((2^64), (x449₂, (x356₁, x445₁))) in
  let x451 := Z.add_with_get_carry((2^64), (x450₂, (x357₁, x446₁))) in
  let x452 := Z.add_with_get_carry((2^64), (x451₂, (x358, 0))) in
  let x453 := Z.mul_split((2^64), (0, x2[3])) in
  let x454 := Z.mul_split((2^64), (0, x2[2])) in
  let x455 := Z.mul_split((2^64), (0, x2[1])) in
  let x456 := Z.mul_split((2^64), (0, x2[0])) in
  let x457 := Z.mul_split((2^64), (0, x2[3])) in
  let x458 := Z.mul_split((2^64), (0, x2[2])) in
  let x459 := Z.mul_split((2^64), (0, x2[1])) in
  let x460 := Z.mul_split((2^64), (0, x2[0])) in
  let x461 := Z.mul_split((2^64), (0, x2[3])) in
  let x462 := Z.mul_split((2^64), (0, x2[2])) in
  let x463 := Z.mul_split((2^64), (0, x2[1])) in
  let x464 := Z.mul_split((2^64), (0, x2[0])) in
  let x465 := Z.mul_split((2^64), (x4, x2[3])) in
  let x466 := Z.mul_split((2^64), (x4, x2[2])) in
  let x467 := Z.mul_split((2^64), (x4, x2[1])) in
  let x468 := Z.mul_split((2^64), (x4, x2[0])) in
  let x469 := 2^192 * x453₂ in
  let x470 := 2^128 * x453₁ in
  let x471 := 2^128 * x454₂ in
  let x472 := 2^64 * x454₁ in
  let x473 := 2^64 * x455₂ in
  let x474 := 1 * x455₁ in
  let x475 := 1 * x456₂ in
  let x476 := 1 * x456₁ in
  let x477 := 2^128 * x457₂ in
  let x478 := 2^64 * x457₁ in
  let x479 := 2^64 * x458₂ in
  let x480 := 1 * x458₁ in
  let x481 := 1 * x459₂ in
  let x482 := 1 * x459₁ in
  let x483 := 1 * x460₂ in
  let x484 := 1 * x460₁ in
  let x485 := 2^64 * x461₂ in
  let x486 := 1 * x461₁ in
  let x487 := 1 * x462₂ in
  let x488 := 1 * x462₁ in
  let x489 := 1 * x463₂ in
  let x490 := 1 * x463₁ in
  let x491 := 1 * x464₂ in
  let x492 := 1 * x464₁ in
  let x493 := 1 * x465₂ in
  let x494 := 1 * x465₁ in
  let x495 := 1 * x466₂ in
  let x496 := 1 * x466₁ in
  let x497 := 1 * x467₂ in
  let x498 := 1 * x467₁ in
  let x499 := 1 * x468₂ in
  let x500 := 1 * x468₁ in
  let x501 := Z.add_with_get_carry((2^64), (0, (x500, 0))) in
  let x502 := Z.add_with_get_carry((2^64), (x501₂, (x499, 0))) in
  let x503 := Z.add_with_get_carry((2^64), (x502₂, (x497, 0))) in
  let x504 := Z.add_with_get_carry((2^64), (x503₂, (x495, 0))) in
  let x505 := Z.add_with_get_carry((2^64), (x504₂, (x493, x469))) in
  let x506 := Z.add_with_get_carry((2^64), (0, (x501₁, 0))) in
  let x507 := Z.add_with_get_carry((2^64), (x506₂, (x502₁, 0))) in
  let x508 := Z.add_with_get_carry((2^64), (x507₂, (x503₁, 0))) in
  let x509 := Z.add_with_get_carry((2^64), (x508₂, (x504₁, 0))) in
  let x510 := Z.add_with_get_carry((2^64), (x509₂, (x505₁, x470))) in
  let x511 := Z.add_with_get_carry((2^64), (0, (x506₁, 0))) in
  let x512 := Z.add_with_get_carry((2^64), (x511₂, (x507₁, 0))) in
  let x513 := Z.add_with_get_carry((2^64), (x512₂, (x508₁, 0))) in
  let x514 := Z.add_with_get_carry((2^64), (x513₂, (x509₁, 0))) in
  let x515 := Z.add_with_get_carry((2^64), (x514₂, (x510₁, x471))) in
  let x516 := Z.add_with_get_carry((2^64), (0, (x511₁, 0))) in
  let x517 := Z.add_with_get_carry((2^64), (x516₂, (x512₁, 0))) in
  let x518 := Z.add_with_get_carry((2^64), (x517₂, (x513₁, 0))) in
  let x519 := Z.add_with_get_carry((2^64), (x518₂, (x514₁, 0))) in
  let x520 := Z.add_with_get_carry((2^64), (x519₂, (x515₁, x472))) in
  let x521 := Z.add_with_get_carry((2^64), (0, (x516₁, 0))) in
  let x522 := Z.add_with_get_carry((2^64), (x521₂, (x517₁, 0))) in
  let x523 := Z.add_with_get_carry((2^64), (x522₂, (x518₁, 0))) in
  let x524 := Z.add_with_get_carry((2^64), (x523₂, (x519₁, 0))) in
  let x525 := Z.add_with_get_carry((2^64), (x524₂, (x520₁, x473))) in
  let x526 := Z.add_with_get_carry((2^64), (0, (x521₁, 0))) in
  let x527 := Z.add_with_get_carry((2^64), (x526₂, (x522₁, 0))) in
  let x528 := Z.add_with_get_carry((2^64), (x527₂, (x523₁, 0))) in
  let x529 := Z.add_with_get_carry((2^64), (x528₂, (x524₁, 0))) in
  let x530 := Z.add_with_get_carry((2^64), (x529₂, (x525₁, x474))) in
  let x531 := Z.add_with_get_carry((2^64), (0, (x526₁, 0))) in
  let x532 := Z.add_with_get_carry((2^64), (x531₂, (x527₁, 0))) in
  let x533 := Z.add_with_get_carry((2^64), (x532₂, (x528₁, 0))) in
  let x534 := Z.add_with_get_carry((2^64), (x533₂, (x529₁, 0))) in
  let x535 := Z.add_with_get_carry((2^64), (x534₂, (x530₁, x475))) in
  let x536 := Z.add_with_get_carry((2^64), (0, (x531₁, 0))) in
  let x537 := Z.add_with_get_carry((2^64), (x536₂, (x532₁, 0))) in
  let x538 := Z.add_with_get_carry((2^64), (x537₂, (x533₁, 0))) in
  let x539 := Z.add_with_get_carry((2^64), (x538₂, (x534₁, 0))) in
  let x540 := Z.add_with_get_carry((2^64), (x539₂, (x535₁, x477))) in
  let x541 := Z.add_with_get_carry((2^64), (0, (x536₁, 0))) in
  let x542 := Z.add_with_get_carry((2^64), (x541₂, (x537₁, 0))) in
  let x543 := Z.add_with_get_carry((2^64), (x542₂, (x538₁, 0))) in
  let x544 := Z.add_with_get_carry((2^64), (x543₂, (x539₁, 0))) in
  let x545 := Z.add_with_get_carry((2^64), (x544₂, (x540₁, x478))) in
  let x546 := Z.add_with_get_carry((2^64), (0, (x541₁, 0))) in
  let x547 := Z.add_with_get_carry((2^64), (x546₂, (x542₁, 0))) in
  let x548 := Z.add_with_get_carry((2^64), (x547₂, (x543₁, 0))) in
  let x549 := Z.add_with_get_carry((2^64), (x548₂, (x544₁, x476))) in
  let x550 := Z.add_with_get_carry((2^64), (x549₂, (x545₁, x479))) in
  let x551 := Z.add_with_get_carry((2^64), (0, (x546₁, 0))) in
  let x552 := Z.add_with_get_carry((2^64), (x551₂, (x547₁, 0))) in
  let x553 := Z.add_with_get_carry((2^64), (x552₂, (x548₁, 0))) in
  let x554 := Z.add_with_get_carry((2^64), (x553₂, (x549₁, x482))) in
  let x555 := Z.add_with_get_carry((2^64), (x554₂, (x550₁, x480))) in
  let x556 := Z.add_with_get_carry((2^64), (0, (x551₁, 0))) in
  let x557 := Z.add_with_get_carry((2^64), (x556₂, (x552₁, 0))) in
  let x558 := Z.add_with_get_carry((2^64), (x557₂, (x553₁, x484))) in
  let x559 := Z.add_with_get_carry((2^64), (x558₂, (x554₁, x483))) in
  let x560 := Z.add_with_get_carry((2^64), (x559₂, (x555₁, x481))) in
  let x561 := Z.add_with_get_carry((2^64), (0, (x556₁, 0))) in
  let x562 := Z.add_with_get_carry((2^64), (x561₂, (x557₁, 0))) in
  let x563 := Z.add_with_get_carry((2^64), (x562₂, (x558₁, x490))) in
  let x564 := Z.add_with_get_carry((2^64), (x563₂, (x559₁, x488))) in
  let x565 := Z.add_with_get_carry((2^64), (x564₂, (x560₁, x485))) in
  let x566 := Z.add_with_get_carry((2^64), (0, (x561₁, 0))) in
  let x567 := Z.add_with_get_carry((2^64), (x566₂, (x562₁, x492))) in
  let x568 := Z.add_with_get_carry((2^64), (x567₂, (x563₁, x491))) in
  let x569 := Z.add_with_get_carry((2^64), (x568₂, (x564₁, x489))) in
  let x570 := Z.add_with_get_carry((2^64), (x569₂, (x565₁, x486))) in
  let x571 := Z.add_with_get_carry((2^64), (0, (x566₁, 0))) in
  let x572 := Z.add_with_get_carry((2^64), (x571₂, (x567₁, x498))) in
  let x573 := Z.add_with_get_carry((2^64), (x572₂, (x568₁, x496))) in
  let x574 := Z.add_with_get_carry((2^64), (x573₂, (x569₁, x494))) in
  let x575 := Z.add_with_get_carry((2^64), (x574₂, (x570₁, x487))) in
  let x576 := Z.add_with_get_carry((2^64), (0, (x448₁, x571₁))) in
  let x577 := Z.add_with_get_carry((2^64), (x576₂, (x449₁, x572₁))) in
  let x578 := Z.add_with_get_carry((2^64), (x577₂, (x450₁, x573₁))) in
  let x579 := Z.add_with_get_carry((2^64), (x578₂, (x451₁, x574₁))) in
  let x580 := Z.add_with_get_carry((2^64), (x579₂, (x452₁, x575₁))) in
  let x581 := 0 + x580₂ in
  let x582 := (Z.mul_split((2^64), (x576₁, 1)))₁ in
  let x583 := Z.mul_split((2^64), (x582, 0xffffffff00000001)) in
  let x584 := Z.mul_split((2^64), (x582, 0)) in
  let x585 := Z.mul_split((2^64), (x582, (2^32-1))) in
  let x586 := Z.mul_split((2^64), (x582, (2^64-1))) in
  let x587 := 1 * x583₂ in
  let x588 := 1 * x583₁ in
  let x589 := 1 * x584₂ in
  let x590 := 1 * x584₁ in
  let x591 := 1 * x585₂ in
  let x592 := 1 * x585₁ in
  let x593 := 1 * x586₂ in
  let x594 := 1 * x586₁ in
  let x595 := Z.add_with_get_carry((2^64), (0, (x594, 0))) in
  let x596 := Z.add_with_get_carry((2^64), (x595₂, (x593, 0))) in
  let x597 := Z.add_with_get_carry((2^64), (x596₂, (x591, 0))) in
  let x598 := Z.add_with_get_carry((2^64), (x597₂, (x589, 0))) in
  let x599 := Z.add_with_get_carry((2^64), (x598₂, (x587, 0))) in
  let x600 := Z.add_with_get_carry((2^64), (0, (x595₁, 0))) in
  let x601 := Z.add_with_get_carry((2^64), (x600₂, (x596₁, 0))) in
  let x602 := Z.add_with_get_carry((2^64), (x601₂, (x597₁, 0))) in
  let x603 := Z.add_with_get_carry((2^64), (x602₂, (x598₁, 0))) in
  let x604 := Z.add_with_get_carry((2^64), (x603₂, (x599₁, 0))) in
  let x605 := Z.add_with_get_carry((2^64), (0, (x600₁, 0))) in
  let x606 := Z.add_with_get_carry((2^64), (x605₂, (x601₁, 0))) in
  let x607 := Z.add_with_get_carry((2^64), (x606₂, (x602₁, 0))) in
  let x608 := Z.add_with_get_carry((2^64), (x607₂, (x603₁, 0))) in
  let x609 := Z.add_with_get_carry((2^64), (x608₂, (x604₁, 0))) in
  let x610 := Z.add_with_get_carry((2^64), (0, (x605₁, 0))) in
  let x611 := Z.add_with_get_carry((2^64), (x610₂, (x606₁, 0))) in
  let x612 := Z.add_with_get_carry((2^64), (x611₂, (x607₁, 0))) in
  let x613 := Z.add_with_get_carry((2^64), (x612₂, (x608₁, 0))) in
  let x614 := Z.add_with_get_carry((2^64), (x613₂, (x609₁, 0))) in
  let x615 := Z.add_with_get_carry((2^64), (0, (x610₁, 0))) in
  let x616 := Z.add_with_get_carry((2^64), (x615₂, (x611₁, 0))) in
  let x617 := Z.add_with_get_carry((2^64), (x616₂, (x612₁, 0))) in
  let x618 := Z.add_with_get_carry((2^64), (x617₂, (x613₁, 0))) in
  let x619 := Z.add_with_get_carry((2^64), (x618₂, (x614₁, 0))) in
  let x620 := Z.add_with_get_carry((2^64), (0, (x615₁, 0))) in
  let x621 := Z.add_with_get_carry((2^64), (x620₂, (x616₁, 0))) in
  let x622 := Z.add_with_get_carry((2^64), (x621₂, (x617₁, 0))) in
  let x623 := Z.add_with_get_carry((2^64), (x622₂, (x618₁, 0))) in
  let x624 := Z.add_with_get_carry((2^64), (x623₂, (x619₁, 0))) in
  let x625 := Z.add_with_get_carry((2^64), (0, (x620₁, 0))) in
  let x626 := Z.add_with_get_carry((2^64), (x625₂, (x621₁, 0))) in
  let x627 := Z.add_with_get_carry((2^64), (x626₂, (x622₁, 0))) in
  let x628 := Z.add_with_get_carry((2^64), (x627₂, (x623₁, 0))) in
  let x629 := Z.add_with_get_carry((2^64), (x628₂, (x624₁, 0))) in
  let x630 := Z.add_with_get_carry((2^64), (0, (x625₁, 0))) in
  let x631 := Z.add_with_get_carry((2^64), (x630₂, (x626₁, 0))) in
  let x632 := Z.add_with_get_carry((2^64), (x631₂, (x627₁, 0))) in
  let x633 := Z.add_with_get_carry((2^64), (x632₂, (x628₁, 0))) in
  let x634 := Z.add_with_get_carry((2^64), (x633₂, (x629₁, 0))) in
  let x635 := Z.add_with_get_carry((2^64), (0, (x630₁, 0))) in
  let x636 := Z.add_with_get_carry((2^64), (x635₂, (x631₁, 0))) in
  let x637 := Z.add_with_get_carry((2^64), (x636₂, (x632₁, 0))) in
  let x638 := Z.add_with_get_carry((2^64), (x637₂, (x633₁, 0))) in
  let x639 := Z.add_with_get_carry((2^64), (x638₂, (x634₁, 0))) in
  let x640 := Z.add_with_get_carry((2^64), (0, (x635₁, 0))) in
  let x641 := Z.add_with_get_carry((2^64), (x640₂, (x636₁, 0))) in
  let x642 := Z.add_with_get_carry((2^64), (x641₂, (x637₁, 0))) in
  let x643 := Z.add_with_get_carry((2^64), (x642₂, (x638₁, 0))) in
  let x644 := Z.add_with_get_carry((2^64), (x643₂, (x639₁, 0))) in
  let x645 := Z.add_with_get_carry((2^64), (0, (x640₁, 0))) in
  let x646 := Z.add_with_get_carry((2^64), (x645₂, (x641₁, 0))) in
  let x647 := Z.add_with_get_carry((2^64), (x646₂, (x642₁, 0))) in
  let x648 := Z.add_with_get_carry((2^64), (x647₂, (x643₁, 0))) in
  let x649 := Z.add_with_get_carry((2^64), (x648₂, (x644₁, 0))) in
  let x650 := Z.add_with_get_carry((2^64), (0, (x645₁, 0))) in
  let x651 := Z.add_with_get_carry((2^64), (x650₂, (x646₁, 0))) in
  let x652 := Z.add_with_get_carry((2^64), (x651₂, (x647₁, 0))) in
  let x653 := Z.add_with_get_carry((2^64), (x652₂, (x648₁, 0))) in
  let x654 := Z.add_with_get_carry((2^64), (x653₂, (x649₁, 0))) in
  let x655 := Z.add_with_get_carry((2^64), (0, (x650₁, 0))) in
  let x656 := Z.add_with_get_carry((2^64), (x655₂, (x651₁, 0))) in
  let x657 := Z.add_with_get_carry((2^64), (x656₂, (x652₁, 0))) in
  let x658 := Z.add_with_get_carry((2^64), (x657₂, (x653₁, 0))) in
  let x659 := Z.add_with_get_carry((2^64), (x658₂, (x654₁, 0))) in
  let x660 := Z.add_with_get_carry((2^64), (0, (x655₁, 0))) in
  let x661 := Z.add_with_get_carry((2^64), (x660₂, (x656₁, 0))) in
  let x662 := Z.add_with_get_carry((2^64), (x661₂, (x657₁, 0))) in
  let x663 := Z.add_with_get_carry((2^64), (x662₂, (x658₁, 0))) in
  let x664 := Z.add_with_get_carry((2^64), (x663₂, (x659₁, 0))) in
  let x665 := Z.add_with_get_carry((2^64), (0, (x660₁, 0))) in
  let x666 := Z.add_with_get_carry((2^64), (x665₂, (x661₁, x592))) in
  let x667 := Z.add_with_get_carry((2^64), (x666₂, (x662₁, x590))) in
  let x668 := Z.add_with_get_carry((2^64), (x667₂, (x663₁, x588))) in
  let x669 := Z.add_with_get_carry((2^64), (x668₂, (x664₁, 0))) in
  let x670 := Z.add_with_get_carry((2^64), (0, (x576₁, x665₁))) in
  let x671 := Z.add_with_get_carry((2^64), (x670₂, (x577₁, x666₁))) in
  let x672 := Z.add_with_get_carry((2^64), (x671₂, (x578₁, x667₁))) in
  let x673 := Z.add_with_get_carry((2^64), (x672₂, (x579₁, x668₁))) in
  let x674 := Z.add_with_get_carry((2^64), (x673₂, (x580₁, x669₁))) in
  let x675 := Z.add_with_get_carry((2^64), (x674₂, (x581, 0))) in
  let x676 := Z.mul_split((2^64), (0, x2[3])) in
  let x677 := Z.mul_split((2^64), (0, x2[2])) in
  let x678 := Z.mul_split((2^64), (0, x2[1])) in
  let x679 := Z.mul_split((2^64), (0, x2[0])) in
  let x680 := Z.mul_split((2^64), (0, x2[3])) in
  let x681 := Z.mul_split((2^64), (0, x2[2])) in
  let x682 := Z.mul_split((2^64), (0, x2[1])) in
  let x683 := Z.mul_split((2^64), (0, x2[0])) in
  let x684 := Z.mul_split((2^64), (0, x2[3])) in
  let x685 := Z.mul_split((2^64), (0, x2[2])) in
  let x686 := Z.mul_split((2^64), (0, x2[1])) in
  let x687 := Z.mul_split((2^64), (0, x2[0])) in
  let x688 := Z.mul_split((2^64), (x5, x2[3])) in
  let x689 := Z.mul_split((2^64), (x5, x2[2])) in
  let x690 := Z.mul_split((2^64), (x5, x2[1])) in
  let x691 := Z.mul_split((2^64), (x5, x2[0])) in
  let x692 := 2^192 * x676₂ in
  let x693 := 2^128 * x676₁ in
  let x694 := 2^128 * x677₂ in
  let x695 := 2^64 * x677₁ in
  let x696 := 2^64 * x678₂ in
  let x697 := 1 * x678₁ in
  let x698 := 1 * x679₂ in
  let x699 := 1 * x679₁ in
  let x700 := 2^128 * x680₂ in
  let x701 := 2^64 * x680₁ in
  let x702 := 2^64 * x681₂ in
  let x703 := 1 * x681₁ in
  let x704 := 1 * x682₂ in
  let x705 := 1 * x682₁ in
  let x706 := 1 * x683₂ in
  let x707 := 1 * x683₁ in
  let x708 := 2^64 * x684₂ in
  let x709 := 1 * x684₁ in
  let x710 := 1 * x685₂ in
  let x711 := 1 * x685₁ in
  let x712 := 1 * x686₂ in
  let x713 := 1 * x686₁ in
  let x714 := 1 * x687₂ in
  let x715 := 1 * x687₁ in
  let x716 := 1 * x688₂ in
  let x717 := 1 * x688₁ in
  let x718 := 1 * x689₂ in
  let x719 := 1 * x689₁ in
  let x720 := 1 * x690₂ in
  let x721 := 1 * x690₁ in
  let x722 := 1 * x691₂ in
  let x723 := 1 * x691₁ in
  let x724 := Z.add_with_get_carry((2^64), (0, (x723, 0))) in
  let x725 := Z.add_with_get_carry((2^64), (x724₂, (x722, 0))) in
  let x726 := Z.add_with_get_carry((2^64), (x725₂, (x720, 0))) in
  let x727 := Z.add_with_get_carry((2^64), (x726₂, (x718, 0))) in
  let x728 := Z.add_with_get_carry((2^64), (x727₂, (x716, x692))) in
  let x729 := Z.add_with_get_carry((2^64), (0, (x724₁, 0))) in
  let x730 := Z.add_with_get_carry((2^64), (x729₂, (x725₁, 0))) in
  let x731 := Z.add_with_get_carry((2^64), (x730₂, (x726₁, 0))) in
  let x732 := Z.add_with_get_carry((2^64), (x731₂, (x727₁, 0))) in
  let x733 := Z.add_with_get_carry((2^64), (x732₂, (x728₁, x693))) in
  let x734 := Z.add_with_get_carry((2^64), (0, (x729₁, 0))) in
  let x735 := Z.add_with_get_carry((2^64), (x734₂, (x730₁, 0))) in
  let x736 := Z.add_with_get_carry((2^64), (x735₂, (x731₁, 0))) in
  let x737 := Z.add_with_get_carry((2^64), (x736₂, (x732₁, 0))) in
  let x738 := Z.add_with_get_carry((2^64), (x737₂, (x733₁, x694))) in
  let x739 := Z.add_with_get_carry((2^64), (0, (x734₁, 0))) in
  let x740 := Z.add_with_get_carry((2^64), (x739₂, (x735₁, 0))) in
  let x741 := Z.add_with_get_carry((2^64), (x740₂, (x736₁, 0))) in
  let x742 := Z.add_with_get_carry((2^64), (x741₂, (x737₁, 0))) in
  let x743 := Z.add_with_get_carry((2^64), (x742₂, (x738₁, x695))) in
  let x744 := Z.add_with_get_carry((2^64), (0, (x739₁, 0))) in
  let x745 := Z.add_with_get_carry((2^64), (x744₂, (x740₁, 0))) in
  let x746 := Z.add_with_get_carry((2^64), (x745₂, (x741₁, 0))) in
  let x747 := Z.add_with_get_carry((2^64), (x746₂, (x742₁, 0))) in
  let x748 := Z.add_with_get_carry((2^64), (x747₂, (x743₁, x696))) in
  let x749 := Z.add_with_get_carry((2^64), (0, (x744₁, 0))) in
  let x750 := Z.add_with_get_carry((2^64), (x749₂, (x745₁, 0))) in
  let x751 := Z.add_with_get_carry((2^64), (x750₂, (x746₁, 0))) in
  let x752 := Z.add_with_get_carry((2^64), (x751₂, (x747₁, 0))) in
  let x753 := Z.add_with_get_carry((2^64), (x752₂, (x748₁, x697))) in
  let x754 := Z.add_with_get_carry((2^64), (0, (x749₁, 0))) in
  let x755 := Z.add_with_get_carry((2^64), (x754₂, (x750₁, 0))) in
  let x756 := Z.add_with_get_carry((2^64), (x755₂, (x751₁, 0))) in
  let x757 := Z.add_with_get_carry((2^64), (x756₂, (x752₁, 0))) in
  let x758 := Z.add_with_get_carry((2^64), (x757₂, (x753₁, x698))) in
  let x759 := Z.add_with_get_carry((2^64), (0, (x754₁, 0))) in
  let x760 := Z.add_with_get_carry((2^64), (x759₂, (x755₁, 0))) in
  let x761 := Z.add_with_get_carry((2^64), (x760₂, (x756₁, 0))) in
  let x762 := Z.add_with_get_carry((2^64), (x761₂, (x757₁, 0))) in
  let x763 := Z.add_with_get_carry((2^64), (x762₂, (x758₁, x700))) in
  let x764 := Z.add_with_get_carry((2^64), (0, (x759₁, 0))) in
  let x765 := Z.add_with_get_carry((2^64), (x764₂, (x760₁, 0))) in
  let x766 := Z.add_with_get_carry((2^64), (x765₂, (x761₁, 0))) in
  let x767 := Z.add_with_get_carry((2^64), (x766₂, (x762₁, 0))) in
  let x768 := Z.add_with_get_carry((2^64), (x767₂, (x763₁, x701))) in
  let x769 := Z.add_with_get_carry((2^64), (0, (x764₁, 0))) in
  let x770 := Z.add_with_get_carry((2^64), (x769₂, (x765₁, 0))) in
  let x771 := Z.add_with_get_carry((2^64), (x770₂, (x766₁, 0))) in
  let x772 := Z.add_with_get_carry((2^64), (x771₂, (x767₁, x699))) in
  let x773 := Z.add_with_get_carry((2^64), (x772₂, (x768₁, x702))) in
  let x774 := Z.add_with_get_carry((2^64), (0, (x769₁, 0))) in
  let x775 := Z.add_with_get_carry((2^64), (x774₂, (x770₁, 0))) in
  let x776 := Z.add_with_get_carry((2^64), (x775₂, (x771₁, 0))) in
  let x777 := Z.add_with_get_carry((2^64), (x776₂, (x772₁, x705))) in
  let x778 := Z.add_with_get_carry((2^64), (x777₂, (x773₁, x703))) in
  let x779 := Z.add_with_get_carry((2^64), (0, (x774₁, 0))) in
  let x780 := Z.add_with_get_carry((2^64), (x779₂, (x775₁, 0))) in
  let x781 := Z.add_with_get_carry((2^64), (x780₂, (x776₁, x707))) in
  let x782 := Z.add_with_get_carry((2^64), (x781₂, (x777₁, x706))) in
  let x783 := Z.add_with_get_carry((2^64), (x782₂, (x778₁, x704))) in
  let x784 := Z.add_with_get_carry((2^64), (0, (x779₁, 0))) in
  let x785 := Z.add_with_get_carry((2^64), (x784₂, (x780₁, 0))) in
  let x786 := Z.add_with_get_carry((2^64), (x785₂, (x781₁, x713))) in
  let x787 := Z.add_with_get_carry((2^64), (x786₂, (x782₁, x711))) in
  let x788 := Z.add_with_get_carry((2^64), (x787₂, (x783₁, x708))) in
  let x789 := Z.add_with_get_carry((2^64), (0, (x784₁, 0))) in
  let x790 := Z.add_with_get_carry((2^64), (x789₂, (x785₁, x715))) in
  let x791 := Z.add_with_get_carry((2^64), (x790₂, (x786₁, x714))) in
  let x792 := Z.add_with_get_carry((2^64), (x791₂, (x787₁, x712))) in
  let x793 := Z.add_with_get_carry((2^64), (x792₂, (x788₁, x709))) in
  let x794 := Z.add_with_get_carry((2^64), (0, (x789₁, 0))) in
  let x795 := Z.add_with_get_carry((2^64), (x794₂, (x790₁, x721))) in
  let x796 := Z.add_with_get_carry((2^64), (x795₂, (x791₁, x719))) in
  let x797 := Z.add_with_get_carry((2^64), (x796₂, (x792₁, x717))) in
  let x798 := Z.add_with_get_carry((2^64), (x797₂, (x793₁, x710))) in
  let x799 := Z.add_with_get_carry((2^64), (0, (x671₁, x794₁))) in
  let x800 := Z.add_with_get_carry((2^64), (x799₂, (x672₁, x795₁))) in
  let x801 := Z.add_with_get_carry((2^64), (x800₂, (x673₁, x796₁))) in
  let x802 := Z.add_with_get_carry((2^64), (x801₂, (x674₁, x797₁))) in
  let x803 := Z.add_with_get_carry((2^64), (x802₂, (x675₁, x798₁))) in
  let x804 := 0 + x803₂ in
  let x805 := (Z.mul_split((2^64), (x799₁, 1)))₁ in
  let x806 := Z.mul_split((2^64), (x805, 0xffffffff00000001)) in
  let x807 := Z.mul_split((2^64), (x805, 0)) in
  let x808 := Z.mul_split((2^64), (x805, (2^32-1))) in
  let x809 := Z.mul_split((2^64), (x805, (2^64-1))) in
  let x810 := 1 * x806₂ in
  let x811 := 1 * x806₁ in
  let x812 := 1 * x807₂ in
  let x813 := 1 * x807₁ in
  let x814 := 1 * x808₂ in
  let x815 := 1 * x808₁ in
  let x816 := 1 * x809₂ in
  let x817 := 1 * x809₁ in
  let x818 := Z.add_with_get_carry((2^64), (0, (x817, 0))) in
  let x819 := Z.add_with_get_carry((2^64), (x818₂, (x816, 0))) in
  let x820 := Z.add_with_get_carry((2^64), (x819₂, (x814, 0))) in
  let x821 := Z.add_with_get_carry((2^64), (x820₂, (x812, 0))) in
  let x822 := Z.add_with_get_carry((2^64), (x821₂, (x810, 0))) in
  let x823 := Z.add_with_get_carry((2^64), (0, (x818₁, 0))) in
  let x824 := Z.add_with_get_carry((2^64), (x823₂, (x819₁, 0))) in
  let x825 := Z.add_with_get_carry((2^64), (x824₂, (x820₁, 0))) in
  let x826 := Z.add_with_get_carry((2^64), (x825₂, (x821₁, 0))) in
  let x827 := Z.add_with_get_carry((2^64), (x826₂, (x822₁, 0))) in
  let x828 := Z.add_with_get_carry((2^64), (0, (x823₁, 0))) in
  let x829 := Z.add_with_get_carry((2^64), (x828₂, (x824₁, 0))) in
  let x830 := Z.add_with_get_carry((2^64), (x829₂, (x825₁, 0))) in
  let x831 := Z.add_with_get_carry((2^64), (x830₂, (x826₁, 0))) in
  let x832 := Z.add_with_get_carry((2^64), (x831₂, (x827₁, 0))) in
  let x833 := Z.add_with_get_carry((2^64), (0, (x828₁, 0))) in
  let x834 := Z.add_with_get_carry((2^64), (x833₂, (x829₁, 0))) in
  let x835 := Z.add_with_get_carry((2^64), (x834₂, (x830₁, 0))) in
  let x836 := Z.add_with_get_carry((2^64), (x835₂, (x831₁, 0))) in
  let x837 := Z.add_with_get_carry((2^64), (x836₂, (x832₁, 0))) in
  let x838 := Z.add_with_get_carry((2^64), (0, (x833₁, 0))) in
  let x839 := Z.add_with_get_carry((2^64), (x838₂, (x834₁, 0))) in
  let x840 := Z.add_with_get_carry((2^64), (x839₂, (x835₁, 0))) in
  let x841 := Z.add_with_get_carry((2^64), (x840₂, (x836₁, 0))) in
  let x842 := Z.add_with_get_carry((2^64), (x841₂, (x837₁, 0))) in
  let x843 := Z.add_with_get_carry((2^64), (0, (x838₁, 0))) in
  let x844 := Z.add_with_get_carry((2^64), (x843₂, (x839₁, 0))) in
  let x845 := Z.add_with_get_carry((2^64), (x844₂, (x840₁, 0))) in
  let x846 := Z.add_with_get_carry((2^64), (x845₂, (x841₁, 0))) in
  let x847 := Z.add_with_get_carry((2^64), (x846₂, (x842₁, 0))) in
  let x848 := Z.add_with_get_carry((2^64), (0, (x843₁, 0))) in
  let x849 := Z.add_with_get_carry((2^64), (x848₂, (x844₁, 0))) in
  let x850 := Z.add_with_get_carry((2^64), (x849₂, (x845₁, 0))) in
  let x851 := Z.add_with_get_carry((2^64), (x850₂, (x846₁, 0))) in
  let x852 := Z.add_with_get_carry((2^64), (x851₂, (x847₁, 0))) in
  let x853 := Z.add_with_get_carry((2^64), (0, (x848₁, 0))) in
  let x854 := Z.add_with_get_carry((2^64), (x853₂, (x849₁, 0))) in
  let x855 := Z.add_with_get_carry((2^64), (x854₂, (x850₁, 0))) in
  let x856 := Z.add_with_get_carry((2^64), (x855₂, (x851₁, 0))) in
  let x857 := Z.add_with_get_carry((2^64), (x856₂, (x852₁, 0))) in
  let x858 := Z.add_with_get_carry((2^64), (0, (x853₁, 0))) in
  let x859 := Z.add_with_get_carry((2^64), (x858₂, (x854₁, 0))) in
  let x860 := Z.add_with_get_carry((2^64), (x859₂, (x855₁, 0))) in
  let x861 := Z.add_with_get_carry((2^64), (x860₂, (x856₁, 0))) in
  let x862 := Z.add_with_get_carry((2^64), (x861₂, (x857₁, 0))) in
  let x863 := Z.add_with_get_carry((2^64), (0, (x858₁, 0))) in
  let x864 := Z.add_with_get_carry((2^64), (x863₂, (x859₁, 0))) in
  let x865 := Z.add_with_get_carry((2^64), (x864₂, (x860₁, 0))) in
  let x866 := Z.add_with_get_carry((2^64), (x865₂, (x861₁, 0))) in
  let x867 := Z.add_with_get_carry((2^64), (x866₂, (x862₁, 0))) in
  let x868 := Z.add_with_get_carry((2^64), (0, (x863₁, 0))) in
  let x869 := Z.add_with_get_carry((2^64), (x868₂, (x864₁, 0))) in
  let x870 := Z.add_with_get_carry((2^64), (x869₂, (x865₁, 0))) in
  let x871 := Z.add_with_get_carry((2^64), (x870₂, (x866₁, 0))) in
  let x872 := Z.add_with_get_carry((2^64), (x871₂, (x867₁, 0))) in
  let x873 := Z.add_with_get_carry((2^64), (0, (x868₁, 0))) in
  let x874 := Z.add_with_get_carry((2^64), (x873₂, (x869₁, 0))) in
  let x875 := Z.add_with_get_carry((2^64), (x874₂, (x870₁, 0))) in
  let x876 := Z.add_with_get_carry((2^64), (x875₂, (x871₁, 0))) in
  let x877 := Z.add_with_get_carry((2^64), (x876₂, (x872₁, 0))) in
  let x878 := Z.add_with_get_carry((2^64), (0, (x873₁, 0))) in
  let x879 := Z.add_with_get_carry((2^64), (x878₂, (x874₁, 0))) in
  let x880 := Z.add_with_get_carry((2^64), (x879₂, (x875₁, 0))) in
  let x881 := Z.add_with_get_carry((2^64), (x880₂, (x876₁, 0))) in
  let x882 := Z.add_with_get_carry((2^64), (x881₂, (x877₁, 0))) in
  let x883 := Z.add_with_get_carry((2^64), (0, (x878₁, 0))) in
  let x884 := Z.add_with_get_carry((2^64), (x883₂, (x879₁, 0))) in
  let x885 := Z.add_with_get_carry((2^64), (x884₂, (x880₁, 0))) in
  let x886 := Z.add_with_get_carry((2^64), (x885₂, (x881₁, 0))) in
  let x887 := Z.add_with_get_carry((2^64), (x886₂, (x882₁, 0))) in
  let x888 := Z.add_with_get_carry((2^64), (0, (x883₁, 0))) in
  let x889 := Z.add_with_get_carry((2^64), (x888₂, (x884₁, x815))) in
  let x890 := Z.add_with_get_carry((2^64), (x889₂, (x885₁, x813))) in
  let x891 := Z.add_with_get_carry((2^64), (x890₂, (x886₁, x811))) in
  let x892 := Z.add_with_get_carry((2^64), (x891₂, (x887₁, 0))) in
  let x893 := Z.add_with_get_carry((2^64), (0, (x799₁, x888₁))) in
  let x894 := Z.add_with_get_carry((2^64), (x893₂, (x800₁, x889₁))) in
  let x895 := Z.add_with_get_carry((2^64), (x894₂, (x801₁, x890₁))) in
  let x896 := Z.add_with_get_carry((2^64), (x895₂, (x802₁, x891₁))) in
  let x897 := Z.add_with_get_carry((2^64), (x896₂, (x803₁, x892₁))) in
  let x898 := Z.add_with_get_carry((2^64), (x897₂, (x804, 0))) in
  let x899 := Z.add_with_get_carry((2^64), (0, (x894₁, (-(2^64-1))))) in
  let x900 := Z.add_with_get_carry((2^64), (x899₂, (x895₁, (-(2^32-1))))) in
  let x901 := Z.add_with_get_carry((2^64), (x900₂, (x896₁, 0))) in
  let x902 := Z.add_with_get_carry((2^64), (x901₂, (x897₁, (-0xffffffff00000001)))) in
  let x903 := Z.add_with_get_carry((2^64), (x902₂, (x898₁, 0))) in
  Z.zselect((-(0 + x903₂)), (x899₁, x894₁)) :: Z.zselect((-(0 + x903₂)), (x900₁, x895₁)) :: Z.zselect((-(0 + x903₂)), (x901₁, x896₁)) :: Z.zselect((-(0 + x903₂)), (x902₁, x897₁)) :: []
)

After rewriting RewriteUnfoldValueBarrier:
(λ x1 x2,
  let x3 := x1[1] in
  let x4 := x1[2] in
  let x5 := x1[3] in
  let x6 := x1[0] in
  let x7 := Z.mul_split((2^64), (0, x2[3])) in
  let x8 := Z.mul_split((2^64), (0, x2[2])) in
  let x9 := Z.mul_split((2^64), (0, x2[1])) in
  let x10 := Z.mul_split((2^64), (0, x2[0])) in
  let x11 := Z.mul_split((2^64), (0, x2[3])) in
  let x12 := Z.mul_split((2^64), (0, x2[2])) in
  let x13 := Z.mul_split((2^64), (0, x2[1])) in
  let x14 := Z.mul_split((2^64), (0, x2[0])) in
  let x15 := Z.mul_split((2^64), (0, x2[3])) in
  let x16 := Z.mul_split((2^64), (0, x2[2])) in
  let x17 := Z.mul_split((2^64), (0, x2[1])) in
  let x18 := Z.mul_split((2^64), (0, x2[0])) in
  let x19 := Z.mul_split((2^64), (x6, x2[3])) in
  let x20 := Z.mul_split((2^64), (x6, x2[2])) in
  let x21 := Z.mul_split((2^64), (x6, x2[1])) in
  let x22 := Z.mul_split((2^64), (x6, x2[0])) in
  let x23 := 2^192 * x7₂ in
  let x24 := 2^128 * x7₁ in
  let x25 := 2^128 * x8₂ in
  let x26 := 2^64 * x8₁ in
  let x27 := 2^64 * x9₂ in
  let x28 := 1 * x9₁ in
  let x29 := 1 * x10₂ in
  let x30 := 1 * x10₁ in
  let x31 := 2^128 * x11₂ in
  let x32 := 2^64 * x11₁ in
  let x33 := 2^64 * x12₂ in
  let x34 := 1 * x12₁ in
  let x35 := 1 * x13₂ in
  let x36 := 1 * x13₁ in
  let x37 := 1 * x14₂ in
  let x38 := 1 * x14₁ in
  let x39 := 2^64 * x15₂ in
  let x40 := 1 * x15₁ in
  let x41 := 1 * x16₂ in
  let x42 := 1 * x16₁ in
  let x43 := 1 * x17₂ in
  let x44 := 1 * x17₁ in
  let x45 := 1 * x18₂ in
  let x46 := 1 * x18₁ in
  let x47 := 1 * x19₂ in
  let x48 := 1 * x19₁ in
  let x49 := 1 * x20₂ in
  let x50 := 1 * x20₁ in
  let x51 := 1 * x21₂ in
  let x52 := 1 * x21₁ in
  let x53 := 1 * x22₂ in
  let x54 := 1 * x22₁ in
  let x55 := Z.add_with_get_carry((2^64), (0, (x54, 0))) in
  let x56 := Z.add_with_get_carry((2^64), (x55₂, (x53, 0))) in
  let x57 := Z.add_with_get_carry((2^64), (x56₂, (x51, 0))) in
  let x58 := Z.add_with_get_carry((2^64), (x57₂, (x49, 0))) in
  let x59 := Z.add_with_get_carry((2^64), (x58₂, (x47, x23))) in
  let x60 := Z.add_with_get_carry((2^64), (0, (x55₁, 0))) in
  let x61 := Z.add_with_get_carry((2^64), (x60₂, (x56₁, 0))) in
  let x62 := Z.add_with_get_carry((2^64), (x61₂, (x57₁, 0))) in
  let x63 := Z.add_with_get_carry((2^64), (x62₂, (x58₁, 0))) in
  let x64 := Z.add_with_get_carry((2^64), (x63₂, (x59₁, x24))) in
  let x65 := Z.add_with_get_carry((2^64), (0, (x60₁, 0))) in
  let x66 := Z.add_with_get_carry((2^64), (x65₂, (x61₁, 0))) in
  let x67 := Z.add_with_get_carry((2^64), (x66₂, (x62₁, 0))) in
  let x68 := Z.add_with_get_carry((2^64), (x67₂, (x63₁, 0))) in
  let x69 := Z.add_with_get_carry((2^64), (x68₂, (x64₁, x25))) in
  let x70 := Z.add_with_get_carry((2^64), (0, (x65₁, 0))) in
  let x71 := Z.add_with_get_carry((2^64), (x70₂, (x66₁, 0))) in
  let x72 := Z.add_with_get_carry((2^64), (x71₂, (x67₁, 0))) in
  let x73 := Z.add_with_get_carry((2^64), (x72₂, (x68₁, 0))) in
  let x74 := Z.add_with_get_carry((2^64), (x73₂, (x69₁, x26))) in
  let x75 := Z.add_with_get_carry((2^64), (0, (x70₁, 0))) in
  let x76 := Z.add_with_get_carry((2^64), (x75₂, (x71₁, 0))) in
  let x77 := Z.add_with_get_carry((2^64), (x76₂, (x72₁, 0))) in
  let x78 := Z.add_with_get_carry((2^64), (x77₂, (x73₁, 0))) in
  let x79 := Z.add_with_get_carry((2^64), (x78₂, (x74₁, x27))) in
  let x80 := Z.add_with_get_carry((2^64), (0, (x75₁, 0))) in
  let x81 := Z.add_with_get_carry((2^64), (x80₂, (x76₁, 0))) in
  let x82 := Z.add_with_get_carry((2^64), (x81₂, (x77₁, 0))) in
  let x83 := Z.add_with_get_carry((2^64), (x82₂, (x78₁, 0))) in
  let x84 := Z.add_with_get_carry((2^64), (x83₂, (x79₁, x28))) in
  let x85 := Z.add_with_get_carry((2^64), (0, (x80₁, 0))) in
  let x86 := Z.add_with_get_carry((2^64), (x85₂, (x81₁, 0))) in
  let x87 := Z.add_with_get_carry((2^64), (x86₂, (x82₁, 0))) in
  let x88 := Z.add_with_get_carry((2^64), (x87₂, (x83₁, 0))) in
  let x89 := Z.add_with_get_carry((2^64), (x88₂, (x84₁, x29))) in
  let x90 := Z.add_with_get_carry((2^64), (0, (x85₁, 0))) in
  let x91 := Z.add_with_get_carry((2^64), (x90₂, (x86₁, 0))) in
  let x92 := Z.add_with_get_carry((2^64), (x91₂, (x87₁, 0))) in
  let x93 := Z.add_with_get_carry((2^64), (x92₂, (x88₁, 0))) in
  let x94 := Z.add_with_get_carry((2^64), (x93₂, (x89₁, x31))) in
  let x95 := Z.add_with_get_carry((2^64), (0, (x90₁, 0))) in
  let x96 := Z.add_with_get_carry((2^64), (x95₂, (x91₁, 0))) in
  let x97 := Z.add_with_get_carry((2^64), (x96₂, (x92₁, 0))) in
  let x98 := Z.add_with_get_carry((2^64), (x97₂, (x93₁, 0))) in
  let x99 := Z.add_with_get_carry((2^64), (x98₂, (x94₁, x32))) in
  let x100 := Z.add_with_get_carry((2^64), (0, (x95₁, 0))) in
  let x101 := Z.add_with_get_carry((2^64), (x100₂, (x96₁, 0))) in
  let x102 := Z.add_with_get_carry((2^64), (x101₂, (x97₁, 0))) in
  let x103 := Z.add_with_get_carry((2^64), (x102₂, (x98₁, x30))) in
  let x104 := Z.add_with_get_carry((2^64), (x103₂, (x99₁, x33))) in
  let x105 := Z.add_with_get_carry((2^64), (0, (x100₁, 0))) in
  let x106 := Z.add_with_get_carry((2^64), (x105₂, (x101₁, 0))) in
  let x107 := Z.add_with_get_carry((2^64), (x106₂, (x102₁, 0))) in
  let x108 := Z.add_with_get_carry((2^64), (x107₂, (x103₁, x36))) in
  let x109 := Z.add_with_get_carry((2^64), (x108₂, (x104₁, x34))) in
  let x110 := Z.add_with_get_carry((2^64), (0, (x105₁, 0))) in
  let x111 := Z.add_with_get_carry((2^64), (x110₂, (x106₁, 0))) in
  let x112 := Z.add_with_get_carry((2^64), (x111₂, (x107₁, x38))) in
  let x113 := Z.add_with_get_carry((2^64), (x112₂, (x108₁, x37))) in
  let x114 := Z.add_with_get_carry((2^64), (x113₂, (x109₁, x35))) in
  let x115 := Z.add_with_get_carry((2^64), (0, (x110₁, 0))) in
  let x116 := Z.add_with_get_carry((2^64), (x115₂, (x111₁, 0))) in
  let x117 := Z.add_with_get_carry((2^64), (x116₂, (x112₁, x44))) in
  let x118 := Z.add_with_get_carry((2^64), (x117₂, (x113₁, x42))) in
  let x119 := Z.add_with_get_carry((2^64), (x118₂, (x114₁, x39))) in
  let x120 := Z.add_with_get_carry((2^64), (0, (x115₁, 0))) in
  let x121 := Z.add_with_get_carry((2^64), (x120₂, (x116₁, x46))) in
  let x122 := Z.add_with_get_carry((2^64), (x121₂, (x117₁, x45))) in
  let x123 := Z.add_with_get_carry((2^64), (x122₂, (x118₁, x43))) in
  let x124 := Z.add_with_get_carry((2^64), (x123₂, (x119₁, x40))) in
  let x125 := Z.add_with_get_carry((2^64), (0, (x120₁, 0))) in
  let x126 := Z.add_with_get_carry((2^64), (x125₂, (x121₁, x52))) in
  let x127 := Z.add_with_get_carry((2^64), (x126₂, (x122₁, x50))) in
  let x128 := Z.add_with_get_carry((2^64), (x127₂, (x123₁, x48))) in
  let x129 := Z.add_with_get_carry((2^64), (x128₂, (x124₁, x41))) in
  let x130 := Z.add_with_get_carry((2^64), (0, (0, x125₁))) in
  let x131 := Z.add_with_get_carry((2^64), (x130₂, (0, x126₁))) in
  let x132 := Z.add_with_get_carry((2^64), (x131₂, (0, x127₁))) in
  let x133 := Z.add_with_get_carry((2^64), (x132₂, (0, x128₁))) in
  let x134 := Z.add_with_get_carry((2^64), (x133₂, (0, x129₁))) in
  let x135 := 0 + x134₂ in
  let x136 := (Z.mul_split((2^64), (x130₁, 1)))₁ in
  let x137 := Z.mul_split((2^64), (x136, 0xffffffff00000001)) in
  let x138 := Z.mul_split((2^64), (x136, 0)) in
  let x139 := Z.mul_split((2^64), (x136, (2^32-1))) in
  let x140 := Z.mul_split((2^64), (x136, (2^64-1))) in
  let x141 := 1 * x137₂ in
  let x142 := 1 * x137₁ in
  let x143 := 1 * x138₂ in
  let x144 := 1 * x138₁ in
  let x145 := 1 * x139₂ in
  let x146 := 1 * x139₁ in
  let x147 := 1 * x140₂ in
  let x148 := 1 * x140₁ in
  let x149 := Z.add_with_get_carry((2^64), (0, (x148, 0))) in
  let x150 := Z.add_with_get_carry((2^64), (x149₂, (x147, 0))) in
  let x151 := Z.add_with_get_carry((2^64), (x150₂, (x145, 0))) in
  let x152 := Z.add_with_get_carry((2^64), (x151₂, (x143, 0))) in
  let x153 := Z.add_with_get_carry((2^64), (x152₂, (x141, 0))) in
  let x154 := Z.add_with_get_carry((2^64), (0, (x149₁, 0))) in
  let x155 := Z.add_with_get_carry((2^64), (x154₂, (x150₁, 0))) in
  let x156 := Z.add_with_get_carry((2^64), (x155₂, (x151₁, 0))) in
  let x157 := Z.add_with_get_carry((2^64), (x156₂, (x152₁, 0))) in
  let x158 := Z.add_with_get_carry((2^64), (x157₂, (x153₁, 0))) in
  let x159 := Z.add_with_get_carry((2^64), (0, (x154₁, 0))) in
  let x160 := Z.add_with_get_carry((2^64), (x159₂, (x155₁, 0))) in
  let x161 := Z.add_with_get_carry((2^64), (x160₂, (x156₁, 0))) in
  let x162 := Z.add_with_get_carry((2^64), (x161₂, (x157₁, 0))) in
  let x163 := Z.add_with_get_carry((2^64), (x162₂, (x158₁, 0))) in
  let x164 := Z.add_with_get_carry((2^64), (0, (x159₁, 0))) in
  let x165 := Z.add_with_get_carry((2^64), (x164₂, (x160₁, 0))) in
  let x166 := Z.add_with_get_carry((2^64), (x165₂, (x161₁, 0))) in
  let x167 := Z.add_with_get_carry((2^64), (x166₂, (x162₁, 0))) in
  let x168 := Z.add_with_get_carry((2^64), (x167₂, (x163₁, 0))) in
  let x169 := Z.add_with_get_carry((2^64), (0, (x164₁, 0))) in
  let x170 := Z.add_with_get_carry((2^64), (x169₂, (x165₁, 0))) in
  let x171 := Z.add_with_get_carry((2^64), (x170₂, (x166₁, 0))) in
  let x172 := Z.add_with_get_carry((2^64), (x171₂, (x167₁, 0))) in
  let x173 := Z.add_with_get_carry((2^64), (x172₂, (x168₁, 0))) in
  let x174 := Z.add_with_get_carry((2^64), (0, (x169₁, 0))) in
  let x175 := Z.add_with_get_carry((2^64), (x174₂, (x170₁, 0))) in
  let x176 := Z.add_with_get_carry((2^64), (x175₂, (x171₁, 0))) in
  let x177 := Z.add_with_get_carry((2^64), (x176₂, (x172₁, 0))) in
  let x178 := Z.add_with_get_carry((2^64), (x177₂, (x173₁, 0))) in
  let x179 := Z.add_with_get_carry((2^64), (0, (x174₁, 0))) in
  let x180 := Z.add_with_get_carry((2^64), (x179₂, (x175₁, 0))) in
  let x181 := Z.add_with_get_carry((2^64), (x180₂, (x176₁, 0))) in
  let x182 := Z.add_with_get_carry((2^64), (x181₂, (x177₁, 0))) in
  let x183 := Z.add_with_get_carry((2^64), (x182₂, (x178₁, 0))) in
  let x184 := Z.add_with_get_carry((2^64), (0, (x179₁, 0))) in
  let x185 := Z.add_with_get_carry((2^64), (x184₂, (x180₁, 0))) in
  let x186 := Z.add_with_get_carry((2^64), (x185₂, (x181₁, 0))) in
  let x187 := Z.add_with_get_carry((2^64), (x186₂, (x182₁, 0))) in
  let x188 := Z.add_with_get_carry((2^64), (x187₂, (x183₁, 0))) in
  let x189 := Z.add_with_get_carry((2^64), (0, (x184₁, 0))) in
  let x190 := Z.add_with_get_carry((2^64), (x189₂, (x185₁, 0))) in
  let x191 := Z.add_with_get_carry((2^64), (x190₂, (x186₁, 0))) in
  let x192 := Z.add_with_get_carry((2^64), (x191₂, (x187₁, 0))) in
  let x193 := Z.add_with_get_carry((2^64), (x192₂, (x188₁, 0))) in
  let x194 := Z.add_with_get_carry((2^64), (0, (x189₁, 0))) in
  let x195 := Z.add_with_get_carry((2^64), (x194₂, (x190₁, 0))) in
  let x196 := Z.add_with_get_carry((2^64), (x195₂, (x191₁, 0))) in
  let x197 := Z.add_with_get_carry((2^64), (x196₂, (x192₁, 0))) in
  let x198 := Z.add_with_get_carry(…
@JasonGross JasonGross force-pushed the asm-boring-ssl branch 2 times, most recently from fd74d62 to 029e4ec Compare November 15, 2022 00:32
@JasonGross
Copy link
Collaborator Author

I guess in this case the assembly is the simpler one (the LHS). The outermost * 2^32 is the shl on the last line of

ecp_nistz256_mul_mont:
push rbp
push rbx
push r12
push r13
push r14
push r15
xchg rdx, rsi                  ; hack: swap args
mov rbx, rdx
mov rax, QWORD PTR [rbx]
mov r9, QWORD PTR [rsi]
mov r10, QWORD PTR [rsi + 0x08 * 1]
mov r11, QWORD PTR [rsi + 0x08 * 2]
mov r12, QWORD PTR [rsi + 0x08 * 3]
mov rbp, rax
mul r9
mov r14, 4294967295
mov r8, rax
mov rax, rbp
mov r9, rdx
mul r10
mov r15, 18446744069414584321
add r9, rax	; #549
mov rax, rbp
adc rdx, 0	; #550, #551
mov r10, rdx
mul r11
add r10, rax	; #552
mov rax, rbp
adc rdx, 0	; #553, #554
mov r11, rdx
mul r12
add r11, rax	; #555
mov rax, r8
adc rdx, 0	; #556
xor r13, r13	; #557
mov r12, rdx
mov rbp, r8
shl r8, 32	; #558, #559, #560

The PHOAS fragment corresponding to the "multiply by 2^32-1 then shift right by 64" is, I believe,

  x1 = (arg1[1]);
  x2 = (arg1[2]);
  x3 = (arg1[3]);
  x4 = (arg1[0]);
  mulx_u64(&x5, &x6, x4, (arg2[3]));
  mulx_u64(&x7, &x8, x4, (arg2[2]));
  mulx_u64(&x9, &x10, x4, (arg2[1]));
  mulx_u64(&x11, &x12, x4, (arg2[0]));
  addcarryx_u64(&x13, &x14, 0x0, x12, x9);
  addcarryx_u64(&x15, &x16, x14, x10, x7);
  addcarryx_u64(&x17, &x18, x16, x8, x5);
  x19 = (x18 + x6);
  mulx_u64(&x20, &x21, x11, UINT64_C(0xffffffff00000001));
  mulx_u64(&x22, &x23, x11, UINT32_C(0xffffffff));
  mulx_u64(&x24, &x25, x11, UINT64_C(0xffffffffffffffff));
  addcarryx_u64(&x26, &x27, 0x0, x25, x22);

where "shift right by 64" is how the PHOAS/the equivalence checker is interpreting the upper-half of double-wide multiplication.

Some more details

The full error trace is:

Unable to unify: [inr [762, 763, 764, 765]] == [inr [322, 323, 324, 325]]
Could not unify the values at index 0: [#762, #763, #764, #765] ≠ [#322, #323, #324, #325]
index 0: #762 ≠ #322
(selectznz, [#761, #748, #735]) ≠ (selectznz, [#321, #303, #288])
index 0: #761 ≠ #321
(subborrow 64, [#747, #758]) ≠ (subborrow 64, [#301, #317])
index 0: #747 ≠ #301
(add 64, [#727, #745]) ≠ (add 64, [#267, #299])
index 0: #727 ≠ #267
(addcarry 64, [#229, #669, #687, #719, #724]) ≠ (addcarry 64, [#191, #223, #229, #250, #264])
index 1: #669 ≠ #191
(addcarry 64, [#153, #611, #629, #661, #666]) ≠ (addcarry 64, [#115, #147, #153, #174, #188])
index 1: #611 ≠ #115
(addcarry 64, [#77, #572, #603, #608]) ≠ (addcarry 64, [#73, #77, #98, #112])
index 1: #572 ≠ #73
(addcarry 64, [#14, #35, #42, #569]) ≠ (addcarry 64, [#14, #35, #42, #70])
index 3: #569 ≠ #70
(addcarry 64, [#33, #40, #566]) ≠ (addcarry 64, [#33, #40, #67])
index 2: #566 ≠ #67
(addcarry 64, [#30, #561, #563]) ≠ (addcarry 64, [#30, #47, #55, #64])
(addcarry 64, [#561, #563]) ≠ (addcarry 64, [#47, #55, #64])
(addcarry 64, [(shr 64, [#24, #418]), (addcarry 64, [#27, #560])]) ≠ (addcarry 64, [(shr 64, [#44, #10]), (addcarry 64, [#45, #52]), (addcarry 64, [#27, #53, #61])])
(addcarry 64, [(shr 64, [#24, (const 32, [])]), (addcarry 64, [#27, (mul 64, [#3, #7, #559])])]) ≠ (addcarry 64, [(shr 64, [(mulZ, [#24, #43]), #10]), (addcarry 64, [(mul 64, [#3, #7, #43]), (shr 64, [#49, #10])]), (addcarry 64, [#27, (add 64, [#45, #52]), (addcarry 64, [#24, #50])])])
(addcarry 64, [(shr 64, [#24, (const 32, [])]), (addcarry 64, [#27, (mul 64, [#3, #7, (const 4294967296, [])])])]) ≠ (addcarry 64, [(shr 64, [(mulZ, [#24, (const 4294967295, [])]), #10]), (addcarry 64, [(mul 64, [#3, #7, (const 4294967295, [])]), (shr 64, [(mulZ, [#24, #48]), #10])]), (addcarry 64, [#27, (add 64, [(mul 64, [#3, #7, #43]), (shr 64, [#49, #10])]), (addcarry 64, [#24, (mul 64, [#3, #7, #48])])])])
(addcarry 64, [(shr 64, [#24, (const 32, [])]), (addcarry 64, [#27, (mul 64, [#3, #7, (const 4294967296, [])])])]) ≠ (addcarry 64, [(shr 64, [(mulZ, [#24, (const 4294967295, [])]), #10]), (addcarry 64, [(mul 64, [#3, #7, (const 4294967295, [])]), (shr 64, [(mulZ, [#24, (const 18446744073709551615, [])]), #10])]), (addcarry 64, [#27, (add 64, [(mul 64, [#3, #7, (const 4294967295, [])]), (shr 64, [(mulZ, [#24, #48]), #10])]), (addcarry 64, [#24, (mul 64, [#3, #7, (const 18446744073709551615, [])])])])])
(addcarry 64, [(shr 64, [#24, (const 32, [])]), (addcarry 64, [#27, (mul 64, [#3, #7, (const 4294967296, [])])])]) ≠ (addcarry 64, [(shr 64, [(mulZ, [#24, (const 4294967295, [])]), #10]), (addcarry 64, [(mul 64, [#3, #7, (const 4294967295, [])]), (shr 64, [(mulZ, [#24, (const 18446744073709551615, [])]), #10])]), (addcarry 64, [#27, (add 64, [(mul 64, [#3, #7, (const 4294967295, [])]), (shr 64, [(mulZ, [#24, (const 18446744073709551615, [])]), #10])]), (addcarry 64, [#24, (mul 64, [#3, #7, (const 18446744073709551615, [])])])])])
(addcarry 64, [(shr 64, [(mul 64, [#3, #7]), (const 32, [])]), (addcarry 64, [(add 64, [#20, #26]), (mul 64, [(old 64 3, []), (old 64 7, []), (const 4294967296, [])])])]) ≠ (addcarry 64, [(shr 64, [(mulZ, [(mul 64, [#3, #7]), (const 4294967295, [])]), (const 64, [])]), (addcarry 64, [(mul 64, [(old 64 3, []), (old 64 7, []), (const 4294967295, [])]), (shr 64, [(mulZ, [(mul 64, [#3, #7]), (const 18446744073709551615, [])]), (const 64, [])])]), (addcarry 64, [(add 64, [#20, #26]), (add 64, [(mul 64, [(old 64 3, []), (old 64 7, []), (const 4294967295, [])]), (shr 64, [(mulZ, [(mul 64, [#3, #7]), (const 18446744073709551615, [])]), (const 64, [])])]), (addcarry 64, [(mul 64, [#3, #7]), (mul 64, [(old 64 3, []), (old 64 7, []), (const 18446744073709551615, [])])])])])
(addcarry₆₄, [((#3 *₆₄ #7) >>₆₄ 32), (addcarry₆₄, [(#20 +₆₄ #26), (old₆₄ 3 *₆₄ old₆₄ 7 *₆₄ 2^32)])]) ≠ (addcarry₆₄, [(((#3 *₆₄ #7) *ℤ 2^32-1) >>₆₄ 64), (addcarry₆₄, [(old₆₄ 3 *₆₄ old₆₄ 7 *₆₄ 2^32-1), (((#3 *₆₄ #7) *ℤ 2^64-1) >>₆₄ 64)]), (addcarry₆₄, [(#20 +₆₄ #26), ((old₆₄ 3 *₆₄ old₆₄ 7 *₆₄ 2^32-1) +₆₄ (((#3 *₆₄ #7) *ℤ 2^64-1) >>₆₄ 64)), (addcarry₆₄, [(#3 *₆₄ #7), (old₆₄ 3 *₆₄ old₆₄ 7 *₆₄ 2^64-1)])])])
3 is a special value no longer present in the symbolic machine state at the end of execution.
7 is a special value no longer present in the symbolic machine state at the end of execution.

We're mostly interested in things under #560, which shows up by

Assembly (in fiat-amd64/boringssl_intel_manual_mul_p256.asm):
ecp_nistz256_mul_mont:
push rbp
push rbx
push r12
push r13
push r14
push r15
xchg rdx, rsi                  ; hack: swap args
mov rbx, rdx
mov rax, QWORD PTR [rbx]
mov r9, QWORD PTR [rsi]
mov r10, QWORD PTR [rsi + 0x08 * 1]
mov r11, QWORD PTR [rsi + 0x08 * 2]
mov r12, QWORD PTR [rsi + 0x08 * 3]
mov rbp, rax
mul r9
mov r14, 4294967295
mov r8, rax
mov rax, rbp
mov r9, rdx
mul r10
mov r15, 18446744069414584321
add r9, rax	; #549
mov rax, rbp
adc rdx, 0	; #550, #551
mov r10, rdx
mul r11
add r10, rax	; #552
mov rax, rbp
adc rdx, 0	; #553, #554
mov r11, rdx
mul r12
add r11, rax	; #555
mov rax, r8
adc rdx, 0	; #556
xor r13, r13	; #557
mov r12, rdx
mov rbp, r8
shl r8, 32	; #558, #559, #560

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants