aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorJosh Bleecher Snyder <josharian@gmail.com>2015-07-28 12:37:46 -0700
committerJosh Bleecher Snyder <josharian@gmail.com>2015-07-28 21:09:37 +0000
commit25d1916816c7fae4049b47efdc5fde37ce4a9be1 (patch)
tree69c3d634b95ad494f6772148eba659186a1ae78b /src
parent71a4c4bb8d20e2ea7f4aa9f34b2a3c833de372f8 (diff)
downloadgo-25d1916816c7fae4049b47efdc5fde37ce4a9be1.tar.xz
[dev.ssa] cmd/compile: implement OINDREG in expr context
Change-Id: I1922656c99773255e5bc15b5a2bd79f19a2fe82c Reviewed-on: https://go-review.googlesource.com/12796 Reviewed-by: Keith Randall <khr@golang.org>
Diffstat (limited to 'src')
-rw-r--r--src/cmd/compile/internal/gc/ssa.go14
1 files changed, 13 insertions, 1 deletions
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() {