void mat4_set(float m[4][4], float a00, float a01, float a02, float a03,
              float a10, float a11, float a12, float a13, float a20, float a21,
              float a22, float a23, float a30, float a31, float a32,
              float a33) {
  do {
    (m[0])[0] = (a00);
    (m[0])[1] = (a01);
    (m[0])[2] = (a02);
    (m[0])[3] = (a03);
  } while (0);
  do {
    (m[1])[0] = (a10);
    (m[1])[1] = (a11);
    (m[1])[2] = (a12);
    (m[1])[3] = (a13);
  } while (0);
  do {
    (m[2])[0] = (a20);
    (m[2])[1] = (a21);
    (m[2])[2] = (a22);
    (m[2])[3] = (a23);
  } while (0);
  do {
    (m[3])[0] = (a30);
    (m[3])[1] = (a31);
    (m[3])[2] = (a32);
    (m[3])[3] = (a33);
  } while (0);
}


x86 assembly (clang, -O0):
<mat4_set>:
push   %rbp
mov    %rsp,%rbp
movss  0x48(%rbp),%xmm8
movss  0x40(%rbp),%xmm8
movss  0x38(%rbp),%xmm8
movss  0x30(%rbp),%xmm8
movss  0x28(%rbp),%xmm8
movss  0x20(%rbp),%xmm8
movss  0x18(%rbp),%xmm8
movss  0x10(%rbp),%xmm8
mov    %rdi,-0x8(%rbp)
movss  %xmm0,-0xc(%rbp)
movss  %xmm1,-0x10(%rbp)
movss  %xmm2,-0x14(%rbp)
movss  %xmm3,-0x18(%rbp)
movss  %xmm4,-0x1c(%rbp)
movss  %xmm5,-0x20(%rbp)
movss  %xmm6,-0x24(%rbp)
movss  %xmm7,-0x28(%rbp)
movss  -0xc(%rbp),%xmm0
mov    -0x8(%rbp),%rax
movss  %xmm0,(%rax)
movss  -0x10(%rbp),%xmm0
mov    -0x8(%rbp),%rax
movss  %xmm0,0x4(%rax)
movss  -0x14(%rbp),%xmm0
mov    -0x8(%rbp),%rax
movss  %xmm0,0x8(%rax)
movss  -0x18(%rbp),%xmm0
mov    -0x8(%rbp),%rax
movss  %xmm0,0xc(%rax)
jmp    119c <mat4_set+0x9c>
movss  -0x1c(%rbp),%xmm0
mov    -0x8(%rbp),%rax
movss  %xmm0,0x10(%rax)
movss  -0x20(%rbp),%xmm0
mov    -0x8(%rbp),%rax
movss  %xmm0,0x14(%rax)
movss  -0x24(%rbp),%xmm0
mov    -0x8(%rbp),%rax
movss  %xmm0,0x18(%rax)
movss  -0x28(%rbp),%xmm0
mov    -0x8(%rbp),%rax
movss  %xmm0,0x1c(%rax)
jmp    11d9 <mat4_set+0xd9>
movss  0x10(%rbp),%xmm0
mov    -0x8(%rbp),%rax
movss  %xmm0,0x20(%rax)
movss  0x18(%rbp),%xmm0
mov    -0x8(%rbp),%rax
movss  %xmm0,0x24(%rax)
movss  0x20(%rbp),%xmm0
mov    -0x8(%rbp),%rax
movss  %xmm0,0x28(%rax)
movss  0x28(%rbp),%xmm0
mov    -0x8(%rbp),%rax
movss  %xmm0,0x2c(%rax)
jmp    1216 <mat4_set+0x116>
movss  0x30(%rbp),%xmm0
mov    -0x8(%rbp),%rax
movss  %xmm0,0x30(%rax)
movss  0x38(%rbp),%xmm0
mov    -0x8(%rbp),%rax
movss  %xmm0,0x34(%rax)
movss  0x40(%rbp),%xmm0
mov    -0x8(%rbp),%rax
movss  %xmm0,0x38(%rax)
movss  0x48(%rbp),%xmm0
mov    -0x8(%rbp),%rax
movss  %xmm0,0x3c(%rax)
pop    %rbp
ret

x86 assembly (clang, -O2):
<mat4_set>:
movss  0x40(%rsp),%xmm8
movss  0x38(%rsp),%xmm9
movss  0x30(%rsp),%xmm10
movss  0x28(%rsp),%xmm11
movss  0x20(%rsp),%xmm12
movss  0x18(%rsp),%xmm13
movss  0x10(%rsp),%xmm14
movss  0x8(%rsp),%xmm15
movss  %xmm0,(%rdi)
movss  %xmm1,0x4(%rdi)
movss  %xmm2,0x8(%rdi)
movss  %xmm3,0xc(%rdi)
movss  %xmm4,0x10(%rdi)
movss  %xmm5,0x14(%rdi)
movss  %xmm6,0x18(%rdi)
movss  %xmm7,0x1c(%rdi)
movss  %xmm15,0x20(%rdi)
movss  %xmm14,0x24(%rdi)
movss  %xmm13,0x28(%rdi)
movss  %xmm12,0x2c(%rdi)
movss  %xmm11,0x30(%rdi)
movss  %xmm10,0x34(%rdi)
movss  %xmm9,0x38(%rdi)
movss  %xmm8,0x3c(%rdi)
ret

LLVM IR (-O0):
define void @mat4_set([4 x float]* %0, float %1, float %2, float %3, float %4, float %5, float %6, float %7, float %8, float %9, float %10, float %11, float %12, float %13, float %14, float %15, float %16) {
%18 = alloca [4 x float]*
%19 = alloca float
%20 = alloca float
%21 = alloca float
%22 = alloca float
%23 = alloca float
%24 = alloca float
%25 = alloca float
%26 = alloca float
%27 = alloca float
%28 = alloca float
%29 = alloca float
%30 = alloca float
%31 = alloca float
%32 = alloca float
%33 = alloca float
%34 = alloca float
store [4 x float]* %0, [4 x float]** %18
store float %1, float* %19
store float %2, float* %20
store float %3, float* %21
store float %4, float* %22
store float %5, float* %23
store float %6, float* %24
store float %7, float* %25
store float %8, float* %26
store float %9, float* %27
store float %10, float* %28
store float %11, float* %29
store float %12, float* %30
store float %13, float* %31
store float %14, float* %32
store float %15, float* %33
store float %16, float* %34
br label %35
35: ; preds = %17
%36 = load float, float* %19
%37 = load [4 x float]*, [4 x float]** %18
%38 = getelementptr inbounds [4 x float], [4 x float]* %37, i64 0
%39 = getelementptr inbounds [4 x float], [4 x float]* %38, i64 0, i64 0
store float %36, float* %39
%40 = load float, float* %20
%41 = load [4 x float]*, [4 x float]** %18
%42 = getelementptr inbounds [4 x float], [4 x float]* %41, i64 0
%43 = getelementptr inbounds [4 x float], [4 x float]* %42, i64 0, i64 1
store float %40, float* %43
%44 = load float, float* %21
%45 = load [4 x float]*, [4 x float]** %18
%46 = getelementptr inbounds [4 x float], [4 x float]* %45, i64 0
%47 = getelementptr inbounds [4 x float], [4 x float]* %46, i64 0, i64 2
store float %44, float* %47
%48 = load float, float* %22
%49 = load [4 x float]*, [4 x float]** %18
%50 = getelementptr inbounds [4 x float], [4 x float]* %49, i64 0
%51 = getelementptr inbounds [4 x float], [4 x float]* %50, i64 0, i64 3
store float %48, float* %51
br label %52
52: ; preds = %35
br label %53
53: ; preds = %52
%54 = load float, float* %23
%55 = load [4 x float]*, [4 x float]** %18
%56 = getelementptr inbounds [4 x float], [4 x float]* %55, i64 1
%57 = getelementptr inbounds [4 x float], [4 x float]* %56, i64 0, i64 0
store float %54, float* %57
%58 = load float, float* %24
%59 = load [4 x float]*, [4 x float]** %18
%60 = getelementptr inbounds [4 x float], [4 x float]* %59, i64 1
%61 = getelementptr inbounds [4 x float], [4 x float]* %60, i64 0, i64 1
store float %58, float* %61
%62 = load float, float* %25
%63 = load [4 x float]*, [4 x float]** %18
%64 = getelementptr inbounds [4 x float], [4 x float]* %63, i64 1
%65 = getelementptr inbounds [4 x float], [4 x float]* %64, i64 0, i64 2
store float %62, float* %65
%66 = load float, float* %26
%67 = load [4 x float]*, [4 x float]** %18
%68 = getelementptr inbounds [4 x float], [4 x float]* %67, i64 1
%69 = getelementptr inbounds [4 x float], [4 x float]* %68, i64 0, i64 3
store float %66, float* %69
br label %70
70: ; preds = %53
br label %71
71: ; preds = %70
%72 = load float, float* %27
%73 = load [4 x float]*, [4 x float]** %18
%74 = getelementptr inbounds [4 x float], [4 x float]* %73, i64 2
%75 = getelementptr inbounds [4 x float], [4 x float]* %74, i64 0, i64 0
store float %72, float* %75
%76 = load float, float* %28
%77 = load [4 x float]*, [4 x float]** %18
%78 = getelementptr inbounds [4 x float], [4 x float]* %77, i64 2
%79 = getelementptr inbounds [4 x float], [4 x float]* %78, i64 0, i64 1
store float %76, float* %79
%80 = load float, float* %29
%81 = load [4 x float]*, [4 x float]** %18
%82 = getelementptr inbounds [4 x float], [4 x float]* %81, i64 2
%83 = getelementptr inbounds [4 x float], [4 x float]* %82, i64 0, i64 2
store float %80, float* %83
%84 = load float, float* %30
%85 = load [4 x float]*, [4 x float]** %18
%86 = getelementptr inbounds [4 x float], [4 x float]* %85, i64 2
%87 = getelementptr inbounds [4 x float], [4 x float]* %86, i64 0, i64 3
store float %84, float* %87
br label %88
88: ; preds = %71
br label %89
89: ; preds = %88
%90 = load float, float* %31
%91 = load [4 x float]*, [4 x float]** %18
%92 = getelementptr inbounds [4 x float], [4 x float]* %91, i64 3
%93 = getelementptr inbounds [4 x float], [4 x float]* %92, i64 0, i64 0
store float %90, float* %93
%94 = load float, float* %32
%95 = load [4 x float]*, [4 x float]** %18
%96 = getelementptr inbounds [4 x float], [4 x float]* %95, i64 3
%97 = getelementptr inbounds [4 x float], [4 x float]* %96, i64 0, i64 1
store float %94, float* %97
%98 = load float, float* %33
%99 = load [4 x float]*, [4 x float]** %18
%100 = getelementptr inbounds [4 x float], [4 x float]* %99, i64 3
%101 = getelementptr inbounds [4 x float], [4 x float]* %100, i64 0, i64 2
store float %98, float* %101
%102 = load float, float* %34
%103 = load [4 x float]*, [4 x float]** %18
%104 = getelementptr inbounds [4 x float], [4 x float]* %103, i64 3
%105 = getelementptr inbounds [4 x float], [4 x float]* %104, i64 0, i64 3
store float %102, float* %105
br label %106
106: ; preds = %89
ret void
}

LLVM IR (-O2):
define void @mat4_set([4 x float]* nocapture writeonly %0, float %1, float %2, float %3, float %4, float %5, float %6, float %7, float %8, float %9, float %10, float %11, float %12, float %13, float %14, float %15, float %16) {
%18 = getelementptr inbounds [4 x float], [4 x float]* %0, i64 0, i64 0
store float %1, float* %18
%19 = getelementptr inbounds [4 x float], [4 x float]* %0, i64 0, i64 1
store float %2, float* %19
%20 = getelementptr inbounds [4 x float], [4 x float]* %0, i64 0, i64 2
store float %3, float* %20
%21 = getelementptr inbounds [4 x float], [4 x float]* %0, i64 0, i64 3
store float %4, float* %21
%22 = getelementptr inbounds [4 x float], [4 x float]* %0, i64 1, i64 0
store float %5, float* %22
%23 = getelementptr inbounds [4 x float], [4 x float]* %0, i64 1, i64 1
store float %6, float* %23
%24 = getelementptr inbounds [4 x float], [4 x float]* %0, i64 1, i64 2
store float %7, float* %24
%25 = getelementptr inbounds [4 x float], [4 x float]* %0, i64 1, i64 3
store float %8, float* %25
%26 = getelementptr inbounds [4 x float], [4 x float]* %0, i64 2, i64 0
store float %9, float* %26
%27 = getelementptr inbounds [4 x float], [4 x float]* %0, i64 2, i64 1
store float %10, float* %27
%28 = getelementptr inbounds [4 x float], [4 x float]* %0, i64 2, i64 2
store float %11, float* %28
%29 = getelementptr inbounds [4 x float], [4 x float]* %0, i64 2, i64 3
store float %12, float* %29
%30 = getelementptr inbounds [4 x float], [4 x float]* %0, i64 3, i64 0
store float %13, float* %30
%31 = getelementptr inbounds [4 x float], [4 x float]* %0, i64 3, i64 1
store float %14, float* %31
%32 = getelementptr inbounds [4 x float], [4 x float]* %0, i64 3, i64 2
store float %15, float* %32
%33 = getelementptr inbounds [4 x float], [4 x float]* %0, i64 3, i64 3
store float %16, float* %33
ret void
}