1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192 |
- //+build !noasm
- //+build !appengine
- //+build !gccgo
- // Copyright 2015, Klaus Post, see LICENSE for details.
- package reedsolomon
- //go:noescape
- func galMulSSSE3(low, high, in, out []byte)
- //go:noescape
- func galMulSSSE3Xor(low, high, in, out []byte)
- //go:noescape
- func galMulAVX2Xor(low, high, in, out []byte)
- //go:noescape
- func galMulAVX2(low, high, in, out []byte)
- //go:noescape
- func sSE2XorSlice(in, out []byte)
- // This is what the assembler routines do in blocks of 16 bytes:
- /*
- func galMulSSSE3(low, high, in, out []byte) {
- for n, input := range in {
- l := input & 0xf
- h := input >> 4
- out[n] = low[l] ^ high[h]
- }
- }
- func galMulSSSE3Xor(low, high, in, out []byte) {
- for n, input := range in {
- l := input & 0xf
- h := input >> 4
- out[n] ^= low[l] ^ high[h]
- }
- }
- */
- func galMulSlice(c byte, in, out []byte, o *options) {
- var done int
- if o.useAVX2 {
- galMulAVX2(mulTableLow[c][:], mulTableHigh[c][:], in, out)
- done = (len(in) >> 5) << 5
- } else if o.useSSSE3 {
- galMulSSSE3(mulTableLow[c][:], mulTableHigh[c][:], in, out)
- done = (len(in) >> 4) << 4
- }
- remain := len(in) - done
- if remain > 0 {
- mt := mulTable[c][:256]
- for i := done; i < len(in); i++ {
- out[i] = mt[in[i]]
- }
- }
- }
- func galMulSliceXor(c byte, in, out []byte, o *options) {
- var done int
- if o.useAVX2 {
- galMulAVX2Xor(mulTableLow[c][:], mulTableHigh[c][:], in, out)
- done = (len(in) >> 5) << 5
- } else if o.useSSSE3 {
- galMulSSSE3Xor(mulTableLow[c][:], mulTableHigh[c][:], in, out)
- done = (len(in) >> 4) << 4
- }
- remain := len(in) - done
- if remain > 0 {
- mt := mulTable[c][:256]
- for i := done; i < len(in); i++ {
- out[i] ^= mt[in[i]]
- }
- }
- }
- // slice galois add
- func sliceXor(in, out []byte, sse2 bool) {
- var done int
- if sse2 {
- sSE2XorSlice(in, out)
- done = (len(in) >> 4) << 4
- }
- remain := len(in) - done
- if remain > 0 {
- for i := done; i < len(in); i++ {
- out[i] ^= in[i]
- }
- }
- }
|