cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

xor_vmx.c (2863B)


      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
     22typedef 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
     52void __xor_altivec_2(unsigned long bytes,
     53		     unsigned long * __restrict v1_in,
     54		     const unsigned long * __restrict v2_in)
     55{
     56	DEFINE(v1);
     57	DEFINE(v2);
     58	unsigned long lines = bytes / (sizeof(unative_t)) / 4;
     59
     60	do {
     61		LOAD(v1);
     62		LOAD(v2);
     63		XOR(v1, v2);
     64		STORE(v1);
     65
     66		v1 += 4;
     67		v2 += 4;
     68	} while (--lines > 0);
     69}
     70
     71void __xor_altivec_3(unsigned long bytes,
     72		     unsigned long * __restrict v1_in,
     73		     const unsigned long * __restrict v2_in,
     74		     const unsigned long * __restrict v3_in)
     75{
     76	DEFINE(v1);
     77	DEFINE(v2);
     78	DEFINE(v3);
     79	unsigned long lines = bytes / (sizeof(unative_t)) / 4;
     80
     81	do {
     82		LOAD(v1);
     83		LOAD(v2);
     84		LOAD(v3);
     85		XOR(v1, v2);
     86		XOR(v1, v3);
     87		STORE(v1);
     88
     89		v1 += 4;
     90		v2 += 4;
     91		v3 += 4;
     92	} while (--lines > 0);
     93}
     94
     95void __xor_altivec_4(unsigned long bytes,
     96		     unsigned long * __restrict v1_in,
     97		     const unsigned long * __restrict v2_in,
     98		     const unsigned long * __restrict v3_in,
     99		     const unsigned long * __restrict v4_in)
    100{
    101	DEFINE(v1);
    102	DEFINE(v2);
    103	DEFINE(v3);
    104	DEFINE(v4);
    105	unsigned long lines = bytes / (sizeof(unative_t)) / 4;
    106
    107	do {
    108		LOAD(v1);
    109		LOAD(v2);
    110		LOAD(v3);
    111		LOAD(v4);
    112		XOR(v1, v2);
    113		XOR(v3, v4);
    114		XOR(v1, v3);
    115		STORE(v1);
    116
    117		v1 += 4;
    118		v2 += 4;
    119		v3 += 4;
    120		v4 += 4;
    121	} while (--lines > 0);
    122}
    123
    124void __xor_altivec_5(unsigned long bytes,
    125		     unsigned long * __restrict v1_in,
    126		     const unsigned long * __restrict v2_in,
    127		     const unsigned long * __restrict v3_in,
    128		     const unsigned long * __restrict v4_in,
    129		     const unsigned long * __restrict v5_in)
    130{
    131	DEFINE(v1);
    132	DEFINE(v2);
    133	DEFINE(v3);
    134	DEFINE(v4);
    135	DEFINE(v5);
    136	unsigned long lines = bytes / (sizeof(unative_t)) / 4;
    137
    138	do {
    139		LOAD(v1);
    140		LOAD(v2);
    141		LOAD(v3);
    142		LOAD(v4);
    143		LOAD(v5);
    144		XOR(v1, v2);
    145		XOR(v3, v4);
    146		XOR(v1, v5);
    147		XOR(v1, v3);
    148		STORE(v1);
    149
    150		v1 += 4;
    151		v2 += 4;
    152		v3 += 4;
    153		v4 += 4;
    154		v5 += 4;
    155	} while (--lines > 0);
    156}