From 25d1916816c7fae4049b47efdc5fde37ce4a9be1 Mon Sep 17 00:00:00 2001 From: Josh Bleecher Snyder Date: Tue, 28 Jul 2015 12:37:46 -0700 Subject: [PATCH] [dev.ssa] cmd/compile: implement OINDREG in expr context Change-Id: I1922656c99773255e5bc15b5a2bd79f19a2fe82c Reviewed-on: https://go-review.googlesource.com/12796 Reviewed-by: Keith Randall --- src/cmd/compile/internal/gc/ssa.go | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/src/cmd/compile/internal/gc/ssa.go b/src/cmd/compile/internal/gc/ssa.go index e435850b47..6866f4942e 100644 --- a/src/cmd/compile/internal/gc/ssa.go +++ b/src/cmd/compile/internal/gc/ssa.go @@ -1000,6 +1000,14 @@ func (s *state) expr(n *Node) *ssa.Value { case OADDR: return s.addr(n.Left) + case OINDREG: + if int(n.Reg) != Thearch.REGSP { + s.Unimplementedf("OINDREG of non-SP register %s in expr: %v", obj.Rconv(int(n.Reg)), n) + return nil + } + addr := s.entryNewValue1I(ssa.OpOffPtr, Ptrto(n.Type), n.Xoffset, s.sp) + return s.newValue2(ssa.OpLoad, n.Type, addr, s.mem()) + case OIND: p := s.expr(n.Left) s.nilCheck(p) @@ -1184,8 +1192,12 @@ func (s *state) addr(n *Node) *ssa.Value { return nil } case OINDREG: - // indirect off a register (TODO: always SP?) + // indirect off a register // used for storing/loading arguments/returns to/from callees + if int(n.Reg) != Thearch.REGSP { + s.Unimplementedf("OINDREG of non-SP register %s in addr: %v", obj.Rconv(int(n.Reg)), n) + return nil + } return s.entryNewValue1I(ssa.OpOffPtr, Ptrto(n.Type), n.Xoffset, s.sp) case OINDEX: if n.Left.Type.IsSlice() {