@@ -49,49 +49,41 @@ func (d decompress4x) generateProcedure(name string) {
49
49
exhausted := GP64 ()
50
50
XORQ (exhausted .As64 (), exhausted .As64 ()) // exhausted = false
51
51
52
- limitPtr := AllocLocal ( 8 )
52
+ limit := GP64 ( )
53
53
54
54
bufferOrigin := GP64 ()
55
55
peekBits := GP64 ()
56
56
buffer := GP64 ()
57
57
dstEvery := GP64 ()
58
58
table := GP64 ()
59
59
60
- br0 := GP64 ()
61
- br1 := GP64 ()
62
- br2 := GP64 ()
63
- br3 := GP64 ()
60
+ br := GP64 ()
64
61
65
62
Comment ("Preload values" )
66
63
{
67
64
ctx := Dereference (Param ("ctx" ))
68
65
Load (ctx .Field ("peekBits" ), peekBits )
69
- Load (ctx .Field ("out" ), buffer )
70
- MOVQ (buffer , bufferOrigin )
71
- limit := Load (ctx .Field ("limit" ), GP64 ())
72
- MOVQ (limit , limitPtr )
66
+ Load (ctx .Field ("out" ), bufferOrigin )
67
+ Load (ctx .Field ("limit" ), limit )
73
68
Load (ctx .Field ("dstEvery" ), dstEvery )
74
69
Load (ctx .Field ("tbl" ), table )
75
- Load (ctx .Field ("pbr0" ), br0 )
76
- Load (ctx .Field ("pbr1" ), br1 )
77
- Load (ctx .Field ("pbr2" ), br2 )
78
- Load (ctx .Field ("pbr3" ), br3 )
70
+ Load (ctx .Field ("pbr" ), br )
79
71
}
80
72
81
73
Comment ("Main loop" )
82
74
Label ("main_loop" )
83
75
84
76
MOVQ (bufferOrigin , buffer )
85
77
// Check if we have space
86
- CMPQ (buffer , limitPtr )
78
+ CMPQ (buffer , limit )
87
79
SETGE (exhausted .As8 ())
88
- d .decodeTwoValues (0 , br0 , peekBits , table , buffer , exhausted )
80
+ d .decodeTwoValues (0 , br , peekBits , table , buffer , exhausted )
89
81
ADDQ (dstEvery , buffer )
90
- d .decodeTwoValues (1 , br1 , peekBits , table , buffer , exhausted )
82
+ d .decodeTwoValues (1 , br , peekBits , table , buffer , exhausted )
91
83
ADDQ (dstEvery , buffer )
92
- d .decodeTwoValues (2 , br2 , peekBits , table , buffer , exhausted )
84
+ d .decodeTwoValues (2 , br , peekBits , table , buffer , exhausted )
93
85
ADDQ (dstEvery , buffer )
94
- d .decodeTwoValues (3 , br3 , peekBits , table , buffer , exhausted )
86
+ d .decodeTwoValues (3 , br , peekBits , table , buffer , exhausted )
95
87
96
88
ADDQ (U8 (2 ), bufferOrigin ) // off += 2
97
89
@@ -100,10 +92,9 @@ func (d decompress4x) generateProcedure(name string) {
100
92
101
93
{
102
94
ctx := Dereference (Param ("ctx" ))
103
- tmp := Load (ctx .Field ("out" ), GP64 ())
104
- decoded := GP64 ()
105
- MOVQ (bufferOrigin , decoded )
106
- SUBQ (tmp , decoded )
95
+ ctxout , _ := ctx .Field ("out" ).Resolve ()
96
+ decoded := bufferOrigin
97
+ SUBQ (ctxout .Addr , decoded )
107
98
SHLQ (U8 (2 ), decoded ) // decoded *= 4
108
99
109
100
Store (decoded , ctx .Field ("decoded" ))
@@ -118,6 +109,7 @@ const bitReader_in = 0
118
109
const bitReader_off = bitReader_in + 3 * 8 // {ptr, len, cap}
119
110
const bitReader_value = bitReader_off + 8
120
111
const bitReader_bitsRead = bitReader_value + 8
112
+ const bitReader__size = bitReader_bitsRead + 8
121
113
122
114
func (d decompress4x ) decodeTwoValues (id int , br , peekBits , table , buffer , exhausted reg.GPVirtual ) {
123
115
brValue , brBitsRead := d .fillFast32 (id , 32 , br , exhausted )
@@ -157,9 +149,10 @@ func (d decompress4x) decodeTwoValues(id int, br, peekBits, table, buffer, exhau
157
149
Comment ("out[id * dstEvery + 1] = uint8(v1.entry >> 8)" )
158
150
MOVW (out .As16 (), Mem {Base : buffer })
159
151
160
- Comment ("update the bitrader reader structure" )
161
- MOVQ (brValue , Mem {Base : br , Disp : bitReader_value })
162
- MOVB (brBitsRead .As8 (), Mem {Base : br , Disp : bitReader_bitsRead })
152
+ Comment ("update the bitreader structure" )
153
+ offset := id * bitReader__size
154
+ MOVQ (brValue , Mem {Base : br , Disp : offset + bitReader_value })
155
+ MOVB (brBitsRead .As8 (), Mem {Base : br , Disp : offset + bitReader_bitsRead })
163
156
}
164
157
165
158
func (d decompress4x ) generateProcedure4x8bit (name string ) {
@@ -171,49 +164,41 @@ func (d decompress4x) generateProcedure4x8bit(name string) {
171
164
exhausted := GP64 () // Fixed since we need 8H
172
165
XORQ (exhausted .As64 (), exhausted .As64 ()) // exhausted = false
173
166
174
- bufferOrigin := AllocLocal ( 8 )
175
- limitPtr := AllocLocal ( 8 )
167
+ bufferOrigin := GP64 ( )
168
+ limit := GP64 ( )
176
169
177
170
peekBits := GP64 ()
178
171
buffer := GP64 ()
179
172
dstEvery := GP64 ()
180
173
table := GP64 ()
181
174
182
- br0 := GP64 ()
183
- br1 := GP64 ()
184
- br2 := GP64 ()
185
- br3 := GP64 ()
175
+ br := GP64 ()
186
176
187
177
Comment ("Preload values" )
188
178
{
189
179
ctx := Dereference (Param ("ctx" ))
190
180
Load (ctx .Field ("peekBits" ), peekBits )
191
- Load (ctx .Field ("out" ), buffer )
192
- MOVQ (buffer , bufferOrigin )
193
- limit := Load (ctx .Field ("limit" ), GP64 ())
194
- MOVQ (limit , limitPtr )
181
+ Load (ctx .Field ("out" ), bufferOrigin )
182
+ Load (ctx .Field ("limit" ), limit )
195
183
Load (ctx .Field ("dstEvery" ), dstEvery )
196
184
Load (ctx .Field ("tbl" ), table )
197
- Load (ctx .Field ("pbr0" ), br0 )
198
- Load (ctx .Field ("pbr1" ), br1 )
199
- Load (ctx .Field ("pbr2" ), br2 )
200
- Load (ctx .Field ("pbr3" ), br3 )
185
+ Load (ctx .Field ("pbr" ), br )
201
186
}
202
187
203
188
Comment ("Main loop" )
204
189
Label ("main_loop" )
205
190
206
191
MOVQ (bufferOrigin , buffer )
207
192
// Check if we have space
208
- CMPQ (buffer , limitPtr )
193
+ CMPQ (buffer , limit )
209
194
SETGE (exhausted .As8 ())
210
- d .decodeFourValues (0 , br0 , peekBits , table , buffer , exhausted )
195
+ d .decodeFourValues (0 , br , peekBits , table , buffer , exhausted )
211
196
ADDQ (dstEvery , buffer )
212
- d .decodeFourValues (1 , br1 , peekBits , table , buffer , exhausted )
197
+ d .decodeFourValues (1 , br , peekBits , table , buffer , exhausted )
213
198
ADDQ (dstEvery , buffer )
214
- d .decodeFourValues (2 , br2 , peekBits , table , buffer , exhausted )
199
+ d .decodeFourValues (2 , br , peekBits , table , buffer , exhausted )
215
200
ADDQ (dstEvery , buffer )
216
- d .decodeFourValues (3 , br3 , peekBits , table , buffer , exhausted )
201
+ d .decodeFourValues (3 , br , peekBits , table , buffer , exhausted )
217
202
218
203
ADDQ (U8 (4 ), bufferOrigin ) // off += 4
219
204
@@ -222,10 +207,9 @@ func (d decompress4x) generateProcedure4x8bit(name string) {
222
207
223
208
{
224
209
ctx := Dereference (Param ("ctx" ))
225
- tmp := Load (ctx .Field ("out" ), GP64 ())
226
- decoded := GP64 ()
227
- MOVQ (bufferOrigin , decoded )
228
- SUBQ (tmp , decoded )
210
+ ctxout , _ := ctx .Field ("out" ).Resolve ()
211
+ decoded := bufferOrigin
212
+ SUBQ (ctxout .Addr , decoded )
229
213
SHLQ (U8 (2 ), decoded ) // decoded *= 4
230
214
231
215
Store (decoded , ctx .Field ("decoded" ))
@@ -234,7 +218,7 @@ func (d decompress4x) generateProcedure4x8bit(name string) {
234
218
}
235
219
236
220
func (d decompress4x ) decodeFourValues (id int , br , peekBits , table , buffer , exhausted reg.GPVirtual ) {
237
- brValue , brBitsRead := d .fillFast32 (id + 1000 , 32 , br , exhausted )
221
+ brValue , brBitsRead := d .fillFast32 (id , 32 , br , exhausted )
238
222
239
223
decompress := func (valID int , outByte reg.Register ) {
240
224
CX := reg .CL
@@ -269,9 +253,10 @@ func (d decompress4x) decodeFourValues(id int, br, peekBits, table, buffer, exha
269
253
Comment ("out[id * dstEvery + 4] = uint8(v3.entry >> 8)" )
270
254
MOVL (out .As32 (), Mem {Base : buffer })
271
255
272
- Comment ("update the bitreader reader structure" )
273
- MOVQ (brValue , Mem {Base : br , Disp : bitReader_value })
274
- MOVB (brBitsRead .As8 (), Mem {Base : br , Disp : bitReader_bitsRead })
256
+ Comment ("update the bitreader structure" )
257
+ offset := id * bitReader__size
258
+ MOVQ (brValue , Mem {Base : br , Disp : offset + bitReader_value })
259
+ MOVB (brBitsRead .As8 (), Mem {Base : br , Disp : offset + bitReader_bitsRead })
275
260
}
276
261
277
262
func (d decompress4x ) fillFast32 (id , atLeast int , br , exhausted reg.GPVirtual ) (brValue , brBitsRead reg.GPVirtual ) {
@@ -281,14 +266,15 @@ func (d decompress4x) fillFast32(id, atLeast int, br, exhausted reg.GPVirtual) (
281
266
Commentf ("br%d.fillFast32()" , id )
282
267
brValue = GP64 ()
283
268
brBitsRead = GP64 ()
284
- MOVQ (Mem {Base : br , Disp : bitReader_value }, brValue )
285
- MOVBQZX (Mem {Base : br , Disp : bitReader_bitsRead }, brBitsRead )
269
+ offset := bitReader__size * id
270
+ MOVQ (Mem {Base : br , Disp : offset + bitReader_value }, brValue )
271
+ MOVBQZX (Mem {Base : br , Disp : offset + bitReader_bitsRead }, brBitsRead )
286
272
287
273
// We must have at least 2 * max tablelog left
288
274
CMPQ (brBitsRead , U8 (64 - atLeast ))
289
275
JBE (LabelRef ("skip_fill" + strconv .Itoa (id )))
290
276
brOffset := GP64 ()
291
- MOVQ (Mem {Base : br , Disp : bitReader_off }, brOffset )
277
+ MOVQ (Mem {Base : br , Disp : offset + bitReader_off }, brOffset )
292
278
293
279
SUBQ (U8 (32 ), brBitsRead ) // b.bitsRead -= 32
294
280
SUBQ (U8 (4 ), brOffset ) // b.off -= 4
@@ -297,7 +283,7 @@ func (d decompress4x) fillFast32(id, atLeast int, br, exhausted reg.GPVirtual) (
297
283
// v = v[:4]
298
284
// low := (uint32(v[0])) | (uint32(v[1]) << 8) | (uint32(v[2]) << 16) | (uint32(v[3]) << 24)
299
285
tmp := GP64 ()
300
- MOVQ (Mem {Base : br , Disp : bitReader_in }, tmp )
286
+ MOVQ (Mem {Base : br , Disp : offset + bitReader_in }, tmp )
301
287
302
288
Comment ("b.value |= uint64(low) << (b.bitsRead & 63)" )
303
289
addr := Mem {Base : brOffset , Index : tmp .As64 (), Scale : 1 }
@@ -306,7 +292,7 @@ func (d decompress4x) fillFast32(id, atLeast int, br, exhausted reg.GPVirtual) (
306
292
MOVQ (brBitsRead , CX .As64 ())
307
293
SHLQ (CX , tmp .As64 ())
308
294
309
- MOVQ (brOffset , Mem {Base : br , Disp : bitReader_off })
295
+ MOVQ (brOffset , Mem {Base : br , Disp : offset + bitReader_off })
310
296
ORQ (tmp .As64 (), brValue )
311
297
{
312
298
Commentf ("exhausted = exhausted || (br%d.off < 4)" , id )
@@ -474,11 +460,9 @@ func (d decompress1x) generateProcedure(name string) {
474
460
{
475
461
// calculate decoded as current `out` - initial `out`
476
462
ctx := Dereference (Param ("ctx" ))
477
- decoded := GP64 ()
478
- tmp := GP64 ()
479
- MOVQ (buffer , decoded )
480
- Load (ctx .Field ("out" ), tmp )
481
- SUBQ (tmp , decoded )
463
+ ctxout , _ := ctx .Field ("out" ).Resolve ()
464
+ decoded := buffer
465
+ SUBQ (ctxout .Addr , decoded )
482
466
Store (decoded , ctx .Field ("decoded" ))
483
467
484
468
pbr := Dereference (ctx .Field ("pbr" ))
0 commit comments