From: Josh Bleecher Snyder Date: Sat, 4 Jul 2015 01:41:28 +0000 (-0700) Subject: [dev.ssa] cmd/compile/ssa: implement OLEN X-Git-Tag: go1.7beta1~1623^2^2~408 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=cc3f031a319195928e2dbf2b65bff59e8d9226ca;p=gostls13.git [dev.ssa] cmd/compile/ssa: implement OLEN Change-Id: Ie23b13142fd820d7071a348a8370175e58b76d64 Reviewed-on: https://go-review.googlesource.com/11878 Reviewed-by: Keith Randall --- diff --git a/src/cmd/compile/internal/gc/ssa.go b/src/cmd/compile/internal/gc/ssa.go index 14c39d337f..1be5f0cb85 100644 --- a/src/cmd/compile/internal/gc/ssa.go +++ b/src/cmd/compile/internal/gc/ssa.go @@ -521,6 +521,16 @@ func (s *state) expr(n *Node) *ssa.Value { 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