#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*/ bbox_from_extents(float **, float const *, float const,
                                     float const, float const);
void bbox_from_aabb(float box[4][4], const int aabb[2][3]) {
  const float pos[3] = {(aabb[1][0] + aabb[0][0]) / 2.f,
                        (aabb[1][1] + aabb[0][1]) / 2.f,
                        (aabb[1][2] + aabb[0][2]) / 2.f};
  const float size[3] = {(float)(aabb[1][0] - aabb[0][0]),
                         (float)(aabb[1][1] - aabb[0][1]),
                         (float)(aabb[1][2] - aabb[0][2])};
  bbox_from_extents(box, pos, size[0] / 2, size[1] / 2, size[2] / 2);
}


x86 assembly (clang, -O0):
<bbox_from_aabb>:
push   %rbp
mov    %rsp,%rbp
sub    $0x30,%rsp
mov    %rdi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
mov    -0x10(%rbp),%rax
mov    0xc(%rax),%eax
mov    -0x10(%rbp),%rcx
add    (%rcx),%eax
cvtsi2ss %eax,%xmm0
movss  0xec7(%rip),%xmm1
divss  %xmm1,%xmm0
movss  %xmm0,-0x1c(%rbp)
mov    -0x10(%rbp),%rax
mov    0x10(%rax),%eax
mov    -0x10(%rbp),%rcx
add    0x4(%rcx),%eax
cvtsi2ss %eax,%xmm0
movss  0xea4(%rip),%xmm1
divss  %xmm1,%xmm0
movss  %xmm0,-0x18(%rbp)
mov    -0x10(%rbp),%rax
mov    0x14(%rax),%eax
mov    -0x10(%rbp),%rcx
add    0x8(%rcx),%eax
cvtsi2ss %eax,%xmm0
movss  0xe81(%rip),%xmm1
divss  %xmm1,%xmm0
movss  %xmm0,-0x14(%rbp)
mov    -0x10(%rbp),%rax
mov    0xc(%rax),%eax
mov    -0x10(%rbp),%rcx
sub    (%rcx),%eax
cvtsi2ss %eax,%xmm0
movss  %xmm0,-0x28(%rbp)
mov    -0x10(%rbp),%rax
mov    0x10(%rax),%eax
mov    -0x10(%rbp),%rcx
sub    0x4(%rcx),%eax
cvtsi2ss %eax,%xmm0
movss  %xmm0,-0x24(%rbp)
mov    -0x10(%rbp),%rax
mov    0x14(%rax),%eax
mov    -0x10(%rbp),%rcx
sub    0x8(%rcx),%eax
cvtsi2ss %eax,%xmm0
movss  %xmm0,-0x20(%rbp)
mov    -0x8(%rbp),%rdi
lea    -0x1c(%rbp),%rsi
movss  -0x28(%rbp),%xmm0
movss  0xe1f(%rip),%xmm1
divss  %xmm1,%xmm0
movss  -0x24(%rbp),%xmm1
movss  0xe0e(%rip),%xmm2
divss  %xmm2,%xmm1
movss  -0x20(%rbp),%xmm2
movss  0xdfd(%rip),%xmm3
divss  %xmm3,%xmm2
call   1030 <bbox_from_extents@plt>
add    $0x30,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<bbox_from_aabb>:
sub    $0x18,%rsp
mov    (%rsi),%r8d
mov    0xc(%rsi),%ecx
lea    (%r8,%rcx,1),%edx
cvtsi2ss %edx,%xmm0
movss  0xed6(%rip),%xmm3
mulss  %xmm3,%xmm0
movss  %xmm0,0xc(%rsp)
mov    0x4(%rsi),%r9d
mov    0x10(%rsi),%eax
lea    (%r9,%rax,1),%edx
xorps  %xmm0,%xmm0
cvtsi2ss %edx,%xmm0
mulss  %xmm3,%xmm0
movss  %xmm0,0x10(%rsp)
mov    0x8(%rsi),%r10d
mov    0x14(%rsi),%esi
lea    (%r10,%rsi,1),%edx
cvtsi2ss %edx,%xmm4
mulss  %xmm3,%xmm4
sub    %r8d,%ecx
xorps  %xmm0,%xmm0
cvtsi2ss %ecx,%xmm0
sub    %r9d,%eax
cvtsi2ss %eax,%xmm1
sub    %r10d,%esi
cvtsi2ss %esi,%xmm2
movss  %xmm4,0x14(%rsp)
mulss  %xmm3,%xmm0
mulss  %xmm3,%xmm1
mulss  %xmm3,%xmm2
lea    0xc(%rsp),%rsi
call   1030 <bbox_from_extents@plt>
add    $0x18,%rsp
ret

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

LLVM IR (-O2):
define void @bbox_from_aabb([4 x float]* %0, [3 x i32]* nocapture %1) {
%3 = alloca [3 x float]
%4 = bitcast [3 x float]* %3 to i8*
%5 = getelementptr inbounds [3 x float], [3 x float]* %3, i64 0, i64 0
%6 = getelementptr inbounds [3 x i32], [3 x i32]* %1, i64 1, i64 0
%7 = load i32, i32* %6
%8 = getelementptr inbounds [3 x i32], [3 x i32]* %1, i64 0, i64 0
%9 = load i32, i32* %8
%10 = add nsw i32 %9, %7
%11 = sitofp i32 %10 to float
%12 = fmul float %11, 5.000000e-01
store float %12, float* %5
%13 = getelementptr inbounds [3 x float], [3 x float]* %3, i64 0, i64 1
%14 = getelementptr inbounds [3 x i32], [3 x i32]* %1, i64 1, i64 1
%15 = load i32, i32* %14
%16 = getelementptr inbounds [3 x i32], [3 x i32]* %1, i64 0, i64 1
%17 = load i32, i32* %16
%18 = add nsw i32 %17, %15
%19 = sitofp i32 %18 to float
%20 = fmul float %19, 5.000000e-01
store float %20, float* %13
%21 = getelementptr inbounds [3 x float], [3 x float]* %3, i64 0, i64 2
%22 = getelementptr inbounds [3 x i32], [3 x i32]* %1, i64 1, i64 2
%23 = load i32, i32* %22
%24 = getelementptr inbounds [3 x i32], [3 x i32]* %1, i64 0, i64 2
%25 = load i32, i32* %24
%26 = add nsw i32 %25, %23
%27 = sitofp i32 %26 to float
%28 = fmul float %27, 5.000000e-01
store float %28, float* %21
%29 = sub nsw i32 %7, %9
%30 = sitofp i32 %29 to float
%31 = sub nsw i32 %15, %17
%32 = sitofp i32 %31 to float
%33 = sub nsw i32 %23, %25
%34 = sitofp i32 %33 to float
%35 = bitcast [4 x float]* %0 to float**
%36 = fmul float %30, 5.000000e-01
%37 = fmul float %32, 5.000000e-01
%38 = fmul float %34, 5.000000e-01
%39 = call i32 @bbox_from_extents(float** %35, float* %5, float %36, float %37, float %38)
ret void
}