char **ft_make2d(ptr, size, xstar, ystar, xsize, ysize)
char *ptr;
int size;
int xstar;
int ystar;
int xsize;
int ysize;
{
  char **ptr2d;
  if (ptr == 0)
    return 0;
  ((ptr2d) = (void *)calloc(ysize * sizeof(void *), 1));
  if (ptr2d == 0)
    return 0;
  for (; ysize--;) {
    ptr2d[ysize] = ptr + xsize * ysize * size - xstar * size;
  }
  return ptr2d - ystar;
}


x86 assembly (clang, -O0):
<ft_make2d>:
push   %rbp
mov    %rsp,%rbp
sub    $0x30,%rsp
mov    %rdi,-0x10(%rbp)
mov    %esi,-0x14(%rbp)
mov    %edx,-0x18(%rbp)
mov    %ecx,-0x1c(%rbp)
mov    %r8d,-0x20(%rbp)
mov    %r9d,-0x24(%rbp)
cmpq   $0x0,-0x10(%rbp)
jne    1145 <ft_make2d+0x35>
movq   $0x0,-0x8(%rbp)
jmp    11db <ft_make2d+0xcb>
movslq -0x24(%rbp),%rdi
shl    $0x3,%rdi
mov    $0x1,%esi
call   1030 <calloc@plt>
mov    %rax,-0x30(%rbp)
cmpq   $0x0,-0x30(%rbp)
jne    1173 <ft_make2d+0x63>
movq   $0x0,-0x8(%rbp)
jmp    11db <ft_make2d+0xcb>
jmp    1178 <ft_make2d+0x68>
mov    -0x24(%rbp),%eax
mov    %eax,%ecx
add    $0xffffffff,%ecx
mov    %ecx,-0x24(%rbp)
cmp    $0x0,%eax
je     11c3 <ft_make2d+0xb3>
mov    -0x10(%rbp),%rdx
mov    -0x20(%rbp),%eax
imul   -0x24(%rbp),%eax
imul   -0x14(%rbp),%eax
cltq
add    %rax,%rdx
mov    -0x18(%rbp),%eax
imul   -0x14(%rbp),%eax
movslq %eax,%rcx
xor    %eax,%eax
sub    %rcx,%rax
add    %rax,%rdx
mov    -0x30(%rbp),%rax
movslq -0x24(%rbp),%rcx
mov    %rdx,(%rax,%rcx,8)
jmp    1178 <ft_make2d+0x68>
mov    -0x30(%rbp),%rax
movslq -0x1c(%rbp),%rdx
xor    %ecx,%ecx
sub    %rdx,%rcx
shl    $0x3,%rcx
add    %rcx,%rax
mov    %rax,-0x8(%rbp)
mov    -0x8(%rbp),%rax
add    $0x30,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<ft_make2d>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
push   %rax
test   %rdi,%rdi
je     121f <ft_make2d+0x10f>
mov    %r9d,%ebp
mov    %r8d,%r12d
mov    %edx,%r13d
mov    %esi,%ebx
mov    %rdi,%r15
mov    %ecx,0x4(%rsp)
movslq %r9d,%r14
lea    0x0(,%r14,8),%rdi
mov    $0x1,%esi
call   1030 <calloc@plt>
test   %rax,%rax
je     121f <ft_make2d+0x10f>
test   %ebp,%ebp
je     1211 <ft_make2d+0x101>
imul   %ebx,%r13d
movslq %r13d,%rcx
sub    %rcx,%r15
lea    -0x1(%rbp),%ecx
and    $0x3,%ebp
je     1197 <ft_make2d+0x87>
mov    %r12d,%edx
imul   %ebx,%edx
mov    %edx,%esi
imul   %ecx,%esi
nopl   0x0(%rax)
movslq %esi,%rsi
lea    (%r15,%rsi,1),%rdi
mov    %rdi,-0x8(%rax,%r14,8)
add    $0xffffffffffffffff,%r14
sub    %edx,%esi
add    $0xffffffff,%ebp
jne    1180 <ft_make2d+0x70>
cmp    $0x3,%ecx
jb     1211 <ft_make2d+0x101>
imul   %ebx,%r12d
lea    -0x4(%r14),%ecx
imul   %r12d,%ecx
lea    0x0(,%r12,4),%edx
lea    -0x3(%r14),%esi
imul   %r12d,%esi
lea    -0x2(%r14),%edi
imul   %r12d,%edi
lea    -0x1(%r14),%ebp
imul   %r12d,%ebp
nopl   0x0(%rax,%rax,1)
movslq %ebp,%rbp
lea    (%r15,%rbp,1),%rbx
mov    %rbx,-0x8(%rax,%r14,8)
movslq %edi,%rdi
lea    (%r15,%rdi,1),%rbx
mov    %rbx,-0x10(%rax,%r14,8)
movslq %esi,%rsi
lea    (%r15,%rsi,1),%rbx
mov    %rbx,-0x18(%rax,%r14,8)
movslq %ecx,%rcx
lea    (%r15,%rcx,1),%rbx
mov    %rbx,-0x20(%rax,%r14,8)
add    $0xfffffffffffffffc,%r14
sub    %edx,%ecx
sub    %edx,%esi
sub    %edx,%edi
sub    %edx,%ebp
test   %r14d,%r14d
jne    11d0 <ft_make2d+0xc0>
movslq 0x4(%rsp),%rcx
shl    $0x3,%rcx
sub    %rcx,%rax
jmp    1221 <ft_make2d+0x111>
xor    %eax,%eax
add    $0x8,%rsp
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret

LLVM IR (-O0):
define i8** @ft_make2d(i8* %0, i32 %1, i32 %2, i32 %3, i32 %4, i32 %5) {
%7 = alloca i8**
%8 = alloca i8*
%9 = alloca i32
%10 = alloca i32
%11 = alloca i32
%12 = alloca i32
%13 = alloca i32
%14 = alloca i8**
store i8* %0, i8** %8
store i32 %1, i32* %9
store i32 %2, i32* %10
store i32 %3, i32* %11
store i32 %4, i32* %12
store i32 %5, i32* %13
%15 = load i8*, i8** %8
%16 = icmp eq i8* %15, null
br i1 %16, label %17, label %18
17: ; preds = %6
store i8** null, i8*** %7
br label %57
18: ; preds = %6
%19 = load i32, i32* %13
%20 = sext i32 %19 to i64
%21 = mul i64 %20, 8
%22 = call i8* @calloc(i64 %21, i64 1)
%23 = bitcast i8* %22 to i8**
store i8** %23, i8*** %14
%24 = load i8**, i8*** %14
%25 = icmp eq i8** %24, null
br i1 %25, label %26, label %27
26: ; preds = %18
store i8** null, i8*** %7
br label %57
27: ; preds = %18
br label %28
28: ; preds = %32, %27
%29 = load i32, i32* %13
%30 = add nsw i32 %29, -1
store i32 %30, i32* %13
%31 = icmp ne i32 %29, 0
br i1 %31, label %32, label %51
32: ; preds = %28
%33 = load i8*, i8** %8
%34 = load i32, i32* %12
%35 = load i32, i32* %13
%36 = mul nsw i32 %34, %35
%37 = load i32, i32* %9
%38 = mul nsw i32 %36, %37
%39 = sext i32 %38 to i64
%40 = getelementptr inbounds i8, i8* %33, i64 %39
%41 = load i32, i32* %10
%42 = load i32, i32* %9
%43 = mul nsw i32 %41, %42
%44 = sext i32 %43 to i64
%45 = sub i64 0, %44
%46 = getelementptr inbounds i8, i8* %40, i64 %45
%47 = load i8**, i8*** %14
%48 = load i32, i32* %13
%49 = sext i32 %48 to i64
%50 = getelementptr inbounds i8*, i8** %47, i64 %49
store i8* %46, i8** %50
br label %28
51: ; preds = %28
%52 = load i8**, i8*** %14
%53 = load i32, i32* %11
%54 = sext i32 %53 to i64
%55 = sub i64 0, %54
%56 = getelementptr inbounds i8*, i8** %52, i64 %55
store i8** %56, i8*** %7
br label %57
57: ; preds = %51, %26, %17
%58 = load i8**, i8*** %7
ret i8** %58
}

LLVM IR (-O2):
define noalias i8** @ft_make2d(i8* %0, i32 %1, i32 %2, i32 %3, i32 %4, i32 %5) {
%7 = icmp eq i8* %0, null
br i1 %7, label %70, label %8
8: ; preds = %6
%9 = sext i32 %5 to i64
%10 = shl nsw i64 %9, 3
%11 = tail call i8* @calloc(i64 %10, i64 1)
%12 = bitcast i8* %11 to i8**
%13 = icmp eq i8* %11, null
br i1 %13, label %70, label %14
14: ; preds = %8
%15 = icmp eq i32 %5, 0
br i1 %15, label %66, label %16
16: ; preds = %14
%17 = mul i32 %4, %1
%18 = mul nsw i32 %2, %1
%19 = sext i32 %18 to i64
%20 = sub nsw i64 0, %19
%21 = getelementptr inbounds i8, i8* %0, i64 %20
%22 = add i32 %5, -1
%23 = and i32 %5, 3
%24 = icmp eq i32 %23, 0
br i1 %24, label %36, label %25
25: ; preds = %16, %25
%26 = phi i64 [ %28, %25 ], [ %9, %16 ]
%27 = phi i32 [ %34, %25 ], [ 0, %16 ]
%28 = add nsw i64 %26, -1
%29 = trunc i64 %28 to i32
%30 = mul i32 %17, %29
%31 = sext i32 %30 to i64
%32 = getelementptr inbounds i8, i8* %21, i64 %31
%33 = getelementptr inbounds i8*, i8** %12, i64 %28
store i8* %32, i8** %33
%34 = add i32 %27, 1
%35 = icmp eq i32 %34, %23
br i1 %35, label %36, label %25
36: ; preds = %25, %16
%37 = phi i64 [ %9, %16 ], [ %28, %25 ]
%38 = icmp ult i32 %22, 3
br i1 %38, label %66, label %39
39: ; preds = %36, %39
%40 = phi i64 [ %59, %39 ], [ %37, %36 ]
%41 = add nsw i64 %40, -1
%42 = trunc i64 %41 to i32
%43 = mul i32 %17, %42
%44 = sext i32 %43 to i64
%45 = getelementptr inbounds i8, i8* %21, i64 %44
%46 = getelementptr inbounds i8*, i8** %12, i64 %41
store i8* %45, i8** %46
%47 = add nsw i64 %40, -2
%48 = trunc i64 %47 to i32
%49 = mul i32 %17, %48
%50 = sext i32 %49 to i64
%51 = getelementptr inbounds i8, i8* %21, i64 %50
%52 = getelementptr inbounds i8*, i8** %12, i64 %47
store i8* %51, i8** %52
%53 = add nsw i64 %40, -3
%54 = trunc i64 %53 to i32
%55 = mul i32 %17, %54
%56 = sext i32 %55 to i64
%57 = getelementptr inbounds i8, i8* %21, i64 %56
%58 = getelementptr inbounds i8*, i8** %12, i64 %53
store i8* %57, i8** %58
%59 = add nsw i64 %40, -4
%60 = trunc i64 %59 to i32
%61 = mul i32 %17, %60
%62 = sext i32 %61 to i64
%63 = getelementptr inbounds i8, i8* %21, i64 %62
%64 = getelementptr inbounds i8*, i8** %12, i64 %59
store i8* %63, i8** %64
%65 = icmp eq i32 %60, 0
br i1 %65, label %66, label %39
66: ; preds = %36, %39, %14
%67 = sext i32 %3 to i64
%68 = sub nsw i64 0, %67
%69 = getelementptr inbounds i8*, i8** %12, i64 %68
br label %70
70: ; preds = %8, %6, %66
%71 = phi i8** [ %69, %66 ], [ null, %6 ], [ null, %8 ]
ret i8** %71
}