K(g, R, u) float *g, u;
char R;
{
  if (R == '+')
    *g += u;
  if (R == '-')
    *g -= u;
  if (R == '*')
    *g *= u;
  if (R == '/')
    *g /= u;
  if (R == '^')
    P(g, *g, u);
}


x86 assembly (clang, -O0):
<K>:
push   %rbp
mov    %rsp,%rbp
sub    $0x20,%rsp
mov    %sil,%al
cvtsd2ss %xmm0,%xmm0
mov    %rdi,-0x10(%rbp)
mov    %al,-0x11(%rbp)
movss  %xmm0,-0x18(%rbp)
movsbl -0x11(%rbp),%eax
cmp    $0x2b,%eax
jne    1149 <K+0x39>
movss  -0x18(%rbp),%xmm0
mov    -0x10(%rbp),%rax
addss  (%rax),%xmm0
movss  %xmm0,(%rax)
movsbl -0x11(%rbp),%eax
cmp    $0x2d,%eax
jne    116b <K+0x5b>
movss  -0x18(%rbp),%xmm1
mov    -0x10(%rbp),%rax
movss  (%rax),%xmm0
subss  %xmm1,%xmm0
movss  %xmm0,(%rax)
movsbl -0x11(%rbp),%eax
cmp    $0x2a,%eax
jne    1189 <K+0x79>
movss  -0x18(%rbp),%xmm0
mov    -0x10(%rbp),%rax
mulss  (%rax),%xmm0
movss  %xmm0,(%rax)
movsbl -0x11(%rbp),%eax
cmp    $0x2f,%eax
jne    11ab <K+0x9b>
movss  -0x18(%rbp),%xmm1
mov    -0x10(%rbp),%rax
movss  (%rax),%xmm0
divss  %xmm1,%xmm0
movss  %xmm0,(%rax)
movsbl -0x11(%rbp),%eax
cmp    $0x5e,%eax
jne    11d8 <K+0xc8>
mov    -0x10(%rbp),%rdi
mov    -0x10(%rbp),%rax
movss  (%rax),%xmm0
cvtss2sd %xmm0,%xmm0
movss  -0x18(%rbp),%xmm1
cvtss2sd %xmm1,%xmm1
mov    $0x2,%al
call   1030 <P@plt>
mov    -0x4(%rbp),%eax
add    $0x20,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<K>:
push   %rax
cvtsd2ss %xmm0,%xmm1
shl    $0x18,%esi
cmp    $0x2cffffff,%esi
jle    114d <K+0x3d>
cmp    $0x2d000000,%esi
je     1163 <K+0x53>
cmp    $0x2f000000,%esi
je     116d <K+0x5d>
cmp    $0x5e000000,%esi
jne    1179 <K+0x69>
movss  (%rdi),%xmm0
cvtss2sd %xmm0,%xmm0
cvtss2sd %xmm1,%xmm1
mov    $0x2,%al
call   1030 <P@plt>
pop    %rcx
ret
cmp    $0x2a000000,%esi
je     117b <K+0x6b>
cmp    $0x2b000000,%esi
jne    1179 <K+0x69>
addss  (%rdi),%xmm1
jmp    117f <K+0x6f>
movss  (%rdi),%xmm0
subss  %xmm1,%xmm0
jmp    1175 <K+0x65>
movss  (%rdi),%xmm0
divss  %xmm1,%xmm0
movss  %xmm0,(%rdi)
pop    %rcx
ret
mulss  (%rdi),%xmm1
movss  %xmm1,(%rdi)
pop    %rcx
ret

LLVM IR (-O0):
define i32 @K(float* %0, i32 %1, double %2) {
%4 = alloca i32
%5 = alloca float*
%6 = alloca i8
%7 = alloca float
%8 = trunc i32 %1 to i8
%9 = fptrunc double %2 to float
store float* %0, float** %5
store i8 %8, i8* %6
store float %9, float* %7
%10 = load i8, i8* %6
%11 = sext i8 %10 to i32
%12 = icmp eq i32 %11, 43
br i1 %12, label %13, label %18
13: ; preds = %3
%14 = load float, float* %7
%15 = load float*, float** %5
%16 = load float, float* %15
%17 = fadd float %16, %14
store float %17, float* %15
br label %18
18: ; preds = %13, %3
%19 = load i8, i8* %6
%20 = sext i8 %19 to i32
%21 = icmp eq i32 %20, 45
br i1 %21, label %22, label %27
22: ; preds = %18
%23 = load float, float* %7
%24 = load float*, float** %5
%25 = load float, float* %24
%26 = fsub float %25, %23
store float %26, float* %24
br label %27
27: ; preds = %22, %18
%28 = load i8, i8* %6
%29 = sext i8 %28 to i32
%30 = icmp eq i32 %29, 42
br i1 %30, label %31, label %36
31: ; preds = %27
%32 = load float, float* %7
%33 = load float*, float** %5
%34 = load float, float* %33
%35 = fmul float %34, %32
store float %35, float* %33
br label %36
36: ; preds = %31, %27
%37 = load i8, i8* %6
%38 = sext i8 %37 to i32
%39 = icmp eq i32 %38, 47
br i1 %39, label %40, label %45
40: ; preds = %36
%41 = load float, float* %7
%42 = load float*, float** %5
%43 = load float, float* %42
%44 = fdiv float %43, %41
store float %44, float* %42
br label %45
45: ; preds = %40, %36
%46 = load i8, i8* %6
%47 = sext i8 %46 to i32
%48 = icmp eq i32 %47, 94
br i1 %48, label %49, label %57
49: ; preds = %45
%50 = load float*, float** %5
%51 = load float*, float** %5
%52 = load float, float* %51
%53 = fpext float %52 to double
%54 = load float, float* %7
%55 = fpext float %54 to double
%56 = call i32 (float*, double, double, ...) bitcast (i32 (...)* @P to i32 (float*, double, double, ...)*)(float* %50, double %53, double %55)
br label %57
57: ; preds = %49, %45
%58 = load i32, i32* %4
ret i32 %58
}

LLVM IR (-O2):
define i32 @K(float* %0, i32 %1, double %2) {
%4 = fptrunc double %2 to float
%5 = shl i32 %1, 24
switch i32 %5, label %23 [
i32 721420288, label %6
i32 754974720, label %9
i32 704643072, label %12
i32 788529152, label %15
i32 1577058304, label %18
]
6: ; preds = %3
%7 = load float, float* %0
%8 = fadd float %7, %4
store float %8, float* %0
br label %23
9: ; preds = %3
%10 = load float, float* %0
%11 = fsub float %10, %4
store float %11, float* %0
br label %23
12: ; preds = %3
%13 = load float, float* %0
%14 = fmul float %13, %4
store float %14, float* %0
br label %23
15: ; preds = %3
%16 = load float, float* %0
%17 = fdiv float %16, %4
store float %17, float* %0
br label %23
18: ; preds = %3
%19 = load float, float* %0
%20 = fpext float %19 to double
%21 = fpext float %4 to double
%22 = tail call i32 (float*, double, double, ...) bitcast (i32 (...)* @P to i32 (float*, double, double, ...)*)(float* %0, double %20, double %21)
br label %23
23: ; preds = %15, %12, %9, %6, %3, %18
ret i32 undef
}