// File: /workspace/github_c_makefile_star2_O0/wjmelements[P]evm/src/uint256.c
// Function: mul256
void mul256(const uint256_t *number1, const uint256_t *number2, uint256_t *target) {
    uint128_t top[4];
    uint128_t bottom[4];
    UPPER(top[0]) = 0;
    LOWER(top[0]) = UPPER(UPPER_P(number1));
    UPPER(top[1]) = 0;
    LOWER(top[1]) = LOWER(UPPER_P(number1));
    UPPER(top[2]) = 0;
    LOWER(top[2]) = UPPER(LOWER_P(number1));
    UPPER(top[3]) = 0;
    LOWER(top[3]) = LOWER(LOWER_P(number1));
    UPPER(bottom[0]) = 0;
    LOWER(bottom[0]) = UPPER(UPPER_P(number2));
    UPPER(bottom[1]) = 0;
    LOWER(bottom[1]) = LOWER(UPPER_P(number2));
    UPPER(bottom[2]) = 0;
    LOWER(bottom[2]) = UPPER(LOWER_P(number2));
    UPPER(bottom[3]) = 0;
    LOWER(bottom[3]) = LOWER(LOWER_P(number2));

    uint128_t products[4][4];
    for (uint8_t y = 4; y --> 0;) {
        for (uint8_t x = 4; x --> 0;) {
            mul128(&top[x], &bottom[y], &products[x][y]);
        }
    }

    uint128_t tmp, tmp2, fourth64, third64, second64, first64;
    UPPER(fourth64) = 0;
    LOWER(fourth64) = LOWER(products[3][3]);
    UPPER(tmp) = 0;
    LOWER(tmp) = LOWER(products[3][2]);
    UPPER(tmp2) = 0;
    LOWER(tmp2) = UPPER(products[3][3]);
    add128(&tmp, &tmp2, &third64);
    UPPER(tmp) = 0;
    LOWER(tmp) = LOWER(products[3][1]);
    UPPER(tmp2) = 0;
    LOWER(tmp2) = UPPER(products[3][2]);
    add128(&tmp, &tmp2, &second64);
    UPPER(tmp) = 0;
    LOWER(tmp) = LOWER(products[3][0]);
    UPPER(tmp2) = 0;
    LOWER(tmp2) = UPPER(products[3][1]);
    add128(&tmp, &tmp2, &first64);

    UPPER(tmp) = 0;
    LOWER(tmp) = LOWER(products[2][3]);
    add128(&tmp, &third64, &third64);
    UPPER(tmp) = 0;
    LOWER(tmp) = LOWER(products[2][2]);
    add128(&tmp, &second64, &tmp2);
    UPPER(tmp) = 0;
    LOWER(tmp) = UPPER(products[2][3]);
    add128(&tmp, &tmp2, &second64);
    UPPER(tmp) = 0;
    LOWER(tmp) = LOWER(products[2][1]);
    add128(&tmp, &first64, &tmp2);
    UPPER(tmp) = 0;
    LOWER(tmp) = UPPER(products[2][2]);
    add128(&tmp, &tmp2, &first64);

    UPPER(tmp) = 0;
    LOWER(tmp) = LOWER(products[1][3]);
    add128(&tmp, &second64, &second64);
    UPPER(tmp) = 0;
    LOWER(tmp) = LOWER(products[1][2]);
    add128(&tmp, &first64, &tmp2);
    UPPER(tmp) = 0;
    LOWER(tmp) = UPPER(products[1][3]);
    add128(&tmp, &tmp2, &first64);

    UPPER(tmp) = 0;
    LOWER(tmp) = LOWER(products[0][3]);
    add128(&tmp, &first64, &first64);

    uint256_t target1, target2;
    clear256(&target1);
    UPPER(UPPER(target1)) = LOWER(first64);
    clear256(&target2);
    LOWER(UPPER(target2)) = UPPER(third64);
    UPPER(LOWER(target2)) = LOWER(third64);
    add256(&target1, &target2, target);
    clear256(&target1);
    copy128(&UPPER(target1), &second64);
    add256(&target1, target, &target2);
    clear256(&target1);
    copy128(&LOWER(target1), &fourth64);
    add256(&target1, &target2, target);
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x250, %rsp            # imm = 0x250
movq %rdi, -0x8(%rbp)
movq %rsi, -0x10(%rbp)
movq %rdx, -0x18(%rbp)
movq $0x0, -0x60(%rbp)
movq -0x8(%rbp), %rax
movq (%rax), %rax
movq %rax, -0x58(%rbp)
movq $0x0, -0x50(%rbp)
movq -0x8(%rbp), %rax
movq 0x8(%rax), %rax
movq %rax, -0x48(%rbp)
movq $0x0, -0x40(%rbp)
movq -0x8(%rbp), %rax
movq 0x10(%rax), %rax
movq %rax, -0x38(%rbp)
movq $0x0, -0x30(%rbp)
movq -0x8(%rbp), %rax
movq 0x18(%rax), %rax
movq %rax, -0x28(%rbp)
movq $0x0, -0xa0(%rbp)
movq -0x10(%rbp), %rax
movq (%rax), %rax
movq %rax, -0x98(%rbp)
movq $0x0, -0x90(%rbp)
movq -0x10(%rbp), %rax
movq 0x8(%rax), %rax
movq %rax, -0x88(%rbp)
movq $0x0, -0x80(%rbp)
movq -0x10(%rbp), %rax
movq 0x10(%rax), %rax
movq %rax, -0x78(%rbp)
movq $0x0, -0x70(%rbp)
movq -0x10(%rbp), %rax
movq 0x18(%rax), %rax
movq %rax, -0x68(%rbp)
movb $0x4, -0x1a1(%rbp)
movb -0x1a1(%rbp), %al
movb %al, %cl
addb $-0x1, %cl
movb %cl, -0x1a1(%rbp)
movzbl %al, %eax
cmpl $0x0, %eax
jle 0x4e07
movb $0x4, -0x1a2(%rbp)
movb -0x1a2(%rbp), %al
movb %al, %cl
addb $-0x1, %cl
movb %cl, -0x1a2(%rbp)
movzbl %al, %eax
cmpl $0x0, %eax
jle 0x4e02
movzbl -0x1a2(%rbp), %eax
leaq -0x60(%rbp), %rdi
shlq $0x4, %rax
addq %rax, %rdi
movzbl -0x1a1(%rbp), %eax
leaq -0xa0(%rbp), %rsi
shlq $0x4, %rax
addq %rax, %rsi
movzbl -0x1a2(%rbp), %eax
leaq -0x1a0(%rbp), %rdx
shlq $0x6, %rax
addq %rax, %rdx
movzbl -0x1a1(%rbp), %eax
shlq $0x4, %rax
addq %rax, %rdx
callq 0x4950
jmp 0x4d98
jmp 0x4d78
movq $0x0, -0x1d2(%rbp)
movq -0xa8(%rbp), %rax
movq %rax, -0x1ca(%rbp)
movq $0x0, -0x1b2(%rbp)
movq -0xb8(%rbp), %rax
movq %rax, -0x1aa(%rbp)
movq $0x0, -0x1c2(%rbp)
movq -0xb0(%rbp), %rax
movq %rax, -0x1ba(%rbp)
leaq -0x1b2(%rbp), %rdi
leaq -0x1c2(%rbp), %rsi
leaq -0x1e2(%rbp), %rdx
callq 0x39a0
movq $0x0, -0x1b2(%rbp)
movq -0xc8(%rbp), %rax
movq %rax, -0x1aa(%rbp)
movq $0x0, -0x1c2(%rbp)
movq -0xc0(%rbp), %rax
movq %rax, -0x1ba(%rbp)
leaq -0x1b2(%rbp), %rdi
leaq -0x1c2(%rbp), %rsi
leaq -0x1f2(%rbp), %rdx
callq 0x39a0
movq $0x0, -0x1b2(%rbp)
movq -0xd8(%rbp), %rax
movq %rax, -0x1aa(%rbp)
movq $0x0, -0x1c2(%rbp)
movq -0xd0(%rbp), %rax
movq %rax, -0x1ba(%rbp)
leaq -0x1b2(%rbp), %rdi
leaq -0x1c2(%rbp), %rsi
leaq -0x202(%rbp), %rdx
callq 0x39a0
movq $0x0, -0x1b2(%rbp)
movq -0xe8(%rbp), %rax
movq %rax, -0x1aa(%rbp)
leaq -0x1b2(%rbp), %rdi
leaq -0x1e2(%rbp), %rdx
movq %rdx, %rsi
callq 0x39a0
movq $0x0, -0x1b2(%rbp)
movq -0xf8(%rbp), %rax
movq %rax, -0x1aa(%rbp)
leaq -0x1b2(%rbp), %rdi
leaq -0x1f2(%rbp), %rsi
leaq -0x1c2(%rbp), %rdx
callq 0x39a0
movq $0x0, -0x1b2(%rbp)
movq -0xf0(%rbp), %rax
movq %rax, -0x1aa(%rbp)
leaq -0x1b2(%rbp), %rdi
leaq -0x1c2(%rbp), %rsi
leaq -0x1f2(%rbp), %rdx
callq 0x39a0
movq $0x0, -0x1b2(%rbp)
movq -0x108(%rbp), %rax
movq %rax, -0x1aa(%rbp)
leaq -0x1b2(%rbp), %rdi
leaq -0x202(%rbp), %rsi
leaq -0x1c2(%rbp), %rdx
callq 0x39a0
movq $0x0, -0x1b2(%rbp)
movq -0x100(%rbp), %rax
movq %rax, -0x1aa(%rbp)
leaq -0x1b2(%rbp), %rdi
leaq -0x1c2(%rbp), %rsi
leaq -0x202(%rbp), %rdx
callq 0x39a0
movq $0x0, -0x1b2(%rbp)
movq -0x128(%rbp), %rax
movq %rax, -0x1aa(%rbp)
leaq -0x1b2(%rbp), %rdi
leaq -0x1f2(%rbp), %rdx
movq %rdx, %rsi
callq 0x39a0
movq $0x0, -0x1b2(%rbp)
movq -0x138(%rbp), %rax
movq %rax, -0x1aa(%rbp)
leaq -0x1b2(%rbp), %rdi
leaq -0x202(%rbp), %rsi
leaq -0x1c2(%rbp), %rdx
callq 0x39a0
movq $0x0, -0x1b2(%rbp)
movq -0x130(%rbp), %rax
movq %rax, -0x1aa(%rbp)
leaq -0x1b2(%rbp), %rdi
leaq -0x1c2(%rbp), %rsi
leaq -0x202(%rbp), %rdx
callq 0x39a0
movq $0x0, -0x1b2(%rbp)
movq -0x168(%rbp), %rax
movq %rax, -0x1aa(%rbp)
leaq -0x1b2(%rbp), %rdi
leaq -0x202(%rbp), %rdx
movq %rdx, %rsi
callq 0x39a0
leaq -0x222(%rbp), %rdi
callq 0x35f0
movq -0x1fa(%rbp), %rax
movq %rax, -0x222(%rbp)
leaq -0x242(%rbp), %rdi
callq 0x35f0
movq -0x1e2(%rbp), %rax
movq %rax, -0x23a(%rbp)
movq -0x1da(%rbp), %rax
movq %rax, -0x232(%rbp)
movq -0x18(%rbp), %rdx
leaq -0x222(%rbp), %rdi
leaq -0x242(%rbp), %rsi
callq 0x3c70
leaq -0x222(%rbp), %rdi
callq 0x35f0
leaq -0x222(%rbp), %rdi
leaq -0x1f2(%rbp), %rsi
callq 0x3510
movq -0x18(%rbp), %rsi
leaq -0x222(%rbp), %rdi
leaq -0x242(%rbp), %rdx
callq 0x3c70
leaq -0x222(%rbp), %rdi
callq 0x35f0
leaq -0x222(%rbp), %rdi
addq $0x10, %rdi
leaq -0x1d2(%rbp), %rsi
callq 0x3510
movq -0x18(%rbp), %rdx
leaq -0x222(%rbp), %rdi
leaq -0x242(%rbp), %rsi
callq 0x3c70
addq $0x250, %rsp            # imm = 0x250
popq %rbp
retq
nopw %cs:(%rax,%rax)