github.com/bir3/gocompiler@v0.9.2202/extra/compress/zstd/fse_decoder_amd64.go (about)

     1  //go:build amd64 && !appengine && !noasm && gc
     2  // +build amd64,!appengine,!noasm,gc
     3  
     4  package zstd
     5  
     6  import (
     7  	"fmt"
     8  )
     9  
    10  type buildDtableAsmContext struct {
    11  	// inputs
    12  	stateTable *uint16
    13  	norm       *int16
    14  	dt         *uint64
    15  
    16  	// outputs --- set by the procedure in the case of error;
    17  	// for interpretation please see the error handling part below
    18  	errParam1 uint64
    19  	errParam2 uint64
    20  }
    21  
    22  // buildDtable_asm is an x86 assembly implementation of fseDecoder.buildDtable.
    23  // Function returns non-zero exit code on error.
    24  //
    25  //go:noescape
    26  func buildDtable_asm(s *fseDecoder, ctx *buildDtableAsmContext) int
    27  
    28  // please keep in sync with _generate/gen_fse.go
    29  const (
    30  	errorCorruptedNormalizedCounter = 1
    31  	errorNewStateTooBig             = 2
    32  	errorNewStateNoBits             = 3
    33  )
    34  
    35  // buildDtable will build the decoding table.
    36  func (s *fseDecoder) buildDtable() error {
    37  	ctx := buildDtableAsmContext{
    38  		stateTable: &s.stateTable[0],
    39  		norm:       &s.norm[0],
    40  		dt:         (*uint64)(&s.dt[0]),
    41  	}
    42  	code := buildDtable_asm(s, &ctx)
    43  
    44  	if code != 0 {
    45  		switch code {
    46  		case errorCorruptedNormalizedCounter:
    47  			position := ctx.errParam1
    48  			return fmt.Errorf("corrupted input (position=%d, expected 0)", position)
    49  
    50  		case errorNewStateTooBig:
    51  			newState := decSymbol(ctx.errParam1)
    52  			size := ctx.errParam2
    53  			return fmt.Errorf("newState (%d) outside table size (%d)", newState, size)
    54  
    55  		case errorNewStateNoBits:
    56  			newState := decSymbol(ctx.errParam1)
    57  			oldState := decSymbol(ctx.errParam2)
    58  			return fmt.Errorf("newState (%d) == oldState (%d) and no bits", newState, oldState)
    59  
    60  		default:
    61  			return fmt.Errorf("buildDtable_asm returned unhandled nonzero code = %d", code)
    62  		}
    63  	}
    64  	return nil
    65  }