encoder.go 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224
  1. package yu_base64
  2. import "unsafe"
  3. //go:nosplit
  4. func (e *Encoding) encode(dst []byte, src []byte, outlen uintptr) {
  5. inlen := len(src)
  6. ip := uintptr(unsafe.Pointer(&src[0]))
  7. ipstart := ip
  8. op := uintptr(unsafe.Pointer(&dst[0]))
  9. opstart := op
  10. if outlen >= 8+12 {
  11. u0x := bswap32(ip)
  12. u1x := bswap32(ip + 3)
  13. for op <= (opstart+outlen)-(128+12) {
  14. {
  15. _u0, _u1 := u0x, u1x
  16. u0x = bswap32(ip + 6 + 0*6)
  17. u1x = bswap32(ip + 6 + 0*6 + 3)
  18. _u0 = e.lutXe[(_u0>>8)&0xfff]<<16 | e.lutXe[_u0>>20]
  19. stou32(op+0*8, _u0)
  20. _u1 = e.lutXe[(_u1>>8)&0xfff]<<16 | e.lutXe[_u1>>20]
  21. stou32(op+0*8+4, _u1)
  22. }
  23. {
  24. _u0, _u1 := u0x, u1x
  25. u0x = bswap32(ip + 6 + 1*6)
  26. u1x = bswap32(ip + 6 + 1*6 + 3)
  27. _u0 = e.lutXe[(_u0>>8)&0xfff]<<16 | e.lutXe[_u0>>20]
  28. stou32(op+1*8, _u0)
  29. _u1 = e.lutXe[(_u1>>8)&0xfff]<<16 | e.lutXe[_u1>>20]
  30. stou32(op+1*8+4, _u1)
  31. }
  32. {
  33. _u0, _u1 := u0x, u1x
  34. u0x = bswap32(ip + 6 + 2*6)
  35. u1x = bswap32(ip + 6 + 2*6 + 3)
  36. _u0 = e.lutXe[(_u0>>8)&0xfff]<<16 | e.lutXe[_u0>>20]
  37. stou32(op+2*8, _u0)
  38. _u1 = e.lutXe[(_u1>>8)&0xfff]<<16 | e.lutXe[_u1>>20]
  39. stou32(op+2*8+4, _u1)
  40. }
  41. {
  42. _u0, _u1 := u0x, u1x
  43. u0x = bswap32(ip + 6 + 3*6)
  44. u1x = bswap32(ip + 6 + 3*6 + 3)
  45. _u0 = e.lutXe[(_u0>>8)&0xfff]<<16 | e.lutXe[_u0>>20]
  46. stou32(op+3*8, _u0)
  47. _u1 = e.lutXe[(_u1>>8)&0xfff]<<16 | e.lutXe[_u1>>20]
  48. stou32(op+3*8+4, _u1)
  49. }
  50. {
  51. _u0, _u1 := u0x, u1x
  52. u0x = bswap32(ip + 6 + 4*6)
  53. u1x = bswap32(ip + 6 + 4*6 + 3)
  54. _u0 = e.lutXe[(_u0>>8)&0xfff]<<16 | e.lutXe[_u0>>20]
  55. stou32(op+4*8, _u0)
  56. _u1 = e.lutXe[(_u1>>8)&0xfff]<<16 | e.lutXe[_u1>>20]
  57. stou32(op+4*8+4, _u1)
  58. }
  59. {
  60. _u0, _u1 := u0x, u1x
  61. u0x = bswap32(ip + 6 + 5*6)
  62. u1x = bswap32(ip + 6 + 5*6 + 3)
  63. _u0 = e.lutXe[(_u0>>8)&0xfff]<<16 | e.lutXe[_u0>>20]
  64. stou32(op+5*8, _u0)
  65. _u1 = e.lutXe[(_u1>>8)&0xfff]<<16 | e.lutXe[_u1>>20]
  66. stou32(op+5*8+4, _u1)
  67. }
  68. {
  69. _u0, _u1 := u0x, u1x
  70. u0x = bswap32(ip + 6 + 6*6)
  71. u1x = bswap32(ip + 6 + 6*6 + 3)
  72. _u0 = e.lutXe[(_u0>>8)&0xfff]<<16 | e.lutXe[_u0>>20]
  73. stou32(op+6*8, _u0)
  74. _u1 = e.lutXe[(_u1>>8)&0xfff]<<16 | e.lutXe[_u1>>20]
  75. stou32(op+6*8+4, _u1)
  76. }
  77. {
  78. _u0, _u1 := u0x, u1x
  79. u0x = bswap32(ip + 6 + 7*6)
  80. u1x = bswap32(ip + 6 + 7*6 + 3)
  81. _u0 = e.lutXe[(_u0>>8)&0xfff]<<16 | e.lutXe[_u0>>20]
  82. stou32(op+7*8, _u0)
  83. _u1 = e.lutXe[(_u1>>8)&0xfff]<<16 | e.lutXe[_u1>>20]
  84. stou32(op+7*8+4, _u1)
  85. }
  86. {
  87. _u0, _u1 := u0x, u1x
  88. u0x = bswap32(ip + 6 + 8*6)
  89. u1x = bswap32(ip + 6 + 8*6 + 3)
  90. _u0 = e.lutXe[(_u0>>8)&0xfff]<<16 | e.lutXe[_u0>>20]
  91. stou32(op+8*8, _u0)
  92. _u1 = e.lutXe[(_u1>>8)&0xfff]<<16 | e.lutXe[_u1>>20]
  93. stou32(op+8*8+4, _u1)
  94. }
  95. {
  96. _u0, _u1 := u0x, u1x
  97. u0x = bswap32(ip + 6 + 9*6)
  98. u1x = bswap32(ip + 6 + 9*6 + 3)
  99. _u0 = e.lutXe[(_u0>>8)&0xfff]<<16 | e.lutXe[_u0>>20]
  100. stou32(op+9*8, _u0)
  101. _u1 = e.lutXe[(_u1>>8)&0xfff]<<16 | e.lutXe[_u1>>20]
  102. stou32(op+9*8+4, _u1)
  103. }
  104. {
  105. _u0, _u1 := u0x, u1x
  106. u0x = bswap32(ip + 6 + 10*6)
  107. u1x = bswap32(ip + 6 + 10*6 + 3)
  108. _u0 = e.lutXe[(_u0>>8)&0xfff]<<16 | e.lutXe[_u0>>20]
  109. stou32(op+10*8, _u0)
  110. _u1 = e.lutXe[(_u1>>8)&0xfff]<<16 | e.lutXe[_u1>>20]
  111. stou32(op+10*8+4, _u1)
  112. }
  113. {
  114. _u0, _u1 := u0x, u1x
  115. u0x = bswap32(ip + 6 + 11*6)
  116. u1x = bswap32(ip + 6 + 11*6 + 3)
  117. _u0 = e.lutXe[(_u0>>8)&0xfff]<<16 | e.lutXe[_u0>>20]
  118. stou32(op+11*8, _u0)
  119. _u1 = e.lutXe[(_u1>>8)&0xfff]<<16 | e.lutXe[_u1>>20]
  120. stou32(op+11*8+4, _u1)
  121. }
  122. {
  123. _u0, _u1 := u0x, u1x
  124. u0x = bswap32(ip + 6 + 12*6)
  125. u1x = bswap32(ip + 6 + 12*6 + 3)
  126. _u0 = e.lutXe[(_u0>>8)&0xfff]<<16 | e.lutXe[_u0>>20]
  127. stou32(op+12*8, _u0)
  128. _u1 = e.lutXe[(_u1>>8)&0xfff]<<16 | e.lutXe[_u1>>20]
  129. stou32(op+12*8+4, _u1)
  130. }
  131. {
  132. _u0, _u1 := u0x, u1x
  133. u0x = bswap32(ip + 6 + 13*6)
  134. u1x = bswap32(ip + 6 + 13*6 + 3)
  135. _u0 = e.lutXe[(_u0>>8)&0xfff]<<16 | e.lutXe[_u0>>20]
  136. stou32(op+13*8, _u0)
  137. _u1 = e.lutXe[(_u1>>8)&0xfff]<<16 | e.lutXe[_u1>>20]
  138. stou32(op+13*8+4, _u1)
  139. }
  140. {
  141. _u0, _u1 := u0x, u1x
  142. u0x = bswap32(ip + 6 + 14*6)
  143. u1x = bswap32(ip + 6 + 14*6 + 3)
  144. _u0 = e.lutXe[(_u0>>8)&0xfff]<<16 | e.lutXe[_u0>>20]
  145. stou32(op+14*8, _u0)
  146. _u1 = e.lutXe[(_u1>>8)&0xfff]<<16 | e.lutXe[_u1>>20]
  147. stou32(op+14*8+4, _u1)
  148. }
  149. {
  150. _u0, _u1 := u0x, u1x
  151. u0x = bswap32(ip + 6 + 15*6)
  152. u1x = bswap32(ip + 6 + 15*6 + 3)
  153. _u0 = e.lutXe[(_u0>>8)&0xfff]<<16 | e.lutXe[_u0>>20]
  154. stou32(op+15*8, _u0)
  155. _u1 = e.lutXe[(_u1>>8)&0xfff]<<16 | e.lutXe[_u1>>20]
  156. stou32(op+15*8+4, _u1)
  157. }
  158. op += 128
  159. ip += (128 / 4) * 3
  160. }
  161. for op <= (opstart+outlen)-(16+12) {
  162. {
  163. _u0, _u1 := u0x, u1x
  164. u0x = bswap32(ip + 6 + 0*6)
  165. u1x = bswap32(ip + 6 + 0*6 + 3)
  166. _u0 = e.lutXe[(_u0>>8)&0xfff]<<16 | e.lutXe[_u0>>20]
  167. stou32(op+0*8, _u0)
  168. _u1 = e.lutXe[(_u1>>8)&0xfff]<<16 | e.lutXe[_u1>>20]
  169. stou32(op+0*8+4, _u1)
  170. }
  171. {
  172. _u0, _u1 := u0x, u1x
  173. u0x = bswap32(ip + 6 + 1*6)
  174. u1x = bswap32(ip + 6 + 1*6 + 3)
  175. _u0 = e.lutXe[(_u0>>8)&0xfff]<<16 | e.lutXe[_u0>>20]
  176. stou32(op+1*8, _u0)
  177. _u1 = e.lutXe[(_u1>>8)&0xfff]<<16 | e.lutXe[_u1>>20]
  178. stou32(op+1*8+4, _u1)
  179. }
  180. op += 16
  181. ip += (16 / 4) * 3
  182. }
  183. if op <= (opstart+outlen)-(8+12) {
  184. _u0 := e.lutXe[(u0x>>8)&0xfff]<<16 | e.lutXe[u0x>>20]
  185. stou32(op+0*8, _u0)
  186. _u1 := e.lutXe[(u1x>>8)&0xfff]<<16 | e.lutXe[u1x>>20]
  187. stou32(op+0*8+4, _u1)
  188. op += 8
  189. ip += (8 / 4) * 3
  190. }
  191. }
  192. for op < (opstart+outlen)-4 {
  193. _u := bswap32(ip)
  194. stou32(op, e.lutXe[(_u>>8)&0xfff]<<16|e.lutXe[_u>>20])
  195. op += 4
  196. ip += 3
  197. }
  198. _l := uint32((ipstart + uintptr(inlen)) - ip)
  199. if _l == 3 {
  200. _u := uint32(*(*byte)(unsafe.Pointer(ip + 0)))<<24 | uint32(*(*byte)(unsafe.Pointer(ip + 1)))<<16 | uint32(*(*byte)(unsafe.Pointer(ip + 2)))<<8
  201. 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]))
  202. } else if _l != 0 {
  203. *(*byte)(unsafe.Pointer(op)) = e.lutSe[(*(*byte)(unsafe.Pointer(ip + 0))>>2)&0x3f]
  204. op++
  205. if _l == 2 {
  206. *(*byte)(unsafe.Pointer(op)) = e.lutSe[(*(*byte)(unsafe.Pointer(ip + 0))&0x3)<<4|(*(*byte)(unsafe.Pointer(ip + 1))&0xf0)>>4]
  207. op++
  208. *(*byte)(unsafe.Pointer(op)) = e.lutSe[(*(*byte)(unsafe.Pointer(ip + 1))&0xf)<<2]
  209. op++
  210. } else {
  211. *(*byte)(unsafe.Pointer(op)) = e.lutSe[(*(*byte)(unsafe.Pointer(ip + 0))&0x3)<<4]
  212. op++
  213. if e.pad {
  214. *(*byte)(unsafe.Pointer(op)) = '='
  215. op++
  216. }
  217. }
  218. if e.pad {
  219. *(*byte)(unsafe.Pointer(op)) = '='
  220. }
  221. }
  222. }