Пример #1
0
func (yyrcvr *yyParserImpl) Parse(yylex yyLexer) int {
	var yyn int
	var yylval yySymType
	var yyVAL yySymType
	var yyDollar []yySymType
	yyS := make([]yySymType, yyMaxDepth)

	Nerrs := 0   /* number of errors */
	Errflag := 0 /* error recovery flag */
	yystate := 0
	yychar := -1
	yytoken := -1 // yychar translated into internal numbering
	yyrcvr.lookahead = func() int { return yychar }
	defer func() {
		// Make sure we report no lookahead when not parsing.
		yychar = -1
		yytoken = -1
	}()
	yyp := -1
	goto yystack

ret0:
	return 0

ret1:
	return 1

yystack:
	/* put a state and value onto the stack */
	if yyDebug >= 4 {
		__yyfmt__.Printf("char %v in %v\n", yyTokname(yytoken), yyStatname(yystate))
	}

	yyp++
	if yyp >= len(yyS) {
		nyys := make([]yySymType, len(yyS)*2)
		copy(nyys, yyS)
		yyS = nyys
	}
	yyS[yyp] = yyVAL
	yyS[yyp].yys = yystate

yynewstate:
	yyn = yyPact[yystate]
	if yyn <= yyFlag {
		goto yydefault /* simple state */
	}
	if yychar < 0 {
		yychar, yytoken = yylex1(yylex, &yylval)
	}
	yyn += yytoken
	if yyn < 0 || yyn >= yyLast {
		goto yydefault
	}
	yyn = yyAct[yyn]
	if yyChk[yyn] == yytoken { /* valid shift */
		yychar = -1
		yytoken = -1
		yyVAL = yylval
		yystate = yyn
		if Errflag > 0 {
			Errflag--
		}
		goto yystack
	}

yydefault:
	/* default state action */
	yyn = yyDef[yystate]
	if yyn == -2 {
		if yychar < 0 {
			yychar, yytoken = yylex1(yylex, &yylval)
		}

		/* look through exception table */
		xi := 0
		for {
			if yyExca[xi+0] == -1 && yyExca[xi+1] == yystate {
				break
			}
			xi += 2
		}
		for xi += 2; ; xi += 2 {
			yyn = yyExca[xi+0]
			if yyn < 0 || yyn == yytoken {
				break
			}
		}
		yyn = yyExca[xi+1]
		if yyn < 0 {
			goto ret0
		}
	}
	if yyn == 0 {
		/* error ... attempt to resume parsing */
		switch Errflag {
		case 0: /* brand new error */
			yylex.Error("syntax error")
			Nerrs++
			if yyDebug >= 1 {
				__yyfmt__.Printf("%s", yyStatname(yystate))
				__yyfmt__.Printf(" saw %s\n", yyTokname(yytoken))
			}
			fallthrough

		case 1, 2: /* incompletely recovered error ... try again */
			Errflag = 3

			/* find a state where "error" is a legal shift action */
			for yyp >= 0 {
				yyn = yyPact[yyS[yyp].yys] + yyErrCode
				if yyn >= 0 && yyn < yyLast {
					yystate = yyAct[yyn] /* simulate a shift of "error" */
					if yyChk[yystate] == yyErrCode {
						goto yystack
					}
				}

				/* the current p has no shift on "error", pop stack */
				if yyDebug >= 2 {
					__yyfmt__.Printf("error recovery pops state %d\n", yyS[yyp].yys)
				}
				yyp--
			}
			/* there is no state on the stack with an error shift ... abort */
			goto ret1

		case 3: /* no shift yet; clobber input char */
			if yyDebug >= 2 {
				__yyfmt__.Printf("error recovery discards %s\n", yyTokname(yytoken))
			}
			if yytoken == yyEofCode {
				goto ret1
			}
			yychar = -1
			yytoken = -1
			goto yynewstate /* try again in the same state */
		}
	}

	/* reduction by production yyn */
	if yyDebug >= 2 {
		__yyfmt__.Printf("reduce %v in:\n\t%v\n", yyn, yyStatname(yystate))
	}

	yynt := yyn
	yypt := yyp
	_ = yypt // guard against "declared and not used"

	yyp -= yyR2[yyn]
	// yyp is now the index of $0. Perform the default action. Iff the
	// reduced production is ε, $1 is possibly out of range.
	if yyp+1 >= len(yyS) {
		nyys := make([]yySymType, len(yyS)*2)
		copy(nyys, yyS)
		yyS = nyys
	}
	yyVAL = yyS[yyp+1]

	/* consult goto table to find next state */
	yyn = yyR1[yyn]
	yyg := yyPgo[yyn]
	yyj := yyg + yyS[yyp].yys + 1

	if yyj >= yyLast {
		yystate = yyAct[yyg]
	} else {
		yystate = yyAct[yyj]
		if yyChk[yystate] != -yyn {
			yystate = yyAct[yyg]
		}
	}
	// dummy call; replaced with literal code
	switch yynt {

	case 2:
		yyDollar = yyS[yypt-1 : yypt+1]
		//line a.y:72
		{
			stmtline = asm.Lineno
		}
	case 4:
		yyDollar = yyS[yypt-2 : yypt+1]
		//line a.y:79
		{
			yyDollar[1].sym = asm.LabelLookup(yyDollar[1].sym)
			if yyDollar[1].sym.Type == LLAB && yyDollar[1].sym.Value != int64(asm.PC) {
				yyerror("redeclaration of %s", yyDollar[1].sym.Labelname)
			}
			yyDollar[1].sym.Type = LLAB
			yyDollar[1].sym.Value = int64(asm.PC)
		}
	case 6:
		yyDollar = yyS[yypt-4 : yypt+1]
		//line a.y:89
		{
			yyDollar[1].sym.Type = LVAR
			yyDollar[1].sym.Value = yyDollar[3].lval
		}
	case 7:
		yyDollar = yyS[yypt-4 : yypt+1]
		//line a.y:94
		{
			if yyDollar[1].sym.Value != yyDollar[3].lval {
				yyerror("redeclaration of %s", yyDollar[1].sym.Name)
			}
			yyDollar[1].sym.Value = yyDollar[3].lval
		}
	case 8:
		yyDollar = yyS[yypt-2 : yypt+1]
		//line a.y:101
		{
			nosched = int(yyDollar[1].lval)
		}
	case 12:
		yyDollar = yyS[yypt-4 : yypt+1]
		//line a.y:113
		{
			outcode(int(yyDollar[1].lval), &yyDollar[2].addr, 0, &yyDollar[4].addr)
		}
	case 13:
		yyDollar = yyS[yypt-4 : yypt+1]
		//line a.y:117
		{
			outcode(int(yyDollar[1].lval), &yyDollar[2].addr, 0, &yyDollar[4].addr)
		}
	case 14:
		yyDollar = yyS[yypt-4 : yypt+1]
		//line a.y:121
		{
			outcode(int(yyDollar[1].lval), &yyDollar[2].addr, 0, &yyDollar[4].addr)
		}
	case 15:
		yyDollar = yyS[yypt-4 : yypt+1]
		//line a.y:125
		{
			outcode(int(yyDollar[1].lval), &yyDollar[2].addr, 0, &yyDollar[4].addr)
		}
	case 16:
		yyDollar = yyS[yypt-4 : yypt+1]
		//line a.y:129
		{
			outcode(int(yyDollar[1].lval), &yyDollar[2].addr, 0, &yyDollar[4].addr)
		}
	case 17:
		yyDollar = yyS[yypt-4 : yypt+1]
		//line a.y:133
		{
			outcode(int(yyDollar[1].lval), &yyDollar[2].addr, 0, &yyDollar[4].addr)
		}
	case 18:
		yyDollar = yyS[yypt-4 : yypt+1]
		//line a.y:140
		{
			outcode(int(yyDollar[1].lval), &yyDollar[2].addr, 0, &yyDollar[4].addr)
		}
	case 19:
		yyDollar = yyS[yypt-4 : yypt+1]
		//line a.y:144
		{
			outcode(int(yyDollar[1].lval), &yyDollar[2].addr, 0, &yyDollar[4].addr)
		}
	case 20:
		yyDollar = yyS[yypt-4 : yypt+1]
		//line a.y:148
		{
			outcode(int(yyDollar[1].lval), &yyDollar[2].addr, 0, &yyDollar[4].addr)
		}
	case 21:
		yyDollar = yyS[yypt-4 : yypt+1]
		//line a.y:152
		{
			outcode(int(yyDollar[1].lval), &yyDollar[2].addr, 0, &yyDollar[4].addr)
		}
	case 22:
		yyDollar = yyS[yypt-4 : yypt+1]
		//line a.y:156
		{
			outcode(int(yyDollar[1].lval), &yyDollar[2].addr, 0, &yyDollar[4].addr)
		}
	case 23:
		yyDollar = yyS[yypt-4 : yypt+1]
		//line a.y:160
		{
			outcode(int(yyDollar[1].lval), &yyDollar[2].addr, 0, &yyDollar[4].addr)
		}
	case 24:
		yyDollar = yyS[yypt-4 : yypt+1]
		//line a.y:167
		{
			outcode(int(yyDollar[1].lval), &yyDollar[2].addr, 0, &yyDollar[4].addr)
		}
	case 25:
		yyDollar = yyS[yypt-4 : yypt+1]
		//line a.y:171
		{
			outcode(int(yyDollar[1].lval), &yyDollar[2].addr, 0, &yyDollar[4].addr)
		}
	case 26:
		yyDollar = yyS[yypt-4 : yypt+1]
		//line a.y:175
		{
			outcode(int(yyDollar[1].lval), &yyDollar[2].addr, 0, &yyDollar[4].addr)
		}
	case 27:
		yyDollar = yyS[yypt-4 : yypt+1]
		//line a.y:179
		{
			outcode(int(yyDollar[1].lval), &yyDollar[2].addr, 0, &yyDollar[4].addr)
		}
	case 28:
		yyDollar = yyS[yypt-4 : yypt+1]
		//line a.y:186
		{
			outcode(int(yyDollar[1].lval), &yyDollar[2].addr, 0, &yyDollar[4].addr)
		}
	case 29:
		yyDollar = yyS[yypt-4 : yypt+1]
		//line a.y:190
		{
			outcode(int(yyDollar[1].lval), &yyDollar[2].addr, 0, &yyDollar[4].addr)
		}
	case 30:
		yyDollar = yyS[yypt-4 : yypt+1]
		//line a.y:197
		{
			outcode(int(yyDollar[1].lval), &yyDollar[2].addr, 0, &yyDollar[4].addr)
		}
	case 31:
		yyDollar = yyS[yypt-4 : yypt+1]
		//line a.y:201
		{
			outcode(int(yyDollar[1].lval), &yyDollar[2].addr, 0, &yyDollar[4].addr)
		}
	case 32:
		yyDollar = yyS[yypt-6 : yypt+1]
		//line a.y:205
		{
			outgcode(int(yyDollar[1].lval), &yyDollar[2].addr, 0, &yyDollar[4].addr, &yyDollar[6].addr)
		}
	case 33:
		yyDollar = yyS[yypt-4 : yypt+1]
		//line a.y:209
		{
			outcode(int(yyDollar[1].lval), &yyDollar[2].addr, 0, &yyDollar[4].addr)
		}
	case 34:
		yyDollar = yyS[yypt-4 : yypt+1]
		//line a.y:213
		{
			outcode(int(yyDollar[1].lval), &yyDollar[2].addr, int(yyDollar[4].lval), &nullgen)
		}
	case 35:
		yyDollar = yyS[yypt-6 : yypt+1]
		//line a.y:220
		{
			outgcode(int(yyDollar[1].lval), &yyDollar[2].addr, 0, &yyDollar[4].addr, &yyDollar[6].addr)
		}
	case 36:
		yyDollar = yyS[yypt-4 : yypt+1]
		//line a.y:224
		{
			outcode(int(yyDollar[1].lval), &yyDollar[2].addr, 0, &yyDollar[4].addr)
		}
	case 37:
		yyDollar = yyS[yypt-4 : yypt+1]
		//line a.y:228
		{
			outcode(int(yyDollar[1].lval), &yyDollar[2].addr, 0, &yyDollar[4].addr)
		}
	case 38:
		yyDollar = yyS[yypt-6 : yypt+1]
		//line a.y:238
		{
			outcode(int(yyDollar[1].lval), &yyDollar[2].addr, int(yyDollar[4].lval), &yyDollar[6].addr)
		}
	case 39:
		yyDollar = yyS[yypt-6 : yypt+1]
		//line a.y:242
		{
			outcode(int(yyDollar[1].lval), &yyDollar[2].addr, int(yyDollar[4].lval), &yyDollar[6].addr)
		}
	case 40:
		yyDollar = yyS[yypt-6 : yypt+1]
		//line a.y:246
		{
			outgcode(int(yyDollar[1].lval), &yyDollar[2].addr, 0, &yyDollar[4].addr, &yyDollar[6].addr)
		}
	case 41:
		yyDollar = yyS[yypt-4 : yypt+1]
		//line a.y:250
		{
			outcode(int(yyDollar[1].lval), &yyDollar[2].addr, 0, &yyDollar[4].addr)
		}
	case 42:
		yyDollar = yyS[yypt-4 : yypt+1]
		//line a.y:254
		{
			outcode(int(yyDollar[1].lval), &yyDollar[2].addr, 0, &yyDollar[4].addr)
		}
	case 43:
		yyDollar = yyS[yypt-6 : yypt+1]
		//line a.y:258
		{
			outcode(int(yyDollar[1].lval), &yyDollar[2].addr, int(yyDollar[4].lval), &yyDollar[6].addr)
		}
	case 44:
		yyDollar = yyS[yypt-4 : yypt+1]
		//line a.y:262
		{
			outcode(int(yyDollar[1].lval), &yyDollar[2].addr, 0, &yyDollar[4].addr)
		}
	case 45:
		yyDollar = yyS[yypt-6 : yypt+1]
		//line a.y:266
		{
			outcode(int(yyDollar[1].lval), &yyDollar[2].addr, int(yyDollar[4].lval), &yyDollar[6].addr)
		}
	case 46:
		yyDollar = yyS[yypt-4 : yypt+1]
		//line a.y:270
		{
			outcode(int(yyDollar[1].lval), &yyDollar[2].addr, 0, &yyDollar[4].addr)
		}
	case 47:
		yyDollar = yyS[yypt-6 : yypt+1]
		//line a.y:274
		{
			outcode(int(yyDollar[1].lval), &yyDollar[2].addr, int(yyDollar[4].lval), &yyDollar[6].addr)
		}
	case 48:
		yyDollar = yyS[yypt-4 : yypt+1]
		//line a.y:278
		{
			outcode(int(yyDollar[1].lval), &yyDollar[2].addr, 0, &yyDollar[4].addr)
		}
	case 49:
		yyDollar = yyS[yypt-4 : yypt+1]
		//line a.y:282
		{
			outcode(int(yyDollar[1].lval), &yyDollar[2].addr, 0, &yyDollar[4].addr)
		}
	case 50:
		yyDollar = yyS[yypt-2 : yypt+1]
		//line a.y:286
		{
			outcode(int(yyDollar[1].lval), &yyDollar[2].addr, 0, &yyDollar[2].addr)
		}
	case 51:
		yyDollar = yyS[yypt-6 : yypt+1]
		//line a.y:293
		{
			outcode(int(yyDollar[1].lval), &yyDollar[2].addr, int(yyDollar[4].lval), &yyDollar[6].addr)
		}
	case 52:
		yyDollar = yyS[yypt-4 : yypt+1]
		//line a.y:300
		{
			outcode(int(yyDollar[1].lval), &yyDollar[2].addr, 0, &yyDollar[4].addr)
		}
	case 53:
		yyDollar = yyS[yypt-4 : yypt+1]
		//line a.y:304
		{
			outcode(int(yyDollar[1].lval), &yyDollar[2].addr, 0, &yyDollar[4].addr)
		}
	case 54:
		yyDollar = yyS[yypt-4 : yypt+1]
		//line a.y:311
		{
			outcode(int(yyDollar[1].lval), &yyDollar[2].addr, int(yyDollar[4].addr.Reg), &yyDollar[4].addr)
		}
	case 55:
		yyDollar = yyS[yypt-6 : yypt+1]
		//line a.y:315
		{
			outcode(int(yyDollar[1].lval), &yyDollar[2].addr, int(yyDollar[4].lval), &yyDollar[6].addr)
		}
	case 56:
		yyDollar = yyS[yypt-4 : yypt+1]
		//line a.y:323
		{
			outcode(int(yyDollar[1].lval), &yyDollar[2].addr, 0, &yyDollar[4].addr)
		}
	case 57:
		yyDollar = yyS[yypt-4 : yypt+1]
		//line a.y:327
		{
			outcode(int(yyDollar[1].lval), &yyDollar[2].addr, 0, &yyDollar[4].addr)
		}
	case 58:
		yyDollar = yyS[yypt-4 : yypt+1]
		//line a.y:331
		{
			outcode(int(yyDollar[1].lval), &yyDollar[2].addr, 0, &yyDollar[4].addr)
		}
	case 59:
		yyDollar = yyS[yypt-4 : yypt+1]
		//line a.y:335
		{
			outcode(int(yyDollar[1].lval), &yyDollar[2].addr, 0, &yyDollar[4].addr)
		}
	case 60:
		yyDollar = yyS[yypt-4 : yypt+1]
		//line a.y:339
		{
			outcode(int(yyDollar[1].lval), &yyDollar[2].addr, 0, &yyDollar[4].addr)
		}
	case 61:
		yyDollar = yyS[yypt-4 : yypt+1]
		//line a.y:343
		{
			outcode(int(yyDollar[1].lval), &yyDollar[2].addr, 0, &yyDollar[4].addr)
		}
	case 62:
		yyDollar = yyS[yypt-4 : yypt+1]
		//line a.y:347
		{
			outcode(int(yyDollar[1].lval), &yyDollar[2].addr, 0, &yyDollar[4].addr)
		}
	case 63:
		yyDollar = yyS[yypt-4 : yypt+1]
		//line a.y:351
		{
			outcode(int(yyDollar[1].lval), &yyDollar[2].addr, 0, &yyDollar[4].addr)
		}
	case 64:
		yyDollar = yyS[yypt-2 : yypt+1]
		//line a.y:360
		{
			outcode(int(yyDollar[1].lval), &nullgen, 0, &yyDollar[2].addr)
		}
	case 65:
		yyDollar = yyS[yypt-2 : yypt+1]
		//line a.y:364
		{
			outcode(int(yyDollar[1].lval), &nullgen, 0, &yyDollar[2].addr)
		}
	case 66:
		yyDollar = yyS[yypt-4 : yypt+1]
		//line a.y:368
		{
			outcode(int(yyDollar[1].lval), &nullgen, 0, &yyDollar[3].addr)
		}
	case 67:
		yyDollar = yyS[yypt-3 : yypt+1]
		//line a.y:372
		{
			outcode(int(yyDollar[1].lval), &nullgen, 0, &yyDollar[3].addr)
		}
	case 68:
		yyDollar = yyS[yypt-3 : yypt+1]
		//line a.y:376
		{
			outcode(int(yyDollar[1].lval), &nullgen, 0, &yyDollar[3].addr)
		}
	case 69:
		yyDollar = yyS[yypt-5 : yypt+1]
		//line a.y:380
		{
			outcode(int(yyDollar[1].lval), &nullgen, 0, &yyDollar[4].addr)
		}
	case 70:
		yyDollar = yyS[yypt-4 : yypt+1]
		//line a.y:384
		{
			outcode(int(yyDollar[1].lval), &yyDollar[2].addr, 0, &yyDollar[4].addr)
		}
	case 71:
		yyDollar = yyS[yypt-4 : yypt+1]
		//line a.y:388
		{
			outcode(int(yyDollar[1].lval), &yyDollar[2].addr, 0, &yyDollar[4].addr)
		}
	case 72:
		yyDollar = yyS[yypt-6 : yypt+1]
		//line a.y:392
		{
			outcode(int(yyDollar[1].lval), &yyDollar[2].addr, 0, &yyDollar[5].addr)
		}
	case 73:
		yyDollar = yyS[yypt-4 : yypt+1]
		//line a.y:396
		{
			outcode(int(yyDollar[1].lval), &nullgen, int(yyDollar[2].lval), &yyDollar[4].addr)
		}
	case 74:
		yyDollar = yyS[yypt-4 : yypt+1]
		//line a.y:400
		{
			outcode(int(yyDollar[1].lval), &nullgen, int(yyDollar[2].lval), &yyDollar[4].addr)
		}
	case 75:
		yyDollar = yyS[yypt-6 : yypt+1]
		//line a.y:404
		{
			outcode(int(yyDollar[1].lval), &nullgen, int(yyDollar[2].lval), &yyDollar[5].addr)
		}
	case 76:
		yyDollar = yyS[yypt-6 : yypt+1]
		//line a.y:408
		{
			var g obj.Addr
			g = nullgen
			g.Type = obj.TYPE_CONST
			g.Offset = yyDollar[2].lval
			outcode(int(yyDollar[1].lval), &g, int(REG_R0+yyDollar[4].lval), &yyDollar[6].addr)
		}
	case 77:
		yyDollar = yyS[yypt-6 : yypt+1]
		//line a.y:416
		{
			var g obj.Addr
			g = nullgen
			g.Type = obj.TYPE_CONST
			g.Offset = yyDollar[2].lval
			outcode(int(yyDollar[1].lval), &g, int(REG_R0+yyDollar[4].lval), &yyDollar[6].addr)
		}
	case 78:
		yyDollar = yyS[yypt-8 : yypt+1]
		//line a.y:424
		{
			var g obj.Addr
			g = nullgen
			g.Type = obj.TYPE_CONST
			g.Offset = yyDollar[2].lval
			outcode(int(yyDollar[1].lval), &g, int(REG_R0+yyDollar[4].lval), &yyDollar[7].addr)
		}
	case 79:
		yyDollar = yyS[yypt-4 : yypt+1]
		//line a.y:435
		{
			outcode(int(yyDollar[1].lval), &yyDollar[2].addr, int(yyDollar[4].lval), &nullgen)
		}
	case 80:
		yyDollar = yyS[yypt-4 : yypt+1]
		//line a.y:439
		{
			outcode(int(yyDollar[1].lval), &yyDollar[2].addr, int(yyDollar[4].lval), &nullgen)
		}
	case 81:
		yyDollar = yyS[yypt-3 : yypt+1]
		//line a.y:443
		{
			outcode(int(yyDollar[1].lval), &yyDollar[2].addr, 0, &nullgen)
		}
	case 82:
		yyDollar = yyS[yypt-2 : yypt+1]
		//line a.y:447
		{
			outcode(int(yyDollar[1].lval), &nullgen, 0, &nullgen)
		}
	case 83:
		yyDollar = yyS[yypt-4 : yypt+1]
		//line a.y:454
		{
			outcode(int(yyDollar[1].lval), &yyDollar[2].addr, 0, &yyDollar[4].addr)
		}
	case 84:
		yyDollar = yyS[yypt-4 : yypt+1]
		//line a.y:458
		{
			outcode(int(yyDollar[1].lval), &yyDollar[2].addr, 0, &yyDollar[4].addr)
		}
	case 85:
		yyDollar = yyS[yypt-6 : yypt+1]
		//line a.y:462
		{
			outcode(int(yyDollar[1].lval), &yyDollar[2].addr, int(yyDollar[4].addr.Reg), &yyDollar[6].addr)
		}
	case 86:
		yyDollar = yyS[yypt-8 : yypt+1]
		//line a.y:466
		{
			outgcode(int(yyDollar[1].lval), &yyDollar[2].addr, int(yyDollar[4].addr.Reg), &yyDollar[6].addr, &yyDollar[8].addr)
		}
	case 87:
		yyDollar = yyS[yypt-4 : yypt+1]
		//line a.y:470
		{
			outcode(int(yyDollar[1].lval), &yyDollar[2].addr, 0, &yyDollar[4].addr)
		}
	case 88:
		yyDollar = yyS[yypt-6 : yypt+1]
		//line a.y:474
		{
			outcode(int(yyDollar[1].lval), &yyDollar[2].addr, int(yyDollar[6].addr.Reg), &yyDollar[4].addr)
		}
	case 89:
		yyDollar = yyS[yypt-4 : yypt+1]
		//line a.y:481
		{
			outcode(int(yyDollar[1].lval), &yyDollar[2].addr, 0, &yyDollar[4].addr)
		}
	case 90:
		yyDollar = yyS[yypt-4 : yypt+1]
		//line a.y:485
		{
			outcode(int(yyDollar[1].lval), &yyDollar[2].addr, 0, &yyDollar[4].addr)
		}
	case 91:
		yyDollar = yyS[yypt-6 : yypt+1]
		//line a.y:489
		{
			outcode(int(yyDollar[1].lval), &yyDollar[2].addr, int(yyDollar[6].addr.Reg), &yyDollar[4].addr)
		}
	case 92:
		yyDollar = yyS[yypt-6 : yypt+1]
		//line a.y:493
		{
			outcode(int(yyDollar[1].lval), &yyDollar[2].addr, int(yyDollar[6].addr.Reg), &yyDollar[4].addr)
		}
	case 93:
		yyDollar = yyS[yypt-8 : yypt+1]
		//line a.y:500
		{
			outgcode(int(yyDollar[1].lval), &yyDollar[2].addr, int(yyDollar[4].addr.Reg), &yyDollar[6].addr, &yyDollar[8].addr)
		}
	case 94:
		yyDollar = yyS[yypt-8 : yypt+1]
		//line a.y:504
		{
			outgcode(int(yyDollar[1].lval), &yyDollar[2].addr, int(yyDollar[4].addr.Reg), &yyDollar[6].addr, &yyDollar[8].addr)
		}
	case 95:
		yyDollar = yyS[yypt-8 : yypt+1]
		//line a.y:508
		{
			outgcode(int(yyDollar[1].lval), &yyDollar[2].addr, int(yyDollar[4].addr.Reg), &yyDollar[6].addr, &yyDollar[8].addr)
		}
	case 96:
		yyDollar = yyS[yypt-8 : yypt+1]
		//line a.y:512
		{
			outgcode(int(yyDollar[1].lval), &yyDollar[2].addr, int(yyDollar[4].addr.Reg), &yyDollar[6].addr, &yyDollar[8].addr)
		}
	case 97:
		yyDollar = yyS[yypt-4 : yypt+1]
		//line a.y:519
		{
			outcode(int(yyDollar[1].lval), &yyDollar[2].addr, 0, &yyDollar[4].addr)
		}
	case 98:
		yyDollar = yyS[yypt-4 : yypt+1]
		//line a.y:523
		{
			outcode(int(yyDollar[1].lval), &yyDollar[2].addr, 0, &yyDollar[4].addr)
		}
	case 99:
		yyDollar = yyS[yypt-4 : yypt+1]
		//line a.y:531
		{
			outcode(int(yyDollar[1].lval), &yyDollar[2].addr, 0, &yyDollar[4].addr)
		}
	case 100:
		yyDollar = yyS[yypt-6 : yypt+1]
		//line a.y:535
		{
			outgcode(int(yyDollar[1].lval), &yyDollar[2].addr, 0, &yyDollar[4].addr, &yyDollar[6].addr)
		}
	case 101:
		yyDollar = yyS[yypt-4 : yypt+1]
		//line a.y:539
		{
			outcode(int(yyDollar[1].lval), &yyDollar[2].addr, 0, &yyDollar[4].addr)
		}
	case 102:
		yyDollar = yyS[yypt-6 : yypt+1]
		//line a.y:543
		{
			outgcode(int(yyDollar[1].lval), &yyDollar[2].addr, 0, &yyDollar[4].addr, &yyDollar[6].addr)
		}
	case 103:
		yyDollar = yyS[yypt-4 : yypt+1]
		//line a.y:547
		{
			outcode(int(yyDollar[1].lval), &yyDollar[2].addr, 0, &yyDollar[4].addr)
		}
	case 104:
		yyDollar = yyS[yypt-4 : yypt+1]
		//line a.y:551
		{
			outcode(int(yyDollar[1].lval), &yyDollar[2].addr, 0, &yyDollar[4].addr)
		}
	case 105:
		yyDollar = yyS[yypt-2 : yypt+1]
		//line a.y:555
		{
			outcode(int(yyDollar[1].lval), &yyDollar[2].addr, 0, &nullgen)
		}
	case 106:
		yyDollar = yyS[yypt-2 : yypt+1]
		//line a.y:562
		{
			outcode(int(yyDollar[1].lval), &nullgen, 0, &nullgen)
		}
	case 107:
		yyDollar = yyS[yypt-3 : yypt+1]
		//line a.y:566
		{
			outcode(int(yyDollar[1].lval), &yyDollar[2].addr, 0, &nullgen)
		}
	case 108:
		yyDollar = yyS[yypt-3 : yypt+1]
		//line a.y:570
		{
			outcode(int(yyDollar[1].lval), &yyDollar[2].addr, 0, &nullgen)
		}
	case 109:
		yyDollar = yyS[yypt-3 : yypt+1]
		//line a.y:574
		{
			outcode(int(yyDollar[1].lval), &nullgen, 0, &yyDollar[3].addr)
		}
	case 110:
		yyDollar = yyS[yypt-3 : yypt+1]
		//line a.y:578
		{
			outcode(int(yyDollar[1].lval), &nullgen, 0, &yyDollar[3].addr)
		}
	case 111:
		yyDollar = yyS[yypt-2 : yypt+1]
		//line a.y:582
		{
			outcode(int(yyDollar[1].lval), &yyDollar[2].addr, 0, &nullgen)
		}
	case 112:
		yyDollar = yyS[yypt-3 : yypt+1]
		//line a.y:589
		{
			outcode(int(yyDollar[1].lval), &yyDollar[2].addr, 0, &nullgen)
		}
	case 113:
		yyDollar = yyS[yypt-3 : yypt+1]
		//line a.y:593
		{
			outcode(int(yyDollar[1].lval), &yyDollar[2].addr, 0, &nullgen)
		}
	case 114:
		yyDollar = yyS[yypt-4 : yypt+1]
		//line a.y:600
		{
			if yyDollar[2].addr.Type != obj.TYPE_CONST || yyDollar[4].addr.Type != obj.TYPE_CONST {
				yyerror("arguments to PCDATA must be integer constants")
			}
			outcode(int(yyDollar[1].lval), &yyDollar[2].addr, 0, &yyDollar[4].addr)
		}
	case 115:
		yyDollar = yyS[yypt-4 : yypt+1]
		//line a.y:610
		{
			if yyDollar[2].addr.Type != obj.TYPE_CONST {
				yyerror("index for FUNCDATA must be integer constant")
			}
			if yyDollar[4].addr.Type != obj.TYPE_MEM || (yyDollar[4].addr.Name != obj.NAME_EXTERN && yyDollar[4].addr.Name != obj.NAME_STATIC) {
				yyerror("value for FUNCDATA must be symbol reference")
			}
			outcode(int(yyDollar[1].lval), &yyDollar[2].addr, 0, &yyDollar[4].addr)
		}
	case 116:
		yyDollar = yyS[yypt-2 : yypt+1]
		//line a.y:623
		{
			outcode(int(yyDollar[1].lval), &nullgen, 0, &nullgen)
		}
	case 117:
		yyDollar = yyS[yypt-5 : yypt+1]
		//line a.y:630
		{
			asm.Settext(yyDollar[2].addr.Sym)
			outcode(int(yyDollar[1].lval), &yyDollar[2].addr, 0, &yyDollar[5].addr)
		}
	case 118:
		yyDollar = yyS[yypt-7 : yypt+1]
		//line a.y:635
		{
			asm.Settext(yyDollar[2].addr.Sym)
			outcode(int(yyDollar[1].lval), &yyDollar[2].addr, int(yyDollar[4].lval), &yyDollar[7].addr)
			if asm.Pass > 1 {
				lastpc.From3.Type = obj.TYPE_CONST
				lastpc.From3.Offset = yyDollar[4].lval
			}
		}
	case 119:
		yyDollar = yyS[yypt-4 : yypt+1]
		//line a.y:647
		{
			asm.Settext(yyDollar[2].addr.Sym)
			outcode(int(yyDollar[1].lval), &yyDollar[2].addr, 0, &yyDollar[4].addr)
		}
	case 120:
		yyDollar = yyS[yypt-6 : yypt+1]
		//line a.y:652
		{
			asm.Settext(yyDollar[2].addr.Sym)
			outcode(int(yyDollar[1].lval), &yyDollar[2].addr, 0, &yyDollar[6].addr)
			if asm.Pass > 1 {
				lastpc.From3.Type = obj.TYPE_CONST
				lastpc.From3.Offset = yyDollar[4].lval
			}
		}
	case 121:
		yyDollar = yyS[yypt-6 : yypt+1]
		//line a.y:665
		{
			outcode(int(yyDollar[1].lval), &yyDollar[2].addr, 0, &yyDollar[6].addr)
			if asm.Pass > 1 {
				lastpc.From3.Type = obj.TYPE_CONST
				lastpc.From3.Offset = yyDollar[4].lval
			}
		}
	case 122:
		yyDollar = yyS[yypt-6 : yypt+1]
		//line a.y:673
		{
			outcode(int(yyDollar[1].lval), &yyDollar[2].addr, 0, &yyDollar[6].addr)
			if asm.Pass > 1 {
				lastpc.From3.Type = obj.TYPE_CONST
				lastpc.From3.Offset = yyDollar[4].lval
			}
		}
	case 123:
		yyDollar = yyS[yypt-6 : yypt+1]
		//line a.y:681
		{
			outcode(int(yyDollar[1].lval), &yyDollar[2].addr, 0, &yyDollar[6].addr)
			if asm.Pass > 1 {
				lastpc.From3.Type = obj.TYPE_CONST
				lastpc.From3.Offset = yyDollar[4].lval
			}
		}
	case 124:
		yyDollar = yyS[yypt-2 : yypt+1]
		//line a.y:692
		{
			outcode(int(yyDollar[1].lval), &nullgen, 0, &nullgen)
		}
	case 125:
		yyDollar = yyS[yypt-4 : yypt+1]
		//line a.y:698
		{
			yyVAL.addr = nullgen
			yyVAL.addr.Type = obj.TYPE_BRANCH
			yyVAL.addr.Offset = yyDollar[1].lval + int64(asm.PC)
		}
	case 126:
		yyDollar = yyS[yypt-2 : yypt+1]
		//line a.y:704
		{
			yyDollar[1].sym = asm.LabelLookup(yyDollar[1].sym)
			yyVAL.addr = nullgen
			if asm.Pass == 2 && yyDollar[1].sym.Type != LLAB {
				yyerror("undefined label: %s", yyDollar[1].sym.Labelname)
			}
			yyVAL.addr.Type = obj.TYPE_BRANCH
			yyVAL.addr.Offset = yyDollar[1].sym.Value + yyDollar[2].lval
		}
	case 127:
		yyDollar = yyS[yypt-1 : yypt+1]
		//line a.y:716
		{
			yyVAL.addr = nullgen
			yyVAL.addr.Type = obj.TYPE_REG
			yyVAL.addr.Reg = int16(yyDollar[1].lval)
		}
	case 128:
		yyVAL.addr = yyS[yypt-0].addr
	case 129:
		yyVAL.addr = yyS[yypt-0].addr
	case 130:
		yyDollar = yyS[yypt-1 : yypt+1]
		//line a.y:728
		{
			yyVAL.addr = nullgen
			yyVAL.addr.Type = obj.TYPE_REG
			yyVAL.addr.Reg = int16(yyDollar[1].lval)
		}
	case 131:
		yyDollar = yyS[yypt-1 : yypt+1]
		//line a.y:736
		{
			yyVAL.addr = nullgen
			yyVAL.addr.Type = obj.TYPE_REG
			yyVAL.addr.Reg = int16(yyDollar[1].lval) /* whole register */
		}
	case 132:
		yyDollar = yyS[yypt-1 : yypt+1]
		//line a.y:743
		{
			yyVAL.addr = nullgen
			yyVAL.addr.Type = obj.TYPE_REG
			yyVAL.addr.Reg = int16(yyDollar[1].lval)
		}
	case 133:
		yyDollar = yyS[yypt-1 : yypt+1]
		//line a.y:751
		{
			yyVAL.addr = nullgen
			yyVAL.addr.Type = obj.TYPE_REG
			yyVAL.addr.Reg = int16(yyDollar[1].lval)
		}
	case 134:
		yyDollar = yyS[yypt-1 : yypt+1]
		//line a.y:759
		{
			yyVAL.addr = nullgen
			yyVAL.addr.Type = obj.TYPE_REG
			yyVAL.addr.Reg = int16(yyDollar[1].lval)
		}
	case 135:
		yyDollar = yyS[yypt-4 : yypt+1]
		//line a.y:765
		{
			if yyDollar[3].lval < 0 || yyDollar[3].lval >= 1024 {
				yyerror("SPR/DCR out of range")
			}
			yyVAL.addr = nullgen
			yyVAL.addr.Type = obj.TYPE_REG
			yyVAL.addr.Reg = int16(yyDollar[1].lval + yyDollar[3].lval)
		}
	case 136:
		yyVAL.addr = yyS[yypt-0].addr
	case 137:
		yyDollar = yyS[yypt-1 : yypt+1]
		//line a.y:777
		{
			yyVAL.addr = nullgen
			yyVAL.addr.Type = obj.TYPE_REG
			yyVAL.addr.Reg = int16(yyDollar[1].lval)
		}
	case 138:
		yyDollar = yyS[yypt-1 : yypt+1]
		//line a.y:785
		{
			yyVAL.addr = nullgen
			yyVAL.addr.Type = obj.TYPE_REG
			yyVAL.addr.Reg = int16(yyDollar[1].lval)
		}
	case 139:
		yyDollar = yyS[yypt-4 : yypt+1]
		//line a.y:791
		{
			yyVAL.addr = nullgen
			yyVAL.addr.Type = obj.TYPE_REG
			yyVAL.addr.Reg = int16(REG_F0 + yyDollar[3].lval)
		}
	case 140:
		yyDollar = yyS[yypt-1 : yypt+1]
		//line a.y:799
		{
			yyVAL.addr = nullgen
			yyVAL.addr.Type = obj.TYPE_REG
			yyVAL.addr.Reg = int16(yyDollar[1].lval)
		}
	case 141:
		yyDollar = yyS[yypt-4 : yypt+1]
		//line a.y:805
		{
			yyVAL.addr = nullgen
			yyVAL.addr.Type = obj.TYPE_REG
			yyVAL.addr.Reg = int16(REG_CR0 + yyDollar[3].lval)
		}
	case 142:
		yyDollar = yyS[yypt-1 : yypt+1]
		//line a.y:813
		{
			yyVAL.addr = nullgen
			yyVAL.addr.Type = obj.TYPE_REG
			yyVAL.addr.Reg = int16(yyDollar[1].lval)
		}
	case 143:
		yyDollar = yyS[yypt-3 : yypt+1]
		//line a.y:821
		{
			var mb, me int
			var v uint32

			yyVAL.addr = nullgen
			yyVAL.addr.Type = obj.TYPE_CONST
			mb = int(yyDollar[1].lval)
			me = int(yyDollar[3].lval)
			if mb < 0 || mb > 31 || me < 0 || me > 31 {
				yyerror("illegal mask start/end value(s)")
				mb = 0
				me = 0
			}
			if mb <= me {
				v = (^uint32(0) >> uint(mb)) & (^uint32(0) << uint(31-me))
			} else {
				v = (^uint32(0) >> uint(me+1)) & (^uint32(0) << uint(31-(mb-1)))
			}
			yyVAL.addr.Offset = int64(v)
		}
	case 144:
		yyDollar = yyS[yypt-1 : yypt+1]
		//line a.y:844
		{
			yyVAL.addr = nullgen
			yyVAL.addr.Type = obj.TYPE_TEXTSIZE
			yyVAL.addr.Offset = int64(yyDollar[1].lval)
			yyVAL.addr.Val = int32(obj.ArgsSizeUnknown)
		}
	case 145:
		yyDollar = yyS[yypt-2 : yypt+1]
		//line a.y:851
		{
			yyVAL.addr = nullgen
			yyVAL.addr.Type = obj.TYPE_TEXTSIZE
			yyVAL.addr.Offset = -int64(yyDollar[2].lval)
			yyVAL.addr.Val = int32(obj.ArgsSizeUnknown)
		}
	case 146:
		yyDollar = yyS[yypt-3 : yypt+1]
		//line a.y:858
		{
			yyVAL.addr = nullgen
			yyVAL.addr.Type = obj.TYPE_TEXTSIZE
			yyVAL.addr.Offset = int64(yyDollar[1].lval)
			yyVAL.addr.Val = int32(yyDollar[3].lval)
		}
	case 147:
		yyDollar = yyS[yypt-4 : yypt+1]
		//line a.y:865
		{
			yyVAL.addr = nullgen
			yyVAL.addr.Type = obj.TYPE_TEXTSIZE
			yyVAL.addr.Offset = -int64(yyDollar[2].lval)
			yyVAL.addr.Val = int32(yyDollar[4].lval)
		}
	case 148:
		yyDollar = yyS[yypt-2 : yypt+1]
		//line a.y:874
		{
			yyVAL.addr = yyDollar[2].addr
			yyVAL.addr.Type = obj.TYPE_ADDR
		}
	case 149:
		yyDollar = yyS[yypt-2 : yypt+1]
		//line a.y:879
		{
			yyVAL.addr = nullgen
			yyVAL.addr.Type = obj.TYPE_SCONST
			yyVAL.addr.Val = yyDollar[2].sval
		}
	case 150:
		yyDollar = yyS[yypt-2 : yypt+1]
		//line a.y:887
		{
			yyVAL.addr = nullgen
			yyVAL.addr.Type = obj.TYPE_FCONST
			yyVAL.addr.Val = yyDollar[2].dval
		}
	case 151:
		yyDollar = yyS[yypt-3 : yypt+1]
		//line a.y:893
		{
			yyVAL.addr = nullgen
			yyVAL.addr.Type = obj.TYPE_FCONST
			yyVAL.addr.Val = -yyDollar[3].dval
		}
	case 152:
		yyDollar = yyS[yypt-2 : yypt+1]
		//line a.y:900
		{
			yyVAL.addr = nullgen
			yyVAL.addr.Type = obj.TYPE_CONST
			yyVAL.addr.Offset = yyDollar[2].lval
		}
	case 153:
		yyVAL.lval = yyS[yypt-0].lval
	case 154:
		yyDollar = yyS[yypt-4 : yypt+1]
		//line a.y:909
		{
			if yyVAL.lval < 0 || yyVAL.lval >= NREG {
				print("register value out of range\n")
			}
			yyVAL.lval = REG_R0 + yyDollar[3].lval
		}
	case 155:
		yyDollar = yyS[yypt-3 : yypt+1]
		//line a.y:918
		{
			yyVAL.addr = nullgen
			yyVAL.addr.Type = obj.TYPE_MEM
			yyVAL.addr.Reg = int16(yyDollar[2].lval)
			yyVAL.addr.Offset = 0
		}
	case 156:
		yyDollar = yyS[yypt-5 : yypt+1]
		//line a.y:925
		{
			yyVAL.addr = nullgen
			yyVAL.addr.Type = obj.TYPE_MEM
			yyVAL.addr.Reg = int16(yyDollar[2].lval)
			yyVAL.addr.Scale = int16(yyDollar[4].lval)
			yyVAL.addr.Offset = 0
		}
	case 157:
		yyVAL.addr = yyS[yypt-0].addr
	case 158:
		yyDollar = yyS[yypt-4 : yypt+1]
		//line a.y:936
		{
			yyVAL.addr = nullgen
			yyVAL.addr.Type = obj.TYPE_MEM
			yyVAL.addr.Reg = int16(yyDollar[3].lval)
			yyVAL.addr.Offset = yyDollar[1].lval
		}
	case 159:
		yyDollar = yyS[yypt-4 : yypt+1]
		//line a.y:945
		{
			yyVAL.addr = nullgen
			yyVAL.addr.Type = obj.TYPE_MEM
			yyVAL.addr.Name = int8(yyDollar[3].lval)
			yyVAL.addr.Sym = nil
			yyVAL.addr.Offset = yyDollar[1].lval
		}
	case 160:
		yyDollar = yyS[yypt-5 : yypt+1]
		//line a.y:953
		{
			yyVAL.addr = nullgen
			yyVAL.addr.Type = obj.TYPE_MEM
			yyVAL.addr.Name = int8(yyDollar[4].lval)
			yyVAL.addr.Sym = obj.Linklookup(asm.Ctxt, yyDollar[1].sym.Name, 0)
			yyVAL.addr.Offset = yyDollar[2].lval
		}
	case 161:
		yyDollar = yyS[yypt-7 : yypt+1]
		//line a.y:961
		{
			yyVAL.addr = nullgen
			yyVAL.addr.Type = obj.TYPE_MEM
			yyVAL.addr.Name = obj.NAME_STATIC
			yyVAL.addr.Sym = obj.Linklookup(asm.Ctxt, yyDollar[1].sym.Name, 1)
			yyVAL.addr.Offset = yyDollar[4].lval
		}
	case 164:
		yyDollar = yyS[yypt-0 : yypt+1]
		//line a.y:973
		{
			yyVAL.lval = 0
		}
	case 165:
		yyDollar = yyS[yypt-2 : yypt+1]
		//line a.y:977
		{
			yyVAL.lval = yyDollar[2].lval
		}
	case 166:
		yyDollar = yyS[yypt-2 : yypt+1]
		//line a.y:981
		{
			yyVAL.lval = -yyDollar[2].lval
		}
	case 167:
		yyVAL.lval = yyS[yypt-0].lval
	case 168:
		yyVAL.lval = yyS[yypt-0].lval
	case 169:
		yyVAL.lval = yyS[yypt-0].lval
	case 170:
		yyVAL.lval = yyS[yypt-0].lval
	case 171:
		yyDollar = yyS[yypt-1 : yypt+1]
		//line a.y:993
		{
			yyVAL.lval = yyDollar[1].sym.Value
		}
	case 172:
		yyDollar = yyS[yypt-2 : yypt+1]
		//line a.y:997
		{
			yyVAL.lval = -yyDollar[2].lval
		}
	case 173:
		yyDollar = yyS[yypt-2 : yypt+1]
		//line a.y:1001
		{
			yyVAL.lval = yyDollar[2].lval
		}
	case 174:
		yyDollar = yyS[yypt-2 : yypt+1]
		//line a.y:1005
		{
			yyVAL.lval = ^yyDollar[2].lval
		}
	case 175:
		yyDollar = yyS[yypt-3 : yypt+1]
		//line a.y:1009
		{
			yyVAL.lval = yyDollar[2].lval
		}
	case 176:
		yyVAL.lval = yyS[yypt-0].lval
	case 177:
		yyDollar = yyS[yypt-3 : yypt+1]
		//line a.y:1016
		{
			yyVAL.lval = yyDollar[1].lval + yyDollar[3].lval
		}
	case 178:
		yyDollar = yyS[yypt-3 : yypt+1]
		//line a.y:1020
		{
			yyVAL.lval = yyDollar[1].lval - yyDollar[3].lval
		}
	case 179:
		yyDollar = yyS[yypt-3 : yypt+1]
		//line a.y:1024
		{
			yyVAL.lval = yyDollar[1].lval * yyDollar[3].lval
		}
	case 180:
		yyDollar = yyS[yypt-3 : yypt+1]
		//line a.y:1028
		{
			yyVAL.lval = yyDollar[1].lval / yyDollar[3].lval
		}
	case 181:
		yyDollar = yyS[yypt-3 : yypt+1]
		//line a.y:1032
		{
			yyVAL.lval = yyDollar[1].lval % yyDollar[3].lval
		}
	case 182:
		yyDollar = yyS[yypt-4 : yypt+1]
		//line a.y:1036
		{
			yyVAL.lval = yyDollar[1].lval << uint(yyDollar[4].lval)
		}
	case 183:
		yyDollar = yyS[yypt-4 : yypt+1]
		//line a.y:1040
		{
			yyVAL.lval = yyDollar[1].lval >> uint(yyDollar[4].lval)
		}
	case 184:
		yyDollar = yyS[yypt-3 : yypt+1]
		//line a.y:1044
		{
			yyVAL.lval = yyDollar[1].lval & yyDollar[3].lval
		}
	case 185:
		yyDollar = yyS[yypt-3 : yypt+1]
		//line a.y:1048
		{
			yyVAL.lval = yyDollar[1].lval ^ yyDollar[3].lval
		}
	case 186:
		yyDollar = yyS[yypt-3 : yypt+1]
		//line a.y:1052
		{
			yyVAL.lval = yyDollar[1].lval | yyDollar[3].lval
		}
	}
	goto yystack /* stack new state and value */
}
Пример #2
0
Файл: y.go Проект: Ericean/go
func (yyrcvr *yyParserImpl) Parse(yylex yyLexer) int {
	var yyn int
	var yylval yySymType
	var yyVAL yySymType
	var yyDollar []yySymType
	yyS := make([]yySymType, yyMaxDepth)

	Nerrs := 0   /* number of errors */
	Errflag := 0 /* error recovery flag */
	yystate := 0
	yychar := -1
	yytoken := -1 // yychar translated into internal numbering
	yyrcvr.lookahead = func() int { return yychar }
	defer func() {
		// Make sure we report no lookahead when not parsing.
		yystate = -1
		yychar = -1
		yytoken = -1
	}()
	yyp := -1
	goto yystack

ret0:
	return 0

ret1:
	return 1

yystack:
	/* put a state and value onto the stack */
	if yyDebug >= 4 {
		__yyfmt__.Printf("char %v in %v\n", yyTokname(yytoken), yyStatname(yystate))
	}

	yyp++
	if yyp >= len(yyS) {
		nyys := make([]yySymType, len(yyS)*2)
		copy(nyys, yyS)
		yyS = nyys
	}
	yyS[yyp] = yyVAL
	yyS[yyp].yys = yystate

yynewstate:
	yyn = yyPact[yystate]
	if yyn <= yyFlag {
		goto yydefault /* simple state */
	}
	if yychar < 0 {
		yychar, yytoken = yylex1(yylex, &yylval)
	}
	yyn += yytoken
	if yyn < 0 || yyn >= yyLast {
		goto yydefault
	}
	yyn = yyAct[yyn]
	if yyChk[yyn] == yytoken { /* valid shift */
		yychar = -1
		yytoken = -1
		yyVAL = yylval
		yystate = yyn
		if Errflag > 0 {
			Errflag--
		}
		goto yystack
	}

yydefault:
	/* default state action */
	yyn = yyDef[yystate]
	if yyn == -2 {
		if yychar < 0 {
			yychar, yytoken = yylex1(yylex, &yylval)
		}

		/* look through exception table */
		xi := 0
		for {
			if yyExca[xi+0] == -1 && yyExca[xi+1] == yystate {
				break
			}
			xi += 2
		}
		for xi += 2; ; xi += 2 {
			yyn = yyExca[xi+0]
			if yyn < 0 || yyn == yytoken {
				break
			}
		}
		yyn = yyExca[xi+1]
		if yyn < 0 {
			goto ret0
		}
	}
	if yyn == 0 {
		/* error ... attempt to resume parsing */
		switch Errflag {
		case 0: /* brand new error */
			yylex.Error(yyErrorMessage(yystate, yytoken))
			Nerrs++
			if yyDebug >= 1 {
				__yyfmt__.Printf("%s", yyStatname(yystate))
				__yyfmt__.Printf(" saw %s\n", yyTokname(yytoken))
			}
			fallthrough

		case 1, 2: /* incompletely recovered error ... try again */
			Errflag = 3

			/* find a state where "error" is a legal shift action */
			for yyp >= 0 {
				yyn = yyPact[yyS[yyp].yys] + yyErrCode
				if yyn >= 0 && yyn < yyLast {
					yystate = yyAct[yyn] /* simulate a shift of "error" */
					if yyChk[yystate] == yyErrCode {
						goto yystack
					}
				}

				/* the current p has no shift on "error", pop stack */
				if yyDebug >= 2 {
					__yyfmt__.Printf("error recovery pops state %d\n", yyS[yyp].yys)
				}
				yyp--
			}
			/* there is no state on the stack with an error shift ... abort */
			goto ret1

		case 3: /* no shift yet; clobber input char */
			if yyDebug >= 2 {
				__yyfmt__.Printf("error recovery discards %s\n", yyTokname(yytoken))
			}
			if yytoken == yyEofCode {
				goto ret1
			}
			yychar = -1
			yytoken = -1
			goto yynewstate /* try again in the same state */
		}
	}

	/* reduction by production yyn */
	if yyDebug >= 2 {
		__yyfmt__.Printf("reduce %v in:\n\t%v\n", yyn, yyStatname(yystate))
	}

	yynt := yyn
	yypt := yyp
	_ = yypt // guard against "declared and not used"

	yyp -= yyR2[yyn]
	// yyp is now the index of $0. Perform the default action. Iff the
	// reduced production is ε, $1 is possibly out of range.
	if yyp+1 >= len(yyS) {
		nyys := make([]yySymType, len(yyS)*2)
		copy(nyys, yyS)
		yyS = nyys
	}
	yyVAL = yyS[yyp+1]

	/* consult goto table to find next state */
	yyn = yyR1[yyn]
	yyg := yyPgo[yyn]
	yyj := yyg + yyS[yyp].yys + 1

	if yyj >= yyLast {
		yystate = yyAct[yyg]
	} else {
		yystate = yyAct[yyj]
		if yyChk[yystate] != -yyn {
			yystate = yyAct[yyg]
		}
	}
	// dummy call; replaced with literal code
	switch yynt {

	case 2:
		yyDollar = yyS[yypt-1 : yypt+1]
		//line a.y:73
		{
			stmtline = asm.Lineno
		}
	case 4:
		yyDollar = yyS[yypt-2 : yypt+1]
		//line a.y:80
		{
			yyDollar[1].sym = asm.LabelLookup(yyDollar[1].sym)
			if yyDollar[1].sym.Type == LLAB && yyDollar[1].sym.Value != int64(asm.PC) {
				yyerror("redeclaration of %s", yyDollar[1].sym.Labelname)
			}
			yyDollar[1].sym.Type = LLAB
			yyDollar[1].sym.Value = int64(asm.PC)
		}
	case 6:
		yyDollar = yyS[yypt-4 : yypt+1]
		//line a.y:90
		{
			yyDollar[1].sym.Type = LVAR
			yyDollar[1].sym.Value = int64(yyDollar[3].lval)
		}
	case 7:
		yyDollar = yyS[yypt-4 : yypt+1]
		//line a.y:95
		{
			if yyDollar[1].sym.Value != int64(yyDollar[3].lval) {
				yyerror("redeclaration of %s", yyDollar[1].sym.Name)
			}
			yyDollar[1].sym.Value = int64(yyDollar[3].lval)
		}
	case 11:
		yyDollar = yyS[yypt-7 : yypt+1]
		//line a.y:110
		{
			outcode(yyDollar[1].lval, yyDollar[2].lval, &yyDollar[3].addr, yyDollar[5].lval, &yyDollar[7].addr)
		}
	case 12:
		yyDollar = yyS[yypt-6 : yypt+1]
		//line a.y:114
		{
			outcode(yyDollar[1].lval, yyDollar[2].lval, &yyDollar[3].addr, yyDollar[5].lval, &nullgen)
		}
	case 13:
		yyDollar = yyS[yypt-5 : yypt+1]
		//line a.y:118
		{
			outcode(yyDollar[1].lval, yyDollar[2].lval, &yyDollar[3].addr, 0, &yyDollar[5].addr)
		}
	case 14:
		yyDollar = yyS[yypt-5 : yypt+1]
		//line a.y:125
		{
			outcode(yyDollar[1].lval, yyDollar[2].lval, &yyDollar[3].addr, 0, &yyDollar[5].addr)
		}
	case 15:
		yyDollar = yyS[yypt-5 : yypt+1]
		//line a.y:132
		{
			outcode(yyDollar[1].lval, yyDollar[2].lval, &yyDollar[3].addr, 0, &yyDollar[5].addr)
		}
	case 16:
		yyDollar = yyS[yypt-4 : yypt+1]
		//line a.y:139
		{
			outcode(yyDollar[1].lval, yyDollar[2].lval, &nullgen, 0, &yyDollar[4].addr)
		}
	case 17:
		yyDollar = yyS[yypt-4 : yypt+1]
		//line a.y:143
		{
			outcode(yyDollar[1].lval, yyDollar[2].lval, &nullgen, 0, &yyDollar[4].addr)
		}
	case 18:
		yyDollar = yyS[yypt-3 : yypt+1]
		//line a.y:150
		{
			outcode(yyDollar[1].lval, Always, &nullgen, 0, &yyDollar[3].addr)
		}
	case 19:
		yyDollar = yyS[yypt-3 : yypt+1]
		//line a.y:157
		{
			outcode(yyDollar[1].lval, Always, &nullgen, 0, &yyDollar[3].addr)
		}
	case 20:
		yyDollar = yyS[yypt-4 : yypt+1]
		//line a.y:164
		{
			outcode(yyDollar[1].lval, yyDollar[2].lval, &nullgen, 0, &yyDollar[4].addr)
		}
	case 21:
		yyDollar = yyS[yypt-6 : yypt+1]
		//line a.y:171
		{
			outcode(yyDollar[1].lval, yyDollar[2].lval, &yyDollar[3].addr, yyDollar[5].lval, &nullgen)
		}
	case 22:
		yyDollar = yyS[yypt-7 : yypt+1]
		//line a.y:178
		{
			var g obj.Addr

			g = nullgen
			g.Type = obj.TYPE_REGLIST
			g.Offset = int64(yyDollar[6].lval)
			outcode(yyDollar[1].lval, yyDollar[2].lval, &yyDollar[3].addr, 0, &g)
		}
	case 23:
		yyDollar = yyS[yypt-7 : yypt+1]
		//line a.y:187
		{
			var g obj.Addr

			g = nullgen
			g.Type = obj.TYPE_REGLIST
			g.Offset = int64(yyDollar[4].lval)
			outcode(yyDollar[1].lval, yyDollar[2].lval, &g, 0, &yyDollar[7].addr)
		}
	case 24:
		yyDollar = yyS[yypt-7 : yypt+1]
		//line a.y:199
		{
			outcode(yyDollar[1].lval, yyDollar[2].lval, &yyDollar[5].addr, int32(yyDollar[3].addr.Reg), &yyDollar[7].addr)
		}
	case 25:
		yyDollar = yyS[yypt-6 : yypt+1]
		//line a.y:203
		{
			outcode(yyDollar[1].lval, yyDollar[2].lval, &yyDollar[5].addr, int32(yyDollar[3].addr.Reg), &yyDollar[3].addr)
		}
	case 26:
		yyDollar = yyS[yypt-6 : yypt+1]
		//line a.y:207
		{
			outcode(yyDollar[1].lval, yyDollar[2].lval, &yyDollar[4].addr, int32(yyDollar[6].addr.Reg), &yyDollar[6].addr)
		}
	case 27:
		yyDollar = yyS[yypt-3 : yypt+1]
		//line a.y:214
		{
			outcode(yyDollar[1].lval, yyDollar[2].lval, &nullgen, 0, &nullgen)
		}
	case 28:
		yyDollar = yyS[yypt-5 : yypt+1]
		//line a.y:221
		{
			asm.Settext(yyDollar[2].addr.Sym)
			outcode(yyDollar[1].lval, Always, &yyDollar[2].addr, 0, &yyDollar[5].addr)
			if asm.Pass > 1 {
				lastpc.From3 = new(obj.Addr)
			}
		}
	case 29:
		yyDollar = yyS[yypt-7 : yypt+1]
		//line a.y:229
		{
			asm.Settext(yyDollar[2].addr.Sym)
			outcode(yyDollar[1].lval, Always, &yyDollar[2].addr, 0, &yyDollar[7].addr)
			if asm.Pass > 1 {
				lastpc.From3 = new(obj.Addr)
				lastpc.From3.Type = obj.TYPE_CONST
				lastpc.From3.Offset = int64(yyDollar[4].lval)
			}
		}
	case 30:
		yyDollar = yyS[yypt-4 : yypt+1]
		//line a.y:242
		{
			asm.Settext(yyDollar[2].addr.Sym)
			outcode(yyDollar[1].lval, Always, &yyDollar[2].addr, 0, &yyDollar[4].addr)
			if asm.Pass > 1 {
				lastpc.From3 = new(obj.Addr)
			}
		}
	case 31:
		yyDollar = yyS[yypt-6 : yypt+1]
		//line a.y:250
		{
			asm.Settext(yyDollar[2].addr.Sym)
			outcode(yyDollar[1].lval, Always, &yyDollar[2].addr, 0, &yyDollar[6].addr)
			if asm.Pass > 1 {
				lastpc.From3 = new(obj.Addr)
				lastpc.From3.Type = obj.TYPE_CONST
				lastpc.From3.Offset = int64(yyDollar[4].lval)
			}
		}
	case 32:
		yyDollar = yyS[yypt-6 : yypt+1]
		//line a.y:264
		{
			outcode(yyDollar[1].lval, Always, &yyDollar[2].addr, 0, &yyDollar[6].addr)
			if asm.Pass > 1 {
				lastpc.From3 = new(obj.Addr)
				lastpc.From3.Type = obj.TYPE_CONST
				lastpc.From3.Offset = int64(yyDollar[4].lval)
			}
		}
	case 33:
		yyDollar = yyS[yypt-4 : yypt+1]
		//line a.y:276
		{
			outcode(yyDollar[1].lval, yyDollar[2].lval, &yyDollar[3].addr, 0, &nullgen)
		}
	case 34:
		yyDollar = yyS[yypt-3 : yypt+1]
		//line a.y:283
		{
			outcode(yyDollar[1].lval, Always, &nullgen, 0, &yyDollar[3].addr)
		}
	case 35:
		yyDollar = yyS[yypt-5 : yypt+1]
		//line a.y:290
		{
			outcode(yyDollar[1].lval, yyDollar[2].lval, &yyDollar[3].addr, 0, &yyDollar[5].addr)
		}
	case 36:
		yyDollar = yyS[yypt-5 : yypt+1]
		//line a.y:294
		{
			outcode(yyDollar[1].lval, yyDollar[2].lval, &yyDollar[3].addr, 0, &yyDollar[5].addr)
		}
	case 37:
		yyDollar = yyS[yypt-7 : yypt+1]
		//line a.y:298
		{
			outcode(yyDollar[1].lval, yyDollar[2].lval, &yyDollar[3].addr, yyDollar[5].lval, &yyDollar[7].addr)
		}
	case 38:
		yyDollar = yyS[yypt-6 : yypt+1]
		//line a.y:302
		{
			outcode(yyDollar[1].lval, yyDollar[2].lval, &yyDollar[3].addr, int32(yyDollar[5].addr.Reg), &nullgen)
		}
	case 39:
		yyDollar = yyS[yypt-12 : yypt+1]
		//line a.y:309
		{
			var g obj.Addr

			g = nullgen
			g.Type = obj.TYPE_CONST
			g.Offset = int64(
				(0xe << 24) | /* opcode */
					(yyDollar[1].lval << 20) | /* MCR/MRC */
					((yyDollar[2].lval ^ C_SCOND_XOR) << 28) | /* scond */
					((yyDollar[3].lval & 15) << 8) | /* coprocessor number */
					((yyDollar[5].lval & 7) << 21) | /* coprocessor operation */
					((yyDollar[7].lval & 15) << 12) | /* arm register */
					((yyDollar[9].lval & 15) << 16) | /* Crn */
					((yyDollar[11].lval & 15) << 0) | /* Crm */
					((yyDollar[12].lval & 7) << 5) | /* coprocessor information */
					(1 << 4)) /* must be set */
			outcode(AMRC, Always, &nullgen, 0, &g)
		}
	case 40:
		yyDollar = yyS[yypt-7 : yypt+1]
		//line a.y:321
		{
			outcode(yyDollar[1].lval, yyDollar[2].lval, &yyDollar[3].addr, int32(yyDollar[5].addr.Reg), &yyDollar[7].addr)
		}
	case 41:
		yyDollar = yyS[yypt-9 : yypt+1]
		//line a.y:329
		{
			yyDollar[7].addr.Type = obj.TYPE_REGREG2
			yyDollar[7].addr.Offset = int64(yyDollar[9].lval)
			outcode(yyDollar[1].lval, yyDollar[2].lval, &yyDollar[3].addr, int32(yyDollar[5].addr.Reg), &yyDollar[7].addr)
		}
	case 42:
		yyDollar = yyS[yypt-2 : yypt+1]
		//line a.y:338
		{
			outcode(yyDollar[1].lval, Always, &yyDollar[2].addr, 0, &nullgen)
		}
	case 43:
		yyDollar = yyS[yypt-4 : yypt+1]
		//line a.y:345
		{
			if yyDollar[2].addr.Type != obj.TYPE_CONST || yyDollar[4].addr.Type != obj.TYPE_CONST {
				yyerror("arguments to PCDATA must be integer constants")
			}
			outcode(yyDollar[1].lval, Always, &yyDollar[2].addr, 0, &yyDollar[4].addr)
		}
	case 44:
		yyDollar = yyS[yypt-4 : yypt+1]
		//line a.y:355
		{
			if yyDollar[2].addr.Type != obj.TYPE_CONST {
				yyerror("index for FUNCDATA must be integer constant")
			}
			if yyDollar[4].addr.Type != obj.NAME_EXTERN && yyDollar[4].addr.Type != obj.NAME_STATIC && yyDollar[4].addr.Type != obj.TYPE_MEM {
				yyerror("value for FUNCDATA must be symbol reference")
			}
			outcode(yyDollar[1].lval, Always, &yyDollar[2].addr, 0, &yyDollar[4].addr)
		}
	case 45:
		yyDollar = yyS[yypt-2 : yypt+1]
		//line a.y:368
		{
			outcode(yyDollar[1].lval, Always, &nullgen, 0, &nullgen)
		}
	case 46:
		yyDollar = yyS[yypt-1 : yypt+1]
		//line a.y:374
		{
			yyVAL.addr = nullgen
			yyVAL.addr.Type = obj.TYPE_TEXTSIZE
			yyVAL.addr.Offset = int64(yyDollar[1].lval)
			yyVAL.addr.Val = int32(obj.ArgsSizeUnknown)
		}
	case 47:
		yyDollar = yyS[yypt-2 : yypt+1]
		//line a.y:381
		{
			yyVAL.addr = nullgen
			yyVAL.addr.Type = obj.TYPE_TEXTSIZE
			yyVAL.addr.Offset = -int64(yyDollar[2].lval)
			yyVAL.addr.Val = int32(obj.ArgsSizeUnknown)
		}
	case 48:
		yyDollar = yyS[yypt-3 : yypt+1]
		//line a.y:388
		{
			yyVAL.addr = nullgen
			yyVAL.addr.Type = obj.TYPE_TEXTSIZE
			yyVAL.addr.Offset = int64(yyDollar[1].lval)
			yyVAL.addr.Val = int32(yyDollar[3].lval)
		}
	case 49:
		yyDollar = yyS[yypt-4 : yypt+1]
		//line a.y:395
		{
			yyVAL.addr = nullgen
			yyVAL.addr.Type = obj.TYPE_TEXTSIZE
			yyVAL.addr.Offset = -int64(yyDollar[2].lval)
			yyVAL.addr.Val = int32(yyDollar[4].lval)
		}
	case 50:
		yyDollar = yyS[yypt-0 : yypt+1]
		//line a.y:403
		{
			yyVAL.lval = Always
		}
	case 51:
		yyDollar = yyS[yypt-2 : yypt+1]
		//line a.y:407
		{
			yyVAL.lval = (yyDollar[1].lval & ^C_SCOND) | yyDollar[2].lval
		}
	case 52:
		yyDollar = yyS[yypt-2 : yypt+1]
		//line a.y:411
		{
			yyVAL.lval = yyDollar[1].lval | yyDollar[2].lval
		}
	case 55:
		yyDollar = yyS[yypt-4 : yypt+1]
		//line a.y:420
		{
			yyVAL.addr = nullgen
			yyVAL.addr.Type = obj.TYPE_BRANCH
			yyVAL.addr.Offset = int64(yyDollar[1].lval) + int64(asm.PC)
		}
	case 56:
		yyDollar = yyS[yypt-2 : yypt+1]
		//line a.y:426
		{
			yyDollar[1].sym = asm.LabelLookup(yyDollar[1].sym)
			yyVAL.addr = nullgen
			if asm.Pass == 2 && yyDollar[1].sym.Type != LLAB {
				yyerror("undefined label: %s", yyDollar[1].sym.Labelname)
			}
			yyVAL.addr.Type = obj.TYPE_BRANCH
			yyVAL.addr.Offset = yyDollar[1].sym.Value + int64(yyDollar[2].lval)
		}
	case 57:
		yyDollar = yyS[yypt-2 : yypt+1]
		//line a.y:437
		{
			yyVAL.addr = nullgen
			yyVAL.addr.Type = obj.TYPE_CONST
			yyVAL.addr.Offset = int64(yyDollar[2].lval)
		}
	case 58:
		yyDollar = yyS[yypt-2 : yypt+1]
		//line a.y:443
		{
			yyVAL.addr = yyDollar[2].addr
			yyVAL.addr.Type = obj.TYPE_ADDR
		}
	case 59:
		yyDollar = yyS[yypt-2 : yypt+1]
		//line a.y:448
		{
			yyVAL.addr = nullgen
			yyVAL.addr.Type = obj.TYPE_SCONST
			yyVAL.addr.Val = yyDollar[2].sval
		}
	case 61:
		yyDollar = yyS[yypt-2 : yypt+1]
		//line a.y:457
		{
			yyVAL.addr = nullgen
			yyVAL.addr.Type = obj.TYPE_FCONST
			yyVAL.addr.Val = yyDollar[2].dval
		}
	case 62:
		yyDollar = yyS[yypt-3 : yypt+1]
		//line a.y:463
		{
			yyVAL.addr = nullgen
			yyVAL.addr.Type = obj.TYPE_FCONST
			yyVAL.addr.Val = -yyDollar[3].dval
		}
	case 63:
		yyDollar = yyS[yypt-1 : yypt+1]
		//line a.y:471
		{
			yyVAL.lval = 1 << uint(yyDollar[1].lval&15)
		}
	case 64:
		yyDollar = yyS[yypt-3 : yypt+1]
		//line a.y:475
		{
			yyVAL.lval = 0
			for i := yyDollar[1].lval; i <= yyDollar[3].lval; i++ {
				yyVAL.lval |= 1 << uint(i&15)
			}
			for i := yyDollar[3].lval; i <= yyDollar[1].lval; i++ {
				yyVAL.lval |= 1 << uint(i&15)
			}
		}
	case 65:
		yyDollar = yyS[yypt-3 : yypt+1]
		//line a.y:485
		{
			yyVAL.lval = (1 << uint(yyDollar[1].lval&15)) | yyDollar[3].lval
		}
	case 69:
		yyDollar = yyS[yypt-4 : yypt+1]
		//line a.y:494
		{
			yyVAL.addr = yyDollar[1].addr
			yyVAL.addr.Reg = int16(yyDollar[3].lval)
		}
	case 70:
		yyDollar = yyS[yypt-1 : yypt+1]
		//line a.y:499
		{
			yyVAL.addr = nullgen
			yyVAL.addr.Type = obj.TYPE_REG
			yyVAL.addr.Reg = int16(yyDollar[1].lval)
		}
	case 71:
		yyDollar = yyS[yypt-1 : yypt+1]
		//line a.y:505
		{
			yyVAL.addr = nullgen
			yyVAL.addr.Type = obj.TYPE_REG
			yyVAL.addr.Reg = int16(yyDollar[1].lval)
		}
	case 72:
		yyDollar = yyS[yypt-1 : yypt+1]
		//line a.y:511
		{
			yyVAL.addr = nullgen
			yyVAL.addr.Type = obj.TYPE_MEM
			yyVAL.addr.Offset = int64(yyDollar[1].lval)
		}
	case 76:
		yyDollar = yyS[yypt-1 : yypt+1]
		//line a.y:522
		{
			yyVAL.addr = yyDollar[1].addr
			if yyDollar[1].addr.Name != obj.NAME_EXTERN && yyDollar[1].addr.Name != obj.NAME_STATIC {
			}
		}
	case 77:
		yyDollar = yyS[yypt-3 : yypt+1]
		//line a.y:530
		{
			yyVAL.addr = nullgen
			yyVAL.addr.Type = obj.TYPE_MEM
			yyVAL.addr.Reg = int16(yyDollar[2].lval)
			yyVAL.addr.Offset = 0
		}
	case 79:
		yyDollar = yyS[yypt-4 : yypt+1]
		//line a.y:540
		{
			yyVAL.addr = nullgen
			yyVAL.addr.Type = obj.TYPE_MEM
			yyVAL.addr.Reg = int16(yyDollar[3].lval)
			yyVAL.addr.Offset = int64(yyDollar[1].lval)
		}
	case 81:
		yyDollar = yyS[yypt-4 : yypt+1]
		//line a.y:550
		{
			yyVAL.addr = yyDollar[1].addr
			yyVAL.addr.Type = obj.TYPE_MEM
			yyVAL.addr.Reg = int16(yyDollar[3].lval)
		}
	case 86:
		yyDollar = yyS[yypt-2 : yypt+1]
		//line a.y:563
		{
			yyVAL.addr = nullgen
			yyVAL.addr.Type = obj.TYPE_CONST
			yyVAL.addr.Offset = int64(yyDollar[2].lval)
		}
	case 87:
		yyDollar = yyS[yypt-1 : yypt+1]
		//line a.y:571
		{
			yyVAL.addr = nullgen
			yyVAL.addr.Type = obj.TYPE_REG
			yyVAL.addr.Reg = int16(yyDollar[1].lval)
		}
	case 88:
		yyDollar = yyS[yypt-5 : yypt+1]
		//line a.y:579
		{
			yyVAL.addr = nullgen
			yyVAL.addr.Type = obj.TYPE_REGREG
			yyVAL.addr.Reg = int16(yyDollar[2].lval)
			yyVAL.addr.Offset = int64(yyDollar[4].lval)
		}
	case 89:
		yyDollar = yyS[yypt-4 : yypt+1]
		//line a.y:588
		{
			yyVAL.addr = nullgen
			yyVAL.addr.Type = obj.TYPE_SHIFT
			yyVAL.addr.Offset = int64(yyDollar[1].lval&15) | int64(yyDollar[4].lval) | (0 << 5)
		}
	case 90:
		yyDollar = yyS[yypt-4 : yypt+1]
		//line a.y:594
		{
			yyVAL.addr = nullgen
			yyVAL.addr.Type = obj.TYPE_SHIFT
			yyVAL.addr.Offset = int64(yyDollar[1].lval&15) | int64(yyDollar[4].lval) | (1 << 5)
		}
	case 91:
		yyDollar = yyS[yypt-4 : yypt+1]
		//line a.y:600
		{
			yyVAL.addr = nullgen
			yyVAL.addr.Type = obj.TYPE_SHIFT
			yyVAL.addr.Offset = int64(yyDollar[1].lval&15) | int64(yyDollar[4].lval) | (2 << 5)
		}
	case 92:
		yyDollar = yyS[yypt-4 : yypt+1]
		//line a.y:606
		{
			yyVAL.addr = nullgen
			yyVAL.addr.Type = obj.TYPE_SHIFT
			yyVAL.addr.Offset = int64(yyDollar[1].lval&15) | int64(yyDollar[4].lval) | (3 << 5)
		}
	case 93:
		yyDollar = yyS[yypt-1 : yypt+1]
		//line a.y:614
		{
			if yyVAL.lval < REG_R0 || yyVAL.lval > REG_R15 {
				print("register value out of range\n")
			}
			yyVAL.lval = ((yyDollar[1].lval & 15) << 8) | (1 << 4)
		}
	case 94:
		yyDollar = yyS[yypt-1 : yypt+1]
		//line a.y:621
		{
			if yyVAL.lval < 0 || yyVAL.lval >= 32 {
				print("shift value out of range\n")
			}
			yyVAL.lval = (yyDollar[1].lval & 31) << 7
		}
	case 96:
		yyDollar = yyS[yypt-1 : yypt+1]
		//line a.y:631
		{
			yyVAL.lval = REGPC
		}
	case 97:
		yyDollar = yyS[yypt-4 : yypt+1]
		//line a.y:635
		{
			if yyDollar[3].lval < 0 || yyDollar[3].lval >= NREG {
				print("register value out of range\n")
			}
			yyVAL.lval = REG_R0 + yyDollar[3].lval
		}
	case 99:
		yyDollar = yyS[yypt-1 : yypt+1]
		//line a.y:645
		{
			yyVAL.lval = REGSP
		}
	case 101:
		yyDollar = yyS[yypt-4 : yypt+1]
		//line a.y:652
		{
			if yyDollar[3].lval < 0 || yyDollar[3].lval >= NREG {
				print("register value out of range\n")
			}
			yyVAL.lval = yyDollar[3].lval // TODO(rsc): REG_C0+$3
		}
	case 104:
		yyDollar = yyS[yypt-1 : yypt+1]
		//line a.y:665
		{
			yyVAL.addr = nullgen
			yyVAL.addr.Type = obj.TYPE_REG
			yyVAL.addr.Reg = int16(yyDollar[1].lval)
		}
	case 105:
		yyDollar = yyS[yypt-4 : yypt+1]
		//line a.y:671
		{
			yyVAL.addr = nullgen
			yyVAL.addr.Type = obj.TYPE_REG
			yyVAL.addr.Reg = int16(REG_F0 + yyDollar[3].lval)
		}
	case 106:
		yyDollar = yyS[yypt-4 : yypt+1]
		//line a.y:679
		{
			yyVAL.addr = nullgen
			yyVAL.addr.Type = obj.TYPE_MEM
			yyVAL.addr.Name = int8(yyDollar[3].lval)
			yyVAL.addr.Sym = nil
			yyVAL.addr.Offset = int64(yyDollar[1].lval)
		}
	case 107:
		yyDollar = yyS[yypt-5 : yypt+1]
		//line a.y:687
		{
			yyVAL.addr = nullgen
			yyVAL.addr.Type = obj.TYPE_MEM
			yyVAL.addr.Name = int8(yyDollar[4].lval)
			yyVAL.addr.Sym = obj.Linklookup(asm.Ctxt, yyDollar[1].sym.Name, 0)
			yyVAL.addr.Offset = int64(yyDollar[2].lval)
		}
	case 108:
		yyDollar = yyS[yypt-7 : yypt+1]
		//line a.y:695
		{
			yyVAL.addr = nullgen
			yyVAL.addr.Type = obj.TYPE_MEM
			yyVAL.addr.Name = obj.NAME_STATIC
			yyVAL.addr.Sym = obj.Linklookup(asm.Ctxt, yyDollar[1].sym.Name, 1)
			yyVAL.addr.Offset = int64(yyDollar[4].lval)
		}
	case 109:
		yyDollar = yyS[yypt-0 : yypt+1]
		//line a.y:704
		{
			yyVAL.lval = 0
		}
	case 110:
		yyDollar = yyS[yypt-2 : yypt+1]
		//line a.y:708
		{
			yyVAL.lval = yyDollar[2].lval
		}
	case 111:
		yyDollar = yyS[yypt-2 : yypt+1]
		//line a.y:712
		{
			yyVAL.lval = -yyDollar[2].lval
		}
	case 116:
		yyDollar = yyS[yypt-1 : yypt+1]
		//line a.y:724
		{
			yyVAL.lval = int32(yyDollar[1].sym.Value)
		}
	case 117:
		yyDollar = yyS[yypt-2 : yypt+1]
		//line a.y:728
		{
			yyVAL.lval = -yyDollar[2].lval
		}
	case 118:
		yyDollar = yyS[yypt-2 : yypt+1]
		//line a.y:732
		{
			yyVAL.lval = yyDollar[2].lval
		}
	case 119:
		yyDollar = yyS[yypt-2 : yypt+1]
		//line a.y:736
		{
			yyVAL.lval = ^yyDollar[2].lval
		}
	case 120:
		yyDollar = yyS[yypt-3 : yypt+1]
		//line a.y:740
		{
			yyVAL.lval = yyDollar[2].lval
		}
	case 121:
		yyDollar = yyS[yypt-0 : yypt+1]
		//line a.y:745
		{
			yyVAL.lval = 0
		}
	case 122:
		yyDollar = yyS[yypt-2 : yypt+1]
		//line a.y:749
		{
			yyVAL.lval = yyDollar[2].lval
		}
	case 124:
		yyDollar = yyS[yypt-3 : yypt+1]
		//line a.y:756
		{
			yyVAL.lval = yyDollar[1].lval + yyDollar[3].lval
		}
	case 125:
		yyDollar = yyS[yypt-3 : yypt+1]
		//line a.y:760
		{
			yyVAL.lval = yyDollar[1].lval - yyDollar[3].lval
		}
	case 126:
		yyDollar = yyS[yypt-3 : yypt+1]
		//line a.y:764
		{
			yyVAL.lval = yyDollar[1].lval * yyDollar[3].lval
		}
	case 127:
		yyDollar = yyS[yypt-3 : yypt+1]
		//line a.y:768
		{
			yyVAL.lval = yyDollar[1].lval / yyDollar[3].lval
		}
	case 128:
		yyDollar = yyS[yypt-3 : yypt+1]
		//line a.y:772
		{
			yyVAL.lval = yyDollar[1].lval % yyDollar[3].lval
		}
	case 129:
		yyDollar = yyS[yypt-4 : yypt+1]
		//line a.y:776
		{
			yyVAL.lval = yyDollar[1].lval << uint(yyDollar[4].lval)
		}
	case 130:
		yyDollar = yyS[yypt-4 : yypt+1]
		//line a.y:780
		{
			yyVAL.lval = yyDollar[1].lval >> uint(yyDollar[4].lval)
		}
	case 131:
		yyDollar = yyS[yypt-3 : yypt+1]
		//line a.y:784
		{
			yyVAL.lval = yyDollar[1].lval & yyDollar[3].lval
		}
	case 132:
		yyDollar = yyS[yypt-3 : yypt+1]
		//line a.y:788
		{
			yyVAL.lval = yyDollar[1].lval ^ yyDollar[3].lval
		}
	case 133:
		yyDollar = yyS[yypt-3 : yypt+1]
		//line a.y:792
		{
			yyVAL.lval = yyDollar[1].lval | yyDollar[3].lval
		}
	}
	goto yystack /* stack new state and value */
}
Пример #3
0
Файл: y.go Проект: Ericean/go
func (yyrcvr *yyParserImpl) Parse(yylex yyLexer) int {
	var yyn int
	var yylval yySymType
	var yyVAL yySymType
	var yyDollar []yySymType
	yyS := make([]yySymType, yyMaxDepth)

	Nerrs := 0   /* number of errors */
	Errflag := 0 /* error recovery flag */
	yystate := 0
	yychar := -1
	yytoken := -1 // yychar translated into internal numbering
	yyrcvr.lookahead = func() int { return yychar }
	defer func() {
		// Make sure we report no lookahead when not parsing.
		yystate = -1
		yychar = -1
		yytoken = -1
	}()
	yyp := -1
	goto yystack

ret0:
	return 0

ret1:
	return 1

yystack:
	/* put a state and value onto the stack */
	if yyDebug >= 4 {
		__yyfmt__.Printf("char %v in %v\n", yyTokname(yytoken), yyStatname(yystate))
	}

	yyp++
	if yyp >= len(yyS) {
		nyys := make([]yySymType, len(yyS)*2)
		copy(nyys, yyS)
		yyS = nyys
	}
	yyS[yyp] = yyVAL
	yyS[yyp].yys = yystate

yynewstate:
	yyn = yyPact[yystate]
	if yyn <= yyFlag {
		goto yydefault /* simple state */
	}
	if yychar < 0 {
		yychar, yytoken = yylex1(yylex, &yylval)
	}
	yyn += yytoken
	if yyn < 0 || yyn >= yyLast {
		goto yydefault
	}
	yyn = yyAct[yyn]
	if yyChk[yyn] == yytoken { /* valid shift */
		yychar = -1
		yytoken = -1
		yyVAL = yylval
		yystate = yyn
		if Errflag > 0 {
			Errflag--
		}
		goto yystack
	}

yydefault:
	/* default state action */
	yyn = yyDef[yystate]
	if yyn == -2 {
		if yychar < 0 {
			yychar, yytoken = yylex1(yylex, &yylval)
		}

		/* look through exception table */
		xi := 0
		for {
			if yyExca[xi+0] == -1 && yyExca[xi+1] == yystate {
				break
			}
			xi += 2
		}
		for xi += 2; ; xi += 2 {
			yyn = yyExca[xi+0]
			if yyn < 0 || yyn == yytoken {
				break
			}
		}
		yyn = yyExca[xi+1]
		if yyn < 0 {
			goto ret0
		}
	}
	if yyn == 0 {
		/* error ... attempt to resume parsing */
		switch Errflag {
		case 0: /* brand new error */
			yylex.Error(yyErrorMessage(yystate, yytoken))
			Nerrs++
			if yyDebug >= 1 {
				__yyfmt__.Printf("%s", yyStatname(yystate))
				__yyfmt__.Printf(" saw %s\n", yyTokname(yytoken))
			}
			fallthrough

		case 1, 2: /* incompletely recovered error ... try again */
			Errflag = 3

			/* find a state where "error" is a legal shift action */
			for yyp >= 0 {
				yyn = yyPact[yyS[yyp].yys] + yyErrCode
				if yyn >= 0 && yyn < yyLast {
					yystate = yyAct[yyn] /* simulate a shift of "error" */
					if yyChk[yystate] == yyErrCode {
						goto yystack
					}
				}

				/* the current p has no shift on "error", pop stack */
				if yyDebug >= 2 {
					__yyfmt__.Printf("error recovery pops state %d\n", yyS[yyp].yys)
				}
				yyp--
			}
			/* there is no state on the stack with an error shift ... abort */
			goto ret1

		case 3: /* no shift yet; clobber input char */
			if yyDebug >= 2 {
				__yyfmt__.Printf("error recovery discards %s\n", yyTokname(yytoken))
			}
			if yytoken == yyEofCode {
				goto ret1
			}
			yychar = -1
			yytoken = -1
			goto yynewstate /* try again in the same state */
		}
	}

	/* reduction by production yyn */
	if yyDebug >= 2 {
		__yyfmt__.Printf("reduce %v in:\n\t%v\n", yyn, yyStatname(yystate))
	}

	yynt := yyn
	yypt := yyp
	_ = yypt // guard against "declared and not used"

	yyp -= yyR2[yyn]
	// yyp is now the index of $0. Perform the default action. Iff the
	// reduced production is ε, $1 is possibly out of range.
	if yyp+1 >= len(yyS) {
		nyys := make([]yySymType, len(yyS)*2)
		copy(nyys, yyS)
		yyS = nyys
	}
	yyVAL = yyS[yyp+1]

	/* consult goto table to find next state */
	yyn = yyR1[yyn]
	yyg := yyPgo[yyn]
	yyj := yyg + yyS[yyp].yys + 1

	if yyj >= yyLast {
		yystate = yyAct[yyg]
	} else {
		yystate = yyAct[yyj]
		if yyChk[yystate] != -yyn {
			yystate = yyAct[yyg]
		}
	}
	// dummy call; replaced with literal code
	switch yynt {

	case 2:
		yyDollar = yyS[yypt-1 : yypt+1]
		//line a.y:74
		{
			stmtline = asm.Lineno
		}
	case 4:
		yyDollar = yyS[yypt-2 : yypt+1]
		//line a.y:81
		{
			yyDollar[1].sym = asm.LabelLookup(yyDollar[1].sym)
			if yyDollar[1].sym.Type == LLAB && yyDollar[1].sym.Value != int64(asm.PC) {
				yyerror("redeclaration of %s", yyDollar[1].sym.Labelname)
			}
			yyDollar[1].sym.Type = LLAB
			yyDollar[1].sym.Value = int64(asm.PC)
		}
	case 9:
		yyDollar = yyS[yypt-3 : yypt+1]
		//line a.y:96
		{
			yyDollar[1].sym.Type = LVAR
			yyDollar[1].sym.Value = yyDollar[3].lval
		}
	case 10:
		yyDollar = yyS[yypt-3 : yypt+1]
		//line a.y:101
		{
			if yyDollar[1].sym.Value != int64(yyDollar[3].lval) {
				yyerror("redeclaration of %s", yyDollar[1].sym.Name)
			}
			yyDollar[1].sym.Value = yyDollar[3].lval
		}
	case 11:
		yyDollar = yyS[yypt-2 : yypt+1]
		//line a.y:107
		{
			outcode(int(yyDollar[1].lval), &yyDollar[2].addr2)
		}
	case 12:
		yyDollar = yyS[yypt-2 : yypt+1]
		//line a.y:108
		{
			outcode(int(yyDollar[1].lval), &yyDollar[2].addr2)
		}
	case 13:
		yyDollar = yyS[yypt-2 : yypt+1]
		//line a.y:109
		{
			outcode(int(yyDollar[1].lval), &yyDollar[2].addr2)
		}
	case 14:
		yyDollar = yyS[yypt-2 : yypt+1]
		//line a.y:110
		{
			outcode(int(yyDollar[1].lval), &yyDollar[2].addr2)
		}
	case 15:
		yyDollar = yyS[yypt-2 : yypt+1]
		//line a.y:111
		{
			outcode(int(yyDollar[1].lval), &yyDollar[2].addr2)
		}
	case 16:
		yyDollar = yyS[yypt-2 : yypt+1]
		//line a.y:112
		{
			outcode(int(yyDollar[1].lval), &yyDollar[2].addr2)
		}
	case 19:
		yyDollar = yyS[yypt-2 : yypt+1]
		//line a.y:115
		{
			outcode(int(yyDollar[1].lval), &yyDollar[2].addr2)
		}
	case 20:
		yyDollar = yyS[yypt-2 : yypt+1]
		//line a.y:116
		{
			outcode(int(yyDollar[1].lval), &yyDollar[2].addr2)
		}
	case 21:
		yyDollar = yyS[yypt-2 : yypt+1]
		//line a.y:117
		{
			outcode(int(yyDollar[1].lval), &yyDollar[2].addr2)
		}
	case 22:
		yyDollar = yyS[yypt-2 : yypt+1]
		//line a.y:118
		{
			outcode(int(yyDollar[1].lval), &yyDollar[2].addr2)
		}
	case 23:
		yyDollar = yyS[yypt-2 : yypt+1]
		//line a.y:119
		{
			outcode(int(yyDollar[1].lval), &yyDollar[2].addr2)
		}
	case 25:
		yyDollar = yyS[yypt-2 : yypt+1]
		//line a.y:121
		{
			outcode(int(yyDollar[1].lval), &yyDollar[2].addr2)
		}
	case 26:
		yyDollar = yyS[yypt-2 : yypt+1]
		//line a.y:122
		{
			outcode(int(yyDollar[1].lval), &yyDollar[2].addr2)
		}
	case 27:
		yyDollar = yyS[yypt-2 : yypt+1]
		//line a.y:123
		{
			outcode(int(yyDollar[1].lval), &yyDollar[2].addr2)
		}
	case 28:
		yyDollar = yyS[yypt-2 : yypt+1]
		//line a.y:124
		{
			outcode(int(yyDollar[1].lval), &yyDollar[2].addr2)
		}
	case 29:
		yyDollar = yyS[yypt-0 : yypt+1]
		//line a.y:127
		{
			yyVAL.addr2.from = nullgen
			yyVAL.addr2.to = nullgen
		}
	case 30:
		yyDollar = yyS[yypt-1 : yypt+1]
		//line a.y:132
		{
			yyVAL.addr2.from = nullgen
			yyVAL.addr2.to = nullgen
		}
	case 31:
		yyDollar = yyS[yypt-3 : yypt+1]
		//line a.y:139
		{
			yyVAL.addr2.from = yyDollar[1].addr
			yyVAL.addr2.to = yyDollar[3].addr
		}
	case 32:
		yyDollar = yyS[yypt-3 : yypt+1]
		//line a.y:146
		{
			yyVAL.addr2.from = yyDollar[1].addr
			yyVAL.addr2.to = yyDollar[3].addr
		}
	case 33:
		yyDollar = yyS[yypt-2 : yypt+1]
		//line a.y:153
		{
			yyVAL.addr2.from = yyDollar[1].addr
			yyVAL.addr2.to = nullgen
		}
	case 34:
		yyDollar = yyS[yypt-1 : yypt+1]
		//line a.y:158
		{
			yyVAL.addr2.from = yyDollar[1].addr
			yyVAL.addr2.to = nullgen
		}
	case 35:
		yyDollar = yyS[yypt-2 : yypt+1]
		//line a.y:165
		{
			yyVAL.addr2.from = nullgen
			yyVAL.addr2.to = yyDollar[2].addr
		}
	case 36:
		yyDollar = yyS[yypt-1 : yypt+1]
		//line a.y:170
		{
			yyVAL.addr2.from = nullgen
			yyVAL.addr2.to = yyDollar[1].addr
		}
	case 37:
		yyDollar = yyS[yypt-2 : yypt+1]
		//line a.y:177
		{
			yyVAL.addr2.from = nullgen
			yyVAL.addr2.to = yyDollar[2].addr
		}
	case 38:
		yyDollar = yyS[yypt-1 : yypt+1]
		//line a.y:182
		{
			yyVAL.addr2.from = nullgen
			yyVAL.addr2.to = yyDollar[1].addr
		}
	case 39:
		yyDollar = yyS[yypt-3 : yypt+1]
		//line a.y:187
		{
			yyVAL.addr2.from = yyDollar[1].addr
			yyVAL.addr2.to = yyDollar[3].addr
		}
	case 40:
		yyDollar = yyS[yypt-6 : yypt+1]
		//line a.y:194
		{
			outcode(obj.ADATA, &Addr2{yyDollar[2].addr, yyDollar[6].addr})
			if asm.Pass > 1 {
				lastpc.From3 = new(obj.Addr)
				lastpc.From3.Type = obj.TYPE_CONST
				lastpc.From3.Offset = yyDollar[4].lval
			}
		}
	case 41:
		yyDollar = yyS[yypt-5 : yypt+1]
		//line a.y:205
		{
			asm.Settext(yyDollar[2].addr.Sym)
			outcode(obj.ATEXT, &Addr2{yyDollar[2].addr, yyDollar[5].addr})
			if asm.Pass > 1 {
				lastpc.From3 = new(obj.Addr)
			}
		}
	case 42:
		yyDollar = yyS[yypt-7 : yypt+1]
		//line a.y:213
		{
			asm.Settext(yyDollar[2].addr.Sym)
			outcode(obj.ATEXT, &Addr2{yyDollar[2].addr, yyDollar[7].addr})
			if asm.Pass > 1 {
				lastpc.From3 = new(obj.Addr)
				lastpc.From3.Type = obj.TYPE_CONST
				lastpc.From3.Offset = yyDollar[4].lval
			}
		}
	case 43:
		yyDollar = yyS[yypt-4 : yypt+1]
		//line a.y:225
		{
			asm.Settext(yyDollar[2].addr.Sym)
			outcode(obj.AGLOBL, &Addr2{yyDollar[2].addr, yyDollar[4].addr})
			if asm.Pass > 1 {
				lastpc.From3 = new(obj.Addr)
			}
		}
	case 44:
		yyDollar = yyS[yypt-6 : yypt+1]
		//line a.y:233
		{
			asm.Settext(yyDollar[2].addr.Sym)
			outcode(obj.AGLOBL, &Addr2{yyDollar[2].addr, yyDollar[6].addr})
			if asm.Pass > 1 {
				lastpc.From3 = new(obj.Addr)
				lastpc.From3.Type = obj.TYPE_CONST
				lastpc.From3.Offset = yyDollar[4].lval
			}
		}
	case 45:
		yyDollar = yyS[yypt-2 : yypt+1]
		//line a.y:246
		{
			yyVAL.addr2.from = nullgen
			yyVAL.addr2.to = yyDollar[2].addr
		}
	case 46:
		yyDollar = yyS[yypt-1 : yypt+1]
		//line a.y:251
		{
			yyVAL.addr2.from = nullgen
			yyVAL.addr2.to = yyDollar[1].addr
		}
	case 47:
		yyDollar = yyS[yypt-2 : yypt+1]
		//line a.y:256
		{
			yyVAL.addr2.from = nullgen
			yyVAL.addr2.to = yyDollar[2].addr
			yyVAL.addr2.to.Type = obj.TYPE_INDIR
		}
	case 50:
		yyDollar = yyS[yypt-3 : yypt+1]
		//line a.y:268
		{
			yyVAL.addr2.from = yyDollar[1].addr
			yyVAL.addr2.to = yyDollar[3].addr
		}
	case 51:
		yyDollar = yyS[yypt-5 : yypt+1]
		//line a.y:273
		{
			yyVAL.addr2.from = yyDollar[1].addr
			yyVAL.addr2.to = yyDollar[3].addr
			if yyVAL.addr2.from.Index != obj.TYPE_NONE {
				yyerror("dp shift with lhs index")
			}
			yyVAL.addr2.from.Index = int16(yyDollar[5].lval)
		}
	case 52:
		yyDollar = yyS[yypt-3 : yypt+1]
		//line a.y:284
		{
			yyVAL.addr2.from = yyDollar[1].addr
			yyVAL.addr2.to = yyDollar[3].addr
		}
	case 53:
		yyDollar = yyS[yypt-5 : yypt+1]
		//line a.y:289
		{
			yyVAL.addr2.from = yyDollar[1].addr
			yyVAL.addr2.to = yyDollar[3].addr
			if yyVAL.addr2.to.Index != obj.TYPE_NONE {
				yyerror("dp move with lhs index")
			}
			yyVAL.addr2.to.Index = int16(yyDollar[5].lval)
		}
	case 54:
		yyDollar = yyS[yypt-2 : yypt+1]
		//line a.y:300
		{
			yyVAL.addr2.from = yyDollar[1].addr
			yyVAL.addr2.to = nullgen
		}
	case 55:
		yyDollar = yyS[yypt-1 : yypt+1]
		//line a.y:305
		{
			yyVAL.addr2.from = yyDollar[1].addr
			yyVAL.addr2.to = nullgen
		}
	case 56:
		yyDollar = yyS[yypt-3 : yypt+1]
		//line a.y:310
		{
			yyVAL.addr2.from = yyDollar[1].addr
			yyVAL.addr2.to = yyDollar[3].addr
		}
	case 57:
		yyDollar = yyS[yypt-5 : yypt+1]
		//line a.y:317
		{
			yyVAL.addr2.from = yyDollar[1].addr
			yyVAL.addr2.to = yyDollar[3].addr
			yyVAL.addr2.to.Offset = yyDollar[5].lval
		}
	case 58:
		yyDollar = yyS[yypt-5 : yypt+1]
		//line a.y:325
		{
			yyVAL.addr2.from = yyDollar[3].addr
			yyVAL.addr2.to = yyDollar[5].addr
			if yyDollar[1].addr.Type != obj.TYPE_CONST {
				yyerror("illegal constant")
			}
			yyVAL.addr2.to.Offset = yyDollar[1].addr.Offset
		}
	case 59:
		yyDollar = yyS[yypt-3 : yypt+1]
		//line a.y:336
		{
			if yyDollar[1].addr.Type != obj.TYPE_CONST || yyDollar[3].addr.Type != obj.TYPE_CONST {
				yyerror("arguments to PCDATA must be integer constants")
			}
			yyVAL.addr2.from = yyDollar[1].addr
			yyVAL.addr2.to = yyDollar[3].addr
		}
	case 60:
		yyDollar = yyS[yypt-3 : yypt+1]
		//line a.y:346
		{
			if yyDollar[1].addr.Type != obj.TYPE_CONST {
				yyerror("index for FUNCDATA must be integer constant")
			}
			if yyDollar[3].addr.Type != obj.TYPE_MEM || (yyDollar[3].addr.Name != obj.NAME_EXTERN && yyDollar[3].addr.Name != obj.NAME_STATIC) {
				yyerror("value for FUNCDATA must be symbol reference")
			}
			yyVAL.addr2.from = yyDollar[1].addr
			yyVAL.addr2.to = yyDollar[3].addr
		}
	case 65:
		yyDollar = yyS[yypt-2 : yypt+1]
		//line a.y:365
		{
			yyVAL.addr = yyDollar[2].addr
		}
	case 66:
		yyDollar = yyS[yypt-2 : yypt+1]
		//line a.y:369
		{
			yyVAL.addr = yyDollar[2].addr
		}
	case 72:
		yyDollar = yyS[yypt-4 : yypt+1]
		//line a.y:382
		{
			yyVAL.addr = nullgen
			yyVAL.addr.Type = obj.TYPE_BRANCH
			yyVAL.addr.Offset = yyDollar[1].lval + int64(asm.PC)
		}
	case 73:
		yyDollar = yyS[yypt-2 : yypt+1]
		//line a.y:388
		{
			yyDollar[1].sym = asm.LabelLookup(yyDollar[1].sym)
			yyVAL.addr = nullgen
			if asm.Pass == 2 && yyDollar[1].sym.Type != LLAB {
				yyerror("undefined label: %s", yyDollar[1].sym.Labelname)
			}
			yyVAL.addr.Type = obj.TYPE_BRANCH
			yyVAL.addr.Offset = yyDollar[1].sym.Value + yyDollar[2].lval
		}
	case 74:
		yyDollar = yyS[yypt-1 : yypt+1]
		//line a.y:400
		{
			yyVAL.addr = nullgen
			yyVAL.addr.Type = obj.TYPE_REG
			yyVAL.addr.Reg = int16(yyDollar[1].lval)
		}
	case 75:
		yyDollar = yyS[yypt-1 : yypt+1]
		//line a.y:406
		{
			yyVAL.addr = nullgen
			yyVAL.addr.Type = obj.TYPE_REG
			yyVAL.addr.Reg = int16(yyDollar[1].lval)
		}
	case 76:
		yyDollar = yyS[yypt-1 : yypt+1]
		//line a.y:412
		{
			yyVAL.addr = nullgen
			yyVAL.addr.Type = obj.TYPE_REG
			yyVAL.addr.Reg = int16(yyDollar[1].lval)
		}
	case 77:
		yyDollar = yyS[yypt-1 : yypt+1]
		//line a.y:418
		{
			yyVAL.addr = nullgen
			yyVAL.addr.Type = obj.TYPE_REG
			yyVAL.addr.Reg = int16(yyDollar[1].lval)
		}
	case 78:
		yyDollar = yyS[yypt-1 : yypt+1]
		//line a.y:424
		{
			yyVAL.addr = nullgen
			yyVAL.addr.Type = obj.TYPE_REG
			yyVAL.addr.Reg = REG_SP
		}
	case 79:
		yyDollar = yyS[yypt-1 : yypt+1]
		//line a.y:430
		{
			yyVAL.addr = nullgen
			yyVAL.addr.Type = obj.TYPE_REG
			yyVAL.addr.Reg = int16(yyDollar[1].lval)
		}
	case 80:
		yyDollar = yyS[yypt-2 : yypt+1]
		//line a.y:438
		{
			yyVAL.addr = nullgen
			yyVAL.addr.Type = obj.TYPE_CONST
			yyVAL.addr.Offset = yyDollar[2].lval
		}
	case 81:
		yyDollar = yyS[yypt-2 : yypt+1]
		//line a.y:444
		{
			yyVAL.addr = yyDollar[2].addr
			yyVAL.addr.Type = obj.TYPE_ADDR
			/*
				if($2.Type == D_AUTO || $2.Type == D_PARAM)
					yyerror("constant cannot be automatic: %s",
						$2.Sym.name);
			*/
		}
	case 82:
		yyDollar = yyS[yypt-2 : yypt+1]
		//line a.y:453
		{
			yyVAL.addr = nullgen
			yyVAL.addr.Type = obj.TYPE_SCONST
			yyVAL.addr.Val = yyDollar[2].sval
		}
	case 83:
		yyDollar = yyS[yypt-2 : yypt+1]
		//line a.y:459
		{
			yyVAL.addr = nullgen
			yyVAL.addr.Type = obj.TYPE_FCONST
			yyVAL.addr.Val = yyDollar[2].dval
		}
	case 84:
		yyDollar = yyS[yypt-4 : yypt+1]
		//line a.y:465
		{
			yyVAL.addr = nullgen
			yyVAL.addr.Type = obj.TYPE_FCONST
			yyVAL.addr.Val = yyDollar[3].dval
		}
	case 85:
		yyDollar = yyS[yypt-5 : yypt+1]
		//line a.y:471
		{
			yyVAL.addr = nullgen
			yyVAL.addr.Type = obj.TYPE_FCONST
			yyVAL.addr.Val = -yyDollar[4].dval
		}
	case 86:
		yyDollar = yyS[yypt-3 : yypt+1]
		//line a.y:477
		{
			yyVAL.addr = nullgen
			yyVAL.addr.Type = obj.TYPE_FCONST
			yyVAL.addr.Val = -yyDollar[3].dval
		}
	case 87:
		yyDollar = yyS[yypt-1 : yypt+1]
		//line a.y:485
		{
			yyVAL.addr = nullgen
			yyVAL.addr.Type = obj.TYPE_TEXTSIZE
			yyVAL.addr.Offset = yyDollar[1].lval
			yyVAL.addr.Val = int32(obj.ArgsSizeUnknown)
		}
	case 88:
		yyDollar = yyS[yypt-2 : yypt+1]
		//line a.y:492
		{
			yyVAL.addr = nullgen
			yyVAL.addr.Type = obj.TYPE_TEXTSIZE
			yyVAL.addr.Offset = -yyDollar[2].lval
			yyVAL.addr.Val = int32(obj.ArgsSizeUnknown)
		}
	case 89:
		yyDollar = yyS[yypt-3 : yypt+1]
		//line a.y:499
		{
			yyVAL.addr = nullgen
			yyVAL.addr.Type = obj.TYPE_TEXTSIZE
			yyVAL.addr.Offset = yyDollar[1].lval
			yyVAL.addr.Val = int32(yyDollar[3].lval)
		}
	case 90:
		yyDollar = yyS[yypt-4 : yypt+1]
		//line a.y:506
		{
			yyVAL.addr = nullgen
			yyVAL.addr.Type = obj.TYPE_TEXTSIZE
			yyVAL.addr.Offset = -yyDollar[2].lval
			yyVAL.addr.Val = int32(yyDollar[4].lval)
		}
	case 93:
		yyDollar = yyS[yypt-1 : yypt+1]
		//line a.y:520
		{
			yyVAL.addr = nullgen
			yyVAL.addr.Type = obj.TYPE_MEM
			yyVAL.addr.Offset = yyDollar[1].lval
		}
	case 94:
		yyDollar = yyS[yypt-4 : yypt+1]
		//line a.y:526
		{
			yyVAL.addr = nullgen
			yyVAL.addr.Type = obj.TYPE_MEM
			yyVAL.addr.Reg = int16(yyDollar[3].lval)
			yyVAL.addr.Offset = yyDollar[1].lval
		}
	case 95:
		yyDollar = yyS[yypt-4 : yypt+1]
		//line a.y:533
		{
			yyVAL.addr = nullgen
			yyVAL.addr.Type = obj.TYPE_MEM
			yyVAL.addr.Reg = REG_SP
			yyVAL.addr.Offset = yyDollar[1].lval
		}
	case 96:
		yyDollar = yyS[yypt-6 : yypt+1]
		//line a.y:540
		{
			yyVAL.addr = nullgen
			yyVAL.addr.Type = obj.TYPE_MEM
			yyVAL.addr.Offset = yyDollar[1].lval
			yyVAL.addr.Index = int16(yyDollar[3].lval)
			yyVAL.addr.Scale = int16(yyDollar[5].lval)
			checkscale(yyVAL.addr.Scale)
		}
	case 97:
		yyDollar = yyS[yypt-9 : yypt+1]
		//line a.y:549
		{
			yyVAL.addr = nullgen
			yyVAL.addr.Type = obj.TYPE_MEM
			yyVAL.addr.Reg = int16(yyDollar[3].lval)
			yyVAL.addr.Offset = yyDollar[1].lval
			yyVAL.addr.Index = int16(yyDollar[6].lval)
			yyVAL.addr.Scale = int16(yyDollar[8].lval)
			checkscale(yyVAL.addr.Scale)
		}
	case 98:
		yyDollar = yyS[yypt-9 : yypt+1]
		//line a.y:559
		{
			yyVAL.addr = nullgen
			yyVAL.addr.Type = obj.TYPE_MEM
			yyVAL.addr.Reg = int16(yyDollar[3].lval)
			yyVAL.addr.Offset = yyDollar[1].lval
			yyVAL.addr.Index = int16(yyDollar[6].lval)
			yyVAL.addr.Scale = int16(yyDollar[8].lval)
			checkscale(yyVAL.addr.Scale)
		}
	case 99:
		yyDollar = yyS[yypt-3 : yypt+1]
		//line a.y:569
		{
			yyVAL.addr = nullgen
			yyVAL.addr.Type = obj.TYPE_MEM
			yyVAL.addr.Reg = int16(yyDollar[2].lval)
		}
	case 100:
		yyDollar = yyS[yypt-3 : yypt+1]
		//line a.y:575
		{
			yyVAL.addr = nullgen
			yyVAL.addr.Type = obj.TYPE_MEM
			yyVAL.addr.Reg = REG_SP
		}
	case 101:
		yyDollar = yyS[yypt-4 : yypt+1]
		//line a.y:581
		{
			yyVAL.addr = nullgen
			yyVAL.addr.Type = obj.TYPE_MEM
			yyVAL.addr.Reg = int16(yyDollar[3].lval)
			yyVAL.addr.Offset = yyDollar[1].lval
		}
	case 102:
		yyDollar = yyS[yypt-5 : yypt+1]
		//line a.y:588
		{
			yyVAL.addr = nullgen
			yyVAL.addr.Type = obj.TYPE_MEM
			yyVAL.addr.Index = int16(yyDollar[2].lval)
			yyVAL.addr.Scale = int16(yyDollar[4].lval)
			checkscale(yyVAL.addr.Scale)
		}
	case 103:
		yyDollar = yyS[yypt-8 : yypt+1]
		//line a.y:596
		{
			yyVAL.addr = nullgen
			yyVAL.addr.Type = obj.TYPE_MEM
			yyVAL.addr.Reg = int16(yyDollar[2].lval)
			yyVAL.addr.Index = int16(yyDollar[5].lval)
			yyVAL.addr.Scale = int16(yyDollar[7].lval)
			checkscale(yyVAL.addr.Scale)
		}
	case 104:
		yyDollar = yyS[yypt-1 : yypt+1]
		//line a.y:607
		{
			yyVAL.addr = yyDollar[1].addr
		}
	case 105:
		yyDollar = yyS[yypt-6 : yypt+1]
		//line a.y:611
		{
			yyVAL.addr = yyDollar[1].addr
			yyVAL.addr.Index = int16(yyDollar[3].lval)
			yyVAL.addr.Scale = int16(yyDollar[5].lval)
			checkscale(yyVAL.addr.Scale)
		}
	case 106:
		yyDollar = yyS[yypt-5 : yypt+1]
		//line a.y:620
		{
			yyVAL.addr = nullgen
			yyVAL.addr.Type = obj.TYPE_MEM
			yyVAL.addr.Name = int8(yyDollar[4].lval)
			yyVAL.addr.Sym = obj.Linklookup(asm.Ctxt, yyDollar[1].sym.Name, 0)
			yyVAL.addr.Offset = yyDollar[2].lval
		}
	case 107:
		yyDollar = yyS[yypt-7 : yypt+1]
		//line a.y:628
		{
			yyVAL.addr = nullgen
			yyVAL.addr.Type = obj.TYPE_MEM
			yyVAL.addr.Name = obj.NAME_STATIC
			yyVAL.addr.Sym = obj.Linklookup(asm.Ctxt, yyDollar[1].sym.Name, 1)
			yyVAL.addr.Offset = yyDollar[4].lval
		}
	case 108:
		yyDollar = yyS[yypt-0 : yypt+1]
		//line a.y:637
		{
			yyVAL.lval = 0
		}
	case 109:
		yyDollar = yyS[yypt-2 : yypt+1]
		//line a.y:641
		{
			yyVAL.lval = yyDollar[2].lval
		}
	case 110:
		yyDollar = yyS[yypt-2 : yypt+1]
		//line a.y:645
		{
			yyVAL.lval = -yyDollar[2].lval
		}
	case 112:
		yyDollar = yyS[yypt-1 : yypt+1]
		//line a.y:652
		{
			yyVAL.lval = obj.NAME_AUTO
		}
	case 115:
		yyDollar = yyS[yypt-1 : yypt+1]
		//line a.y:660
		{
			yyVAL.lval = yyDollar[1].sym.Value
		}
	case 116:
		yyDollar = yyS[yypt-2 : yypt+1]
		//line a.y:664
		{
			yyVAL.lval = -yyDollar[2].lval
		}
	case 117:
		yyDollar = yyS[yypt-2 : yypt+1]
		//line a.y:668
		{
			yyVAL.lval = yyDollar[2].lval
		}
	case 118:
		yyDollar = yyS[yypt-2 : yypt+1]
		//line a.y:672
		{
			yyVAL.lval = ^yyDollar[2].lval
		}
	case 119:
		yyDollar = yyS[yypt-3 : yypt+1]
		//line a.y:676
		{
			yyVAL.lval = yyDollar[2].lval
		}
	case 121:
		yyDollar = yyS[yypt-3 : yypt+1]
		//line a.y:683
		{
			yyVAL.lval = yyDollar[1].lval + yyDollar[3].lval
		}
	case 122:
		yyDollar = yyS[yypt-3 : yypt+1]
		//line a.y:687
		{
			yyVAL.lval = yyDollar[1].lval - yyDollar[3].lval
		}
	case 123:
		yyDollar = yyS[yypt-3 : yypt+1]
		//line a.y:691
		{
			yyVAL.lval = yyDollar[1].lval * yyDollar[3].lval
		}
	case 124:
		yyDollar = yyS[yypt-3 : yypt+1]
		//line a.y:695
		{
			yyVAL.lval = yyDollar[1].lval / yyDollar[3].lval
		}
	case 125:
		yyDollar = yyS[yypt-3 : yypt+1]
		//line a.y:699
		{
			yyVAL.lval = yyDollar[1].lval % yyDollar[3].lval
		}
	case 126:
		yyDollar = yyS[yypt-4 : yypt+1]
		//line a.y:703
		{
			yyVAL.lval = yyDollar[1].lval << uint(yyDollar[4].lval)
		}
	case 127:
		yyDollar = yyS[yypt-4 : yypt+1]
		//line a.y:707
		{
			yyVAL.lval = yyDollar[1].lval >> uint(yyDollar[4].lval)
		}
	case 128:
		yyDollar = yyS[yypt-3 : yypt+1]
		//line a.y:711
		{
			yyVAL.lval = yyDollar[1].lval & yyDollar[3].lval
		}
	case 129:
		yyDollar = yyS[yypt-3 : yypt+1]
		//line a.y:715
		{
			yyVAL.lval = yyDollar[1].lval ^ yyDollar[3].lval
		}
	case 130:
		yyDollar = yyS[yypt-3 : yypt+1]
		//line a.y:719
		{
			yyVAL.lval = yyDollar[1].lval | yyDollar[3].lval
		}
	}
	goto yystack /* stack new state and value */
}