void wxy2fxy(long long wx, long long wy, double *ox, double *oy, int z, int x,
             int y) {
  wx -= (long long)x << (32 - z);
  wy -= (long long)y << (32 - z);
  *ox = (double)wx / (1LL << (32 - z));
  *oy = (double)wy / (1LL << (32 - z));
}


x86 assembly (clang, -O0):
<wxy2fxy>:
push   %rbp
mov    %rsp,%rbp
mov    0x10(%rbp),%eax
mov    %rdi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
mov    %rdx,-0x18(%rbp)
mov    %rcx,-0x20(%rbp)
mov    %r8d,-0x24(%rbp)
mov    %r9d,-0x28(%rbp)
movslq -0x28(%rbp),%rax
mov    $0x20,%ecx
sub    -0x24(%rbp),%ecx
mov    %ecx,%ecx
shl    %cl,%rax
mov    %rax,%rcx
mov    -0x8(%rbp),%rax
sub    %rcx,%rax
mov    %rax,-0x8(%rbp)
movslq 0x10(%rbp),%rax
mov    $0x20,%ecx
sub    -0x24(%rbp),%ecx
mov    %ecx,%ecx
shl    %cl,%rax
mov    %rax,%rcx
mov    -0x10(%rbp),%rax
sub    %rcx,%rax
mov    %rax,-0x10(%rbp)
cvtsi2sdq -0x8(%rbp),%xmm0
mov    $0x20,%eax
sub    -0x24(%rbp),%eax
mov    %eax,%eax
mov    %eax,%ecx
mov    $0x1,%eax
shl    %cl,%rax
cvtsi2sd %rax,%xmm1
divsd  %xmm1,%xmm0
mov    -0x18(%rbp),%rax
movsd  %xmm0,(%rax)
cvtsi2sdq -0x10(%rbp),%xmm0
mov    $0x20,%eax
sub    -0x24(%rbp),%eax
mov    %eax,%eax
mov    %eax,%ecx
mov    $0x1,%eax
shl    %cl,%rax
cvtsi2sd %rax,%xmm1
divsd  %xmm1,%xmm0
mov    -0x20(%rbp),%rax
movsd  %xmm0,(%rax)
pop    %rbp
ret

x86 assembly (clang, -O2):
<wxy2fxy>:
mov    %rcx,%r10
movslq %r9d,%r9
mov    $0x20,%cl
sub    %r8b,%cl
shl    %cl,%r9
movslq 0x8(%rsp),%rax
shl    %cl,%rax
sub    %r9,%rdi
sub    %rax,%rsi
cvtsi2sd %rdi,%xmm0
mov    $0x1,%eax
shl    %cl,%rax
cvtsi2sd %rax,%xmm1
divsd  %xmm1,%xmm0
movsd  %xmm0,(%rdx)
xorps  %xmm0,%xmm0
cvtsi2sd %rsi,%xmm0
divsd  %xmm1,%xmm0
movsd  %xmm0,(%r10)
ret

LLVM IR (-O0):
define void @wxy2fxy(i64 %0, i64 %1, double* %2, double* %3, i32 %4, i32 %5, i32 %6) {
%8 = alloca i64
%9 = alloca i64
%10 = alloca double*
%11 = alloca double*
%12 = alloca i32
%13 = alloca i32
%14 = alloca i32
store i64 %0, i64* %8
store i64 %1, i64* %9
store double* %2, double** %10
store double* %3, double** %11
store i32 %4, i32* %12
store i32 %5, i32* %13
store i32 %6, i32* %14
%15 = load i32, i32* %13
%16 = sext i32 %15 to i64
%17 = load i32, i32* %12
%18 = sub nsw i32 32, %17
%19 = zext i32 %18 to i64
%20 = shl i64 %16, %19
%21 = load i64, i64* %8
%22 = sub nsw i64 %21, %20
store i64 %22, i64* %8
%23 = load i32, i32* %14
%24 = sext i32 %23 to i64
%25 = load i32, i32* %12
%26 = sub nsw i32 32, %25
%27 = zext i32 %26 to i64
%28 = shl i64 %24, %27
%29 = load i64, i64* %9
%30 = sub nsw i64 %29, %28
store i64 %30, i64* %9
%31 = load i64, i64* %8
%32 = sitofp i64 %31 to double
%33 = load i32, i32* %12
%34 = sub nsw i32 32, %33
%35 = zext i32 %34 to i64
%36 = shl i64 1, %35
%37 = sitofp i64 %36 to double
%38 = fdiv double %32, %37
%39 = load double*, double** %10
store double %38, double* %39
%40 = load i64, i64* %9
%41 = sitofp i64 %40 to double
%42 = load i32, i32* %12
%43 = sub nsw i32 32, %42
%44 = zext i32 %43 to i64
%45 = shl i64 1, %44
%46 = sitofp i64 %45 to double
%47 = fdiv double %41, %46
%48 = load double*, double** %11
store double %47, double* %48
ret void
}

LLVM IR (-O2):
define void @wxy2fxy(i64 %0, i64 %1, double* nocapture writeonly %2, double* nocapture writeonly %3, i32 %4, i32 %5, i32 %6) {
%8 = sext i32 %5 to i64
%9 = sub nsw i32 32, %4
%10 = zext i32 %9 to i64
%11 = shl i64 %8, %10
%12 = sub nsw i64 %0, %11
%13 = sext i32 %6 to i64
%14 = shl i64 %13, %10
%15 = sub nsw i64 %1, %14
%16 = sitofp i64 %12 to double
%17 = shl nuw i64 1, %10
%18 = sitofp i64 %17 to double
%19 = fdiv double %16, %18
store double %19, double* %2
%20 = sitofp i64 %15 to double
%21 = fdiv double %20, %18
store double %21, double* %3
ret void
}