| //go: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 | |
| } |