#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*/ split_sexigesimal_str(char const *, float **);
void sexigesimal_str_to_coords(const char *str, short *hour, short *min,
                               short *sec, short *msec) {
  float splitted[3];
  split_sexigesimal_str(str, &splitted);
  *hour = splitted[0];
  *min = splitted[1];
  *sec = splitted[2];
  if (*min < 0) {
    *min *= -1;
  }
  if (*sec < 0) {
    *sec *= -1;
  }
  *msec = (short)((splitted[2] - *sec) * 1000);
}


x86 assembly (clang, -O0):
<sexigesimal_str_to_coords>:
push   %rbp
mov    %rsp,%rbp
sub    $0x40,%rsp
mov    %rdi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
mov    %rdx,-0x18(%rbp)
mov    %rcx,-0x20(%rbp)
mov    %r8,-0x28(%rbp)
mov    -0x8(%rbp),%rdi
lea    -0x34(%rbp),%rsi
call   1030 <split_sexigesimal_str@plt>
cvttss2si -0x34(%rbp),%eax
mov    %ax,%cx
mov    -0x10(%rbp),%rax
mov    %cx,(%rax)
cvttss2si -0x30(%rbp),%eax
mov    %ax,%cx
mov    -0x18(%rbp),%rax
mov    %cx,(%rax)
movss  -0x2c(%rbp),%xmm0
cvttss2si %xmm0,%eax
mov    %ax,%cx
mov    -0x20(%rbp),%rax
mov    %cx,(%rax)
mov    -0x18(%rbp),%rax
movswl (%rax),%eax
cmp    $0x0,%eax
jge    1187 <sexigesimal_str_to_coords+0x77>
mov    -0x18(%rbp),%rax
movswl (%rax),%ecx
imul   $0xffffffff,%ecx,%ecx
mov    %cx,(%rax)
mov    -0x20(%rbp),%rax
movswl (%rax),%eax
cmp    $0x0,%eax
jge    11a4 <sexigesimal_str_to_coords+0x94>
mov    -0x20(%rbp),%rax
movswl (%rax),%ecx
imul   $0xffffffff,%ecx,%ecx
mov    %cx,(%rax)
movss  -0x2c(%rbp),%xmm0
mov    -0x20(%rbp),%rax
movswl (%rax),%eax
cvtsi2ss %eax,%xmm1
subss  %xmm1,%xmm0
movss  0xe40(%rip),%xmm1
mulss  %xmm1,%xmm0
cvttss2si %xmm0,%eax
mov    %ax,%cx
mov    -0x28(%rbp),%rax
mov    %cx,(%rax)
add    $0x40,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<sexigesimal_str_to_coords>:
push   %r15
push   %r14
push   %r12
push   %rbx
sub    $0x18,%rsp
mov    %r8,%r14
mov    %rcx,%r15
mov    %rdx,%rbx
mov    %rsi,%r12
lea    0xc(%rsp),%rsi
call   1030 <split_sexigesimal_str@plt>
cvttss2si 0xc(%rsp),%eax
mov    %ax,(%r12)
cvttss2si 0x10(%rsp),%eax
mov    %ax,(%rbx)
movss  0x14(%rsp),%xmm0
cvttss2si %xmm0,%eax
mov    %ax,(%r15)
movzwl (%rbx),%ecx
test   %cx,%cx
js     1185 <sexigesimal_str_to_coords+0x75>
test   %ax,%ax
js     1193 <sexigesimal_str_to_coords+0x83>
cwtl
cvtsi2ss %eax,%xmm1
subss  %xmm1,%xmm0
mulss  0xe8f(%rip),%xmm0
cvttss2si %xmm0,%eax
mov    %ax,(%r14)
add    $0x18,%rsp
pop    %rbx
pop    %r12
pop    %r14
pop    %r15
ret
neg    %ecx
mov    %cx,(%rbx)
movzwl (%r15),%eax
test   %ax,%ax
jns    1160 <sexigesimal_str_to_coords+0x50>
neg    %eax
mov    %ax,(%r15)
jmp    1160 <sexigesimal_str_to_coords+0x50>

LLVM IR (-O0):
define void @sexigesimal_str_to_coords(i8* %0, i16* %1, i16* %2, i16* %3, i16* %4) {
%6 = alloca i8*
%7 = alloca i16*
%8 = alloca i16*
%9 = alloca i16*
%10 = alloca i16*
%11 = alloca [3 x float]
store i8* %0, i8** %6
store i16* %1, i16** %7
store i16* %2, i16** %8
store i16* %3, i16** %9
store i16* %4, i16** %10
%12 = load i8*, i8** %6
%13 = bitcast [3 x float]* %11 to float**
%14 = call i32 @split_sexigesimal_str(i8* %12, float** %13)
%15 = getelementptr inbounds [3 x float], [3 x float]* %11, i64 0, i64 0
%16 = load float, float* %15
%17 = fptosi float %16 to i16
%18 = load i16*, i16** %7
store i16 %17, i16* %18
%19 = getelementptr inbounds [3 x float], [3 x float]* %11, i64 0, i64 1
%20 = load float, float* %19
%21 = fptosi float %20 to i16
%22 = load i16*, i16** %8
store i16 %21, i16* %22
%23 = getelementptr inbounds [3 x float], [3 x float]* %11, i64 0, i64 2
%24 = load float, float* %23
%25 = fptosi float %24 to i16
%26 = load i16*, i16** %9
store i16 %25, i16* %26
%27 = load i16*, i16** %8
%28 = load i16, i16* %27
%29 = sext i16 %28 to i32
%30 = icmp slt i32 %29, 0
br i1 %30, label %31, label %37
31: ; preds = %5
%32 = load i16*, i16** %8
%33 = load i16, i16* %32
%34 = sext i16 %33 to i32
%35 = mul nsw i32 %34, -1
%36 = trunc i32 %35 to i16
store i16 %36, i16* %32
br label %37
37: ; preds = %31, %5
%38 = load i16*, i16** %9
%39 = load i16, i16* %38
%40 = sext i16 %39 to i32
%41 = icmp slt i32 %40, 0
br i1 %41, label %42, label %48
42: ; preds = %37
%43 = load i16*, i16** %9
%44 = load i16, i16* %43
%45 = sext i16 %44 to i32
%46 = mul nsw i32 %45, -1
%47 = trunc i32 %46 to i16
store i16 %47, i16* %43
br label %48
48: ; preds = %42, %37
%49 = getelementptr inbounds [3 x float], [3 x float]* %11, i64 0, i64 2
%50 = load float, float* %49
%51 = load i16*, i16** %9
%52 = load i16, i16* %51
%53 = sext i16 %52 to i32
%54 = sitofp i32 %53 to float
%55 = fsub float %50, %54
%56 = fmul float %55, 1.000000e+03
%57 = fptosi float %56 to i16
%58 = load i16*, i16** %10
store i16 %57, i16* %58
ret void
}

LLVM IR (-O2):
define void @sexigesimal_str_to_coords(i8* %0, i16* nocapture writeonly %1, i16* nocapture %2, i16* nocapture %3, i16* nocapture writeonly %4) {
%6 = alloca [3 x float]
%7 = bitcast [3 x float]* %6 to i8*
%8 = bitcast [3 x float]* %6 to float**
%9 = call i32 @split_sexigesimal_str(i8* %0, float** %8)
%10 = getelementptr inbounds [3 x float], [3 x float]* %6, i64 0, i64 0
%11 = load float, float* %10
%12 = fptosi float %11 to i16
store i16 %12, i16* %1
%13 = getelementptr inbounds [3 x float], [3 x float]* %6, i64 0, i64 1
%14 = load float, float* %13
%15 = fptosi float %14 to i16
store i16 %15, i16* %2
%16 = getelementptr inbounds [3 x float], [3 x float]* %6, i64 0, i64 2
%17 = load float, float* %16
%18 = fptosi float %17 to i16
store i16 %18, i16* %3
%19 = load i16, i16* %2
%20 = icmp slt i16 %19, 0
br i1 %20, label %21, label %24
21: ; preds = %5
%22 = sub i16 0, %19
store i16 %22, i16* %2
%23 = load i16, i16* %3
br label %24
24: ; preds = %21, %5
%25 = phi i16 [ %23, %21 ], [ %18, %5 ]
%26 = icmp slt i16 %25, 0
br i1 %26, label %27, label %29
27: ; preds = %24
%28 = sub i16 0, %25
store i16 %28, i16* %3
br label %29
29: ; preds = %27, %24
%30 = phi i16 [ %28, %27 ], [ %25, %24 ]
%31 = sitofp i16 %30 to float
%32 = fsub float %17, %31
%33 = fmul float %32, 1.000000e+03
%34 = fptosi float %33 to i16
store i16 %34, i16* %4
ret void
}