func ReverseComp4Inplace(seq8 []byte) {
	nByte := len(seq8)
	if nByte <= 16 {
		nByteDiv2 := nByte >> 1
		for idx, invIdx := 0, nByte-1; idx != nByteDiv2; idx, invIdx = idx+1, invIdx-1 {
			seq8[idx], seq8[invIdx] = revComp4Table.Get(seq8[invIdx]), revComp4Table.Get(seq8[idx])
		}
		if nByte&1 == 1 {
			seq8[nByteDiv2] = revComp4Table.Get(seq8[nByteDiv2])
		}
		return
	}
	seq8Header := (*reflect.SliceHeader)(unsafe.Pointer(&seq8))
	reverseCompInplaceLookupSSSE3Asm(unsafe.Pointer(seq8Header.Data), &revComp4Table, nByte)
}
ReverseComp4Inplace reverse-complements seq8[], assuming that it's using
.bam seq-field encoding with one 4-bit byte per base.

WARNING: If a seq8[] value is larger than 15, it's possible for this to
immediately crash, and it's also possible for this to return and fill seq8[]
with garbage.  Only promise is that we don't scribble over arbitrary memory.
package biosimd
import (
	"reflect"
	"unsafe"
	"github.com/grailbio/base/simd"
)
func reverseCompInplaceTinyLookupSSSE3Asm(main unsafe.Pointer, tablePtr *NibbleLookupTable, nByte int)
func reverseCompInplaceLookupSSSE3Asm(main unsafe.Pointer, tablePtr *NibbleLookupTable, nByte int)
func reverseCompTinyLookupSSSE3Asm(dst, src unsafe.Pointer, tablePtr *NibbleLookupTable, nByte int)
func reverseCompLookupSSSE3Asm(dst, src unsafe.Pointer, tablePtr *NibbleLookupTable, nByte int)
func reverseComp8InplaceSSSE3Asm(ascii8 unsafe.Pointer, nByte int)
var revComp8Table = [...]byte{
	'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N',
	'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N',
	'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N',
	'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N',
	'N', 'T', 'N', 'G', 'N', 'N', 'N', 'C', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N',
	'N', 'N', 'N', 'N', 'A', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N',
	'N', 'T', 'N', 'G', 'N', 'N', 'N', 'C', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N',
	'N', 'N', 'N', 'N', 'A', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N',
	'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N',
	'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N',
	'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N',
	'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N',
	'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N',
	'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N',
	'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N',
	'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N'}
var revComp8Table16 = MakeNibbleLookupTable([16]byte{
	'N', 'T', 'N', 'G', 'A', 'N', 'N', 'C', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N'})
func ReverseComp8InplaceNoValidate(ascii8 []byte) {
	nByte := len(ascii8)
	if nByte <= 16 {
		nByteDiv2 := nByte >> 1
		for idx, invIdx := 0, nByte-1; idx != nByteDiv2; idx, invIdx = idx+1, invIdx-1 {
			ascii8[idx], ascii8[invIdx] = revComp8Table[ascii8[invIdx]], revComp8Table[ascii8[idx]]
		}
		if nByte&1 == 1 {
			ascii8[nByteDiv2] = revComp8Table[ascii8[nByteDiv2]]
		}
		return
	}
	ascii8Header := (*reflect.SliceHeader)(unsafe.Pointer(&ascii8))
	reverseCompInplaceLookupSSSE3Asm(unsafe.Pointer(ascii8Header.Data), &revComp8Table16, nByte)
}
func ReverseComp8Inplace(ascii8 []byte) {
	nByte := len(ascii8)
	if nByte <= 16 {
		nByteDiv2 := nByte >> 1
		for idx, invIdx := 0, nByte-1; idx != nByteDiv2; idx, invIdx = idx+1, invIdx-1 {
			ascii8[idx], ascii8[invIdx] = revComp8Table[ascii8[invIdx]], revComp8Table[ascii8[idx]]
		}
		if nByte&1 == 1 {
			ascii8[nByteDiv2] = revComp8Table[ascii8[nByteDiv2]]
		}
		return
	}
	ascii8Header := (*reflect.SliceHeader)(unsafe.Pointer(&ascii8))
	reverseComp8InplaceSSSE3Asm(unsafe.Pointer(ascii8Header.Data), nByte)
}
func ReverseComp8NoValidate(dst, src []byte) {
	nByte := len(src)
	if len(dst) != nByte {
		panic("ReverseComp8NoValidate requires len(dst) == len(src).")
	}
	if nByte < 16 {
		for idx, invIdx := 0, nByte-1; idx != nByte; idx, invIdx = idx+1, invIdx-1 {
			dst[idx] = revComp8Table[src[invIdx]]
		}
		return
	}
	srcHeader := (*reflect.SliceHeader)(unsafe.Pointer(&src))
	dstHeader := (*reflect.SliceHeader)(unsafe.Pointer(&dst))
	reverseCompLookupSSSE3Asm(unsafe.Pointer(dstHeader.Data), unsafe.Pointer(srcHeader.Data), &revComp8Table16, nByte)
}
var revComp4Table = MakeNibbleLookupTable([16]byte{0, 8, 4, 12, 2, 10, 6, 14, 1, 9, 5, 13, 3, 11, 7, 15})
func ReverseComp4UnsafeInplace(seq8 []byte) {
	nByte := len(seq8)
	seq8Header := (*reflect.SliceHeader)(unsafe.Pointer(&seq8))
	if nByte <= 16 {
		reverseCompInplaceTinyLookupSSSE3Asm(unsafe.Pointer(seq8Header.Data), &revComp4Table, nByte)
		return
	}
	reverseCompInplaceLookupSSSE3Asm(unsafe.Pointer(seq8Header.Data), &revComp4Table, nByte)
}