71 lines
2.6 KiB
Go
71 lines
2.6 KiB
Go
//go:build arm64 && !appengine && !noasm && gc
|
|
|
|
package zstd
|
|
|
|
// The shared decode/decodeSync/executeSimple wrappers and context structs live
|
|
// in seqdec_asm.go; this file only declares the arm64 asm routines (generated
|
|
// by the avo arm64 lowering printer) and the dispatch helpers. arm64 has no
|
|
// BMI2, so each helper selects only between the 56-bit / safe variants.
|
|
|
|
// sequenceDecs_decode_arm64 implements the main loop of sequenceDecs in arm64 asm.
|
|
//
|
|
// Please refer to seqdec_generic.go for the reference implementation.
|
|
//
|
|
//go:noescape
|
|
func sequenceDecs_decode_arm64(s *sequenceDecs, br *bitReader, ctx *decodeAsmContext) int
|
|
|
|
// sequenceDecs_decode_56_arm64 implements the main loop of sequenceDecs in arm64 asm.
|
|
//
|
|
//go:noescape
|
|
func sequenceDecs_decode_56_arm64(s *sequenceDecs, br *bitReader, ctx *decodeAsmContext) int
|
|
|
|
// decodeAsm runs the sequenceDecs decode loop, choosing the 56-bit variant.
|
|
func decodeAsm(s *sequenceDecs, br *bitReader, ctx *decodeAsmContext, lte56bits bool) int {
|
|
if lte56bits {
|
|
return sequenceDecs_decode_56_arm64(s, br, ctx)
|
|
}
|
|
return sequenceDecs_decode_arm64(s, br, ctx)
|
|
}
|
|
|
|
// sequenceDecs_decodeSync_arm64 implements the main loop of sequenceDecs.decodeSync in arm64 asm.
|
|
//
|
|
// Please refer to seqdec_generic.go for the reference implementation.
|
|
//
|
|
//go:noescape
|
|
func sequenceDecs_decodeSync_arm64(s *sequenceDecs, br *bitReader, ctx *decodeSyncAsmContext) int
|
|
|
|
// sequenceDecs_decodeSync_safe_arm64 does the same as above, but does not write more than output buffer.
|
|
//
|
|
//go:noescape
|
|
func sequenceDecs_decodeSync_safe_arm64(s *sequenceDecs, br *bitReader, ctx *decodeSyncAsmContext) int
|
|
|
|
// decodeSyncAsm runs the decodeSync loop, choosing the safe variant.
|
|
func decodeSyncAsm(s *sequenceDecs, br *bitReader, ctx *decodeSyncAsmContext, safe bool) int {
|
|
if safe {
|
|
return sequenceDecs_decodeSync_safe_arm64(s, br, ctx)
|
|
}
|
|
return sequenceDecs_decodeSync_arm64(s, br, ctx)
|
|
}
|
|
|
|
// sequenceDecs_executeSimple_arm64 implements the main loop of sequenceDecs.executeSimple in arm64 asm.
|
|
//
|
|
// Returns false if a match offset is too big.
|
|
//
|
|
// Please refer to seqdec_generic.go for the reference implementation.
|
|
//
|
|
//go:noescape
|
|
func sequenceDecs_executeSimple_arm64(ctx *executeAsmContext) bool
|
|
|
|
// Same as above, but with safe memcopies
|
|
//
|
|
//go:noescape
|
|
func sequenceDecs_executeSimple_safe_arm64(ctx *executeAsmContext) bool
|
|
|
|
// executeSimpleAsm runs the executeSimple loop, choosing the safe variant.
|
|
func executeSimpleAsm(ctx *executeAsmContext, safe bool) bool {
|
|
if safe {
|
|
return sequenceDecs_executeSimple_safe_arm64(ctx)
|
|
}
|
|
return sequenceDecs_executeSimple_arm64(ctx)
|
|
}
|