There's no need for special ops for panicindex and panicslice.
Just use regular runtime calls.
Change-Id: I71b9b73f4f1ebce1220fdc1e7b7f65cfcf4b7bae
Reviewed-on: https://go-review.googlesource.com/14726
Reviewed-by: David Chase <drchase@google.com>
// bounds check
cmp := s.newValue2(ssa.OpIsInBounds, Types[TBOOL], idx, len)
- s.check(cmp, ssa.OpPanicIndexCheck)
+ s.check(cmp, Panicindex)
}
// sliceBoundsCheck generates slice bounds checking code. Checks if 0 <= idx <= len, branches to exit if not.
// bounds check
cmp := s.newValue2(ssa.OpIsSliceInBounds, Types[TBOOL], idx, len)
- s.check(cmp, ssa.OpPanicSliceCheck)
+ s.check(cmp, panicslice)
}
-// If cmp (a bool) is true, panic using the given op.
-func (s *state) check(cmp *ssa.Value, panicOp ssa.Op) {
+// If cmp (a bool) is true, panic using the given function.
+func (s *state) check(cmp *ssa.Value, fn *Node) {
b := s.endBlock()
b.Kind = ssa.BlockIf
b.Control = cmp
b.AddEdgeTo(bNext)
b.AddEdgeTo(bPanic)
s.startBlock(bPanic)
- // The panic check takes/returns memory to ensure that the right
+ // The panic call takes/returns memory to ensure that the right
// memory state is observed if the panic happens.
- chk := s.newValue1(panicOp, ssa.TypeMem, s.mem())
- s.endBlock()
- bPanic.Kind = ssa.BlockExit
- bPanic.Control = chk
+ s.rtcall(fn, false, nil)
+
s.startBlock(bNext)
}
q.From.Reg = x86.REG_AX
q.To.Type = obj.TYPE_MEM
q.To.Reg = r
- case ssa.OpAMD64LoweredPanicIndexCheck:
- p := Prog(obj.ACALL)
- p.To.Type = obj.TYPE_MEM
- p.To.Name = obj.NAME_EXTERN
- p.To.Sym = Linksym(Panicindex.Sym)
- case ssa.OpAMD64LoweredPanicSliceCheck:
- p := Prog(obj.ACALL)
- p.To.Type = obj.TYPE_MEM
- p.To.Name = obj.NAME_EXTERN
- p.To.Sym = Linksym(panicslice.Sym)
case ssa.OpAMD64LoweredGetG:
r := regnum(v)
// See the comments in cmd/internal/obj/x86/obj6.go
(IsSliceInBounds idx len) -> (SETBE (CMPQ idx len))
(PanicNilCheck ptr mem) -> (LoweredPanicNilCheck ptr mem)
-(PanicIndexCheck mem) -> (LoweredPanicIndexCheck mem)
-(PanicSliceCheck mem) -> (LoweredPanicSliceCheck mem)
(GetG) -> (LoweredGetG)
(Move [size] dst src mem) -> (REPMOVSB dst src (MOVQconst <config.Frontend().TypeUInt64()> [size]) mem)
// Pseudo-ops
{name: "LoweredPanicNilCheck", reg: gp10},
- {name: "LoweredPanicIndexCheck"},
- {name: "LoweredPanicSliceCheck"},
{name: "LoweredGetG", reg: gp01},
}
{name: "IsSliceInBounds", typ: "Bool"}, // 0 <= arg0 <= arg1
// Pseudo-ops
- {name: "PanicNilCheck"}, // trigger a dereference fault; arg0=nil ptr, arg1=mem, returns mem
- {name: "PanicIndexCheck"}, // trigger a bounds check failure, arg0=mem, returns mem
- {name: "PanicSliceCheck"}, // trigger a slice bounds check failure, arg0=mem, returns mem
- {name: "GetG"}, // runtime.getg() (read g pointer)
+ {name: "PanicNilCheck"}, // trigger a dereference fault; arg0=nil ptr, arg1=mem, returns mem
+ {name: "GetG"}, // runtime.getg() (read g pointer)
// Indexing operations
{name: "ArrayIndex"}, // arg0=array, arg1=index. Returns a[i]
OpAMD64REPMOVSB
OpAMD64InvertFlags
OpAMD64LoweredPanicNilCheck
- OpAMD64LoweredPanicIndexCheck
- OpAMD64LoweredPanicSliceCheck
OpAMD64LoweredGetG
OpAdd8
OpIsInBounds
OpIsSliceInBounds
OpPanicNilCheck
- OpPanicIndexCheck
- OpPanicSliceCheck
OpGetG
OpArrayIndex
OpPtrIndex
},
},
},
- {
- name: "LoweredPanicIndexCheck",
- reg: regInfo{},
- },
- {
- name: "LoweredPanicSliceCheck",
- reg: regInfo{},
- },
{
name: "LoweredGetG",
reg: regInfo{
name: "PanicNilCheck",
generic: true,
},
- {
- name: "PanicIndexCheck",
- generic: true,
- },
- {
- name: "PanicSliceCheck",
- generic: true,
- },
{
name: "GetG",
generic: true,
goto end6f8a8c559a167d1f0a5901d09a1fb248
end6f8a8c559a167d1f0a5901d09a1fb248:
;
- case OpPanicIndexCheck:
- // match: (PanicIndexCheck mem)
- // cond:
- // result: (LoweredPanicIndexCheck mem)
- {
- mem := v.Args[0]
- v.Op = OpAMD64LoweredPanicIndexCheck
- v.AuxInt = 0
- v.Aux = nil
- v.resetArgs()
- v.AddArg(mem)
- return true
- }
- goto enda5014ba73d3550a5b66424044395c70f
- enda5014ba73d3550a5b66424044395c70f:
- ;
case OpPanicNilCheck:
// match: (PanicNilCheck ptr mem)
// cond:
goto enda02b1ad5a6f929b782190145f2c8628b
enda02b1ad5a6f929b782190145f2c8628b:
;
- case OpPanicSliceCheck:
- // match: (PanicSliceCheck mem)
- // cond:
- // result: (LoweredPanicSliceCheck mem)
- {
- mem := v.Args[0]
- v.Op = OpAMD64LoweredPanicSliceCheck
- v.AuxInt = 0
- v.Aux = nil
- v.resetArgs()
- v.AddArg(mem)
- return true
- }
- goto end238ed0074810b55bd2bba7b45cdeed68
- end238ed0074810b55bd2bba7b45cdeed68:
- ;
case OpRsh16Ux16:
// match: (Rsh16Ux16 <t> x y)
// cond: