#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 */

/* Variables and functions */
int /*<<< orphan*/ abort();
void check(float A[128][128], float B[128][128]) {
  int i, j;
  for (i = 0; i < 128; i++)
    for (j = 0; j < 128; j++)
      if (A[i][j] - B[i][j] > 0.000001 || B[i][j] - A[i][j] > 0.000001)
        abort();
}


x86 assembly (clang, -O0):
<check>:
push   %rbp
mov    %rsp,%rbp
sub    $0x20,%rsp
mov    %rdi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
movl   $0x0,-0x14(%rbp)
cmpl   $0x80,-0x14(%rbp)
jge    1201 <check+0xf1>
movl   $0x0,-0x18(%rbp)
cmpl   $0x80,-0x18(%rbp)
jge    11ee <check+0xde>
mov    -0x8(%rbp),%rax
movslq -0x14(%rbp),%rcx
shl    $0x9,%rcx
add    %rcx,%rax
movslq -0x18(%rbp),%rcx
movss  (%rax,%rcx,4),%xmm0
mov    -0x10(%rbp),%rax
movslq -0x14(%rbp),%rcx
shl    $0x9,%rcx
add    %rcx,%rax
movslq -0x18(%rbp),%rcx
subss  (%rax,%rcx,4),%xmm0
cvtss2sd %xmm0,%xmm0
movsd  0xe7c(%rip),%xmm1
ucomisd %xmm1,%xmm0
ja     11d4 <check+0xc4>
mov    -0x10(%rbp),%rax
movslq -0x14(%rbp),%rcx
shl    $0x9,%rcx
add    %rcx,%rax
movslq -0x18(%rbp),%rcx
movss  (%rax,%rcx,4),%xmm0
mov    -0x8(%rbp),%rax
movslq -0x14(%rbp),%rcx
shl    $0x9,%rcx
add    %rcx,%rax
movslq -0x18(%rbp),%rcx
subss  (%rax,%rcx,4),%xmm0
cvtss2sd %xmm0,%xmm0
movsd  0xe36(%rip),%xmm1
ucomisd %xmm1,%xmm0
jbe    11db <check+0xcb>
mov    $0x0,%al
call   1030 <abort@plt>
jmp    11e0 <check+0xd0>
mov    -0x18(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x18(%rbp)
jmp    113b <check+0x2b>
jmp    11f3 <check+0xe3>
mov    -0x14(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x14(%rbp)
jmp    1127 <check+0x17>
add    $0x20,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<check>:
push   %rax
add    $0x4,%rdi
add    $0x4,%rsi
xor    %eax,%eax
movsd  0xedd(%rip),%xmm0
cs nopw 0x0(%rax,%rax,1)
nopl   (%rax)
xor    %ecx,%ecx
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax)
movss  -0x4(%rdi,%rcx,4),%xmm1
movss  -0x4(%rsi,%rcx,4),%xmm2
movaps %xmm1,%xmm3
subss  %xmm2,%xmm3
cvtss2sd %xmm3,%xmm3
ucomisd %xmm0,%xmm3
ja     11c7 <check+0xb7>
subss  %xmm1,%xmm2
xorps  %xmm1,%xmm1
cvtss2sd %xmm2,%xmm1
ucomisd %xmm0,%xmm1
ja     11c7 <check+0xb7>
movss  (%rdi,%rcx,4),%xmm1
movss  (%rsi,%rcx,4),%xmm2
movaps %xmm1,%xmm3
subss  %xmm2,%xmm3
cvtss2sd %xmm3,%xmm3
ucomisd %xmm0,%xmm3
ja     11c7 <check+0xb7>
subss  %xmm1,%xmm2
xorps  %xmm1,%xmm1
cvtss2sd %xmm2,%xmm1
ucomisd %xmm0,%xmm1
ja     11c7 <check+0xb7>
add    $0x2,%rcx
cmp    $0x80,%rcx
jne    1140 <check+0x30>
add    $0x1,%rax
add    $0x200,%rdi
add    $0x200,%rsi
cmp    $0x80,%rax
jne    1130 <check+0x20>
pop    %rax
ret
xor    %eax,%eax
call   1030 <abort@plt>

LLVM IR (-O0):
define void @check([128 x float]* %0, [128 x float]* %1) {
%3 = alloca [128 x float]*
%4 = alloca [128 x float]*
%5 = alloca i32
%6 = alloca i32
store [128 x float]* %0, [128 x float]** %3
store [128 x float]* %1, [128 x float]** %4
store i32 0, i32* %5
br label %7
7: ; preds = %61, %2
%8 = load i32, i32* %5
%9 = icmp slt i32 %8, 128
br i1 %9, label %10, label %64
10: ; preds = %7
store i32 0, i32* %6
br label %11
11: ; preds = %57, %10
%12 = load i32, i32* %6
%13 = icmp slt i32 %12, 128
br i1 %13, label %14, label %60
14: ; preds = %11
%15 = load [128 x float]*, [128 x float]** %3
%16 = load i32, i32* %5
%17 = sext i32 %16 to i64
%18 = getelementptr inbounds [128 x float], [128 x float]* %15, i64 %17
%19 = load i32, i32* %6
%20 = sext i32 %19 to i64
%21 = getelementptr inbounds [128 x float], [128 x float]* %18, i64 0, i64 %20
%22 = load float, float* %21
%23 = load [128 x float]*, [128 x float]** %4
%24 = load i32, i32* %5
%25 = sext i32 %24 to i64
%26 = getelementptr inbounds [128 x float], [128 x float]* %23, i64 %25
%27 = load i32, i32* %6
%28 = sext i32 %27 to i64
%29 = getelementptr inbounds [128 x float], [128 x float]* %26, i64 0, i64 %28
%30 = load float, float* %29
%31 = fsub float %22, %30
%32 = fpext float %31 to double
%33 = fcmp ogt double %32, 0x3EB0C6F7A0B5ED8D
br i1 %33, label %54, label %34
34: ; preds = %14
%35 = load [128 x float]*, [128 x float]** %4
%36 = load i32, i32* %5
%37 = sext i32 %36 to i64
%38 = getelementptr inbounds [128 x float], [128 x float]* %35, i64 %37
%39 = load i32, i32* %6
%40 = sext i32 %39 to i64
%41 = getelementptr inbounds [128 x float], [128 x float]* %38, i64 0, i64 %40
%42 = load float, float* %41
%43 = load [128 x float]*, [128 x float]** %3
%44 = load i32, i32* %5
%45 = sext i32 %44 to i64
%46 = getelementptr inbounds [128 x float], [128 x float]* %43, i64 %45
%47 = load i32, i32* %6
%48 = sext i32 %47 to i64
%49 = getelementptr inbounds [128 x float], [128 x float]* %46, i64 0, i64 %48
%50 = load float, float* %49
%51 = fsub float %42, %50
%52 = fpext float %51 to double
%53 = fcmp ogt double %52, 0x3EB0C6F7A0B5ED8D
br i1 %53, label %54, label %56
54: ; preds = %34, %14
%55 = call i32 (...) @abort()
unreachable
56: ; preds = %34
br label %57
57: ; preds = %56
%58 = load i32, i32* %6
%59 = add nsw i32 %58, 1
store i32 %59, i32* %6
br label %11
60: ; preds = %11
br label %61
61: ; preds = %60
%62 = load i32, i32* %5
%63 = add nsw i32 %62, 1
store i32 %63, i32* %5
br label %7
64: ; preds = %7
ret void
}

LLVM IR (-O2):
define void @check([128 x float]* nocapture %0, [128 x float]* nocapture %1) {
br label %3
3: ; preds = %2, %36
%4 = phi i64 [ 0, %2 ], [ %37, %36 ]
br label %21
5: ; preds = %30
%6 = or i64 %22, 1
%7 = getelementptr inbounds [128 x float], [128 x float]* %0, i64 %4, i64 %6
%8 = load float, float* %7
%9 = getelementptr inbounds [128 x float], [128 x float]* %1, i64 %4, i64 %6
%10 = load float, float* %9
%11 = fsub float %8, %10
%12 = fpext float %11 to double
%13 = fcmp ogt double %12, 0x3EB0C6F7A0B5ED8D
br i1 %13, label %34, label %14
14: ; preds = %5
%15 = fsub float %10, %8
%16 = fpext float %15 to double
%17 = fcmp ogt double %16, 0x3EB0C6F7A0B5ED8D
br i1 %17, label %34, label %18
18: ; preds = %14
%19 = add nuw nsw i64 %22, 2
%20 = icmp eq i64 %19, 128
br i1 %20, label %36, label %21
21: ; preds = %18, %3
%22 = phi i64 [ 0, %3 ], [ %19, %18 ]
%23 = getelementptr inbounds [128 x float], [128 x float]* %0, i64 %4, i64 %22
%24 = load float, float* %23
%25 = getelementptr inbounds [128 x float], [128 x float]* %1, i64 %4, i64 %22
%26 = load float, float* %25
%27 = fsub float %24, %26
%28 = fpext float %27 to double
%29 = fcmp ogt double %28, 0x3EB0C6F7A0B5ED8D
br i1 %29, label %34, label %30
30: ; preds = %21
%31 = fsub float %26, %24
%32 = fpext float %31 to double
%33 = fcmp ogt double %32, 0x3EB0C6F7A0B5ED8D
br i1 %33, label %34, label %5
34: ; preds = %14, %5, %30, %21
%35 = tail call i32 (...) @abort()
unreachable
36: ; preds = %18
%37 = add nuw nsw i64 %4, 1
%38 = icmp eq i64 %37, 128
br i1 %38, label %39, label %3
39: ; preds = %36
ret void
}