]> git.proxmox.com Git - ceph.git/blame - ceph/src/erasure-code/isa/xor_op.h
update sources to v12.1.0
[ceph.git] / ceph / src / erasure-code / isa / xor_op.h
CommitLineData
7c673cae
FG
1/*
2 * Ceph - scalable distributed file system
3 *
4 * Copyright (C) 2014 CERN (Switzerland)
5 * \
6 * Author: Andreas-Joachim Peters <Andreas.Joachim.Peters@cern.ch> \
7 *
8 * This library is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU Lesser General Public
10 * License as published by the Free Software Foundation; either
11 * version 2.1 of the License, or (at your option) any later version.
12 *
13 */
14
15#ifndef EC_ISA_XOR_OP_H
16#define EC_ISA_XOR_OP_H
17
18// -----------------------------------------------------------------------------
19#include <assert.h>
20#include <stdint.h>
7c673cae
FG
21// -----------------------------------------------------------------------------
22
23// -------------------------------------------------------------------------
24// declaration of 64/128-bit vector operations depending on availability
25// -------------------------------------------------------------------------
26// -------------------------------------------------------------------------
27
28#define EC_ISA_ADDRESS_ALIGNMENT 32u
29#define EC_ISA_VECTOR_SSE2_WORDSIZE 64u
30
31#if __GNUC__ > 4 || \
32 ( (__GNUC__ == 4) && (__GNUC_MINOR__ >= 4) ) ||\
33 (__clang__ == 1 )
34#ifdef EC_ISA_VECTOR_OP_DEBUG
35#pragma message "* using 128-bit vector operations in " __FILE__
36#endif
37
38// -------------------------------------------------------------------------
39// use 128-bit pointer
40// -------------------------------------------------------------------------
41typedef long vector_op_t __attribute__((vector_size(16)));
42#define EC_ISA_VECTOR_OP_WORDSIZE 16
43#else
44// -------------------------------------------------------------------------
45// use 64-bit pointer
46// -------------------------------------------------------------------------
47typedef unsigned long long vector_op_t;
48#define EC_ISA_VECTOR_OP_WORDSIZE 8
49#endif
50
51
52// -------------------------------------------------------------------------
53// check if a pointer is aligend to byte_count
54// -------------------------------------------------------------------------
55#define is_aligned(POINTER, BYTE_COUNT) \
56 (((uintptr_t)(const void *)(POINTER)) % (BYTE_COUNT) == 0)
57
58// -------------------------------------------------------------------------
59// compute byte-wise XOR of cw and dw block, ew contains the end address of cw
60// -------------------------------------------------------------------------
61void
62byte_xor(unsigned char* cw, unsigned char* dw, unsigned char* ew);
63
64// -------------------------------------------------------------------------
65// compute word-wise XOR of cw and dw block, ew contains the end address of cw
66// -------------------------------------------------------------------------
67void
68vector_xor(vector_op_t* cw, vector_op_t* dw, vector_op_t* ew);
69
70// -------------------------------------------------------------------------
71// compute region XOR like parity = src[0] ^ src[1] ... ^ src[src_size-]
72// -------------------------------------------------------------------------
73void
74region_xor(unsigned char** src, unsigned char* parity, int src_size, unsigned size);
75
76// -------------------------------------------------------------------------
77// compute region XOR like parity = src[0] ^ src[1] ... ^ src[src_size-]
78// using SSE2 64-byte operations
79// -------------------------------------------------------------------------
80void
81region_sse2_xor(char** src /* array of 64-byte aligned source pointer to xor */,
82 char* parity /* 64-byte aligned output pointer containing the parity */,
83 int src_size /* size of the source pointer array */,
84 unsigned size /* size of the region to xor */);
85
86
87#endif // EC_ISA_XOR_OP_H