float pa(float instrpa) {
  float newpa;
  int intpart;
  intpart = (int)(instrpa / 180.);
  newpa = instrpa - (intpart * 180.);
  if (newpa <= -90.)
    newpa = newpa + 180.;
  else if (newpa > 90.)
    newpa = newpa - 180.;
  return (newpa);
}


x86 assembly (clang, -O0):
<pa>:
push   %rbp
mov    %rsp,%rbp
movss  %xmm0,-0x4(%rbp)
movss  -0x4(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
movsd  0xeee(%rip),%xmm1
divsd  %xmm1,%xmm0
cvttsd2si %xmm0,%eax
mov    %eax,-0xc(%rbp)
movss  -0x4(%rbp),%xmm0
cvtss2sd %xmm0,%xmm1
cvtsi2sdl -0xc(%rbp),%xmm0
movq   %xmm0,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm0
movsd  0xeb6(%rip),%xmm2
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
movss  %xmm0,-0x8(%rbp)
movss  -0x8(%rbp),%xmm0
cvtss2sd %xmm0,%xmm1
movsd  0xe8c(%rip),%xmm0
ucomisd %xmm1,%xmm0
jb     11a1 <pa+0xa1>
movss  -0x8(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
movsd  0xe79(%rip),%xmm1
addsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
movss  %xmm0,-0x8(%rbp)
jmp    11df <pa+0xdf>
movss  -0x8(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
movsd  0xe5e(%rip),%xmm1
ucomisd %xmm1,%xmm0
jbe    11da <pa+0xda>
movss  -0x8(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
movsd  0xe3b(%rip),%xmm1
subsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
movss  %xmm0,-0x8(%rbp)
jmp    11df <pa+0xdf>
movss  -0x8(%rbp),%xmm0
pop    %rbp
ret

x86 assembly (clang, -O2):
<pa>:
cvtss2sd %xmm0,%xmm0
movsd  0xef4(%rip),%xmm1
movaps %xmm0,%xmm2
divsd  %xmm1,%xmm2
cvttpd2dq %xmm2,%xmm2
cvtdq2pd %xmm2,%xmm2
mulsd  %xmm1,%xmm2
subsd  %xmm2,%xmm0
cvtsd2ss %xmm0,%xmm0
movss  0xed9(%rip),%xmm1
ucomiss %xmm0,%xmm1
jae    1146 <pa+0x46>
ucomiss 0xed5(%rip),%xmm0
jbe    1145 <pa+0x45>
addss  0xecf(%rip),%xmm0
ret
addss  0xebe(%rip),%xmm0
ret

LLVM IR (-O0):
define float @pa(float %0) {
%2 = alloca float
%3 = alloca float
%4 = alloca i32
store float %0, float* %2
%5 = load float, float* %2
%6 = fpext float %5 to double
%7 = fdiv double %6, 1.800000e+02
%8 = fptosi double %7 to i32
store i32 %8, i32* %4
%9 = load float, float* %2
%10 = fpext float %9 to double
%11 = load i32, i32* %4
%12 = sitofp i32 %11 to double
%13 = fneg double %12
%14 = call double @llvm.fmuladd.f64(double %13, double 1.800000e+02, double %10)
%15 = fptrunc double %14 to float
store float %15, float* %3
%16 = load float, float* %3
%17 = fpext float %16 to double
%18 = fcmp ole double %17, -9.000000e+01
br i1 %18, label %19, label %24
19: ; preds = %1
%20 = load float, float* %3
%21 = fpext float %20 to double
%22 = fadd double %21, 1.800000e+02
%23 = fptrunc double %22 to float
store float %23, float* %3
br label %34
24: ; preds = %1
%25 = load float, float* %3
%26 = fpext float %25 to double
%27 = fcmp ogt double %26, 9.000000e+01
br i1 %27, label %28, label %33
28: ; preds = %24
%29 = load float, float* %3
%30 = fpext float %29 to double
%31 = fsub double %30, 1.800000e+02
%32 = fptrunc double %31 to float
store float %32, float* %3
br label %33
33: ; preds = %28, %24
br label %34
34: ; preds = %33, %19
%35 = load float, float* %3
ret float %35
}

LLVM IR (-O2):
define float @pa(float %0) {
%2 = fpext float %0 to double
%3 = fdiv double %2, 1.800000e+02
%4 = fptosi double %3 to i32
%5 = sitofp i32 %4 to double
%6 = fneg double %5
%7 = tail call double @llvm.fmuladd.f64(double %6, double 1.800000e+02, double %2)
%8 = fptrunc double %7 to float
%9 = fcmp ugt float %8, -9.000000e+01
br i1 %9, label %12, label %10
10: ; preds = %1
%11 = fadd float %8, 1.800000e+02
br label %16
12: ; preds = %1
%13 = fcmp ogt float %8, 9.000000e+01
br i1 %13, label %14, label %16
14: ; preds = %12
%15 = fadd float %8, -1.800000e+02
br label %16
16: ; preds = %12, %14, %10
%17 = phi float [ %11, %10 ], [ %15, %14 ], [ %8, %12 ]
ret float %17
}