void getGridFromId(int id, int size, int *precision, int *grid, int dim) {
  for (int i = dim - 1; i >= 0; i--) {
    size /= precision[i];
    grid[i] = id / size;
    id -= grid[i] * size;
  }
}


x86 assembly (clang, -O0):
<getGridFromId>:
push   %rbp
mov    %rsp,%rbp
mov    %edi,-0x4(%rbp)
mov    %esi,-0x8(%rbp)
mov    %rdx,-0x10(%rbp)
mov    %rcx,-0x18(%rbp)
mov    %r8d,-0x1c(%rbp)
mov    -0x1c(%rbp),%eax
sub    $0x1,%eax
mov    %eax,-0x20(%rbp)
cmpl   $0x0,-0x20(%rbp)
jl     1176 <getGridFromId+0x76>
mov    -0x10(%rbp),%rax
movslq -0x20(%rbp),%rcx
mov    (%rax,%rcx,4),%ecx
mov    -0x8(%rbp),%eax
cltd
idiv   %ecx
mov    %eax,-0x8(%rbp)
mov    -0x4(%rbp),%eax
cltd
idivl  -0x8(%rbp)
mov    %eax,%edx
mov    -0x18(%rbp),%rax
movslq -0x20(%rbp),%rcx
mov    %edx,(%rax,%rcx,4)
mov    -0x18(%rbp),%rax
movslq -0x20(%rbp),%rcx
mov    (%rax,%rcx,4),%ecx
imul   -0x8(%rbp),%ecx
mov    -0x4(%rbp),%eax
sub    %ecx,%eax
mov    %eax,-0x4(%rbp)
mov    -0x20(%rbp),%eax
add    $0xffffffff,%eax
mov    %eax,-0x20(%rbp)
jmp    111f <getGridFromId+0x1f>
pop    %rbp
ret

x86 assembly (clang, -O2):
<getGridFromId>:
test   %r8d,%r8d
jle    1145 <getGridFromId+0x45>
mov    %rdx,%r9
mov    %esi,%r11d
mov    %edi,%r10d
mov    %r8d,%edi
add    $0x1,%rdi
cs nopw 0x0(%rax,%rax,1)
nop
lea    -0x2(%rdi),%esi
mov    %r11d,%eax
cltd
idivl  (%r9,%rsi,4)
mov    %eax,%r11d
mov    %r10d,%eax
cltd
idiv   %r11d
mov    %eax,(%rcx,%rsi,4)
add    $0xffffffffffffffff,%rdi
mov    %edx,%r10d
cmp    $0x1,%rdi
ja     1120 <getGridFromId+0x20>
ret

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

LLVM IR (-O2):
define void @getGridFromId(i32 %0, i32 %1, i32* nocapture %2, i32* nocapture writeonly %3, i32 %4) {
%6 = icmp sgt i32 %4, 0
br i1 %6, label %7, label %9
7: ; preds = %5
%8 = zext i32 %4 to i64
br label %10
9: ; preds = %10, %5
ret void
10: ; preds = %7, %10
%11 = phi i64 [ %8, %7 ], [ %14, %10 ]
%12 = phi i32 [ %0, %7 ], [ %22, %10 ]
%13 = phi i32 [ %1, %7 ], [ %18, %10 ]
%14 = add nsw i64 %11, -1
%15 = and i64 %14, 4294967295
%16 = getelementptr inbounds i32, i32* %2, i64 %15
%17 = load i32, i32* %16
%18 = sdiv i32 %13, %17
%19 = sdiv i32 %12, %18
%20 = getelementptr inbounds i32, i32* %3, i64 %15
store i32 %19, i32* %20
%21 = mul nsw i32 %19, %18
%22 = srem i32 %12, %18
%23 = icmp ugt i64 %11, 1
br i1 %23, label %10, label %9
}