forked from toolshed/abra
		
	
		
			
				
	
	
		
			66 lines
		
	
	
		
			1.6 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			66 lines
		
	
	
		
			1.6 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
| //go:build amd64 && !appengine && !noasm && gc
 | |
| // +build amd64,!appengine,!noasm,gc
 | |
| 
 | |
| package zstd
 | |
| 
 | |
| import (
 | |
| 	"fmt"
 | |
| )
 | |
| 
 | |
| type buildDtableAsmContext struct {
 | |
| 	// inputs
 | |
| 	stateTable *uint16
 | |
| 	norm       *int16
 | |
| 	dt         *uint64
 | |
| 
 | |
| 	// outputs --- set by the procedure in the case of error;
 | |
| 	// for interpretation please see the error handling part below
 | |
| 	errParam1 uint64
 | |
| 	errParam2 uint64
 | |
| }
 | |
| 
 | |
| // buildDtable_asm is an x86 assembly implementation of fseDecoder.buildDtable.
 | |
| // Function returns non-zero exit code on error.
 | |
| //
 | |
| //go:noescape
 | |
| func buildDtable_asm(s *fseDecoder, ctx *buildDtableAsmContext) int
 | |
| 
 | |
| // please keep in sync with _generate/gen_fse.go
 | |
| const (
 | |
| 	errorCorruptedNormalizedCounter = 1
 | |
| 	errorNewStateTooBig             = 2
 | |
| 	errorNewStateNoBits             = 3
 | |
| )
 | |
| 
 | |
| // buildDtable will build the decoding table.
 | |
| func (s *fseDecoder) buildDtable() error {
 | |
| 	ctx := buildDtableAsmContext{
 | |
| 		stateTable: &s.stateTable[0],
 | |
| 		norm:       &s.norm[0],
 | |
| 		dt:         (*uint64)(&s.dt[0]),
 | |
| 	}
 | |
| 	code := buildDtable_asm(s, &ctx)
 | |
| 
 | |
| 	if code != 0 {
 | |
| 		switch code {
 | |
| 		case errorCorruptedNormalizedCounter:
 | |
| 			position := ctx.errParam1
 | |
| 			return fmt.Errorf("corrupted input (position=%d, expected 0)", position)
 | |
| 
 | |
| 		case errorNewStateTooBig:
 | |
| 			newState := decSymbol(ctx.errParam1)
 | |
| 			size := ctx.errParam2
 | |
| 			return fmt.Errorf("newState (%d) outside table size (%d)", newState, size)
 | |
| 
 | |
| 		case errorNewStateNoBits:
 | |
| 			newState := decSymbol(ctx.errParam1)
 | |
| 			oldState := decSymbol(ctx.errParam2)
 | |
| 			return fmt.Errorf("newState (%d) == oldState (%d) and no bits", newState, oldState)
 | |
| 
 | |
| 		default:
 | |
| 			return fmt.Errorf("buildDtable_asm returned unhandled nonzero code = %d", code)
 | |
| 		}
 | |
| 	}
 | |
| 	return nil
 | |
| }
 |