The go:nosplit change wasn't the problem, reinstating.
««« original CL description
undo CL 
93380044 / 
7f0999348917
Partial undo, just of go:nosplit annotation.  Somehow it
is breaking the windows builders.
TBR=bradfitz
««« original CL description
runtime: implement string ops in Go
Also implement go:nosplit annotation.  Not really needed
for now, but we'll definitely need it for other conversions.
benchmark                 old ns/op     new ns/op     delta
BenchmarkRuneIterate      534           474           -11.24%
BenchmarkRuneIterate2     535           470           -12.15%
LGTM=bradfitz
R=golang-codereviews, dave, bradfitz, minux
CC=golang-codereviews
https://golang.org/cl/
93380044
»»»
TBR=bradfitz
CC=golang-codereviews
https://golang.org/cl/
105260044
»»»
TBR=bradfitz
R=bradfitz, golang-codereviews
CC=golang-codereviews
https://golang.org/cl/
103490043
 
 
                if(t->funarg) {
                        fmtstrcpy(fp, "(");
-                       if(fmtmode == FTypeId || fmtmode == FErr) {     // no argument names on function signature, and no "noescape" tags
+                       if(fmtmode == FTypeId || fmtmode == FErr) {     // no argument names on function signature, and no "noescape"/"nosplit" tags
                                for(t1=t->type; t1!=T; t1=t1->down)
                                        if(t1->down)
                                                fmtprint(fp, "%hT, ", t1);
 
        uchar   colas;          // OAS resulting from :=
        uchar   diag;           // already printed error about this
        uchar   noescape;       // func arguments do not escape
+       uchar   nosplit;        // func should not execute on separate stack
        uchar   builtin;        // built-in name, like len or close
        uchar   walkdef;
        uchar   typecheck;
 EXTERN int     flag_race;
 EXTERN int     flag_largemodel;
 EXTERN int     noescape;
+EXTERN int     nosplit;
 EXTERN int     debuglive;
 EXTERN Link*   ctxt;
 
 
                $$->nbody = $3;
                $$->endlineno = lineno;
                $$->noescape = noescape;
+               $$->nosplit = nosplit;
                funcbody($$);
        }
 
                        testdclstack();
                nointerface = 0;
                noescape = 0;
+               nosplit = 0;
        }
 
 vardcl_list:
 
                noescape = 1;
                goto out;
        }
+       if(strcmp(lexbuf, "go:nosplit") == 0) {
+               nosplit = 1;
+               goto out;
+       }
        
 out:
        return c;
 
                ptxt->TEXTFLAG |= WRAPPER;
        if(fn->needctxt)
                ptxt->TEXTFLAG |= NEEDCTXT;
+       if(fn->nosplit)
+               ptxt->TEXTFLAG |= NOSPLIT;
 
        // Clumsy but important.
        // See test/recover.go for test cases and src/pkg/reflect/value.go
 
                (yyval.node)->nbody = (yyvsp[(3) - (3)].list);
                (yyval.node)->endlineno = lineno;
                (yyval.node)->noescape = noescape;
+               (yyval.node)->nosplit = nosplit;
                funcbody((yyval.node));
        }
     break;
                        testdclstack();
                nointerface = 0;
                noescape = 0;
+               nosplit = 0;
        }
     break;