dispatch_amd64.go raw

   1  /*
   2   * Copyright 2021 ByteDance Inc.
   3   *
   4   * Licensed under the Apache License, Version 2.0 (the "License");
   5   * you may not use this file except in compliance with the License.
   6   * You may obtain a copy of the License at
   7   *
   8   *     http://www.apache.org/licenses/LICENSE-2.0
   9   *
  10   * Unless required by applicable law or agreed to in writing, software
  11   * distributed under the License is distributed on an "AS IS" BASIS,
  12   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  13   * See the License for the specific language governing permissions and
  14   * limitations under the License.
  15   */
  16  
  17  package native
  18  
  19  import (
  20      `unsafe`
  21  
  22      `github.com/bytedance/sonic/internal/cpu`
  23      `github.com/bytedance/sonic/internal/native/avx2`
  24      `github.com/bytedance/sonic/internal/native/sse`
  25      `github.com/bytedance/sonic/internal/native/types`
  26      `github.com/bytedance/sonic/internal/rt`
  27  )
  28  
  29  const MaxFrameSize   uintptr = 400
  30  
  31  var (
  32      S_f64toa uintptr
  33      S_f32toa uintptr
  34      S_i64toa uintptr
  35      S_u64toa uintptr
  36      S_lspace uintptr
  37  )
  38  
  39  var (
  40      S_quote   uintptr
  41      S_unquote uintptr
  42  )
  43  
  44  var (
  45      S_value     uintptr
  46      S_vstring   uintptr
  47      S_vnumber   uintptr
  48      S_vsigned   uintptr
  49      S_vunsigned uintptr
  50  )
  51  
  52  var (
  53      S_skip_one    uintptr
  54      S_skip_one_fast    uintptr
  55      S_get_by_path    uintptr
  56      S_skip_array  uintptr
  57      S_skip_object uintptr
  58      S_skip_number uintptr
  59  )
  60  
  61  var (
  62      __Quote func(s unsafe.Pointer, nb int, dp unsafe.Pointer, dn unsafe.Pointer, flags uint64) int
  63  
  64      __Unquote func(s unsafe.Pointer, nb int, dp unsafe.Pointer, ep unsafe.Pointer, flags uint64) int
  65  
  66      __HTMLEscape func(s unsafe.Pointer, nb int, dp unsafe.Pointer, dn unsafe.Pointer) int
  67  
  68      __Value func(s unsafe.Pointer, n int, p int, v unsafe.Pointer, flags uint64) int
  69  
  70      __SkipOne func(s unsafe.Pointer, p unsafe.Pointer, m unsafe.Pointer, flags uint64) int
  71  
  72      __SkipOneFast func(s unsafe.Pointer, p unsafe.Pointer) int
  73  
  74      __GetByPath func(s unsafe.Pointer, p unsafe.Pointer, path unsafe.Pointer, m unsafe.Pointer) int
  75  
  76      __ValidateOne func(s unsafe.Pointer, p unsafe.Pointer, m unsafe.Pointer, flags uint64) int
  77  
  78      __I64toa func(out unsafe.Pointer, val int64) (ret int)
  79  
  80      __U64toa func(out unsafe.Pointer, val uint64) (ret int)
  81  
  82      __F64toa func(out unsafe.Pointer, val float64) (ret int)
  83  
  84      __F32toa func(out unsafe.Pointer, val float32) (ret int)
  85  
  86      __ValidateUTF8 func(s unsafe.Pointer, p unsafe.Pointer, m unsafe.Pointer) (ret int)
  87  
  88      __ValidateUTF8Fast func(s unsafe.Pointer) (ret int)
  89  
  90  	__ParseWithPadding func(parser unsafe.Pointer) (ret int)
  91  
  92  	__LookupSmallKey func(key  unsafe.Pointer, table  unsafe.Pointer, lowerOff int) (index int)
  93  )
  94  
  95  //go:nosplit
  96  func Quote(s unsafe.Pointer, nb int, dp unsafe.Pointer, dn *int, flags uint64) int {
  97      return __Quote(rt.NoEscape(unsafe.Pointer(s)), nb, rt.NoEscape(unsafe.Pointer(dp)), rt.NoEscape(unsafe.Pointer(dn)), flags)
  98  }
  99  
 100  //go:nosplit
 101  func Unquote(s unsafe.Pointer, nb int, dp unsafe.Pointer, ep *int, flags uint64) int {
 102      return __Unquote(rt.NoEscape(unsafe.Pointer(s)), nb, rt.NoEscape(unsafe.Pointer(dp)), rt.NoEscape(unsafe.Pointer(ep)), flags)
 103  }
 104  
 105  //go:nosplit
 106  func HTMLEscape(s unsafe.Pointer, nb int, dp unsafe.Pointer, dn *int) int {
 107      return __HTMLEscape(rt.NoEscape(unsafe.Pointer(s)), nb, rt.NoEscape(unsafe.Pointer(dp)), rt.NoEscape(unsafe.Pointer(dn)))
 108  }
 109  
 110  //go:nosplit
 111  func Value(s unsafe.Pointer, n int, p int, v *types.JsonState, flags uint64) int {
 112      return __Value(rt.NoEscape(unsafe.Pointer(s)), n, p, rt.NoEscape(unsafe.Pointer(v)), flags)
 113  }
 114  
 115  //go:nosplit
 116  func SkipOne(s *string, p *int, m *types.StateMachine, flags uint64) int {
 117      return __SkipOne(rt.NoEscape(unsafe.Pointer(s)), rt.NoEscape(unsafe.Pointer(p)), rt.NoEscape(unsafe.Pointer(m)), flags)
 118  }
 119  
 120  //go:nosplit
 121  func SkipOneFast(s *string, p *int) int {
 122      return __SkipOneFast(rt.NoEscape(unsafe.Pointer(s)), rt.NoEscape(unsafe.Pointer(p)))
 123  }
 124  
 125  //go:nosplit
 126  func GetByPath(s *string, p *int, path *[]interface{}, m *types.StateMachine) int {
 127      return __GetByPath(rt.NoEscape(unsafe.Pointer(s)), rt.NoEscape(unsafe.Pointer(p)), rt.NoEscape(unsafe.Pointer(path)), rt.NoEscape(unsafe.Pointer(m)))
 128  }
 129  
 130  //go:nosplit
 131  func ValidateOne(s *string, p *int, m *types.StateMachine, flags uint64) int {
 132      return __ValidateOne(rt.NoEscape(unsafe.Pointer(s)), rt.NoEscape(unsafe.Pointer(p)), rt.NoEscape(unsafe.Pointer(m)), flags)
 133  }
 134  
 135  //go:nosplit
 136  func I64toa(out *byte, val int64) (ret int) {
 137      return __I64toa(rt.NoEscape(unsafe.Pointer(out)), val)
 138  }
 139  
 140  //go:nosplit
 141  func U64toa(out *byte, val uint64) (ret int) {
 142      return __U64toa(rt.NoEscape(unsafe.Pointer(out)), val)
 143  }
 144  
 145  //go:nosplit
 146  func F64toa(out *byte, val float64) (ret int) {
 147      return __F64toa(rt.NoEscape(unsafe.Pointer(out)), val)
 148  }
 149  
 150  //go:nosplit
 151  func F32toa(out *byte, val float32) (ret int) {
 152      return __F32toa(rt.NoEscape(unsafe.Pointer(out)), val)
 153  }
 154  
 155  //go:nosplit
 156  func ValidateUTF8(s *string, p *int, m *types.StateMachine) (ret int) {
 157      return __ValidateUTF8(rt.NoEscape(unsafe.Pointer(s)), rt.NoEscape(unsafe.Pointer(p)), rt.NoEscape(unsafe.Pointer(m)))
 158  }
 159  
 160  //go:nosplit
 161  func ValidateUTF8Fast(s *string) (ret int) {
 162      return __ValidateUTF8Fast(rt.NoEscape(unsafe.Pointer(s)))
 163  }
 164  
 165  //go:nosplit
 166  func ParseWithPadding(parser unsafe.Pointer) (ret int) {
 167      return __ParseWithPadding(rt.NoEscape(unsafe.Pointer(parser)))
 168  }
 169  
 170  //go:nosplit
 171  func LookupSmallKey(key *string, table *[]byte, lowerOff int) (index int) {
 172      return __LookupSmallKey(rt.NoEscape(unsafe.Pointer(key)), rt.NoEscape(unsafe.Pointer(table)), lowerOff)
 173  }
 174  
 175  func useSSE() {
 176      sse.Use()
 177      S_f64toa      = sse.S_f64toa
 178      __F64toa      = sse.F_f64toa
 179      S_f32toa      = sse.S_f32toa
 180      __F32toa      = sse.F_f32toa
 181      S_i64toa      = sse.S_i64toa
 182      __I64toa      = sse.F_i64toa
 183      S_u64toa      = sse.S_u64toa
 184      __U64toa      = sse.F_u64toa
 185      S_lspace      = sse.S_lspace
 186      S_quote       = sse.S_quote
 187      __Quote       = sse.F_quote
 188      S_unquote     = sse.S_unquote
 189      __Unquote     = sse.F_unquote
 190      S_value       = sse.S_value
 191      __Value       = sse.F_value
 192      S_vstring     = sse.S_vstring
 193      S_vnumber     = sse.S_vnumber
 194      S_vsigned     = sse.S_vsigned
 195      S_vunsigned   = sse.S_vunsigned
 196      S_skip_one    = sse.S_skip_one
 197      __SkipOne     = sse.F_skip_one
 198      __SkipOneFast = sse.F_skip_one_fast
 199      S_skip_array  = sse.S_skip_array
 200      S_skip_object = sse.S_skip_object
 201      S_skip_number = sse.S_skip_number
 202      S_get_by_path = sse.S_get_by_path
 203      __GetByPath   = sse.F_get_by_path
 204      __HTMLEscape  = sse.F_html_escape
 205      __ValidateOne = sse.F_validate_one
 206      __ValidateUTF8= sse.F_validate_utf8
 207      __ValidateUTF8Fast = sse.F_validate_utf8_fast
 208  	__ParseWithPadding = sse.F_parse_with_padding
 209  	__LookupSmallKey = sse.F_lookup_small_key
 210  }
 211  
 212  func useAVX2() {
 213      avx2.Use()
 214      S_f64toa      = avx2.S_f64toa
 215      __F64toa      = avx2.F_f64toa
 216      S_f32toa      = avx2.S_f32toa
 217      __F32toa      = avx2.F_f32toa
 218      S_i64toa      = avx2.S_i64toa
 219      __I64toa      = avx2.F_i64toa
 220      S_u64toa      = avx2.S_u64toa
 221      __U64toa      = avx2.F_u64toa
 222      S_lspace      = avx2.S_lspace
 223      S_quote       = avx2.S_quote
 224      __Quote       = avx2.F_quote
 225      S_unquote     = avx2.S_unquote
 226      __Unquote     = avx2.F_unquote
 227      S_value       = avx2.S_value
 228      __Value       = avx2.F_value
 229      S_vstring     = avx2.S_vstring
 230      S_vnumber     = avx2.S_vnumber
 231      S_vsigned     = avx2.S_vsigned
 232      S_vunsigned   = avx2.S_vunsigned
 233      S_skip_one    = avx2.S_skip_one
 234      __SkipOne     = avx2.F_skip_one
 235      __SkipOneFast = avx2.F_skip_one_fast
 236      S_skip_array  = avx2.S_skip_array
 237      S_skip_object = avx2.S_skip_object
 238      S_skip_number = avx2.S_skip_number
 239      S_get_by_path = avx2.S_get_by_path
 240      __GetByPath   = avx2.F_get_by_path
 241      __HTMLEscape  = avx2.F_html_escape
 242      __ValidateOne = avx2.F_validate_one
 243      __ValidateUTF8= avx2.F_validate_utf8
 244      __ValidateUTF8Fast = avx2.F_validate_utf8_fast
 245  	__ParseWithPadding = avx2.F_parse_with_padding
 246  	__LookupSmallKey = avx2.F_lookup_small_key
 247  }
 248  
 249  
 250  func init() {
 251  	if cpu.HasAVX2 {
 252  		useAVX2()
 253  	} else if cpu.HasSSE {
 254  		useSSE()
 255  	} else {
 256  		panic("Unsupported CPU, lacks of AVX2 or SSE CPUID Flag. maybe it's too old to run Sonic.")
 257  	}
 258  }
 259