void xor_32regs_3(unsigned long bytes, unsigned long *p1, unsigned long *p2,
                  unsigned long *p3) {
  long lines = bytes / (sizeof(long)) / 8;
  do {
    register long d0, d1, d2, d3, d4, d5, d6, d7;
    d0 = p1[0];
    d1 = p1[1];
    d2 = p1[2];
    d3 = p1[3];
    d4 = p1[4];
    d5 = p1[5];
    d6 = p1[6];
    d7 = p1[7];
    d0 ^= p2[0];
    d1 ^= p2[1];
    d2 ^= p2[2];
    d3 ^= p2[3];
    d4 ^= p2[4];
    d5 ^= p2[5];
    d6 ^= p2[6];
    d7 ^= p2[7];
    d0 ^= p3[0];
    d1 ^= p3[1];
    d2 ^= p3[2];
    d3 ^= p3[3];
    d4 ^= p3[4];
    d5 ^= p3[5];
    d6 ^= p3[6];
    d7 ^= p3[7];
    p1[0] = d0;
    p1[1] = d1;
    p1[2] = d2;
    p1[3] = d3;
    p1[4] = d4;
    p1[5] = d5;
    p1[6] = d6;
    p1[7] = d7;
    p1 += 8;
    p2 += 8;
    p3 += 8;
  } while (--lines > 0);
}


x86 assembly (clang, -O0):
<xor_32regs_3>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
mov    %rdx,-0x18(%rbp)
mov    %rcx,-0x20(%rbp)
mov    -0x8(%rbp),%rax
shr    $0x3,%rax
shr    $0x3,%rax
mov    %rax,-0x28(%rbp)
mov    -0x10(%rbp),%rax
mov    (%rax),%rax
mov    %rax,-0x30(%rbp)
mov    -0x10(%rbp),%rax
mov    0x8(%rax),%rax
mov    %rax,-0x38(%rbp)
mov    -0x10(%rbp),%rax
mov    0x10(%rax),%rax
mov    %rax,-0x40(%rbp)
mov    -0x10(%rbp),%rax
mov    0x18(%rax),%rax
mov    %rax,-0x48(%rbp)
mov    -0x10(%rbp),%rax
mov    0x20(%rax),%rax
mov    %rax,-0x50(%rbp)
mov    -0x10(%rbp),%rax
mov    0x28(%rax),%rax
mov    %rax,-0x58(%rbp)
mov    -0x10(%rbp),%rax
mov    0x30(%rax),%rax
mov    %rax,-0x60(%rbp)
mov    -0x10(%rbp),%rax
mov    0x38(%rax),%rax
mov    %rax,-0x68(%rbp)
mov    -0x18(%rbp),%rax
mov    (%rax),%rax
xor    -0x30(%rbp),%rax
mov    %rax,-0x30(%rbp)
mov    -0x18(%rbp),%rax
mov    0x8(%rax),%rax
xor    -0x38(%rbp),%rax
mov    %rax,-0x38(%rbp)
mov    -0x18(%rbp),%rax
mov    0x10(%rax),%rax
xor    -0x40(%rbp),%rax
mov    %rax,-0x40(%rbp)
mov    -0x18(%rbp),%rax
mov    0x18(%rax),%rax
xor    -0x48(%rbp),%rax
mov    %rax,-0x48(%rbp)
mov    -0x18(%rbp),%rax
mov    0x20(%rax),%rax
xor    -0x50(%rbp),%rax
mov    %rax,-0x50(%rbp)
mov    -0x18(%rbp),%rax
mov    0x28(%rax),%rax
xor    -0x58(%rbp),%rax
mov    %rax,-0x58(%rbp)
mov    -0x18(%rbp),%rax
mov    0x30(%rax),%rax
xor    -0x60(%rbp),%rax
mov    %rax,-0x60(%rbp)
mov    -0x18(%rbp),%rax
mov    0x38(%rax),%rax
xor    -0x68(%rbp),%rax
mov    %rax,-0x68(%rbp)
mov    -0x20(%rbp),%rax
mov    (%rax),%rax
xor    -0x30(%rbp),%rax
mov    %rax,-0x30(%rbp)
mov    -0x20(%rbp),%rax
mov    0x8(%rax),%rax
xor    -0x38(%rbp),%rax
mov    %rax,-0x38(%rbp)
mov    -0x20(%rbp),%rax
mov    0x10(%rax),%rax
xor    -0x40(%rbp),%rax
mov    %rax,-0x40(%rbp)
mov    -0x20(%rbp),%rax
mov    0x18(%rax),%rax
xor    -0x48(%rbp),%rax
mov    %rax,-0x48(%rbp)
mov    -0x20(%rbp),%rax
mov    0x20(%rax),%rax
xor    -0x50(%rbp),%rax
mov    %rax,-0x50(%rbp)
mov    -0x20(%rbp),%rax
mov    0x28(%rax),%rax
xor    -0x58(%rbp),%rax
mov    %rax,-0x58(%rbp)
mov    -0x20(%rbp),%rax
mov    0x30(%rax),%rax
xor    -0x60(%rbp),%rax
mov    %rax,-0x60(%rbp)
mov    -0x20(%rbp),%rax
mov    0x38(%rax),%rax
xor    -0x68(%rbp),%rax
mov    %rax,-0x68(%rbp)
mov    -0x30(%rbp),%rcx
mov    -0x10(%rbp),%rax
mov    %rcx,(%rax)
mov    -0x38(%rbp),%rcx
mov    -0x10(%rbp),%rax
mov    %rcx,0x8(%rax)
mov    -0x40(%rbp),%rcx
mov    -0x10(%rbp),%rax
mov    %rcx,0x10(%rax)
mov    -0x48(%rbp),%rcx
mov    -0x10(%rbp),%rax
mov    %rcx,0x18(%rax)
mov    -0x50(%rbp),%rcx
mov    -0x10(%rbp),%rax
mov    %rcx,0x20(%rax)
mov    -0x58(%rbp),%rcx
mov    -0x10(%rbp),%rax
mov    %rcx,0x28(%rax)
mov    -0x60(%rbp),%rcx
mov    -0x10(%rbp),%rax
mov    %rcx,0x30(%rax)
mov    -0x68(%rbp),%rcx
mov    -0x10(%rbp),%rax
mov    %rcx,0x38(%rax)
mov    -0x10(%rbp),%rax
add    $0x40,%rax
mov    %rax,-0x10(%rbp)
mov    -0x18(%rbp),%rax
add    $0x40,%rax
mov    %rax,-0x18(%rbp)
mov    -0x20(%rbp),%rax
add    $0x40,%rax
mov    %rax,-0x20(%rbp)
mov    -0x28(%rbp),%rax
add    $0xffffffffffffffff,%rax
mov    %rax,-0x28(%rbp)
cmp    $0x0,%rax
jg     1124 <xor_32regs_3+0x24>
pop    %rbp
ret

x86 assembly (clang, -O2):
<xor_32regs_3>:
shr    $0x6,%rdi
add    $0x1,%rdi
xor    %eax,%eax
nopw   0x0(%rax,%rax,1)
movups (%rsi,%rax,1),%xmm0
movups 0x10(%rsi,%rax,1),%xmm1
movups 0x20(%rsi,%rax,1),%xmm2
movups 0x30(%rsi,%rax,1),%xmm3
movups (%rdx,%rax,1),%xmm4
xorps  %xmm0,%xmm4
movups 0x10(%rdx,%rax,1),%xmm0
xorps  %xmm1,%xmm0
movups 0x20(%rdx,%rax,1),%xmm1
xorps  %xmm2,%xmm1
movups 0x30(%rdx,%rax,1),%xmm2
xorps  %xmm3,%xmm2
movups (%rcx,%rax,1),%xmm3
xorps  %xmm4,%xmm3
movups 0x10(%rcx,%rax,1),%xmm4
xorps  %xmm0,%xmm4
movups 0x20(%rcx,%rax,1),%xmm0
xorps  %xmm1,%xmm0
movups 0x30(%rcx,%rax,1),%xmm1
xorps  %xmm2,%xmm1
movups %xmm3,(%rsi,%rax,1)
movups %xmm4,0x10(%rsi,%rax,1)
movups %xmm0,0x20(%rsi,%rax,1)
movups %xmm1,0x30(%rsi,%rax,1)
add    $0xffffffffffffffff,%rdi
add    $0x40,%rax
cmp    $0x1,%rdi
ja     1110 <xor_32regs_3+0x10>
ret

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

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