void load_vsx_vmx(unsigned long *load, unsigned long *vsx,
                  unsigned long vmx[][2]) {
  int i;
  for (i = 0; i < 32; i++)
    vsx[i] = load[1 + 2 * i];
  for (i = 0; i < 32; i++) {
    vmx[i][0] = load[64 + 2 * i];
    vmx[i][1] = load[65 + 2 * i];
  }
}


x86 assembly (clang, -O0):
<load_vsx_vmx>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
mov    %rdx,-0x18(%rbp)
movl   $0x0,-0x1c(%rbp)
cmpl   $0x20,-0x1c(%rbp)
jge    114f <load_vsx_vmx+0x4f>
mov    -0x8(%rbp),%rax
mov    -0x1c(%rbp),%ecx
shl    $0x1,%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
mov    (%rax,%rcx,8),%rdx
mov    -0x10(%rbp),%rax
movslq -0x1c(%rbp),%rcx
mov    %rdx,(%rax,%rcx,8)
mov    -0x1c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x1c(%rbp)
jmp    1117 <load_vsx_vmx+0x17>
movl   $0x0,-0x1c(%rbp)
cmpl   $0x20,-0x1c(%rbp)
jge    11bb <load_vsx_vmx+0xbb>
mov    -0x8(%rbp),%rax
mov    -0x1c(%rbp),%ecx
shl    $0x1,%ecx
add    $0x40,%ecx
movslq %ecx,%rcx
mov    (%rax,%rcx,8),%rcx
mov    -0x18(%rbp),%rax
movslq -0x1c(%rbp),%rdx
shl    $0x4,%rdx
add    %rdx,%rax
mov    %rcx,(%rax)
mov    -0x8(%rbp),%rax
mov    -0x1c(%rbp),%ecx
shl    $0x1,%ecx
add    $0x41,%ecx
movslq %ecx,%rcx
mov    (%rax,%rcx,8),%rcx
mov    -0x18(%rbp),%rax
movslq -0x1c(%rbp),%rdx
shl    $0x4,%rdx
add    %rdx,%rax
mov    %rcx,0x8(%rax)
mov    -0x1c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x1c(%rbp)
jmp    1156 <load_vsx_vmx+0x56>
pop    %rbp
ret

x86 assembly (clang, -O2):
<load_vsx_vmx>:
lea    0x200(%rdi),%rax
cmp    %rsi,%rax
jbe    1123 <load_vsx_vmx+0x23>
lea    0x100(%rsi),%rax
lea    0x8(%rdi),%rcx
cmp    %rax,%rcx
jae    1123 <load_vsx_vmx+0x23>
xor    %eax,%eax
jmp    125f <load_vsx_vmx+0x15f>
movups 0x8(%rdi),%xmm0
movups 0x18(%rdi),%xmm1
movlhps %xmm1,%xmm0
movups %xmm0,(%rsi)
movups 0x28(%rdi),%xmm0
movups 0x38(%rdi),%xmm1
movlhps %xmm1,%xmm0
movups %xmm0,0x10(%rsi)
movups 0x48(%rdi),%xmm0
movups 0x58(%rdi),%xmm1
movlhps %xmm1,%xmm0
movups %xmm0,0x20(%rsi)
movups 0x68(%rdi),%xmm0
movups 0x78(%rdi),%xmm1
movlhps %xmm1,%xmm0
movups %xmm0,0x30(%rsi)
movups 0x88(%rdi),%xmm0
movups 0x98(%rdi),%xmm1
movlhps %xmm1,%xmm0
movups %xmm0,0x40(%rsi)
movups 0xa8(%rdi),%xmm0
movups 0xb8(%rdi),%xmm1
movlhps %xmm1,%xmm0
movups %xmm0,0x50(%rsi)
movups 0xc8(%rdi),%xmm0
movups 0xd8(%rdi),%xmm1
movlhps %xmm1,%xmm0
movups %xmm0,0x60(%rsi)
movups 0xe8(%rdi),%xmm0
movups 0xf8(%rdi),%xmm1
movlhps %xmm1,%xmm0
movups %xmm0,0x70(%rsi)
movups 0x108(%rdi),%xmm0
movups 0x118(%rdi),%xmm1
movlhps %xmm1,%xmm0
movups %xmm0,0x80(%rsi)
movups 0x128(%rdi),%xmm0
movups 0x138(%rdi),%xmm1
movlhps %xmm1,%xmm0
movups %xmm0,0x90(%rsi)
movups 0x148(%rdi),%xmm0
movups 0x158(%rdi),%xmm1
movlhps %xmm1,%xmm0
movups %xmm0,0xa0(%rsi)
movups 0x168(%rdi),%xmm0
movups 0x178(%rdi),%xmm1
movlhps %xmm1,%xmm0
movups %xmm0,0xb0(%rsi)
movups 0x188(%rdi),%xmm0
movups 0x198(%rdi),%xmm1
movlhps %xmm1,%xmm0
movups %xmm0,0xc0(%rsi)
movups 0x1a8(%rdi),%xmm0
movups 0x1b8(%rdi),%xmm1
movlhps %xmm1,%xmm0
movups %xmm0,0xd0(%rsi)
movups 0x1c8(%rdi),%xmm0
movups 0x1d8(%rdi),%xmm1
movlhps %xmm1,%xmm0
movups %xmm0,0xe0(%rsi)
mov    $0x1e,%eax
mov    %rax,%r10
neg    %r10
mov    %rax,%r8
xor    $0x1f,%r8
test   $0x2,%r10b
je     12a5 <load_vsx_vmx+0x1a5>
mov    %rax,%rcx
shl    $0x4,%rcx
lea    (%rcx,%rdi,1),%r9
add    $0x8,%r9
shl    $0x4,%r10d
and    $0x20,%r10d
xor    %r11d,%r11d
nopl   0x0(%rax)
mov    (%r9,%r11,1),%rcx
mov    %rcx,(%rsi,%rax,8)
add    $0x1,%rax
add    $0x10,%r11
cmp    %r11,%r10
jne    1290 <load_vsx_vmx+0x190>
cmp    $0x3,%r8d
jb     12e3 <load_vsx_vmx+0x1e3>
shl    $0x3,%rax
nop
mov    0x8(%rdi,%rax,2),%rcx
mov    %rcx,(%rsi,%rax,1)
mov    0x18(%rdi,%rax,2),%rcx
mov    %rcx,0x8(%rsi,%rax,1)
mov    0x28(%rdi,%rax,2),%rcx
mov    %rcx,0x10(%rsi,%rax,1)
mov    0x38(%rdi,%rax,2),%rcx
mov    %rcx,0x18(%rsi,%rax,1)
add    $0x20,%rax
cmp    $0x100,%rax
jne    12b0 <load_vsx_vmx+0x1b0>
xor    %eax,%eax
cs nopw 0x0(%rax,%rax,1)
nop
mov    0x200(%rdi,%rax,1),%rcx
mov    %rcx,(%rdx,%rax,1)
mov    0x208(%rdi,%rax,1),%rcx
mov    %rcx,0x8(%rdx,%rax,1)
mov    0x210(%rdi,%rax,1),%rcx
mov    %rcx,0x10(%rdx,%rax,1)
mov    0x218(%rdi,%rax,1),%rcx
mov    %rcx,0x18(%rdx,%rax,1)
add    $0x20,%rax
cmp    $0x200,%rax
jne    12f0 <load_vsx_vmx+0x1f0>
ret

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

LLVM IR (-O2):
define void @load_vsx_vmx(i64* nocapture %0, i64* nocapture writeonly %1, [2 x i64]* nocapture writeonly %2) {
%4 = getelementptr i64, i64* %1, i64 32
%5 = getelementptr i64, i64* %0, i64 1
%6 = getelementptr i64, i64* %0, i64 64
%7 = icmp ugt i64* %6, %1
%8 = icmp ult i64* %5, %4
%9 = and i1 %7, %8
br i1 %9, label %100, label %10
10: ; preds = %3
%11 = getelementptr inbounds i64, i64* %0, i64 1
%12 = bitcast i64* %11 to <4 x i64>*
%13 = load <4 x i64>, <4 x i64>* %12
%14 = shufflevector <4 x i64> %13, <4 x i64> poison, <2 x i32> <i32 0, i32 2>
%15 = bitcast i64* %1 to <2 x i64>*
store <2 x i64> %14, <2 x i64>* %15
%16 = getelementptr inbounds i64, i64* %0, i64 5
%17 = bitcast i64* %16 to <4 x i64>*
%18 = load <4 x i64>, <4 x i64>* %17
%19 = shufflevector <4 x i64> %18, <4 x i64> poison, <2 x i32> <i32 0, i32 2>
%20 = getelementptr inbounds i64, i64* %1, i64 2
%21 = bitcast i64* %20 to <2 x i64>*
store <2 x i64> %19, <2 x i64>* %21
%22 = getelementptr inbounds i64, i64* %0, i64 9
%23 = bitcast i64* %22 to <4 x i64>*
%24 = load <4 x i64>, <4 x i64>* %23
%25 = shufflevector <4 x i64> %24, <4 x i64> poison, <2 x i32> <i32 0, i32 2>
%26 = getelementptr inbounds i64, i64* %1, i64 4
%27 = bitcast i64* %26 to <2 x i64>*
store <2 x i64> %25, <2 x i64>* %27
%28 = getelementptr inbounds i64, i64* %0, i64 13
%29 = bitcast i64* %28 to <4 x i64>*
%30 = load <4 x i64>, <4 x i64>* %29
%31 = shufflevector <4 x i64> %30, <4 x i64> poison, <2 x i32> <i32 0, i32 2>
%32 = getelementptr inbounds i64, i64* %1, i64 6
%33 = bitcast i64* %32 to <2 x i64>*
store <2 x i64> %31, <2 x i64>* %33
%34 = getelementptr inbounds i64, i64* %0, i64 17
%35 = bitcast i64* %34 to <4 x i64>*
%36 = load <4 x i64>, <4 x i64>* %35
%37 = shufflevector <4 x i64> %36, <4 x i64> poison, <2 x i32> <i32 0, i32 2>
%38 = getelementptr inbounds i64, i64* %1, i64 8
%39 = bitcast i64* %38 to <2 x i64>*
store <2 x i64> %37, <2 x i64>* %39
%40 = getelementptr inbounds i64, i64* %0, i64 21
%41 = bitcast i64* %40 to <4 x i64>*
%42 = load <4 x i64>, <4 x i64>* %41
%43 = shufflevector <4 x i64> %42, <4 x i64> poison, <2 x i32> <i32 0, i32 2>
%44 = getelementptr inbounds i64, i64* %1, i64 10
%45 = bitcast i64* %44 to <2 x i64>*
store <2 x i64> %43, <2 x i64>* %45
%46 = getelementptr inbounds i64, i64* %0, i64 25
%47 = bitcast i64* %46 to <4 x i64>*
%48 = load <4 x i64>, <4 x i64>* %47
%49 = shufflevector <4 x i64> %48, <4 x i64> poison, <2 x i32> <i32 0, i32 2>
%50 = getelementptr inbounds i64, i64* %1, i64 12
%51 = bitcast i64* %50 to <2 x i64>*
store <2 x i64> %49, <2 x i64>* %51
%52 = getelementptr inbounds i64, i64* %0, i64 29
%53 = bitcast i64* %52 to <4 x i64>*
%54 = load <4 x i64>, <4 x i64>* %53
%55 = shufflevector <4 x i64> %54, <4 x i64> poison, <2 x i32> <i32 0, i32 2>
%56 = getelementptr inbounds i64, i64* %1, i64 14
%57 = bitcast i64* %56 to <2 x i64>*
store <2 x i64> %55, <2 x i64>* %57
%58 = getelementptr inbounds i64, i64* %0, i64 33
%59 = bitcast i64* %58 to <4 x i64>*
%60 = load <4 x i64>, <4 x i64>* %59
%61 = shufflevector <4 x i64> %60, <4 x i64> poison, <2 x i32> <i32 0, i32 2>
%62 = getelementptr inbounds i64, i64* %1, i64 16
%63 = bitcast i64* %62 to <2 x i64>*
store <2 x i64> %61, <2 x i64>* %63
%64 = getelementptr inbounds i64, i64* %0, i64 37
%65 = bitcast i64* %64 to <4 x i64>*
%66 = load <4 x i64>, <4 x i64>* %65
%67 = shufflevector <4 x i64> %66, <4 x i64> poison, <2 x i32> <i32 0, i32 2>
%68 = getelementptr inbounds i64, i64* %1, i64 18
%69 = bitcast i64* %68 to <2 x i64>*
store <2 x i64> %67, <2 x i64>* %69
%70 = getelementptr inbounds i64, i64* %0, i64 41
%71 = bitcast i64* %70 to <4 x i64>*
%72 = load <4 x i64>, <4 x i64>* %71
%73 = shufflevector <4 x i64> %72, <4 x i64> poison, <2 x i32> <i32 0, i32 2>
%74 = getelementptr inbounds i64, i64* %1, i64 20
%75 = bitcast i64* %74 to <2 x i64>*
store <2 x i64> %73, <2 x i64>* %75
%76 = getelementptr inbounds i64, i64* %0, i64 45
%77 = bitcast i64* %76 to <4 x i64>*
%78 = load <4 x i64>, <4 x i64>* %77
%79 = shufflevector <4 x i64> %78, <4 x i64> poison, <2 x i32> <i32 0, i32 2>
%80 = getelementptr inbounds i64, i64* %1, i64 22
%81 = bitcast i64* %80 to <2 x i64>*
store <2 x i64> %79, <2 x i64>* %81
%82 = getelementptr inbounds i64, i64* %0, i64 49
%83 = bitcast i64* %82 to <4 x i64>*
%84 = load <4 x i64>, <4 x i64>* %83
%85 = shufflevector <4 x i64> %84, <4 x i64> poison, <2 x i32> <i32 0, i32 2>
%86 = getelementptr inbounds i64, i64* %1, i64 24
%87 = bitcast i64* %86 to <2 x i64>*
store <2 x i64> %85, <2 x i64>* %87
%88 = getelementptr inbounds i64, i64* %0, i64 53
%89 = bitcast i64* %88 to <4 x i64>*
%90 = load <4 x i64>, <4 x i64>* %89
%91 = shufflevector <4 x i64> %90, <4 x i64> poison, <2 x i32> <i32 0, i32 2>
%92 = getelementptr inbounds i64, i64* %1, i64 26
%93 = bitcast i64* %92 to <2 x i64>*
store <2 x i64> %91, <2 x i64>* %93
%94 = getelementptr inbounds i64, i64* %0, i64 57
%95 = bitcast i64* %94 to <4 x i64>*
%96 = load <4 x i64>, <4 x i64>* %95
%97 = shufflevector <4 x i64> %96, <4 x i64> poison, <2 x i32> <i32 0, i32 2>
%98 = getelementptr inbounds i64, i64* %1, i64 28
%99 = bitcast i64* %98 to <2 x i64>*
store <2 x i64> %97, <2 x i64>* %99
br label %100
100: ; preds = %10, %3
%101 = phi i64 [ 0, %3 ], [ 30, %10 ]
%102 = sub nsw i64 0, %101
%103 = xor i64 %101, 31
%104 = and i64 %102, 2
%105 = icmp eq i64 %104, 0
br i1 %105, label %117, label %106
106: ; preds = %100, %106
%107 = phi i64 [ %114, %106 ], [ %101, %100 ]
%108 = phi i64 [ %115, %106 ], [ 0, %100 ]
%109 = shl nuw nsw i64 %107, 1
%110 = or i64 %109, 1
%111 = getelementptr inbounds i64, i64* %0, i64 %110
%112 = load i64, i64* %111
%113 = getelementptr inbounds i64, i64* %1, i64 %107
store i64 %112, i64* %113
%114 = add nuw nsw i64 %107, 1
%115 = add i64 %108, 1
%116 = icmp eq i64 %115, %104
br i1 %116, label %117, label %106
117: ; preds = %106, %100
%118 = phi i64 [ %101, %100 ], [ %114, %106 ]
%119 = icmp ult i64 %103, 3
br i1 %119, label %147, label %120
120: ; preds = %117, %120
%121 = phi i64 [ %145, %120 ], [ %118, %117 ]
%122 = shl nuw nsw i64 %121, 1
%123 = or i64 %122, 1
%124 = getelementptr inbounds i64, i64* %0, i64 %123
%125 = load i64, i64* %124
%126 = getelementptr inbounds i64, i64* %1, i64 %121
store i64 %125, i64* %126
%127 = add nuw nsw i64 %121, 1
%128 = shl nuw nsw i64 %127, 1
%129 = or i64 %128, 1
%130 = getelementptr inbounds i64, i64* %0, i64 %129
%131 = load i64, i64* %130
%132 = getelementptr inbounds i64, i64* %1, i64 %127
store i64 %131, i64* %132
%133 = add nuw nsw i64 %121, 2
%134 = shl nuw nsw i64 %133, 1
%135 = or i64 %134, 1
%136 = getelementptr inbounds i64, i64* %0, i64 %135
%137 = load i64, i64* %136
%138 = getelementptr inbounds i64, i64* %1, i64 %133
store i64 %137, i64* %138
%139 = add nuw nsw i64 %121, 3
%140 = shl nuw nsw i64 %139, 1
%141 = or i64 %140, 1
%142 = getelementptr inbounds i64, i64* %0, i64 %141
%143 = load i64, i64* %142
%144 = getelementptr inbounds i64, i64* %1, i64 %139
store i64 %143, i64* %144
%145 = add nuw nsw i64 %121, 4
%146 = icmp eq i64 %145, 32
br i1 %146, label %147, label %120
147: ; preds = %120, %117
br label %148
148: ; preds = %148, %147
%149 = phi i64 [ 0, %147 ], [ %169, %148 ]
%150 = shl nuw nsw i64 %149, 1
%151 = add nuw nsw i64 %150, 64
%152 = getelementptr inbounds i64, i64* %0, i64 %151
%153 = load i64, i64* %152
%154 = getelementptr inbounds [2 x i64], [2 x i64]* %2, i64 %149, i64 0
store i64 %153, i64* %154
%155 = add nuw nsw i64 %150, 65
%156 = getelementptr inbounds i64, i64* %0, i64 %155
%157 = load i64, i64* %156
%158 = getelementptr inbounds [2 x i64], [2 x i64]* %2, i64 %149, i64 1
store i64 %157, i64* %158
%159 = or i64 %149, 1
%160 = shl nuw nsw i64 %159, 1
%161 = add nuw nsw i64 %160, 64
%162 = getelementptr inbounds i64, i64* %0, i64 %161
%163 = load i64, i64* %162
%164 = getelementptr inbounds [2 x i64], [2 x i64]* %2, i64 %159, i64 0
store i64 %163, i64* %164
%165 = add nuw nsw i64 %160, 65
%166 = getelementptr inbounds i64, i64* %0, i64 %165
%167 = load i64, i64* %166
%168 = getelementptr inbounds [2 x i64], [2 x i64]* %2, i64 %159, i64 1
store i64 %167, i64* %168
%169 = add nuw nsw i64 %149, 2
%170 = icmp eq i64 %169, 32
br i1 %170, label %171, label %148
171: ; preds = %148
ret void
}