Skip to content

Commit 1e3d646

Browse files
committed
Inlining regstry.Set*
regstry.Set* were very simple functions at the beginning of the project, but recently not. It seems inlining these functions make improvements better.
1 parent 9d7d921 commit 1e3d646

File tree

4 files changed

+945
-132
lines changed

4 files changed

+945
-132
lines changed

_state.go

+24-23
Original file line numberDiff line numberDiff line change
@@ -398,25 +398,26 @@ func (rg *registry) forceResize(newSize int) {
398398
copy(newSlice, rg.array[:rg.top]) // should we copy the area beyond top? there shouldn't be any valid values there so it shouldn't be necessary.
399399
rg.array = newSlice
400400
}
401-
func (rg *registry) SetTop(top int) {
402-
// +inline-call rg.checkSize top
403-
oldtop := rg.top
404-
rg.top = top
405-
for i := oldtop; i < rg.top; i++ {
401+
402+
func (rg *registry) SetTop(topi int) { // +inline-start
403+
// +inline-call rg.checkSize topi
404+
oldtopi := rg.top
405+
rg.top = topi
406+
for i := oldtopi; i < rg.top; i++ {
406407
rg.array[i] = LNil
407408
}
408409
// values beyond top don't need to be valid LValues, so setting them to nil is fine
409410
// setting them to nil rather than LNil lets us invoke the golang memclr opto
410-
if rg.top < oldtop {
411-
nilRange := rg.array[rg.top:oldtop]
411+
if rg.top < oldtopi {
412+
nilRange := rg.array[rg.top:oldtopi]
412413
for i := range nilRange {
413414
nilRange[i] = nil
414415
}
415416
}
416417
//for i := rg.top; i < oldtop; i++ {
417418
// rg.array[i] = LNil
418419
//}
419-
}
420+
} // +inline-end
420421

421422
func (rg *registry) Top() int {
422423
return rg.top
@@ -498,34 +499,34 @@ func (rg *registry) FillNil(regm, n int) { // +inline-start
498499
func (rg *registry) Insert(value LValue, reg int) {
499500
top := rg.Top()
500501
if reg >= top {
501-
rg.Set(reg, value)
502+
// +inline-call rg.Set reg value
502503
return
503504
}
504505
top--
505506
for ; top >= reg; top-- {
506507
// FIXME consider using copy() here if Insert() is called enough
507-
rg.Set(top+1, rg.Get(top))
508+
// +inline-call rg.Set top+1 rg.Get(top)
508509
}
509-
rg.Set(reg, value)
510+
// +inline-call rg.Set reg value
510511
}
511512

512-
func (rg *registry) Set(reg int, val LValue) {
513-
newSize := reg + 1
513+
func (rg *registry) Set(regi int, vali LValue) { // +inline-start
514+
newSize := regi + 1
514515
// +inline-call rg.checkSize newSize
515-
rg.array[reg] = val
516-
if reg >= rg.top {
517-
rg.top = reg + 1
516+
rg.array[regi] = vali
517+
if regi >= rg.top {
518+
rg.top = regi + 1
518519
}
519-
}
520+
} // +inline-end
520521

521-
func (rg *registry) SetNumber(reg int, val LNumber) {
522-
newSize := reg + 1
522+
func (rg *registry) SetNumber(regi int, vali LNumber) { // +inline-start
523+
newSize := regi + 1
523524
// +inline-call rg.checkSize newSize
524-
rg.array[reg] = rg.alloc.LNumber2I(val)
525-
if reg >= rg.top {
526-
rg.top = reg + 1
525+
rg.array[regi] = rg.alloc.LNumber2I(vali)
526+
if regi >= rg.top {
527+
rg.top = regi + 1
527528
}
528-
}
529+
} // +inline-end
529530

530531
func (rg *registry) IsFull() bool {
531532
return rg.top >= cap(rg.array)

_vm.go

+58-42
Original file line numberDiff line numberDiff line change
@@ -173,7 +173,8 @@ func init() {
173173
A := int(inst>>18) & 0xff //GETA
174174
RA := lbase + A
175175
B := int(inst & 0x1ff) //GETB
176-
reg.Set(RA, reg.Get(lbase+B))
176+
v := reg.Get(lbase + B)
177+
// +inline-call reg.Set RA v
177178
return 0
178179
},
179180
func(L *LState, inst uint32, baseframe *callFrame) int { //OP_MOVEN
@@ -183,15 +184,17 @@ func init() {
183184
A := int(inst>>18) & 0xff //GETA
184185
B := int(inst & 0x1ff) //GETB
185186
C := int(inst>>9) & 0x1ff //GETC
186-
reg.Set(lbase+A, reg.Get(lbase+B))
187+
v := reg.Get(lbase + B)
188+
// +inline-call reg.Set lbase+A v
187189
code := cf.Fn.Proto.Code
188190
pc := cf.Pc
189191
for i := 0; i < C; i++ {
190192
inst = code[pc]
191193
pc++
192194
A = int(inst>>18) & 0xff //GETA
193195
B = int(inst & 0x1ff) //GETB
194-
reg.Set(lbase+A, reg.Get(lbase+B))
196+
v := reg.Get(lbase + B)
197+
// +inline-call reg.Set lbase+A v
195198
}
196199
cf.Pc = pc
197200
return 0
@@ -203,7 +206,8 @@ func init() {
203206
A := int(inst>>18) & 0xff //GETA
204207
RA := lbase + A
205208
Bx := int(inst & 0x3ffff) //GETBX
206-
reg.Set(RA, cf.Fn.Proto.Constants[Bx])
209+
v := cf.Fn.Proto.Constants[Bx]
210+
// +inline-call reg.Set RA v
207211
return 0
208212
},
209213
func(L *LState, inst uint32, baseframe *callFrame) int { //OP_LOADBOOL
@@ -215,9 +219,9 @@ func init() {
215219
B := int(inst & 0x1ff) //GETB
216220
C := int(inst>>9) & 0x1ff //GETC
217221
if B != 0 {
218-
reg.Set(RA, LTrue)
222+
// +inline-call reg.Set RA LTrue
219223
} else {
220-
reg.Set(RA, LFalse)
224+
// +inline-call reg.Set RA LFalse
221225
}
222226
if C != 0 {
223227
cf.Pc++
@@ -232,7 +236,7 @@ func init() {
232236
RA := lbase + A
233237
B := int(inst & 0x1ff) //GETB
234238
for i := RA; i <= lbase+B; i++ {
235-
reg.Set(i, LNil)
239+
// +inline-call reg.Set i LNil
236240
}
237241
return 0
238242
},
@@ -243,7 +247,8 @@ func init() {
243247
A := int(inst>>18) & 0xff //GETA
244248
RA := lbase + A
245249
B := int(inst & 0x1ff) //GETB
246-
reg.Set(RA, cf.Fn.Upvalues[B].Value())
250+
v := cf.Fn.Upvalues[B].Value()
251+
// +inline-call reg.Set RA v
247252
return 0
248253
},
249254
func(L *LState, inst uint32, baseframe *callFrame) int { //OP_GETGLOBAL
@@ -254,7 +259,8 @@ func init() {
254259
RA := lbase + A
255260
Bx := int(inst & 0x3ffff) //GETBX
256261
//reg.Set(RA, L.getField(cf.Fn.Env, cf.Fn.Proto.Constants[Bx]))
257-
reg.Set(RA, L.getFieldString(cf.Fn.Env, cf.Fn.Proto.stringConstants[Bx]))
262+
v := L.getFieldString(cf.Fn.Env, cf.Fn.Proto.stringConstants[Bx])
263+
// +inline-call reg.Set RA v
258264
return 0
259265
},
260266
func(L *LState, inst uint32, baseframe *callFrame) int { //OP_GETTABLE
@@ -265,7 +271,8 @@ func init() {
265271
RA := lbase + A
266272
B := int(inst & 0x1ff) //GETB
267273
C := int(inst>>9) & 0x1ff //GETC
268-
reg.Set(RA, L.getField(reg.Get(lbase+B), L.rkValue(C)))
274+
v := L.getField(reg.Get(lbase+B), L.rkValue(C))
275+
// +inline-call reg.Set RA v
269276
return 0
270277
},
271278
func(L *LState, inst uint32, baseframe *callFrame) int { //OP_GETTABLEKS
@@ -276,7 +283,8 @@ func init() {
276283
RA := lbase + A
277284
B := int(inst & 0x1ff) //GETB
278285
C := int(inst>>9) & 0x1ff //GETC
279-
reg.Set(RA, L.getFieldString(reg.Get(lbase+B), L.rkString(C)))
286+
v := L.getFieldString(reg.Get(lbase+B), L.rkString(C))
287+
// +inline-call reg.Set RA v
280288
return 0
281289
},
282290
func(L *LState, inst uint32, baseframe *callFrame) int { //OP_SETGLOBAL
@@ -330,7 +338,8 @@ func init() {
330338
RA := lbase + A
331339
B := int(inst & 0x1ff) //GETB
332340
C := int(inst>>9) & 0x1ff //GETC
333-
reg.Set(RA, newLTable(B, C))
341+
v := newLTable(B, C)
342+
// +inline-call reg.Set RA v
334343
return 0
335344
},
336345
func(L *LState, inst uint32, baseframe *callFrame) int { //OP_SELF
@@ -342,8 +351,9 @@ func init() {
342351
B := int(inst & 0x1ff) //GETB
343352
C := int(inst>>9) & 0x1ff //GETC
344353
selfobj := reg.Get(lbase + B)
345-
reg.Set(RA, L.getFieldString(selfobj, L.rkString(C)))
346-
reg.Set(RA+1, selfobj)
354+
v := L.getFieldString(selfobj, L.rkString(C))
355+
// +inline-call reg.Set RA v
356+
// +inline-call reg.Set RA+1 selfobj
347357
return 0
348358
},
349359
opArith, // OP_ADD
@@ -361,17 +371,17 @@ func init() {
361371
B := int(inst & 0x1ff) //GETB
362372
unaryv := L.rkValue(B)
363373
if nm, ok := unaryv.(LNumber); ok {
364-
reg.SetNumber(RA, -nm)
374+
// +inline-call reg.Set RA -nm
365375
} else {
366376
op := L.metaOp1(unaryv, "__unm")
367377
if op.Type() == LTFunction {
368378
reg.Push(op)
369379
reg.Push(unaryv)
370380
L.Call(1, 1)
371-
reg.Set(RA, reg.Pop())
381+
// +inline-call reg.Set RA reg.Pop()
372382
} else if str, ok1 := unaryv.(LString); ok1 {
373383
if num, err := parseNumber(string(str)); err == nil {
374-
reg.Set(RA, -num)
384+
// +inline-call reg.Set RA -num
375385
} else {
376386
L.RaiseError("__unm undefined")
377387
}
@@ -389,9 +399,9 @@ func init() {
389399
RA := lbase + A
390400
B := int(inst & 0x1ff) //GETB
391401
if LVIsFalse(reg.Get(lbase + B)) {
392-
reg.Set(RA, LTrue)
402+
// +inline-call reg.Set RA LTrue
393403
} else {
394-
reg.Set(RA, LFalse)
404+
// +inline-call reg.Set RA LFalse
395405
}
396406
return 0
397407
},
@@ -404,7 +414,7 @@ func init() {
404414
B := int(inst & 0x1ff) //GETB
405415
switch lv := L.rkValue(B).(type) {
406416
case LString:
407-
reg.SetNumber(RA, LNumber(len(lv)))
417+
// +inline-call reg.SetNumber RA LNumber(len(lv))
408418
default:
409419
op := L.metaOp1(lv, "__len")
410420
if op.Type() == LTFunction {
@@ -413,12 +423,13 @@ func init() {
413423
L.Call(1, 1)
414424
ret := reg.Pop()
415425
if ret.Type() == LTNumber {
416-
reg.SetNumber(RA, ret.(LNumber))
426+
v, _ := ret.(LNumber)
427+
// +inline-call reg.SetNumber RA v
417428
} else {
418-
reg.Set(RA, ret)
429+
// +inline-call reg.Set RA ret
419430
}
420431
} else if lv.Type() == LTTable {
421-
reg.SetNumber(RA, LNumber(lv.(*LTable).Len()))
432+
// +inline-call reg.SetNumber RA LNumber(lv.(*LTable).Len())
422433
} else {
423434
L.RaiseError("__len undefined")
424435
}
@@ -435,7 +446,8 @@ func init() {
435446
C := int(inst>>9) & 0x1ff //GETC
436447
RC := lbase + C
437448
RB := lbase + B
438-
reg.Set(RA, stringConcat(L, RC-RB+1, RC))
449+
v := stringConcat(L, RC-RB+1, RC)
450+
// +inline-call reg.Set RA v
439451
return 0
440452
},
441453
func(L *LState, inst uint32, baseframe *callFrame) int { //OP_JMP
@@ -538,7 +550,7 @@ func init() {
538550
B := int(inst & 0x1ff) //GETB
539551
C := int(inst>>9) & 0x1ff //GETC
540552
if value := reg.Get(lbase + B); LVAsBool(value) != (C == 0) {
541-
reg.Set(RA, value)
553+
// +inline-call reg.Set RA value
542554
} else {
543555
cf.Pc++
544556
}
@@ -677,13 +689,14 @@ func init() {
677689
if limit, ok2 := reg.Get(RA + 1).assertFloat64(); ok2 {
678690
if step, ok3 := reg.Get(RA + 2).assertFloat64(); ok3 {
679691
init += step
680-
reg.SetNumber(RA, LNumber(init))
692+
v := LNumber(init)
693+
// +inline-call reg.SetNumber RA v
681694
if (step > 0 && init <= limit) || (step <= 0 && init >= limit) {
682695
Sbx := int(inst&0x3ffff) - opMaxArgSbx //GETSBX
683696
cf.Pc += Sbx
684-
reg.SetNumber(RA+3, LNumber(init))
697+
// +inline-call reg.SetNumber RA+3 v
685698
} else {
686-
reg.SetTop(RA + 1)
699+
// +inline-call reg.SetTop RA+1
687700
}
688701
} else {
689702
L.RaiseError("for statement step must be a number")
@@ -705,7 +718,7 @@ func init() {
705718
Sbx := int(inst&0x3ffff) - opMaxArgSbx //GETSBX
706719
if init, ok1 := reg.Get(RA).assertFloat64(); ok1 {
707720
if step, ok2 := reg.Get(RA + 2).assertFloat64(); ok2 {
708-
reg.SetNumber(RA, LNumber(init-step))
721+
// +inline-call reg.SetNumber RA LNumber(init-step)
709722
} else {
710723
L.RaiseError("for statement step must be a number")
711724
}
@@ -723,13 +736,13 @@ func init() {
723736
RA := lbase + A
724737
C := int(inst>>9) & 0x1ff //GETC
725738
nret := C
726-
reg.SetTop(RA + 3 + 2)
727-
reg.Set(RA+3+2, reg.Get(RA+2))
728-
reg.Set(RA+3+1, reg.Get(RA+1))
729-
reg.Set(RA+3, reg.Get(RA))
739+
// +inline-call reg.SetTop RA+3+2
740+
// +inline-call reg.Set RA+3+2 reg.Get(RA+2)
741+
// +inline-call reg.Set RA+3+1 reg.Get(RA+1)
742+
// +inline-call reg.Set RA+3 reg.Get(RA)
730743
L.callR(2, nret, RA+3)
731744
if value := reg.Get(RA + 3); value != LNil {
732-
reg.Set(RA+2, value)
745+
// +inline-call reg.Set RA+2 value
733746
pc := cf.Fn.Proto.Code[cf.Pc]
734747
cf.Pc += int(pc&0x3ffff) - opMaxArgSbx
735748
}
@@ -776,7 +789,7 @@ func init() {
776789
Bx := int(inst & 0x3ffff) //GETBX
777790
proto := cf.Fn.Proto.FunctionPrototypes[Bx]
778791
closure := newLFunctionL(proto, cf.Fn.Env, int(proto.NumUpvalues))
779-
reg.Set(RA, closure)
792+
// +inline-call reg.Set RA closure
780793
for i := 0; i < int(proto.NumUpvalues); i++ {
781794
inst = cf.Fn.Proto.Code[cf.Pc]
782795
cf.Pc++
@@ -829,9 +842,11 @@ func opArith(L *LState, inst uint32, baseframe *callFrame) int { //OP_ADD, OP_SU
829842
v1, ok1 := lhs.assertFloat64()
830843
v2, ok2 := rhs.assertFloat64()
831844
if ok1 && ok2 {
832-
reg.SetNumber(RA, numberArith(L, opcode, LNumber(v1), LNumber(v2)))
845+
v := numberArith(L, opcode, LNumber(v1), LNumber(v2))
846+
// +inline-call reg.SetNumber RA v
833847
} else {
834-
reg.Set(RA, objectArith(L, opcode, lhs, rhs))
848+
v := objectArith(L, opcode, lhs, rhs)
849+
// +inline-call reg.Set RA v
835850
}
836851
return 0
837852
}
@@ -884,19 +899,19 @@ func objectArith(L *LState, opcode int, lhs, rhs LValue) LValue {
884899
event = "__pow"
885900
}
886901
op := L.metaOp2(lhs, rhs, event)
887-
if op.Type() == LTFunction {
902+
if _, ok := op.assertFunction(); ok {
888903
L.reg.Push(op)
889904
L.reg.Push(lhs)
890905
L.reg.Push(rhs)
891906
L.Call(2, 1)
892907
return L.reg.Pop()
893908
}
894-
if str, ok := lhs.(LString); ok {
909+
if str, ok := lhs.assertString(); ok {
895910
if lnum, err := parseNumber(string(str)); err == nil {
896911
lhs = lnum
897912
}
898913
}
899-
if str, ok := rhs.(LString); ok {
914+
if str, ok := rhs.assertString(); ok {
900915
if rnum, err := parseNumber(string(str)); err == nil {
901916
rhs = rnum
902917
}
@@ -972,12 +987,13 @@ func lessThan(L *LState, lhs, rhs LValue) bool {
972987
}
973988

974989
func equals(L *LState, lhs, rhs LValue, raw bool) bool {
975-
if lhs.Type() != rhs.Type() {
990+
lt := lhs.Type()
991+
if lt != rhs.Type() {
976992
return false
977993
}
978994

979995
ret := false
980-
switch lhs.Type() {
996+
switch lt {
981997
case LTNil:
982998
ret = true
983999
case LTNumber:

0 commit comments

Comments
 (0)