void xor_8regs_4(unsigned long bytes, unsigned long *p1, unsigned long *p2,
                 unsigned long *p3, unsigned long *p4) {
  long lines = bytes / (sizeof(long)) / 8;
  do {
    p1[0] ^= p2[0] ^ p3[0] ^ p4[0];
    p1[1] ^= p2[1] ^ p3[1] ^ p4[1];
    p1[2] ^= p2[2] ^ p3[2] ^ p4[2];
    p1[3] ^= p2[3] ^ p3[3] ^ p4[3];
    p1[4] ^= p2[4] ^ p3[4] ^ p4[4];
    p1[5] ^= p2[5] ^ p3[5] ^ p4[5];
    p1[6] ^= p2[6] ^ p3[6] ^ p4[6];
    p1[7] ^= p2[7] ^ p3[7] ^ p4[7];
    p1 += 8;
    p2 += 8;
    p3 += 8;
    p4 += 8;
  } while (--lines > 0);
}


x86 assembly (clang, -O0):
<xor_8regs_4>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
mov    %rdx,-0x18(%rbp)
mov    %rcx,-0x20(%rbp)
mov    %r8,-0x28(%rbp)
mov    -0x8(%rbp),%rax
shr    $0x3,%rax
shr    $0x3,%rax
mov    %rax,-0x30(%rbp)
mov    -0x18(%rbp),%rax
mov    (%rax),%rcx
mov    -0x20(%rbp),%rax
xor    (%rax),%rcx
mov    -0x28(%rbp),%rax
xor    (%rax),%rcx
mov    -0x10(%rbp),%rax
xor    (%rax),%rcx
mov    %rcx,(%rax)
mov    -0x18(%rbp),%rax
mov    0x8(%rax),%rcx
mov    -0x20(%rbp),%rax
xor    0x8(%rax),%rcx
mov    -0x28(%rbp),%rax
xor    0x8(%rax),%rcx
mov    -0x10(%rbp),%rax
xor    0x8(%rax),%rcx
mov    %rcx,0x8(%rax)
mov    -0x18(%rbp),%rax
mov    0x10(%rax),%rcx
mov    -0x20(%rbp),%rax
xor    0x10(%rax),%rcx
mov    -0x28(%rbp),%rax
xor    0x10(%rax),%rcx
mov    -0x10(%rbp),%rax
xor    0x10(%rax),%rcx
mov    %rcx,0x10(%rax)
mov    -0x18(%rbp),%rax
mov    0x18(%rax),%rcx
mov    -0x20(%rbp),%rax
xor    0x18(%rax),%rcx
mov    -0x28(%rbp),%rax
xor    0x18(%rax),%rcx
mov    -0x10(%rbp),%rax
xor    0x18(%rax),%rcx
mov    %rcx,0x18(%rax)
mov    -0x18(%rbp),%rax
mov    0x20(%rax),%rcx
mov    -0x20(%rbp),%rax
xor    0x20(%rax),%rcx
mov    -0x28(%rbp),%rax
xor    0x20(%rax),%rcx
mov    -0x10(%rbp),%rax
xor    0x20(%rax),%rcx
mov    %rcx,0x20(%rax)
mov    -0x18(%rbp),%rax
mov    0x28(%rax),%rcx
mov    -0x20(%rbp),%rax
xor    0x28(%rax),%rcx
mov    -0x28(%rbp),%rax
xor    0x28(%rax),%rcx
mov    -0x10(%rbp),%rax
xor    0x28(%rax),%rcx
mov    %rcx,0x28(%rax)
mov    -0x18(%rbp),%rax
mov    0x30(%rax),%rcx
mov    -0x20(%rbp),%rax
xor    0x30(%rax),%rcx
mov    -0x28(%rbp),%rax
xor    0x30(%rax),%rcx
mov    -0x10(%rbp),%rax
xor    0x30(%rax),%rcx
mov    %rcx,0x30(%rax)
mov    -0x18(%rbp),%rax
mov    0x38(%rax),%rcx
mov    -0x20(%rbp),%rax
xor    0x38(%rax),%rcx
mov    -0x28(%rbp),%rax
xor    0x38(%rax),%rcx
mov    -0x10(%rbp),%rax
xor    0x38(%rax),%rcx
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    $0x40,%rax
mov    %rax,-0x28(%rbp)
mov    -0x30(%rbp),%rax
add    $0xffffffffffffffff,%rax
mov    %rax,-0x30(%rbp)
cmp    $0x0,%rax
jg     1128 <xor_8regs_4+0x28>
pop    %rbp
ret

x86 assembly (clang, -O2):
<xor_8regs_4>:
shr    $0x6,%rdi
add    $0x1,%rdi
xor    %r9d,%r9d
nopl   0x0(%rax,%rax,1)
mov    (%rcx,%r9,1),%rax
xor    (%rdx,%r9,1),%rax
xor    (%r8,%r9,1),%rax
xor    %rax,(%rsi,%r9,1)
mov    0x8(%rcx,%r9,1),%rax
xor    0x8(%rdx,%r9,1),%rax
xor    0x8(%r8,%r9,1),%rax
xor    %rax,0x8(%rsi,%r9,1)
mov    0x10(%rcx,%r9,1),%rax
xor    0x10(%rdx,%r9,1),%rax
xor    0x10(%r8,%r9,1),%rax
xor    %rax,0x10(%rsi,%r9,1)
mov    0x18(%rcx,%r9,1),%rax
xor    0x18(%rdx,%r9,1),%rax
xor    0x18(%r8,%r9,1),%rax
xor    %rax,0x18(%rsi,%r9,1)
mov    0x20(%rcx,%r9,1),%rax
xor    0x20(%rdx,%r9,1),%rax
xor    0x20(%r8,%r9,1),%rax
xor    %rax,0x20(%rsi,%r9,1)
mov    0x28(%rcx,%r9,1),%rax
xor    0x28(%rdx,%r9,1),%rax
xor    0x28(%r8,%r9,1),%rax
xor    %rax,0x28(%rsi,%r9,1)
mov    0x30(%rcx,%r9,1),%rax
xor    0x30(%rdx,%r9,1),%rax
xor    0x30(%r8,%r9,1),%rax
xor    %rax,0x30(%rsi,%r9,1)
mov    0x38(%rcx,%r9,1),%rax
xor    0x38(%rdx,%r9,1),%rax
xor    0x38(%r8,%r9,1),%rax
xor    %rax,0x38(%rsi,%r9,1)
add    $0x40,%r9
add    $0xffffffffffffffff,%rdi
cmp    $0x1,%rdi
ja     1110 <xor_8regs_4+0x10>
ret

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

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