1 // SPDX-License-Identifier: GPL-2.0-or-later 2 /* 3 * 4 * Copyright (C) IBM Corporation, 2012 5 * 6 * Author: Anton Blanchard <anton@au.ibm.com> 7 */ 8 9 /* 10 * Sparse (as at v0.5.0) gets very, very confused by this file. 11 * Make it a bit simpler for it. 12 */ 13 #if !defined(__CHECKER__) 14 #include <altivec.h> 15 #else 16 #define vec_xor(a, b) a ^ b 17 #define vector __attribute__((vector_size(16))) 18 #endif 19 20 #include "xor_vmx.h" 21 22 typedef vector signed char unative_t; 23 24 #define DEFINE(V) \ 25 unative_t *V = (unative_t *)V##_in; \ 26 unative_t V##_0, V##_1, V##_2, V##_3 27 28 #define LOAD(V) \ 29 do { \ 30 V##_0 = V[0]; \ 31 V##_1 = V[1]; \ 32 V##_2 = V[2]; \ 33 V##_3 = V[3]; \ 34 } while (0) 35 36 #define STORE(V) \ 37 do { \ 38 V[0] = V##_0; \ 39 V[1] = V##_1; \ 40 V[2] = V##_2; \ 41 V[3] = V##_3; \ 42 } while (0) 43 44 #define XOR(V1, V2) \ 45 do { \ 46 V1##_0 = vec_xor(V1##_0, V2##_0); \ 47 V1##_1 = vec_xor(V1##_1, V2##_1); \ 48 V1##_2 = vec_xor(V1##_2, V2##_2); \ 49 V1##_3 = vec_xor(V1##_3, V2##_3); \ 50 } while (0) 51 52 void __xor_altivec_2(unsigned long bytes, unsigned long *v1_in, 53 unsigned long *v2_in) 54 { 55 DEFINE(v1); 56 DEFINE(v2); 57 unsigned long lines = bytes / (sizeof(unative_t)) / 4; 58 59 do { 60 LOAD(v1); 61 LOAD(v2); 62 XOR(v1, v2); 63 STORE(v1); 64 65 v1 += 4; 66 v2 += 4; 67 } while (--lines > 0); 68 } 69 70 void __xor_altivec_3(unsigned long bytes, unsigned long *v1_in, 71 unsigned long *v2_in, unsigned long *v3_in) 72 { 73 DEFINE(v1); 74 DEFINE(v2); 75 DEFINE(v3); 76 unsigned long lines = bytes / (sizeof(unative_t)) / 4; 77 78 do { 79 LOAD(v1); 80 LOAD(v2); 81 LOAD(v3); 82 XOR(v1, v2); 83 XOR(v1, v3); 84 STORE(v1); 85 86 v1 += 4; 87 v2 += 4; 88 v3 += 4; 89 } while (--lines > 0); 90 } 91 92 void __xor_altivec_4(unsigned long bytes, unsigned long *v1_in, 93 unsigned long *v2_in, unsigned long *v3_in, 94 unsigned long *v4_in) 95 { 96 DEFINE(v1); 97 DEFINE(v2); 98 DEFINE(v3); 99 DEFINE(v4); 100 unsigned long lines = bytes / (sizeof(unative_t)) / 4; 101 102 do { 103 LOAD(v1); 104 LOAD(v2); 105 LOAD(v3); 106 LOAD(v4); 107 XOR(v1, v2); 108 XOR(v3, v4); 109 XOR(v1, v3); 110 STORE(v1); 111 112 v1 += 4; 113 v2 += 4; 114 v3 += 4; 115 v4 += 4; 116 } while (--lines > 0); 117 } 118 119 void __xor_altivec_5(unsigned long bytes, unsigned long *v1_in, 120 unsigned long *v2_in, unsigned long *v3_in, 121 unsigned long *v4_in, unsigned long *v5_in) 122 { 123 DEFINE(v1); 124 DEFINE(v2); 125 DEFINE(v3); 126 DEFINE(v4); 127 DEFINE(v5); 128 unsigned long lines = bytes / (sizeof(unative_t)) / 4; 129 130 do { 131 LOAD(v1); 132 LOAD(v2); 133 LOAD(v3); 134 LOAD(v4); 135 LOAD(v5); 136 XOR(v1, v2); 137 XOR(v3, v4); 138 XOR(v1, v5); 139 XOR(v1, v3); 140 STORE(v1); 141 142 v1 += 4; 143 v2 += 4; 144 v3 += 4; 145 v4 += 4; 146 v5 += 4; 147 } while (--lines > 0); 148 } 149