float *mat4(float *result, float m11, float m12, float m13, float m14,
            float m21, float m22, float m23, float m24, float m31, float m32,
            float m33, float m34, float m41, float m42, float m43, float m44) {
  result[0] = m11;
  result[1] = m21;
  result[2] = m31;
  result[3] = m41;
  result[4] = m12;
  result[5] = m22;
  result[6] = m32;
  result[7] = m42;
  result[8] = m13;
  result[9] = m23;
  result[10] = m33;
  result[11] = m43;
  result[12] = m14;
  result[13] = m24;
  result[14] = m34;
  result[15] = m44;
  return result;
}


x86 assembly (clang, -O0):
<mat4>:
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  -0x1c(%rbp),%xmm0
mov    -0x8(%rbp),%rax
movss  %xmm0,0x4(%rax)
movss  0x10(%rbp),%xmm0
mov    -0x8(%rbp),%rax
movss  %xmm0,0x8(%rax)
movss  0x30(%rbp),%xmm0
mov    -0x8(%rbp),%rax
movss  %xmm0,0xc(%rax)
movss  -0x10(%rbp),%xmm0
mov    -0x8(%rbp),%rax
movss  %xmm0,0x10(%rax)
movss  -0x20(%rbp),%xmm0
mov    -0x8(%rbp),%rax
movss  %xmm0,0x14(%rax)
movss  0x18(%rbp),%xmm0
mov    -0x8(%rbp),%rax
movss  %xmm0,0x18(%rax)
movss  0x38(%rbp),%xmm0
mov    -0x8(%rbp),%rax
movss  %xmm0,0x1c(%rax)
movss  -0x14(%rbp),%xmm0
mov    -0x8(%rbp),%rax
movss  %xmm0,0x20(%rax)
movss  -0x24(%rbp),%xmm0
mov    -0x8(%rbp),%rax
movss  %xmm0,0x24(%rax)
movss  0x20(%rbp),%xmm0
mov    -0x8(%rbp),%rax
movss  %xmm0,0x28(%rax)
movss  0x40(%rbp),%xmm0
mov    -0x8(%rbp),%rax
movss  %xmm0,0x2c(%rax)
movss  -0x18(%rbp),%xmm0
mov    -0x8(%rbp),%rax
movss  %xmm0,0x30(%rax)
movss  -0x28(%rbp),%xmm0
mov    -0x8(%rbp),%rax
movss  %xmm0,0x34(%rax)
movss  0x28(%rbp),%xmm0
mov    -0x8(%rbp),%rax
movss  %xmm0,0x38(%rax)
movss  0x48(%rbp),%xmm0
mov    -0x8(%rbp),%rax
movss  %xmm0,0x3c(%rax)
mov    -0x8(%rbp),%rax
pop    %rbp
ret

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

LLVM IR (-O0):
define float* @mat4(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 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 float* %0, 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
%35 = load float, float* %19
%36 = load float*, float** %18
%37 = getelementptr inbounds float, float* %36, i64 0
store float %35, float* %37
%38 = load float, float* %23
%39 = load float*, float** %18
%40 = getelementptr inbounds float, float* %39, i64 1
store float %38, float* %40
%41 = load float, float* %27
%42 = load float*, float** %18
%43 = getelementptr inbounds float, float* %42, i64 2
store float %41, float* %43
%44 = load float, float* %31
%45 = load float*, float** %18
%46 = getelementptr inbounds float, float* %45, i64 3
store float %44, float* %46
%47 = load float, float* %20
%48 = load float*, float** %18
%49 = getelementptr inbounds float, float* %48, i64 4
store float %47, float* %49
%50 = load float, float* %24
%51 = load float*, float** %18
%52 = getelementptr inbounds float, float* %51, i64 5
store float %50, float* %52
%53 = load float, float* %28
%54 = load float*, float** %18
%55 = getelementptr inbounds float, float* %54, i64 6
store float %53, float* %55
%56 = load float, float* %32
%57 = load float*, float** %18
%58 = getelementptr inbounds float, float* %57, i64 7
store float %56, float* %58
%59 = load float, float* %21
%60 = load float*, float** %18
%61 = getelementptr inbounds float, float* %60, i64 8
store float %59, float* %61
%62 = load float, float* %25
%63 = load float*, float** %18
%64 = getelementptr inbounds float, float* %63, i64 9
store float %62, float* %64
%65 = load float, float* %29
%66 = load float*, float** %18
%67 = getelementptr inbounds float, float* %66, i64 10
store float %65, float* %67
%68 = load float, float* %33
%69 = load float*, float** %18
%70 = getelementptr inbounds float, float* %69, i64 11
store float %68, float* %70
%71 = load float, float* %22
%72 = load float*, float** %18
%73 = getelementptr inbounds float, float* %72, i64 12
store float %71, float* %73
%74 = load float, float* %26
%75 = load float*, float** %18
%76 = getelementptr inbounds float, float* %75, i64 13
store float %74, float* %76
%77 = load float, float* %30
%78 = load float*, float** %18
%79 = getelementptr inbounds float, float* %78, i64 14
store float %77, float* %79
%80 = load float, float* %34
%81 = load float*, float** %18
%82 = getelementptr inbounds float, float* %81, i64 15
store float %80, float* %82
%83 = load float*, float** %18
ret float* %83
}

LLVM IR (-O2):
define float* @mat4(float* returned 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) {
store float %1, float* %0
%18 = getelementptr inbounds float, float* %0, i64 1
store float %5, float* %18
%19 = getelementptr inbounds float, float* %0, i64 2
store float %9, float* %19
%20 = getelementptr inbounds float, float* %0, i64 3
store float %13, float* %20
%21 = getelementptr inbounds float, float* %0, i64 4
store float %2, float* %21
%22 = getelementptr inbounds float, float* %0, i64 5
store float %6, float* %22
%23 = getelementptr inbounds float, float* %0, i64 6
store float %10, float* %23
%24 = getelementptr inbounds float, float* %0, i64 7
store float %14, float* %24
%25 = getelementptr inbounds float, float* %0, i64 8
store float %3, float* %25
%26 = getelementptr inbounds float, float* %0, i64 9
store float %7, float* %26
%27 = getelementptr inbounds float, float* %0, i64 10
store float %11, float* %27
%28 = getelementptr inbounds float, float* %0, i64 11
store float %15, float* %28
%29 = getelementptr inbounds float, float* %0, i64 12
store float %4, float* %29
%30 = getelementptr inbounds float, float* %0, i64 13
store float %8, float* %30
%31 = getelementptr inbounds float, float* %0, i64 14
store float %12, float* %31
%32 = getelementptr inbounds float, float* %0, i64 15
store float %16, float* %32
ret float* %0
}