@@ -185,6 +185,16 @@ br_fill_end{{.}}:
185
185
#endif
186
186
{{end}}
187
187
188
+ {{/*
189
+ Input:
190
+ AX - number of bits
191
+
192
+ Output:
193
+ BX - value
194
+
195
+ Clobbers:
196
+ AX, BX, CX
197
+ */}}
188
198
{{define "get_bits"}}
189
199
#ifdef GOAMD64_v3
190
200
LEAQ (br_bits_read)(AX*1), CX
@@ -218,34 +228,48 @@ TEXT ·sequenceDecs_decode_amd64(SB), NOSPLIT, $8
218
228
/*
219
229
This procedure implements the following sequence:
220
230
221
- // s.next()
222
- br.fill()
223
- mo, moB := ofState.final()
224
- mo += br.getBits(moB)
231
+ for ctx.iteration >= 0 {
232
+ // s.next()
233
+ br.fill()
234
+ mo, moB := ofState.final()
235
+ mo += br.getBits(moB)
236
+
237
+ br.fill()
238
+ ml, mlB := mlState.final()
239
+ ml += br.getBits(mlB)
225
240
226
- br.fill()
227
- ml, mlB := mlState.final()
228
- ml += br.getBits(mlB)
241
+ ll, llB := llState.final()
242
+ ll += br.getBits(llB)
229
243
230
- ll, llB := llState.final()
231
- ll += br.getBits(llB)
244
+ br.fill()
245
+ if ctx.iteration != 0 {
246
+ nBits := ctx.llState.nbBits() + ctx.mlState.nbBits() + ctx.ofState.nbBits()
247
+ bits := br.get32BitsFast(nBits)
248
+ lowBits := uint16(bits >> ((ofState.nbBits() + mlState.nbBits()) & 31))
249
+ llState = llTable[(llState.newState()+lowBits)&maxTableMask]
232
250
233
- br.fill()
234
- if i != 0 {
235
- nBits := ctx.llState.nbBits() + ctx.mlState.nbBits() + ctx.ofState.nbBits()
236
- bits := br.get32BitsFast(nBits)
237
- lowBits := uint16(bits >> ((ofState.nbBits() + mlState.nbBits()) & 31))
238
- llState = llTable[(llState.newState()+lowBits)&maxTableMask]
251
+ lowBits = uint16(bits >> (ofState.nbBits() & 31))
252
+ lowBits &= bitMask[mlState.nbBits()&15]
253
+ mlState = mlTable[(mlState.newState()+lowBits)&maxTableMask]
239
254
240
- lowBits = uint16(bits >> ( ofState.nbBits() & 31))
241
- lowBits &= bitMask[mlState.nbBits()&15 ]
242
- mlState = mlTable[(mlState.newState()+lowBits)&maxTableMask]
255
+ lowBits = uint16(bits) & bitMask[ ofState.nbBits()&15]
256
+ ofState = ofTable[(ofState.newState()+lowBits)&maxTableMask ]
257
+ }
243
258
244
- lowBits = uint16(bits) & bitMask[ofState.nbBits()&15]
245
- ofState = ofTable[(ofState.newState()+lowBits)&maxTableMask]
259
+ mo = s.adjustOffset(mo, ll, moB)
260
+
261
+ if ml > maxMatchLen {
262
+ return errorMatchLenTooBig
263
+ }
264
+ if mo == 0 && ml > 0 {
265
+ return errorMatchLenOfsMismatch
266
+ }
267
+
268
+ ctx.iteration -= 1
246
269
}
247
270
248
- mo = s.adjustOffset(mo, ll, moB)
271
+ return 0
272
+
249
273
*/
250
274
#define br_value R8 // br.value
251
275
#define br_bits_read R9 // br.bitsRead
@@ -316,7 +340,7 @@ main_loop:
316
340
{{template "bitreader_fill" .}}
317
341
{{end}}
318
342
319
- // if i != 0 {
343
+ // if ctx.iteration != 0 {
320
344
// nBits := ctx.llState.nbBits() + ctx.mlState.nbBits() + ctx.ofState.nbBits()
321
345
// bits := br.get32BitsFast(nBits)
322
346
// lowBits := uint16(bits >> ((ofState.nbBits() + mlState.nbBits()) & 31))
@@ -420,20 +444,22 @@ check_triple:
420
444
return fmt.Errorf("zero matchoff and matchlen (%d) > 0", ml)
421
445
}
422
446
*/
447
+ XORQ AX, AX
423
448
TESTQ BX, BX
424
449
SETEQ DL
425
450
CMPQ CX, $0
426
451
SETHI AL
427
452
ANDQ DX, AX
428
- TESTB AL, AL
453
+ TESTQ AX, AX
429
454
JNZ error_match_len_ofs_mismatch
430
455
431
- ADDQ $24, seqs
456
+ ADDQ $24, seqs // sizof(seqVals) == 3*8
432
457
433
458
DECQ decodeAsmContext_iteration(DI)
434
459
JNS main_loop
435
460
436
461
XORQ AX, AX
462
+
437
463
end:
438
464
MOVQ 0(SP), BP
439
465
MOVQ AX, ret+24(FP)
0 commit comments