int updatepq(unsigned int n, unsigned int d, unsigned int xi, float **xq,
             float *in, unsigned int s) {
  register float *txq = *xq + xi;
  register int nt = n * 2;
  while (d-- > 0) {
    *txq = *(txq + n) = *in;
    txq += nt;
    in += s;
  }
  return (++xi) & (n - 1);
}


x86 assembly (clang, -O0):
<updatepq>:
push   %rbp
mov    %rsp,%rbp
mov    %edi,-0x4(%rbp)
mov    %esi,-0x8(%rbp)
mov    %edx,-0xc(%rbp)
mov    %rcx,-0x18(%rbp)
mov    %r8,-0x20(%rbp)
mov    %r9d,-0x24(%rbp)
mov    -0x18(%rbp),%rax
mov    (%rax),%rax
mov    -0xc(%rbp),%ecx
shl    $0x2,%rcx
add    %rcx,%rax
mov    %rax,-0x30(%rbp)
mov    -0x4(%rbp),%eax
shl    $0x1,%eax
mov    %eax,-0x34(%rbp)
mov    -0x8(%rbp),%eax
mov    %eax,%ecx
add    $0xffffffff,%ecx
mov    %ecx,-0x8(%rbp)
cmp    $0x0,%eax
jbe    1195 <updatepq+0x95>
mov    -0x20(%rbp),%rax
movss  (%rax),%xmm0
mov    -0x30(%rbp),%rax
mov    -0x4(%rbp),%ecx
movss  %xmm0,(%rax,%rcx,4)
mov    -0x30(%rbp),%rax
movss  %xmm0,(%rax)
mov    -0x34(%rbp),%ecx
mov    -0x30(%rbp),%rax
movslq %ecx,%rcx
shl    $0x2,%rcx
add    %rcx,%rax
mov    %rax,-0x30(%rbp)
mov    -0x24(%rbp),%ecx
mov    -0x20(%rbp),%rax
mov    %ecx,%ecx
shl    $0x2,%rcx
add    %rcx,%rax
mov    %rax,-0x20(%rbp)
jmp    1137 <updatepq+0x37>
mov    -0xc(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0xc(%rbp)
mov    -0x4(%rbp),%ecx
sub    $0x1,%ecx
and    %ecx,%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<updatepq>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
mov    %edi,%eax
test   %esi,%esi
je     1207 <updatepq+0x107>
lea    (%rax,%rax,1),%ebp
mov    %edx,%edi
shl    $0x2,%rdi
add    (%rcx),%rdi
mov    %eax,%r10d
movslq %ebp,%r11
mov    %r9d,%ecx
lea    -0x1(%rsi),%r9d
mov    %esi,%ebp
and    $0x3,%ebp
je     116e <updatepq+0x6e>
lea    0x0(,%r11,4),%r14
lea    0x0(,%rcx,4),%r15
xor    %ebx,%ebx
cs nopw 0x0(%rax,%rax,1)
movss  (%r8),%xmm0
movss  %xmm0,(%rdi,%r10,4)
movss  %xmm0,(%rdi)
add    $0x1,%ebx
add    %r14,%rdi
add    %r15,%r8
cmp    %ebx,%ebp
jne    1150 <updatepq+0x50>
sub    %ebx,%esi
cmp    $0x3,%r9d
jb     1207 <updatepq+0x107>
mov    %r11,%r9
shl    $0x4,%r9
lea    0x0(,%r11,4),%r14
lea    (%r14,%r14,2),%r12
lea    (%r12,%r10,4),%r15
shl    $0x2,%r10
lea    0x0(,%r11,8),%r13
lea    (%r10,%r11,8),%rbp
lea    (%r10,%r11,4),%rbx
shl    $0x2,%rcx
nopw   0x0(%rax,%rax,1)
movss  (%r8),%xmm0
movss  %xmm0,(%rdi,%r10,1)
movss  %xmm0,(%rdi)
movss  (%r8,%rcx,1),%xmm0
add    %rcx,%r8
movss  %xmm0,(%rdi,%rbx,1)
movss  %xmm0,(%rdi,%r14,1)
movss  (%rcx,%r8,1),%xmm0
add    %rcx,%r8
movss  %xmm0,(%rdi,%rbp,1)
movss  %xmm0,(%rdi,%r13,1)
movss  (%rcx,%r8,1),%xmm0
add    %rcx,%r8
movss  %xmm0,(%rdi,%r15,1)
movss  %xmm0,(%rdi,%r12,1)
add    %r9,%rdi
add    %rcx,%r8
add    $0xfffffffc,%esi
jne    11b0 <updatepq+0xb0>
add    $0x1,%edx
add    $0xffffffff,%eax
and    %edx,%eax
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret

LLVM IR (-O0):
define i32 @updatepq(i32 %0, i32 %1, i32 %2, float** %3, float* %4, i32 %5) {
%7 = alloca i32
%8 = alloca i32
%9 = alloca i32
%10 = alloca float**
%11 = alloca float*
%12 = alloca i32
%13 = alloca float*
%14 = alloca i32
store i32 %0, i32* %7
store i32 %1, i32* %8
store i32 %2, i32* %9
store float** %3, float*** %10
store float* %4, float** %11
store i32 %5, i32* %12
%15 = load float**, float*** %10
%16 = load float*, float** %15
%17 = load i32, i32* %9
%18 = zext i32 %17 to i64
%19 = getelementptr inbounds float, float* %16, i64 %18
store float* %19, float** %13
%20 = load i32, i32* %7
%21 = mul i32 %20, 2
store i32 %21, i32* %14
br label %22
22: ; preds = %26, %6
%23 = load i32, i32* %8
%24 = add i32 %23, -1
store i32 %24, i32* %8
%25 = icmp ugt i32 %23, 0
br i1 %25, label %26, label %42
26: ; preds = %22
%27 = load float*, float** %11
%28 = load float, float* %27
%29 = load float*, float** %13
%30 = load i32, i32* %7
%31 = zext i32 %30 to i64
%32 = getelementptr inbounds float, float* %29, i64 %31
store float %28, float* %32
%33 = load float*, float** %13
store float %28, float* %33
%34 = load i32, i32* %14
%35 = load float*, float** %13
%36 = sext i32 %34 to i64
%37 = getelementptr inbounds float, float* %35, i64 %36
store float* %37, float** %13
%38 = load i32, i32* %12
%39 = load float*, float** %11
%40 = zext i32 %38 to i64
%41 = getelementptr inbounds float, float* %39, i64 %40
store float* %41, float** %11
br label %22
42: ; preds = %22
%43 = load i32, i32* %9
%44 = add i32 %43, 1
store i32 %44, i32* %9
%45 = load i32, i32* %7
%46 = sub i32 %45, 1
%47 = and i32 %44, %46
ret i32 %47
}

LLVM IR (-O2):
define i32 @updatepq(i32 %0, i32 %1, i32 %2, float** nocapture %3, float* nocapture %4, i32 %5) {
%7 = icmp eq i32 %1, 0
br i1 %7, label %58, label %8
8: ; preds = %6
%9 = shl i32 %0, 1
%10 = load float*, float** %3
%11 = zext i32 %2 to i64
%12 = getelementptr inbounds float, float* %10, i64 %11
%13 = zext i32 %0 to i64
%14 = sext i32 %9 to i64
%15 = zext i32 %5 to i64
%16 = add i32 %1, -1
%17 = and i32 %1, 3
%18 = icmp eq i32 %17, 0
br i1 %18, label %31, label %19
19: ; preds = %8, %19
%20 = phi i32 [ %24, %19 ], [ %1, %8 ]
%21 = phi float* [ %27, %19 ], [ %12, %8 ]
%22 = phi float* [ %28, %19 ], [ %4, %8 ]
%23 = phi i32 [ %29, %19 ], [ 0, %8 ]
%24 = add i32 %20, -1
%25 = load float, float* %22
%26 = getelementptr inbounds float, float* %21, i64 %13
store float %25, float* %26
store float %25, float* %21
%27 = getelementptr inbounds float, float* %21, i64 %14
%28 = getelementptr inbounds float, float* %22, i64 %15
%29 = add i32 %23, 1
%30 = icmp eq i32 %29, %17
br i1 %30, label %31, label %19
31: ; preds = %19, %8
%32 = phi i32 [ %1, %8 ], [ %24, %19 ]
%33 = phi float* [ %12, %8 ], [ %27, %19 ]
%34 = phi float* [ %4, %8 ], [ %28, %19 ]
%35 = icmp ult i32 %16, 3
br i1 %35, label %58, label %36
36: ; preds = %31, %36
%37 = phi i32 [ %52, %36 ], [ %32, %31 ]
%38 = phi float* [ %55, %36 ], [ %33, %31 ]
%39 = phi float* [ %56, %36 ], [ %34, %31 ]
%40 = load float, float* %39
%41 = getelementptr inbounds float, float* %38, i64 %13
store float %40, float* %41
store float %40, float* %38
%42 = getelementptr inbounds float, float* %38, i64 %14
%43 = getelementptr inbounds float, float* %39, i64 %15
%44 = load float, float* %43
%45 = getelementptr inbounds float, float* %42, i64 %13
store float %44, float* %45
store float %44, float* %42
%46 = getelementptr inbounds float, float* %42, i64 %14
%47 = getelementptr inbounds float, float* %43, i64 %15
%48 = load float, float* %47
%49 = getelementptr inbounds float, float* %46, i64 %13
store float %48, float* %49
store float %48, float* %46
%50 = getelementptr inbounds float, float* %46, i64 %14
%51 = getelementptr inbounds float, float* %47, i64 %15
%52 = add i32 %37, -4
%53 = load float, float* %51
%54 = getelementptr inbounds float, float* %50, i64 %13
store float %53, float* %54
store float %53, float* %50
%55 = getelementptr inbounds float, float* %50, i64 %14
%56 = getelementptr inbounds float, float* %51, i64 %15
%57 = icmp eq i32 %52, 0
br i1 %57, label %58, label %36
58: ; preds = %31, %36, %6
%59 = add i32 %2, 1
%60 = add i32 %0, -1
%61 = and i32 %59, %60
ret i32 %61
}