void text3d(x, y, z, s) float x, y, z;
char *s;
{
  float xp, yp;
  if (threedproj(x, y, z, &xp, &yp))
    text_abs(xp, yp, s);
}


x86 assembly (clang, -O0):
<text3d>:
push   %rbp
mov    %rsp,%rbp
sub    $0x30,%rsp
movsd  %xmm2,-0x28(%rbp)
movaps %xmm0,%xmm2
movsd  -0x28(%rbp),%xmm0
cvtsd2ss %xmm2,%xmm2
cvtsd2ss %xmm1,%xmm1
cvtsd2ss %xmm0,%xmm0
movss  %xmm2,-0x4(%rbp)
movss  %xmm1,-0x8(%rbp)
movss  %xmm0,-0xc(%rbp)
mov    %rdi,-0x18(%rbp)
movss  -0x4(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
movss  -0x8(%rbp),%xmm1
cvtss2sd %xmm1,%xmm1
movss  -0xc(%rbp),%xmm2
cvtss2sd %xmm2,%xmm2
lea    -0x1c(%rbp),%rdi
lea    -0x20(%rbp),%rsi
mov    $0x3,%al
call   1030 <threedproj@plt>
cmp    $0x0,%eax
je     11a4 <text3d+0x84>
movss  -0x1c(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
movss  -0x20(%rbp),%xmm1
cvtss2sd %xmm1,%xmm1
mov    -0x18(%rbp),%rdi
mov    $0x2,%al
call   1040 <text_abs@plt>
add    $0x30,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<text3d>:
push   %rbx
sub    $0x10,%rsp
cvtsd2ss %xmm0,%xmm0
cvtsd2ss %xmm1,%xmm1
cvtsd2ss %xmm2,%xmm2
mov    %rdi,%rbx
cvtss2sd %xmm0,%xmm0
cvtss2sd %xmm1,%xmm1
cvtss2sd %xmm2,%xmm2
lea    0xc(%rsp),%rdi
lea    0x8(%rsp),%rsi
mov    $0x3,%al
call   1030 <threedproj@plt>
test   %eax,%eax
je     1173 <text3d+0x53>
movss  0xc(%rsp),%xmm0
cvtss2sd %xmm0,%xmm0
movss  0x8(%rsp),%xmm1
cvtss2sd %xmm1,%xmm1
mov    %rbx,%rdi
mov    $0x2,%al
call   1040 <text_abs@plt>
add    $0x10,%rsp
pop    %rbx
ret

LLVM IR (-O0):
define void @text3d(double %0, double %1, double %2, i8* %3) {
%5 = alloca float
%6 = alloca float
%7 = alloca float
%8 = alloca i8*
%9 = alloca float
%10 = alloca float
%11 = fptrunc double %0 to float
%12 = fptrunc double %1 to float
%13 = fptrunc double %2 to float
store float %11, float* %5
store float %12, float* %6
store float %13, float* %7
store i8* %3, i8** %8
%14 = load float, float* %5
%15 = fpext float %14 to double
%16 = load float, float* %6
%17 = fpext float %16 to double
%18 = load float, float* %7
%19 = fpext float %18 to double
%20 = call i32 (double, double, double, float*, float*, ...) bitcast (i32 (...)* @threedproj to i32 (double, double, double, float*, float*, ...)*)(double %15, double %17, double %19, float* %9, float* %10)
%21 = icmp ne i32 %20, 0
br i1 %21, label %22, label %29
22: ; preds = %4
%23 = load float, float* %9
%24 = fpext float %23 to double
%25 = load float, float* %10
%26 = fpext float %25 to double
%27 = load i8*, i8** %8
%28 = call i32 (double, double, i8*, ...) bitcast (i32 (...)* @text_abs to i32 (double, double, i8*, ...)*)(double %24, double %26, i8* %27)
br label %29
29: ; preds = %22, %4
ret void
}

LLVM IR (-O2):
define void @text3d(double %0, double %1, double %2, i8* %3) {
%5 = alloca float
%6 = alloca float
%7 = fptrunc double %0 to float
%8 = fptrunc double %1 to float
%9 = fptrunc double %2 to float
%10 = bitcast float* %5 to i8*
%11 = bitcast float* %6 to i8*
%12 = fpext float %7 to double
%13 = fpext float %8 to double
%14 = fpext float %9 to double
%15 = call i32 (double, double, double, float*, float*, ...) bitcast (i32 (...)* @threedproj to i32 (double, double, double, float*, float*, ...)*)(double %12, double %13, double %14, float* %5, float* %6)
%16 = icmp eq i32 %15, 0
br i1 %16, label %23, label %17
17: ; preds = %4
%18 = load float, float* %5
%19 = fpext float %18 to double
%20 = load float, float* %6
%21 = fpext float %20 to double
%22 = call i32 (double, double, i8*, ...) bitcast (i32 (...)* @text_abs to i32 (double, double, i8*, ...)*)(double %19, double %21, i8* %3)
br label %23
23: ; preds = %17, %4
ret void
}