[dev.ssa] cmd/compile/ssa: implement OLEN

Change-Id: Ie23b13142fd820d7071a348a8370175e58b76d64
Reviewed-on: https://go-review.googlesource.com/11878
Reviewed-by: Keith Randall <khr@golang.org>
diff --git a/src/cmd/compile/internal/gc/ssa.go b/src/cmd/compile/internal/gc/ssa.go
index 14c39d3..1be5f0c 100644
--- a/src/cmd/compile/internal/gc/ssa.go
+++ b/src/cmd/compile/internal/gc/ssa.go
@@ -521,6 +521,16 @@
 			return s.newValue2(ssa.OpLoad, n.Left.Type.Type, p, s.mem())
 		}
 
+	case OLEN:
+		switch {
+		case n.Left.Type.Bound < 0: // slice
+			return s.newValue1(ssa.OpSliceLen, s.config.Uintptr, s.expr(n.Left))
+		case n.Left.Type.IsString(): // string
+			return s.newValue1(ssa.OpStringLen, s.config.Uintptr, s.expr(n.Left))
+		default: // array
+			return s.constInt(s.config.Uintptr, n.Left.Type.Bound)
+		}
+
 	case OCALLFUNC:
 		static := n.Left.Op == ONAME && n.Left.Class == PFUNC