cubefs
146 строк · 3.1 Кб
1//go:build !noasm && !appengine && !gccgo
2// +build !noasm,!appengine,!gccgo
3
4// Copyright 2015, Klaus Post, see LICENSE for details.
5// Copyright 2017, Minio, Inc.
6
7package reedsolomon
8
9//go:noescape
10func galMulNEON(low, high, in, out []byte)
11
12//go:noescape
13func galMulXorNEON(low, high, in, out []byte)
14
15//go:noescape
16func galXorNEON(in, out []byte)
17
18func galMulSlice(c byte, in, out []byte, o *options) {
19if c == 1 {
20copy(out, in)
21return
22}
23var done int
24galMulNEON(mulTableLow[c][:], mulTableHigh[c][:], in, out)
25done = (len(in) >> 5) << 5
26
27remain := len(in) - done
28if remain > 0 {
29mt := mulTable[c][:256]
30for i := done; i < len(in); i++ {
31out[i] = mt[in[i]]
32}
33}
34}
35
36func galMulSliceXor(c byte, in, out []byte, o *options) {
37if c == 1 {
38sliceXor(in, out, o)
39return
40}
41var done int
42galMulXorNEON(mulTableLow[c][:], mulTableHigh[c][:], in, out)
43done = (len(in) >> 5) << 5
44
45remain := len(in) - done
46if remain > 0 {
47mt := mulTable[c][:256]
48for i := done; i < len(in); i++ {
49out[i] ^= mt[in[i]]
50}
51}
52}
53
54// simple slice xor
55func sliceXor(in, out []byte, o *options) {
56
57galXorNEON(in, out)
58done := (len(in) >> 5) << 5
59
60remain := len(in) - done
61if remain > 0 {
62for i := done; i < len(in); i++ {
63out[i] ^= in[i]
64}
65}
66}
67
68// 4-way butterfly
69func ifftDIT4(work [][]byte, dist int, log_m01, log_m23, log_m02 ffe, o *options) {
70ifftDIT4Ref(work, dist, log_m01, log_m23, log_m02, o)
71}
72
73// 4-way butterfly
74func ifftDIT48(work [][]byte, dist int, log_m01, log_m23, log_m02 ffe8, o *options) {
75ifftDIT4Ref8(work, dist, log_m01, log_m23, log_m02, o)
76}
77
78// 4-way butterfly
79func fftDIT4(work [][]byte, dist int, log_m01, log_m23, log_m02 ffe, o *options) {
80fftDIT4Ref(work, dist, log_m01, log_m23, log_m02, o)
81}
82
83// 4-way butterfly
84func fftDIT48(work [][]byte, dist int, log_m01, log_m23, log_m02 ffe8, o *options) {
85fftDIT4Ref8(work, dist, log_m01, log_m23, log_m02, o)
86}
87
88// 2-way butterfly forward
89func fftDIT2(x, y []byte, log_m ffe, o *options) {
90// Reference version:
91refMulAdd(x, y, log_m)
92// 64 byte aligned, always full.
93galXorNEON(x, y)
94}
95
96// 2-way butterfly forward
97func fftDIT28(x, y []byte, log_m ffe8, o *options) {
98// Reference version:
99mulAdd8(x, y, log_m, o)
100sliceXor(x, y, o)
101}
102
103// 2-way butterfly
104func ifftDIT2(x, y []byte, log_m ffe, o *options) {
105// 64 byte aligned, always full.
106galXorNEON(x, y)
107// Reference version:
108refMulAdd(x, y, log_m)
109}
110
111// 2-way butterfly inverse
112func ifftDIT28(x, y []byte, log_m ffe8, o *options) {
113// Reference version:
114sliceXor(x, y, o)
115mulAdd8(x, y, log_m, o)
116}
117
118func mulgf16(x, y []byte, log_m ffe, o *options) {
119refMul(x, y, log_m)
120}
121
122func mulAdd8(out, in []byte, log_m ffe8, o *options) {
123t := &multiply256LUT8[log_m]
124galMulXorNEON(t[:16], t[16:32], in, out)
125done := (len(in) >> 5) << 5
126in = in[done:]
127if len(in) > 0 {
128out = out[done:]
129refMulAdd8(in, out, log_m)
130}
131}
132
133func mulgf8(out, in []byte, log_m ffe8, o *options) {
134var done int
135t := &multiply256LUT8[log_m]
136galMulNEON(t[:16], t[16:32], in, out)
137done = (len(in) >> 5) << 5
138
139remain := len(in) - done
140if remain > 0 {
141mt := mul8LUTs[log_m].Value[:]
142for i := done; i < len(in); i++ {
143out[i] ^= byte(mt[in[i]])
144}
145}
146}
147