cubefs

Форк
0
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

7
package reedsolomon
8

9
//go:noescape
10
func galMulNEON(low, high, in, out []byte)
11

12
//go:noescape
13
func galMulXorNEON(low, high, in, out []byte)
14

15
//go:noescape
16
func galXorNEON(in, out []byte)
17

18
func galMulSlice(c byte, in, out []byte, o *options) {
19
	if c == 1 {
20
		copy(out, in)
21
		return
22
	}
23
	var done int
24
	galMulNEON(mulTableLow[c][:], mulTableHigh[c][:], in, out)
25
	done = (len(in) >> 5) << 5
26

27
	remain := len(in) - done
28
	if remain > 0 {
29
		mt := mulTable[c][:256]
30
		for i := done; i < len(in); i++ {
31
			out[i] = mt[in[i]]
32
		}
33
	}
34
}
35

36
func galMulSliceXor(c byte, in, out []byte, o *options) {
37
	if c == 1 {
38
		sliceXor(in, out, o)
39
		return
40
	}
41
	var done int
42
	galMulXorNEON(mulTableLow[c][:], mulTableHigh[c][:], in, out)
43
	done = (len(in) >> 5) << 5
44

45
	remain := len(in) - done
46
	if remain > 0 {
47
		mt := mulTable[c][:256]
48
		for i := done; i < len(in); i++ {
49
			out[i] ^= mt[in[i]]
50
		}
51
	}
52
}
53

54
// simple slice xor
55
func sliceXor(in, out []byte, o *options) {
56

57
	galXorNEON(in, out)
58
	done := (len(in) >> 5) << 5
59

60
	remain := len(in) - done
61
	if remain > 0 {
62
		for i := done; i < len(in); i++ {
63
			out[i] ^= in[i]
64
		}
65
	}
66
}
67

68
// 4-way butterfly
69
func ifftDIT4(work [][]byte, dist int, log_m01, log_m23, log_m02 ffe, o *options) {
70
	ifftDIT4Ref(work, dist, log_m01, log_m23, log_m02, o)
71
}
72

73
// 4-way butterfly
74
func ifftDIT48(work [][]byte, dist int, log_m01, log_m23, log_m02 ffe8, o *options) {
75
	ifftDIT4Ref8(work, dist, log_m01, log_m23, log_m02, o)
76
}
77

78
// 4-way butterfly
79
func fftDIT4(work [][]byte, dist int, log_m01, log_m23, log_m02 ffe, o *options) {
80
	fftDIT4Ref(work, dist, log_m01, log_m23, log_m02, o)
81
}
82

83
// 4-way butterfly
84
func fftDIT48(work [][]byte, dist int, log_m01, log_m23, log_m02 ffe8, o *options) {
85
	fftDIT4Ref8(work, dist, log_m01, log_m23, log_m02, o)
86
}
87

88
// 2-way butterfly forward
89
func fftDIT2(x, y []byte, log_m ffe, o *options) {
90
	// Reference version:
91
	refMulAdd(x, y, log_m)
92
	// 64 byte aligned, always full.
93
	galXorNEON(x, y)
94
}
95

96
// 2-way butterfly forward
97
func fftDIT28(x, y []byte, log_m ffe8, o *options) {
98
	// Reference version:
99
	mulAdd8(x, y, log_m, o)
100
	sliceXor(x, y, o)
101
}
102

103
// 2-way butterfly
104
func ifftDIT2(x, y []byte, log_m ffe, o *options) {
105
	// 64 byte aligned, always full.
106
	galXorNEON(x, y)
107
	// Reference version:
108
	refMulAdd(x, y, log_m)
109
}
110

111
// 2-way butterfly inverse
112
func ifftDIT28(x, y []byte, log_m ffe8, o *options) {
113
	// Reference version:
114
	sliceXor(x, y, o)
115
	mulAdd8(x, y, log_m, o)
116
}
117

118
func mulgf16(x, y []byte, log_m ffe, o *options) {
119
	refMul(x, y, log_m)
120
}
121

122
func mulAdd8(out, in []byte, log_m ffe8, o *options) {
123
	t := &multiply256LUT8[log_m]
124
	galMulXorNEON(t[:16], t[16:32], in, out)
125
	done := (len(in) >> 5) << 5
126
	in = in[done:]
127
	if len(in) > 0 {
128
		out = out[done:]
129
		refMulAdd8(in, out, log_m)
130
	}
131
}
132

133
func mulgf8(out, in []byte, log_m ffe8, o *options) {
134
	var done int
135
	t := &multiply256LUT8[log_m]
136
	galMulNEON(t[:16], t[16:32], in, out)
137
	done = (len(in) >> 5) << 5
138

139
	remain := len(in) - done
140
	if remain > 0 {
141
		mt := mul8LUTs[log_m].Value[:]
142
		for i := done; i < len(in); i++ {
143
			out[i] ^= byte(mt[in[i]])
144
		}
145
	}
146
}
147

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.