cubefs

Форк
0
150 строк · 3.3 Кб
1
//go:build !noasm && !appengine && !gccgo
2
// +build !noasm,!appengine,!gccgo
3

4
// Copyright 2015, Klaus Post, see LICENSE for details.
5
// Copyright 2018, Minio, Inc.
6

7
package reedsolomon
8

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

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

15
// This is what the assembler routines do in blocks of 16 bytes:
16
/*
17
func galMulPpc(low, high, in, out []byte) {
18
	for n, input := range in {
19
		l := input & 0xf
20
		h := input >> 4
21
		out[n] = low[l] ^ high[h]
22
	}
23
}
24
func galMulPpcXor(low, high, in, out []byte) {
25
	for n, input := range in {
26
		l := input & 0xf
27
		h := input >> 4
28
		out[n] ^= low[l] ^ high[h]
29
	}
30
}
31
*/
32

33
func galMulSlice(c byte, in, out []byte, o *options) {
34
	if c == 1 {
35
		copy(out, in)
36
		return
37
	}
38
	done := (len(in) >> 4) << 4
39
	if done > 0 {
40
		galMulPpc(mulTableLow[c][:], mulTableHigh[c][:], in[:done], out)
41
	}
42
	remain := len(in) - done
43
	if remain > 0 {
44
		mt := mulTable[c][:256]
45
		for i := done; i < len(in); i++ {
46
			out[i] = mt[in[i]]
47
		}
48
	}
49
}
50

51
func galMulSliceXor(c byte, in, out []byte, o *options) {
52
	if c == 1 {
53
		sliceXor(in, out, o)
54
		return
55
	}
56
	done := (len(in) >> 4) << 4
57
	if done > 0 {
58
		galMulPpcXor(mulTableLow[c][:], mulTableHigh[c][:], in[:done], out)
59
	}
60
	remain := len(in) - done
61
	if remain > 0 {
62
		mt := mulTable[c][:256]
63
		for i := done; i < len(in); i++ {
64
			out[i] ^= mt[in[i]]
65
		}
66
	}
67
}
68

69
// slice galois add
70
func sliceXor(in, out []byte, o *options) {
71
	sliceXorGo(in, out, o)
72
}
73

74
// 4-way butterfly
75
func ifftDIT4(work [][]byte, dist int, log_m01, log_m23, log_m02 ffe, o *options) {
76
	ifftDIT4Ref(work, dist, log_m01, log_m23, log_m02, o)
77
}
78

79
// 4-way butterfly
80
func ifftDIT48(work [][]byte, dist int, log_m01, log_m23, log_m02 ffe8, o *options) {
81
	ifftDIT4Ref8(work, dist, log_m01, log_m23, log_m02, o)
82
}
83

84
// 4-way butterfly
85
func fftDIT4(work [][]byte, dist int, log_m01, log_m23, log_m02 ffe, o *options) {
86
	fftDIT4Ref(work, dist, log_m01, log_m23, log_m02, o)
87
}
88

89
// 4-way butterfly
90
func fftDIT48(work [][]byte, dist int, log_m01, log_m23, log_m02 ffe8, o *options) {
91
	fftDIT4Ref8(work, dist, log_m01, log_m23, log_m02, o)
92
}
93

94
// 2-way butterfly forward
95
func fftDIT2(x, y []byte, log_m ffe, o *options) {
96
	// Reference version:
97
	refMulAdd(x, y, log_m)
98
	sliceXorGo(x, y, o)
99
}
100

101
// 2-way butterfly forward
102
func fftDIT28(x, y []byte, log_m ffe8, o *options) {
103
	// Reference version:
104
	mulAdd8(x, y, log_m, o)
105
	sliceXorGo(x, y, o)
106
}
107

108
// 2-way butterfly inverse
109
func ifftDIT2(x, y []byte, log_m ffe, o *options) {
110
	// Reference version:
111
	sliceXorGo(x, y, o)
112
	refMulAdd(x, y, log_m)
113
}
114

115
// 2-way butterfly inverse
116
func ifftDIT28(x, y []byte, log_m ffe8, o *options) {
117
	// Reference version:
118
	sliceXorGo(x, y, o)
119
	mulAdd8(x, y, log_m, o)
120
}
121

122
func mulgf16(x, y []byte, log_m ffe, o *options) {
123
	refMul(x, y, log_m)
124
}
125

126
func mulAdd8(out, in []byte, log_m ffe8, o *options) {
127
	t := &multiply256LUT8[log_m]
128
	galMulPpcXor(t[:16], t[16:32], in, out)
129
	done := (len(in) >> 4) << 4
130
	in = in[done:]
131
	if len(in) > 0 {
132
		out = out[done:]
133
		refMulAdd8(in, out, log_m)
134
	}
135
}
136

137
func mulgf8(out, in []byte, log_m ffe8, o *options) {
138
	var done int
139
	t := &multiply256LUT8[log_m]
140
	galMulPpc(t[:16], t[16:32], in, out)
141
	done = (len(in) >> 4) << 4
142

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

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

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

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

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