]> Cypherpunks repositories - gostls13.git/commitdiff
[dev.ssa] cmd/compile: implement OINDREG in expr context
authorJosh Bleecher Snyder <josharian@gmail.com>
Tue, 28 Jul 2015 19:37:46 +0000 (12:37 -0700)
committerJosh Bleecher Snyder <josharian@gmail.com>
Tue, 28 Jul 2015 21:09:37 +0000 (21:09 +0000)
Change-Id: I1922656c99773255e5bc15b5a2bd79f19a2fe82c
Reviewed-on: https://go-review.googlesource.com/12796
Reviewed-by: Keith Randall <khr@golang.org>
src/cmd/compile/internal/gc/ssa.go

index e435850b4737bf7799c4f6ca166de781ca31820a..6866f4942ecf82a1c4f878a5535303a52d75753d 100644 (file)
@@ -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() {