#define NULL ((void *)0)
typedef unsigned long size_t; // Customize by platform.
typedef long intptr_t;
typedef unsigned long uintptr_t;
typedef long scalar_t__; // Either arithmetic or pointer type.
/* By default, we understand bool (as a convenience). */
typedef int bool;
#define false 0
#define true 1

/* Forward declarations */

/* Type definitions */
typedef scalar_t__ uint32_t;

/* Variables and functions */
void fiat_25519_opp(uint32_t out1[10], const uint32_t arg1[10]) {
  uint32_t x1 = (0x7ffffdaUL - (arg1[0]));
  uint32_t x2 = (0x3fffffeUL - (arg1[1]));
  uint32_t x3 = (0x7fffffeUL - (arg1[2]));
  uint32_t x4 = (0x3fffffeUL - (arg1[3]));
  uint32_t x5 = (0x7fffffeUL - (arg1[4]));
  uint32_t x6 = (0x3fffffeUL - (arg1[5]));
  uint32_t x7 = (0x7fffffeUL - (arg1[6]));
  uint32_t x8 = (0x3fffffeUL - (arg1[7]));
  uint32_t x9 = (0x7fffffeUL - (arg1[8]));
  uint32_t x10 = (0x3fffffeUL - (arg1[9]));
  out1[0] = x1;
  out1[1] = x2;
  out1[2] = x3;
  out1[3] = x4;
  out1[4] = x5;
  out1[5] = x6;
  out1[6] = x7;
  out1[7] = x8;
  out1[8] = x9;
  out1[9] = x10;
}


x86 assembly (clang, -O0):
<fiat_25519_opp>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
mov    -0x10(%rbp),%rcx
mov    $0x7ffffda,%eax
sub    (%rcx),%rax
mov    %rax,-0x18(%rbp)
mov    -0x10(%rbp),%rcx
mov    $0x3fffffe,%eax
sub    0x8(%rcx),%rax
mov    %rax,-0x20(%rbp)
mov    -0x10(%rbp),%rcx
mov    $0x7fffffe,%eax
sub    0x10(%rcx),%rax
mov    %rax,-0x28(%rbp)
mov    -0x10(%rbp),%rcx
mov    $0x3fffffe,%eax
sub    0x18(%rcx),%rax
mov    %rax,-0x30(%rbp)
mov    -0x10(%rbp),%rcx
mov    $0x7fffffe,%eax
sub    0x20(%rcx),%rax
mov    %rax,-0x38(%rbp)
mov    -0x10(%rbp),%rcx
mov    $0x3fffffe,%eax
sub    0x28(%rcx),%rax
mov    %rax,-0x40(%rbp)
mov    -0x10(%rbp),%rcx
mov    $0x7fffffe,%eax
sub    0x30(%rcx),%rax
mov    %rax,-0x48(%rbp)
mov    -0x10(%rbp),%rcx
mov    $0x3fffffe,%eax
sub    0x38(%rcx),%rax
mov    %rax,-0x50(%rbp)
mov    -0x10(%rbp),%rcx
mov    $0x7fffffe,%eax
sub    0x40(%rcx),%rax
mov    %rax,-0x58(%rbp)
mov    -0x10(%rbp),%rcx
mov    $0x3fffffe,%eax
sub    0x48(%rcx),%rax
mov    %rax,-0x60(%rbp)
mov    -0x18(%rbp),%rcx
mov    -0x8(%rbp),%rax
mov    %rcx,(%rax)
mov    -0x20(%rbp),%rcx
mov    -0x8(%rbp),%rax
mov    %rcx,0x8(%rax)
mov    -0x28(%rbp),%rcx
mov    -0x8(%rbp),%rax
mov    %rcx,0x10(%rax)
mov    -0x30(%rbp),%rcx
mov    -0x8(%rbp),%rax
mov    %rcx,0x18(%rax)
mov    -0x38(%rbp),%rcx
mov    -0x8(%rbp),%rax
mov    %rcx,0x20(%rax)
mov    -0x40(%rbp),%rcx
mov    -0x8(%rbp),%rax
mov    %rcx,0x28(%rax)
mov    -0x48(%rbp),%rcx
mov    -0x8(%rbp),%rax
mov    %rcx,0x30(%rax)
mov    -0x50(%rbp),%rcx
mov    -0x8(%rbp),%rax
mov    %rcx,0x38(%rax)
mov    -0x58(%rbp),%rcx
mov    -0x8(%rbp),%rax
mov    %rcx,0x40(%rax)
mov    -0x60(%rbp),%rcx
mov    -0x8(%rbp),%rax
mov    %rcx,0x48(%rax)
pop    %rbp
ret

x86 assembly (clang, -O2):
<fiat_25519_opp>:
movdqa 0xef8(%rip),%xmm0
movdqu (%rsi),%xmm1
psubq  %xmm1,%xmm0
movdqu 0x10(%rsi),%xmm1
movdqu 0x20(%rsi),%xmm2
movdqu 0x30(%rsi),%xmm3
movdqa 0xee9(%rip),%xmm4
movdqa %xmm4,%xmm5
psubq  %xmm1,%xmm5
movdqa %xmm4,%xmm1
psubq  %xmm2,%xmm1
movdqa %xmm4,%xmm2
psubq  %xmm3,%xmm2
movdqu 0x40(%rsi),%xmm3
psubq  %xmm3,%xmm4
movdqu %xmm0,(%rdi)
movdqu %xmm5,0x10(%rdi)
movdqu %xmm1,0x20(%rdi)
movdqu %xmm2,0x30(%rdi)
movdqu %xmm4,0x40(%rdi)
ret

LLVM IR (-O0):
define void @fiat_25519_opp(i64* %0, i64* %1) {
%3 = alloca i64*
%4 = alloca i64*
%5 = alloca i64
%6 = alloca i64
%7 = alloca i64
%8 = alloca i64
%9 = alloca i64
%10 = alloca i64
%11 = alloca i64
%12 = alloca i64
%13 = alloca i64
%14 = alloca i64
store i64* %0, i64** %3
store i64* %1, i64** %4
%15 = load i64*, i64** %4
%16 = getelementptr inbounds i64, i64* %15, i64 0
%17 = load i64, i64* %16
%18 = sub i64 134217690, %17
store i64 %18, i64* %5
%19 = load i64*, i64** %4
%20 = getelementptr inbounds i64, i64* %19, i64 1
%21 = load i64, i64* %20
%22 = sub i64 67108862, %21
store i64 %22, i64* %6
%23 = load i64*, i64** %4
%24 = getelementptr inbounds i64, i64* %23, i64 2
%25 = load i64, i64* %24
%26 = sub i64 134217726, %25
store i64 %26, i64* %7
%27 = load i64*, i64** %4
%28 = getelementptr inbounds i64, i64* %27, i64 3
%29 = load i64, i64* %28
%30 = sub i64 67108862, %29
store i64 %30, i64* %8
%31 = load i64*, i64** %4
%32 = getelementptr inbounds i64, i64* %31, i64 4
%33 = load i64, i64* %32
%34 = sub i64 134217726, %33
store i64 %34, i64* %9
%35 = load i64*, i64** %4
%36 = getelementptr inbounds i64, i64* %35, i64 5
%37 = load i64, i64* %36
%38 = sub i64 67108862, %37
store i64 %38, i64* %10
%39 = load i64*, i64** %4
%40 = getelementptr inbounds i64, i64* %39, i64 6
%41 = load i64, i64* %40
%42 = sub i64 134217726, %41
store i64 %42, i64* %11
%43 = load i64*, i64** %4
%44 = getelementptr inbounds i64, i64* %43, i64 7
%45 = load i64, i64* %44
%46 = sub i64 67108862, %45
store i64 %46, i64* %12
%47 = load i64*, i64** %4
%48 = getelementptr inbounds i64, i64* %47, i64 8
%49 = load i64, i64* %48
%50 = sub i64 134217726, %49
store i64 %50, i64* %13
%51 = load i64*, i64** %4
%52 = getelementptr inbounds i64, i64* %51, i64 9
%53 = load i64, i64* %52
%54 = sub i64 67108862, %53
store i64 %54, i64* %14
%55 = load i64, i64* %5
%56 = load i64*, i64** %3
%57 = getelementptr inbounds i64, i64* %56, i64 0
store i64 %55, i64* %57
%58 = load i64, i64* %6
%59 = load i64*, i64** %3
%60 = getelementptr inbounds i64, i64* %59, i64 1
store i64 %58, i64* %60
%61 = load i64, i64* %7
%62 = load i64*, i64** %3
%63 = getelementptr inbounds i64, i64* %62, i64 2
store i64 %61, i64* %63
%64 = load i64, i64* %8
%65 = load i64*, i64** %3
%66 = getelementptr inbounds i64, i64* %65, i64 3
store i64 %64, i64* %66
%67 = load i64, i64* %9
%68 = load i64*, i64** %3
%69 = getelementptr inbounds i64, i64* %68, i64 4
store i64 %67, i64* %69
%70 = load i64, i64* %10
%71 = load i64*, i64** %3
%72 = getelementptr inbounds i64, i64* %71, i64 5
store i64 %70, i64* %72
%73 = load i64, i64* %11
%74 = load i64*, i64** %3
%75 = getelementptr inbounds i64, i64* %74, i64 6
store i64 %73, i64* %75
%76 = load i64, i64* %12
%77 = load i64*, i64** %3
%78 = getelementptr inbounds i64, i64* %77, i64 7
store i64 %76, i64* %78
%79 = load i64, i64* %13
%80 = load i64*, i64** %3
%81 = getelementptr inbounds i64, i64* %80, i64 8
store i64 %79, i64* %81
%82 = load i64, i64* %14
%83 = load i64*, i64** %3
%84 = getelementptr inbounds i64, i64* %83, i64 9
store i64 %82, i64* %84
ret void
}

LLVM IR (-O2):
define void @fiat_25519_opp(i64* nocapture writeonly %0, i64* nocapture %1) {
%3 = bitcast i64* %1 to <2 x i64>*
%4 = load <2 x i64>, <2 x i64>* %3
%5 = sub <2 x i64> <i64 134217690, i64 67108862>, %4
%6 = getelementptr inbounds i64, i64* %1, i64 2
%7 = bitcast i64* %6 to <2 x i64>*
%8 = load <2 x i64>, <2 x i64>* %7
%9 = sub <2 x i64> <i64 134217726, i64 67108862>, %8
%10 = getelementptr inbounds i64, i64* %1, i64 4
%11 = bitcast i64* %10 to <2 x i64>*
%12 = load <2 x i64>, <2 x i64>* %11
%13 = sub <2 x i64> <i64 134217726, i64 67108862>, %12
%14 = getelementptr inbounds i64, i64* %1, i64 6
%15 = bitcast i64* %14 to <2 x i64>*
%16 = load <2 x i64>, <2 x i64>* %15
%17 = sub <2 x i64> <i64 134217726, i64 67108862>, %16
%18 = getelementptr inbounds i64, i64* %1, i64 8
%19 = bitcast i64* %18 to <2 x i64>*
%20 = load <2 x i64>, <2 x i64>* %19
%21 = sub <2 x i64> <i64 134217726, i64 67108862>, %20
%22 = bitcast i64* %0 to <2 x i64>*
store <2 x i64> %5, <2 x i64>* %22
%23 = getelementptr inbounds i64, i64* %0, i64 2
%24 = bitcast i64* %23 to <2 x i64>*
store <2 x i64> %9, <2 x i64>* %24
%25 = getelementptr inbounds i64, i64* %0, i64 4
%26 = bitcast i64* %25 to <2 x i64>*
store <2 x i64> %13, <2 x i64>* %26
%27 = getelementptr inbounds i64, i64* %0, i64 6
%28 = bitcast i64* %27 to <2 x i64>*
store <2 x i64> %17, <2 x i64>* %28
%29 = getelementptr inbounds i64, i64* %0, i64 8
%30 = bitcast i64* %29 to <2 x i64>*
store <2 x i64> %21, <2 x i64>* %30
ret void
}