#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*/ Convert_Minutes_To_String(double, long, char *);
int /*<<< orphan*/ strcat(char *, char *);
long Convert_Geodetic_To_GEOREF(double latitude, double longitude,
                                long precision, char *georef) {
  double long_min;
  double lat_min;
  double origin_long;
  double origin_lat;
  long letter_number[4 + 1];
  char long_min_str[5 + 1];
  char lat_min_str[5 + 1];
  long i;
  long error_code = 0x0000;
  latitude = latitude * (180.0 / 3.14159265358979323e0);
  longitude = longitude * (180.0 / 3.14159265358979323e0);
  if ((latitude < (double)-90) || (latitude > (double)90))
    error_code |= 0x0001;
  if ((longitude < (double)-180) || (longitude > (double)360))
    error_code |= 0x0002;
  if ((precision < 0) || (precision > 5))
    error_code |= 0x0080;
  if (!error_code) {
    if (longitude > 180)
      longitude -= 360;
    origin_long = (double)-180;
    origin_lat = (double)-90;
    letter_number[0] = (long)((longitude - origin_long) / 15 + 0.0000005);
    longitude = longitude - ((double)letter_number[0] * 15 + origin_long);
    letter_number[2] = (long)(longitude + 0.0000005);
    long_min = (longitude - (double)letter_number[2]) * (double)60;
    letter_number[1] = (long)((latitude - origin_lat) / 15 + 0.0000005);
    latitude = latitude - ((double)letter_number[1] * 15 + origin_lat);
    letter_number[3] = (long)(latitude + 0.0000005);
    lat_min = (latitude - (double)letter_number[3]) * (double)60;
    for (i = 0; i < 4; i++) {
      if (letter_number[i] >= 8)
        letter_number[i] += 1;
      if (letter_number[i] >= 14)
        letter_number[i] += 1;
    }
    if (letter_number[0] == 26) {
      letter_number[0] = 25;
      letter_number[2] = 16;
      long_min = 59.999;
    }
    if (letter_number[1] == 13) {
      letter_number[1] = 12;
      letter_number[3] = 16;
      lat_min = 59.999;
    }
    for (i = 0; i < 4; i++)
      georef[i] = (char)(letter_number[i] + 65);
    georef[4] = 0;
    Convert_Minutes_To_String(long_min, precision, long_min_str);
    Convert_Minutes_To_String(lat_min, precision, lat_min_str);
    strcat(georef, long_min_str);
    strcat(georef, lat_min_str);
  }
  return (error_code);
}


x86 assembly (clang, -O0):
<Convert_Geodetic_To_GEOREF>:
push   %rbp
mov    %rsp,%rbp
sub    $0x90,%rsp
movsd  %xmm0,-0x8(%rbp)
movsd  %xmm1,-0x10(%rbp)
mov    %rdi,-0x18(%rbp)
mov    %rsi,-0x20(%rbp)
movq   $0x0,-0x90(%rbp)
movsd  0xeb8(%rip),%xmm0
mulsd  -0x8(%rbp),%xmm0
movsd  %xmm0,-0x8(%rbp)
movsd  0xea6(%rip),%xmm0
mulsd  -0x10(%rbp),%xmm0
movsd  %xmm0,-0x10(%rbp)
movsd  0xe8c(%rip),%xmm0
ucomisd -0x8(%rbp),%xmm0
ja     1196 <Convert_Geodetic_To_GEOREF+0x76>
movsd  -0x8(%rbp),%xmm0
movsd  0xe84(%rip),%xmm1
ucomisd %xmm1,%xmm0
jbe    11a8 <Convert_Geodetic_To_GEOREF+0x88>
mov    -0x90(%rbp),%rax
or     $0x1,%rax
mov    %rax,-0x90(%rbp)
movsd  0xe68(%rip),%xmm0
ucomisd -0x10(%rbp),%xmm0
ja     11d2 <Convert_Geodetic_To_GEOREF+0xb2>
movsd  -0x10(%rbp),%xmm0
movsd  0xe58(%rip),%xmm1
ucomisd %xmm1,%xmm0
jbe    11e4 <Convert_Geodetic_To_GEOREF+0xc4>
mov    -0x90(%rbp),%rax
or     $0x2,%rax
mov    %rax,-0x90(%rbp)
cmpq   $0x0,-0x18(%rbp)
jl     11fa <Convert_Geodetic_To_GEOREF+0xda>
cmpq   $0x5,-0x18(%rbp)
jle    120e <Convert_Geodetic_To_GEOREF+0xee>
mov    -0x90(%rbp),%rax
or     $0x80,%rax
mov    %rax,-0x90(%rbp)
cmpq   $0x0,-0x90(%rbp)
jne    14e2 <Convert_Geodetic_To_GEOREF+0x3c2>
movsd  -0x10(%rbp),%xmm0
movsd  0xdff(%rip),%xmm1
ucomisd %xmm1,%xmm0
jbe    1249 <Convert_Geodetic_To_GEOREF+0x129>
movsd  -0x10(%rbp),%xmm0
movsd  0xde0(%rip),%xmm1
subsd  %xmm1,%xmm0
movsd  %xmm0,-0x10(%rbp)
movsd  0xdc7(%rip),%xmm0
movsd  %xmm0,-0x38(%rbp)
movsd  0xda2(%rip),%xmm0
movsd  %xmm0,-0x40(%rbp)
movsd  -0x10(%rbp),%xmm0
subsd  -0x38(%rbp),%xmm0
movsd  0xdcb(%rip),%xmm1
divsd  %xmm1,%xmm0
movsd  0xdb7(%rip),%xmm1
addsd  %xmm1,%xmm0
cvttsd2si %xmm0,%rax
mov    %rax,-0x70(%rbp)
movsd  -0x10(%rbp),%xmm0
cvtsi2sdq -0x70(%rbp),%xmm1
movsd  -0x38(%rbp),%xmm2
movsd  0xd9a(%rip),%xmm3
mulsd  %xmm3,%xmm1
addsd  %xmm2,%xmm1
subsd  %xmm1,%xmm0
movsd  %xmm0,-0x10(%rbp)
movsd  0xd79(%rip),%xmm0
addsd  -0x10(%rbp),%xmm0
cvttsd2si %xmm0,%rax
mov    %rax,-0x60(%rbp)
movsd  -0x10(%rbp),%xmm0
cvtsi2sdq -0x60(%rbp),%xmm1
subsd  %xmm1,%xmm0
movsd  0xd4c(%rip),%xmm1
mulsd  %xmm1,%xmm0
movsd  %xmm0,-0x28(%rbp)
movsd  -0x8(%rbp),%xmm0
subsd  -0x40(%rbp),%xmm0
movsd  0xd41(%rip),%xmm1
divsd  %xmm1,%xmm0
movsd  0xd2d(%rip),%xmm1
addsd  %xmm1,%xmm0
cvttsd2si %xmm0,%rax
mov    %rax,-0x68(%rbp)
movsd  -0x8(%rbp),%xmm0
cvtsi2sdq -0x68(%rbp),%xmm1
movsd  -0x40(%rbp),%xmm2
movsd  0xd10(%rip),%xmm3
mulsd  %xmm3,%xmm1
addsd  %xmm2,%xmm1
subsd  %xmm1,%xmm0
movsd  %xmm0,-0x8(%rbp)
movsd  0xcef(%rip),%xmm0
addsd  -0x8(%rbp),%xmm0
cvttsd2si %xmm0,%rax
mov    %rax,-0x58(%rbp)
movsd  -0x8(%rbp),%xmm0
cvtsi2sdq -0x58(%rbp),%xmm1
subsd  %xmm1,%xmm0
movsd  0xcc2(%rip),%xmm1
mulsd  %xmm1,%xmm0
movsd  %xmm0,-0x30(%rbp)
movq   $0x0,-0x88(%rbp)
cmpq   $0x4,-0x88(%rbp)
04
jge    13fc <Convert_Geodetic_To_GEOREF+0x2dc>
mov    -0x88(%rbp),%rax
cmpq   $0x8,-0x70(%rbp,%rax,8)
jl     13b8 <Convert_Geodetic_To_GEOREF+0x298>
mov    -0x88(%rbp),%rax
mov    -0x70(%rbp,%rax,8),%rcx
add    $0x1,%rcx
mov    %rcx,-0x70(%rbp,%rax,8)
mov    -0x88(%rbp),%rax
cmpq   $0xe,-0x70(%rbp,%rax,8)
jl     13e0 <Convert_Geodetic_To_GEOREF+0x2c0>
mov    -0x88(%rbp),%rax
mov    -0x70(%rbp,%rax,8),%rcx
add    $0x1,%rcx
mov    %rcx,-0x70(%rbp,%rax,8)
jmp    13e5 <Convert_Geodetic_To_GEOREF+0x2c5>
mov    -0x88(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x88(%rbp)
jmp    1382 <Convert_Geodetic_To_GEOREF+0x262>
cmpq   $0x1a,-0x70(%rbp)
jne    1424 <Convert_Geodetic_To_GEOREF+0x304>
movq   $0x19,-0x70(%rbp)
movq   $0x10,-0x60(%rbp)
movsd  0xc29(%rip),%xmm0
movsd  %xmm0,-0x28(%rbp)
cmpq   $0xd,-0x68(%rbp)
jne    144c <Convert_Geodetic_To_GEOREF+0x32c>
movq   $0xc,-0x68(%rbp)
movq   $0x10,-0x58(%rbp)
movsd  0xc01(%rip),%xmm0
movsd  %xmm0,-0x30(%rbp)
movq   $0x0,-0x88(%rbp)
cmpq   $0x4,-0x88(%rbp)
04
jge    149c <Convert_Geodetic_To_GEOREF+0x37c>
mov    -0x88(%rbp),%rax
mov    -0x70(%rbp,%rax,8),%rax
add    $0x41,%rax
mov    %al,%dl
mov    -0x20(%rbp),%rax
mov    -0x88(%rbp),%rcx
mov    %dl,(%rax,%rcx,1)
mov    -0x88(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x88(%rbp)
jmp    1457 <Convert_Geodetic_To_GEOREF+0x337>
mov    -0x20(%rbp),%rax
movb   $0x0,0x4(%rax)
movsd  -0x28(%rbp),%xmm0
mov    -0x18(%rbp),%rdi
lea    -0x76(%rbp),%rsi
call   1030 <Convert_Minutes_To_String@plt>
movsd  -0x30(%rbp),%xmm0
mov    -0x18(%rbp),%rdi
lea    -0x7c(%rbp),%rsi
call   1030 <Convert_Minutes_To_String@plt>
mov    -0x20(%rbp),%rdi
lea    -0x76(%rbp),%rsi
call   1040 <strcat@plt>
mov    -0x20(%rbp),%rdi
lea    -0x7c(%rbp),%rsi
call   1040 <strcat@plt>
mov    -0x90(%rbp),%rax
add    $0x90,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<Convert_Geodetic_To_GEOREF>:
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
sub    $0x20,%rsp
movsd  0xecb(%rip),%xmm2
mulsd  %xmm2,%xmm0
movsd  0xec7(%rip),%xmm3
ucomisd %xmm0,%xmm3
seta   %al
ucomisd 0xec0(%rip),%xmm0
seta   %cl
or     %al,%cl
movzbl %cl,%eax
mulsd  %xmm2,%xmm1
ucomisd 0xeb4(%rip),%xmm1
lea    0x2(%rax),%rcx
cmova  %rcx,%rax
movsd  0xeac(%rip),%xmm2
ucomisd %xmm1,%xmm2
cmova  %rcx,%rax
lea    0x80(%rax),%rbx
cmp    $0x6,%rdi
cmovb  %rax,%rbx
test   %rbx,%rbx
jne    137e <Convert_Geodetic_To_GEOREF+0x25e>
mov    %rsi,%r14
mov    %rdi,%r15
movsd  0xe86(%rip),%xmm3
addsd  %xmm1,%xmm3
movsd  0xe82(%rip),%xmm4
movapd %xmm4,%xmm2
cmpltsd %xmm1,%xmm2
andpd  %xmm2,%xmm3
andnpd %xmm1,%xmm2
orpd   %xmm3,%xmm2
addsd  %xmm2,%xmm4
movsd  0xe69(%rip),%xmm1
divsd  %xmm1,%xmm4
movsd  0xe65(%rip),%xmm3
addsd  %xmm3,%xmm4
cvttsd2si %xmm4,%rdi
xorps  %xmm4,%xmm4
cvtsi2sd %rdi,%xmm4
mulsd  %xmm1,%xmm4
addsd  0xe28(%rip),%xmm4
subsd  %xmm4,%xmm2
movapd %xmm2,%xmm4
addsd  %xmm3,%xmm4
cvttsd2si %xmm4,%r10
movsd  0xdff(%rip),%xmm4
addsd  %xmm0,%xmm4
divsd  %xmm1,%xmm4
addsd  %xmm3,%xmm4
cvttsd2si %xmm4,%rcx
xorps  %xmm4,%xmm4
cvtsi2sd %rcx,%xmm4
mulsd  %xmm1,%xmm4
addsd  0xdd2(%rip),%xmm4
subsd  %xmm4,%xmm0
addsd  %xmm0,%xmm3
cvttsd2si %xmm3,%r9
cmp    $0xd,%rdi
mov    $0x1,%edx
mov    $0x1,%esi
sbb    $0xffffffffffffffff,%rsi
xor    %eax,%eax
cmp    $0x8,%rdi
cmovl  %rax,%rsi
add    %rdi,%rsi
cmp    $0xd,%rcx
sbb    $0xffffffffffffffff,%rdx
cmp    $0x8,%rcx
cmovl  %rax,%rdx
add    %rcx,%rdx
xor    %ecx,%ecx
cmp    $0xd,%r10
setae  %cl
add    $0x1,%ecx
cmp    $0x8,%r10
cmovl  %eax,%ecx
xor    %edi,%edi
cmp    $0xd,%r9
setae  %dil
add    $0x1,%edi
cmp    $0x8,%r9
cmovl  %eax,%edi
lea    (%r10,%rcx,1),%eax
add    %r9d,%edi
movsd  0xd9d(%rip),%xmm3
lea    0x41(%rsi),%ecx
lea    0x41(%rdx),%r8d
add    $0x41,%al
movsd  0xd94(%rip),%xmm4
movapd %xmm4,%xmm1
cmp    $0x1a,%rsi
je     12da <Convert_Geodetic_To_GEOREF+0x1ba>
xorps  %xmm1,%xmm1
cvtsi2sd %r10,%xmm1
subsd  %xmm1,%xmm2
mulsd  %xmm3,%xmm2
movapd %xmm2,%xmm1
movzbl %cl,%ecx
mov    $0x5a,%esi
cmovne %ecx,%esi
movzbl %al,%ecx
mov    $0x51,%r10d
cmove  %r10d,%ecx
add    $0x41,%dil
cmp    $0xd,%rdx
je     1310 <Convert_Geodetic_To_GEOREF+0x1f0>
xorps  %xmm2,%xmm2
cvtsi2sd %r9,%xmm2
subsd  %xmm2,%xmm0
mulsd  %xmm3,%xmm0
movapd %xmm0,%xmm4
movsd  %xmm4,0x8(%rsp)
movzbl %r8b,%edx
mov    $0x4d,%eax
cmovne %edx,%eax
mov    %sil,(%r14)
mov    %al,0x1(%r14)
mov    %cl,0x2(%r14)
movzbl %dil,%eax
cmove  %r10d,%eax
mov    %al,0x3(%r14)
movb   $0x0,0x4(%r14)
lea    0x1a(%rsp),%r12
movapd %xmm1,%xmm0
mov    %r15,%rdi
mov    %r12,%rsi
call   1030 <Convert_Minutes_To_String@plt>
lea    0x14(%rsp),%r13
movsd  0x8(%rsp),%xmm0
mov    %r15,%rdi
mov    %r13,%rsi
call   1030 <Convert_Minutes_To_String@plt>
mov    %r14,%rdi
mov    %r12,%rsi
call   1040 <strcat@plt>
mov    %r14,%rdi
mov    %r13,%rsi
call   1040 <strcat@plt>
mov    %rbx,%rax
add    $0x20,%rsp
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
ret

LLVM IR (-O0):
define i64 @Convert_Geodetic_To_GEOREF(double %0, double %1, i64 %2, i8* %3) {
%5 = alloca double
%6 = alloca double
%7 = alloca i64
%8 = alloca i8*
%9 = alloca double
%10 = alloca double
%11 = alloca double
%12 = alloca double
%13 = alloca [5 x i64]
%14 = alloca [6 x i8]
%15 = alloca [6 x i8]
%16 = alloca i64
%17 = alloca i64
store double %0, double* %5
store double %1, double* %6
store i64 %2, i64* %7
store i8* %3, i8** %8
store i64 0, i64* %17
%18 = load double, double* %5
%19 = fmul double %18, 0x404CA5DC1A63C1F8
store double %19, double* %5
%20 = load double, double* %6
%21 = fmul double %20, 0x404CA5DC1A63C1F8
store double %21, double* %6
%22 = load double, double* %5
%23 = fcmp olt double %22, -9.000000e+01
br i1 %23, label %27, label %24
24: ; preds = %4
%25 = load double, double* %5
%26 = fcmp ogt double %25, 9.000000e+01
br i1 %26, label %27, label %30
27: ; preds = %24, %4
%28 = load i64, i64* %17
%29 = or i64 %28, 1
store i64 %29, i64* %17
br label %30
30: ; preds = %27, %24
%31 = load double, double* %6
%32 = fcmp olt double %31, -1.800000e+02
br i1 %32, label %36, label %33
33: ; preds = %30
%34 = load double, double* %6
%35 = fcmp ogt double %34, 3.600000e+02
br i1 %35, label %36, label %39
36: ; preds = %33, %30
%37 = load i64, i64* %17
%38 = or i64 %37, 2
store i64 %38, i64* %17
br label %39
39: ; preds = %36, %33
%40 = load i64, i64* %7
%41 = icmp slt i64 %40, 0
br i1 %41, label %45, label %42
42: ; preds = %39
%43 = load i64, i64* %7
%44 = icmp sgt i64 %43, 5
br i1 %44, label %45, label %48
45: ; preds = %42, %39
%46 = load i64, i64* %17
%47 = or i64 %46, 128
store i64 %47, i64* %17
br label %48
48: ; preds = %45, %42
%49 = load i64, i64* %17
%50 = icmp ne i64 %49, 0
br i1 %50, label %180, label %51
51: ; preds = %48
%52 = load double, double* %6
%53 = fcmp ogt double %52, 1.800000e+02
br i1 %53, label %54, label %57
54: ; preds = %51
%55 = load double, double* %6
%56 = fsub double %55, 3.600000e+02
store double %56, double* %6
br label %57
57: ; preds = %54, %51
store double -1.800000e+02, double* %11
store double -9.000000e+01, double* %12
%58 = load double, double* %6
%59 = load double, double* %11
%60 = fsub double %58, %59
%61 = fdiv double %60, 1.500000e+01
%62 = fadd double %61, 5.000000e-07
%63 = fptosi double %62 to i64
%64 = getelementptr inbounds [5 x i64], [5 x i64]* %13, i64 0, i64 0
store i64 %63, i64* %64
%65 = load double, double* %6
%66 = getelementptr inbounds [5 x i64], [5 x i64]* %13, i64 0, i64 0
%67 = load i64, i64* %66
%68 = sitofp i64 %67 to double
%69 = load double, double* %11
%70 = call double @llvm.fmuladd.f64(double %68, double 1.500000e+01, double %69)
%71 = fsub double %65, %70
store double %71, double* %6
%72 = load double, double* %6
%73 = fadd double %72, 5.000000e-07
%74 = fptosi double %73 to i64
%75 = getelementptr inbounds [5 x i64], [5 x i64]* %13, i64 0, i64 2
store i64 %74, i64* %75
%76 = load double, double* %6
%77 = getelementptr inbounds [5 x i64], [5 x i64]* %13, i64 0, i64 2
%78 = load i64, i64* %77
%79 = sitofp i64 %78 to double
%80 = fsub double %76, %79
%81 = fmul double %80, 6.000000e+01
store double %81, double* %9
%82 = load double, double* %5
%83 = load double, double* %12
%84 = fsub double %82, %83
%85 = fdiv double %84, 1.500000e+01
%86 = fadd double %85, 5.000000e-07
%87 = fptosi double %86 to i64
%88 = getelementptr inbounds [5 x i64], [5 x i64]* %13, i64 0, i64 1
store i64 %87, i64* %88
%89 = load double, double* %5
%90 = getelementptr inbounds [5 x i64], [5 x i64]* %13, i64 0, i64 1
%91 = load i64, i64* %90
%92 = sitofp i64 %91 to double
%93 = load double, double* %12
%94 = call double @llvm.fmuladd.f64(double %92, double 1.500000e+01, double %93)
%95 = fsub double %89, %94
store double %95, double* %5
%96 = load double, double* %5
%97 = fadd double %96, 5.000000e-07
%98 = fptosi double %97 to i64
%99 = getelementptr inbounds [5 x i64], [5 x i64]* %13, i64 0, i64 3
store i64 %98, i64* %99
%100 = load double, double* %5
%101 = getelementptr inbounds [5 x i64], [5 x i64]* %13, i64 0, i64 3
%102 = load i64, i64* %101
%103 = sitofp i64 %102 to double
%104 = fsub double %100, %103
%105 = fmul double %104, 6.000000e+01
store double %105, double* %10
store i64 0, i64* %16
br label %106
106: ; preds = %130, %57
%107 = load i64, i64* %16
%108 = icmp slt i64 %107, 4
br i1 %108, label %109, label %133
109: ; preds = %106
%110 = load i64, i64* %16
%111 = getelementptr inbounds [5 x i64], [5 x i64]* %13, i64 0, i64 %110
%112 = load i64, i64* %111
%113 = icmp sge i64 %112, 8
br i1 %113, label %114, label %119
114: ; preds = %109
%115 = load i64, i64* %16
%116 = getelementptr inbounds [5 x i64], [5 x i64]* %13, i64 0, i64 %115
%117 = load i64, i64* %116
%118 = add nsw i64 %117, 1
store i64 %118, i64* %116
br label %119
119: ; preds = %114, %109
%120 = load i64, i64* %16
%121 = getelementptr inbounds [5 x i64], [5 x i64]* %13, i64 0, i64 %120
%122 = load i64, i64* %121
%123 = icmp sge i64 %122, 14
br i1 %123, label %124, label %129
124: ; preds = %119
%125 = load i64, i64* %16
%126 = getelementptr inbounds [5 x i64], [5 x i64]* %13, i64 0, i64 %125
%127 = load i64, i64* %126
%128 = add nsw i64 %127, 1
store i64 %128, i64* %126
br label %129
129: ; preds = %124, %119
br label %130
130: ; preds = %129
%131 = load i64, i64* %16
%132 = add nsw i64 %131, 1
store i64 %132, i64* %16
br label %106
133: ; preds = %106
%134 = getelementptr inbounds [5 x i64], [5 x i64]* %13, i64 0, i64 0
%135 = load i64, i64* %134
%136 = icmp eq i64 %135, 26
br i1 %136, label %137, label %140
137: ; preds = %133
%138 = getelementptr inbounds [5 x i64], [5 x i64]* %13, i64 0, i64 0
store i64 25, i64* %138
%139 = getelementptr inbounds [5 x i64], [5 x i64]* %13, i64 0, i64 2
store i64 16, i64* %139
store double 5.999900e+01, double* %9
br label %140
140: ; preds = %137, %133
%141 = getelementptr inbounds [5 x i64], [5 x i64]* %13, i64 0, i64 1
%142 = load i64, i64* %141
%143 = icmp eq i64 %142, 13
br i1 %143, label %144, label %147
144: ; preds = %140
%145 = getelementptr inbounds [5 x i64], [5 x i64]* %13, i64 0, i64 1
store i64 12, i64* %145
%146 = getelementptr inbounds [5 x i64], [5 x i64]* %13, i64 0, i64 3
store i64 16, i64* %146
store double 5.999900e+01, double* %10
br label %147
147: ; preds = %144, %140
store i64 0, i64* %16
br label %148
148: ; preds = %160, %147
%149 = load i64, i64* %16
%150 = icmp slt i64 %149, 4
br i1 %150, label %151, label %163
151: ; preds = %148
%152 = load i64, i64* %16
%153 = getelementptr inbounds [5 x i64], [5 x i64]* %13, i64 0, i64 %152
%154 = load i64, i64* %153
%155 = add nsw i64 %154, 65
%156 = trunc i64 %155 to i8
%157 = load i8*, i8** %8
%158 = load i64, i64* %16
%159 = getelementptr inbounds i8, i8* %157, i64 %158
store i8 %156, i8* %159
br label %160
160: ; preds = %151
%161 = load i64, i64* %16
%162 = add nsw i64 %161, 1
store i64 %162, i64* %16
br label %148
163: ; preds = %148
%164 = load i8*, i8** %8
%165 = getelementptr inbounds i8, i8* %164, i64 4
store i8 0, i8* %165
%166 = load double, double* %9
%167 = load i64, i64* %7
%168 = getelementptr inbounds [6 x i8], [6 x i8]* %14, i64 0, i64 0
%169 = call i32 @Convert_Minutes_To_String(double %166, i64 %167, i8* %168)
%170 = load double, double* %10
%171 = load i64, i64* %7
%172 = getelementptr inbounds [6 x i8], [6 x i8]* %15, i64 0, i64 0
%173 = call i32 @Convert_Minutes_To_String(double %170, i64 %171, i8* %172)
%174 = load i8*, i8** %8
%175 = getelementptr inbounds [6 x i8], [6 x i8]* %14, i64 0, i64 0
%176 = call i32 @strcat(i8* %174, i8* %175)
%177 = load i8*, i8** %8
%178 = getelementptr inbounds [6 x i8], [6 x i8]* %15, i64 0, i64 0
%179 = call i32 @strcat(i8* %177, i8* %178)
br label %180
180: ; preds = %163, %48
%181 = load i64, i64* %17
ret i64 %181
}

LLVM IR (-O2):
define i64 @Convert_Geodetic_To_GEOREF(double %0, double %1, i64 %2, i8* %3) {
%5 = alloca [6 x i8]
%6 = alloca [6 x i8]
%7 = getelementptr inbounds [6 x i8], [6 x i8]* %5, i64 0, i64 0
%8 = getelementptr inbounds [6 x i8], [6 x i8]* %6, i64 0, i64 0
%9 = fmul double %0, 0x404CA5DC1A63C1F8
%10 = fmul double %1, 0x404CA5DC1A63C1F8
%11 = fcmp olt double %9, -9.000000e+01
%12 = fcmp ogt double %9, 9.000000e+01
%13 = or i1 %11, %12
%14 = zext i1 %13 to i64
%15 = fcmp olt double %10, -1.800000e+02
%16 = fcmp ogt double %10, 3.600000e+02
%17 = or i1 %15, %16
%18 = or i64 %14, 2
%19 = select i1 %17, i64 %18, i64 %14
%20 = icmp ugt i64 %2, 5
%21 = or i64 %19, 128
%22 = select i1 %20, i64 %21, i64 %19
%23 = icmp eq i64 %22, 0
br i1 %23, label %24, label %96
24: ; preds = %4
%25 = fcmp ogt double %10, 1.800000e+02
%26 = fadd double %10, -3.600000e+02
%27 = select i1 %25, double %26, double %10
%28 = fadd double %27, 1.800000e+02
%29 = fdiv double %28, 1.500000e+01
%30 = fadd double %29, 5.000000e-07
%31 = fptosi double %30 to i64
%32 = sitofp i64 %31 to double
%33 = tail call double @llvm.fmuladd.f64(double %32, double 1.500000e+01, double -1.800000e+02)
%34 = fsub double %27, %33
%35 = fadd double %34, 5.000000e-07
%36 = fptosi double %35 to i64
%37 = sitofp i64 %36 to double
%38 = fsub double %34, %37
%39 = fadd double %9, 9.000000e+01
%40 = fdiv double %39, 1.500000e+01
%41 = fadd double %40, 5.000000e-07
%42 = fptosi double %41 to i64
%43 = sitofp i64 %42 to double
%44 = tail call double @llvm.fmuladd.f64(double %43, double 1.500000e+01, double -9.000000e+01)
%45 = fsub double %9, %44
%46 = fadd double %45, 5.000000e-07
%47 = fptosi double %46 to i64
%48 = sitofp i64 %47 to double
%49 = fsub double %45, %48
%50 = icmp sgt i64 %31, 7
%51 = icmp ugt i64 %31, 12
%52 = select i1 %51, i64 2, i64 1
%53 = select i1 %50, i64 %52, i64 0
%54 = add nuw nsw i64 %53, %31
%55 = icmp sgt i64 %42, 7
%56 = icmp ugt i64 %42, 12
%57 = select i1 %56, i64 2, i64 1
%58 = select i1 %55, i64 %57, i64 0
%59 = add nuw nsw i64 %58, %42
%60 = icmp sgt i64 %36, 7
%61 = icmp ugt i64 %36, 12
%62 = select i1 %61, i64 2, i64 1
%63 = select i1 %60, i64 %62, i64 0
%64 = add nuw nsw i64 %63, %36
%65 = icmp sgt i64 %47, 7
%66 = icmp ugt i64 %47, 12
%67 = select i1 %66, i64 2, i64 1
%68 = select i1 %65, i64 %67, i64 0
%69 = add nuw nsw i64 %68, %47
%70 = fmul double %38, 6.000000e+01
%71 = fmul double %49, 6.000000e+01
%72 = icmp eq i64 %54, 26
%73 = select i1 %72, double 5.999900e+01, double %70
%74 = icmp eq i64 %59, 13
%75 = select i1 %74, double 5.999900e+01, double %71
%76 = trunc i64 %54 to i8
%77 = add i8 %76, 65
%78 = select i1 %72, i8 90, i8 %77
store i8 %78, i8* %3
%79 = trunc i64 %59 to i8
%80 = add i8 %79, 65
%81 = select i1 %74, i8 77, i8 %80
%82 = getelementptr inbounds i8, i8* %3, i64 1
store i8 %81, i8* %82
%83 = trunc i64 %64 to i8
%84 = add i8 %83, 65
%85 = select i1 %72, i8 81, i8 %84
%86 = getelementptr inbounds i8, i8* %3, i64 2
store i8 %85, i8* %86
%87 = trunc i64 %69 to i8
%88 = add i8 %87, 65
%89 = select i1 %74, i8 81, i8 %88
%90 = getelementptr inbounds i8, i8* %3, i64 3
store i8 %89, i8* %90
%91 = getelementptr inbounds i8, i8* %3, i64 4
store i8 0, i8* %91
%92 = call i32 @Convert_Minutes_To_String(double %73, i64 %2, i8* %7)
%93 = call i32 @Convert_Minutes_To_String(double %75, i64 %2, i8* %8)
%94 = call i32 @strcat(i8* %3, i8* %7)
%95 = call i32 @strcat(i8* %3, i8* %8)
br label %96
96: ; preds = %24, %4
ret i64 %22
}