123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224 |
- package yu_base64
- import "unsafe"
- //go:nosplit
- func (e *Encoding) encode(dst []byte, src []byte, outlen uintptr) {
- inlen := len(src)
- ip := uintptr(unsafe.Pointer(&src[0]))
- ipstart := ip
- op := uintptr(unsafe.Pointer(&dst[0]))
- opstart := op
- if outlen >= 8+12 {
- u0x := bswap32(ip)
- u1x := bswap32(ip + 3)
- for op <= (opstart+outlen)-(128+12) {
- {
- _u0, _u1 := u0x, u1x
- u0x = bswap32(ip + 6 + 0*6)
- u1x = bswap32(ip + 6 + 0*6 + 3)
- _u0 = e.lutXe[(_u0>>8)&0xfff]<<16 | e.lutXe[_u0>>20]
- stou32(op+0*8, _u0)
- _u1 = e.lutXe[(_u1>>8)&0xfff]<<16 | e.lutXe[_u1>>20]
- stou32(op+0*8+4, _u1)
- }
- {
- _u0, _u1 := u0x, u1x
- u0x = bswap32(ip + 6 + 1*6)
- u1x = bswap32(ip + 6 + 1*6 + 3)
- _u0 = e.lutXe[(_u0>>8)&0xfff]<<16 | e.lutXe[_u0>>20]
- stou32(op+1*8, _u0)
- _u1 = e.lutXe[(_u1>>8)&0xfff]<<16 | e.lutXe[_u1>>20]
- stou32(op+1*8+4, _u1)
- }
- {
- _u0, _u1 := u0x, u1x
- u0x = bswap32(ip + 6 + 2*6)
- u1x = bswap32(ip + 6 + 2*6 + 3)
- _u0 = e.lutXe[(_u0>>8)&0xfff]<<16 | e.lutXe[_u0>>20]
- stou32(op+2*8, _u0)
- _u1 = e.lutXe[(_u1>>8)&0xfff]<<16 | e.lutXe[_u1>>20]
- stou32(op+2*8+4, _u1)
- }
- {
- _u0, _u1 := u0x, u1x
- u0x = bswap32(ip + 6 + 3*6)
- u1x = bswap32(ip + 6 + 3*6 + 3)
- _u0 = e.lutXe[(_u0>>8)&0xfff]<<16 | e.lutXe[_u0>>20]
- stou32(op+3*8, _u0)
- _u1 = e.lutXe[(_u1>>8)&0xfff]<<16 | e.lutXe[_u1>>20]
- stou32(op+3*8+4, _u1)
- }
- {
- _u0, _u1 := u0x, u1x
- u0x = bswap32(ip + 6 + 4*6)
- u1x = bswap32(ip + 6 + 4*6 + 3)
- _u0 = e.lutXe[(_u0>>8)&0xfff]<<16 | e.lutXe[_u0>>20]
- stou32(op+4*8, _u0)
- _u1 = e.lutXe[(_u1>>8)&0xfff]<<16 | e.lutXe[_u1>>20]
- stou32(op+4*8+4, _u1)
- }
- {
- _u0, _u1 := u0x, u1x
- u0x = bswap32(ip + 6 + 5*6)
- u1x = bswap32(ip + 6 + 5*6 + 3)
- _u0 = e.lutXe[(_u0>>8)&0xfff]<<16 | e.lutXe[_u0>>20]
- stou32(op+5*8, _u0)
- _u1 = e.lutXe[(_u1>>8)&0xfff]<<16 | e.lutXe[_u1>>20]
- stou32(op+5*8+4, _u1)
- }
- {
- _u0, _u1 := u0x, u1x
- u0x = bswap32(ip + 6 + 6*6)
- u1x = bswap32(ip + 6 + 6*6 + 3)
- _u0 = e.lutXe[(_u0>>8)&0xfff]<<16 | e.lutXe[_u0>>20]
- stou32(op+6*8, _u0)
- _u1 = e.lutXe[(_u1>>8)&0xfff]<<16 | e.lutXe[_u1>>20]
- stou32(op+6*8+4, _u1)
- }
- {
- _u0, _u1 := u0x, u1x
- u0x = bswap32(ip + 6 + 7*6)
- u1x = bswap32(ip + 6 + 7*6 + 3)
- _u0 = e.lutXe[(_u0>>8)&0xfff]<<16 | e.lutXe[_u0>>20]
- stou32(op+7*8, _u0)
- _u1 = e.lutXe[(_u1>>8)&0xfff]<<16 | e.lutXe[_u1>>20]
- stou32(op+7*8+4, _u1)
- }
- {
- _u0, _u1 := u0x, u1x
- u0x = bswap32(ip + 6 + 8*6)
- u1x = bswap32(ip + 6 + 8*6 + 3)
- _u0 = e.lutXe[(_u0>>8)&0xfff]<<16 | e.lutXe[_u0>>20]
- stou32(op+8*8, _u0)
- _u1 = e.lutXe[(_u1>>8)&0xfff]<<16 | e.lutXe[_u1>>20]
- stou32(op+8*8+4, _u1)
- }
- {
- _u0, _u1 := u0x, u1x
- u0x = bswap32(ip + 6 + 9*6)
- u1x = bswap32(ip + 6 + 9*6 + 3)
- _u0 = e.lutXe[(_u0>>8)&0xfff]<<16 | e.lutXe[_u0>>20]
- stou32(op+9*8, _u0)
- _u1 = e.lutXe[(_u1>>8)&0xfff]<<16 | e.lutXe[_u1>>20]
- stou32(op+9*8+4, _u1)
- }
- {
- _u0, _u1 := u0x, u1x
- u0x = bswap32(ip + 6 + 10*6)
- u1x = bswap32(ip + 6 + 10*6 + 3)
- _u0 = e.lutXe[(_u0>>8)&0xfff]<<16 | e.lutXe[_u0>>20]
- stou32(op+10*8, _u0)
- _u1 = e.lutXe[(_u1>>8)&0xfff]<<16 | e.lutXe[_u1>>20]
- stou32(op+10*8+4, _u1)
- }
- {
- _u0, _u1 := u0x, u1x
- u0x = bswap32(ip + 6 + 11*6)
- u1x = bswap32(ip + 6 + 11*6 + 3)
- _u0 = e.lutXe[(_u0>>8)&0xfff]<<16 | e.lutXe[_u0>>20]
- stou32(op+11*8, _u0)
- _u1 = e.lutXe[(_u1>>8)&0xfff]<<16 | e.lutXe[_u1>>20]
- stou32(op+11*8+4, _u1)
- }
- {
- _u0, _u1 := u0x, u1x
- u0x = bswap32(ip + 6 + 12*6)
- u1x = bswap32(ip + 6 + 12*6 + 3)
- _u0 = e.lutXe[(_u0>>8)&0xfff]<<16 | e.lutXe[_u0>>20]
- stou32(op+12*8, _u0)
- _u1 = e.lutXe[(_u1>>8)&0xfff]<<16 | e.lutXe[_u1>>20]
- stou32(op+12*8+4, _u1)
- }
- {
- _u0, _u1 := u0x, u1x
- u0x = bswap32(ip + 6 + 13*6)
- u1x = bswap32(ip + 6 + 13*6 + 3)
- _u0 = e.lutXe[(_u0>>8)&0xfff]<<16 | e.lutXe[_u0>>20]
- stou32(op+13*8, _u0)
- _u1 = e.lutXe[(_u1>>8)&0xfff]<<16 | e.lutXe[_u1>>20]
- stou32(op+13*8+4, _u1)
- }
- {
- _u0, _u1 := u0x, u1x
- u0x = bswap32(ip + 6 + 14*6)
- u1x = bswap32(ip + 6 + 14*6 + 3)
- _u0 = e.lutXe[(_u0>>8)&0xfff]<<16 | e.lutXe[_u0>>20]
- stou32(op+14*8, _u0)
- _u1 = e.lutXe[(_u1>>8)&0xfff]<<16 | e.lutXe[_u1>>20]
- stou32(op+14*8+4, _u1)
- }
- {
- _u0, _u1 := u0x, u1x
- u0x = bswap32(ip + 6 + 15*6)
- u1x = bswap32(ip + 6 + 15*6 + 3)
- _u0 = e.lutXe[(_u0>>8)&0xfff]<<16 | e.lutXe[_u0>>20]
- stou32(op+15*8, _u0)
- _u1 = e.lutXe[(_u1>>8)&0xfff]<<16 | e.lutXe[_u1>>20]
- stou32(op+15*8+4, _u1)
- }
- op += 128
- ip += (128 / 4) * 3
- }
- for op <= (opstart+outlen)-(16+12) {
- {
- _u0, _u1 := u0x, u1x
- u0x = bswap32(ip + 6 + 0*6)
- u1x = bswap32(ip + 6 + 0*6 + 3)
- _u0 = e.lutXe[(_u0>>8)&0xfff]<<16 | e.lutXe[_u0>>20]
- stou32(op+0*8, _u0)
- _u1 = e.lutXe[(_u1>>8)&0xfff]<<16 | e.lutXe[_u1>>20]
- stou32(op+0*8+4, _u1)
- }
- {
- _u0, _u1 := u0x, u1x
- u0x = bswap32(ip + 6 + 1*6)
- u1x = bswap32(ip + 6 + 1*6 + 3)
- _u0 = e.lutXe[(_u0>>8)&0xfff]<<16 | e.lutXe[_u0>>20]
- stou32(op+1*8, _u0)
- _u1 = e.lutXe[(_u1>>8)&0xfff]<<16 | e.lutXe[_u1>>20]
- stou32(op+1*8+4, _u1)
- }
- op += 16
- ip += (16 / 4) * 3
- }
- if op <= (opstart+outlen)-(8+12) {
- _u0 := e.lutXe[(u0x>>8)&0xfff]<<16 | e.lutXe[u0x>>20]
- stou32(op+0*8, _u0)
- _u1 := e.lutXe[(u1x>>8)&0xfff]<<16 | e.lutXe[u1x>>20]
- stou32(op+0*8+4, _u1)
- op += 8
- ip += (8 / 4) * 3
- }
- }
- for op < (opstart+outlen)-4 {
- _u := bswap32(ip)
- stou32(op, e.lutXe[(_u>>8)&0xfff]<<16|e.lutXe[_u>>20])
- op += 4
- ip += 3
- }
- _l := uint32((ipstart + uintptr(inlen)) - ip)
- if _l == 3 {
- _u := uint32(*(*byte)(unsafe.Pointer(ip + 0)))<<24 | uint32(*(*byte)(unsafe.Pointer(ip + 1)))<<16 | uint32(*(*byte)(unsafe.Pointer(ip + 2)))<<8
- stou32(op, uint32(e.lutSe[(_u>>8)&0x3f])<<24|uint32(e.lutSe[(_u>>14)&0x3f])<<16|uint32(e.lutSe[(_u>>20)&0x3f])<<8|uint32(e.lutSe[(_u>>26)&0x3f]))
- } else if _l != 0 {
- *(*byte)(unsafe.Pointer(op)) = e.lutSe[(*(*byte)(unsafe.Pointer(ip + 0))>>2)&0x3f]
- op++
- if _l == 2 {
- *(*byte)(unsafe.Pointer(op)) = e.lutSe[(*(*byte)(unsafe.Pointer(ip + 0))&0x3)<<4|(*(*byte)(unsafe.Pointer(ip + 1))&0xf0)>>4]
- op++
- *(*byte)(unsafe.Pointer(op)) = e.lutSe[(*(*byte)(unsafe.Pointer(ip + 1))&0xf)<<2]
- op++
- } else {
- *(*byte)(unsafe.Pointer(op)) = e.lutSe[(*(*byte)(unsafe.Pointer(ip + 0))&0x3)<<4]
- op++
- if e.pad {
- *(*byte)(unsafe.Pointer(op)) = '='
- op++
- }
- }
- if e.pad {
- *(*byte)(unsafe.Pointer(op)) = '='
- }
- }
- }
|