cmd/internal/obj: fix index panic on invalid instruction

Also introduce actual data structure for table.

Change-Id: I6bbe9aff8a872ae254f3739ae4ca17f7b5c4507a
Reviewed-on: https://go-review.googlesource.com/5701
Reviewed-by: Rob Pike <r@golang.org>
diff --git a/src/cmd/internal/obj/i386/asm8.go b/src/cmd/internal/obj/i386/asm8.go
index 97d4012..11ae6e5 100644
--- a/src/cmd/internal/obj/i386/asm8.go
+++ b/src/cmd/internal/obj/i386/asm8.go
@@ -46,11 +46,18 @@
 
 type Optab struct {
 	as     int16
-	ytab   []byte
+	ytab   []ytab
 	prefix uint8
 	op     [13]uint8
 }
 
+type ytab struct {
+	from    uint8
+	to      uint8
+	zcase   uint8
+	zoffset uint8
+}
+
 var opindex [ALAST + 1]*Optab
 
 const (
@@ -171,962 +178,402 @@
 
 var reg [MAXREG]int
 
-var ynone = []uint8{
-	Ynone,
-	Ynone,
-	Zlit,
-	1,
-	0,
+var ynone = []ytab{
+	{Ynone, Ynone, Zlit, 1},
 }
 
-var ytext = []uint8{
-	Ymb,
-	Ytextsize,
-	Zpseudo,
-	1,
-	0,
+var ytext = []ytab{
+	{Ymb, Ytextsize, Zpseudo, 1},
 }
 
-var ynop = []uint8{
-	Ynone,
-	Ynone,
-	Zpseudo,
-	0,
-	Ynone,
-	Yiauto,
-	Zpseudo,
-	0,
-	Ynone,
-	Yml,
-	Zpseudo,
-	0,
-	Ynone,
-	Yrf,
-	Zpseudo,
-	0,
-	Yiauto,
-	Ynone,
-	Zpseudo,
-	0,
-	Ynone,
-	Yxr,
-	Zpseudo,
-	0,
-	Yml,
-	Ynone,
-	Zpseudo,
-	0,
-	Yrf,
-	Ynone,
-	Zpseudo,
-	0,
-	Yxr,
-	Ynone,
-	Zpseudo,
-	1,
-	0,
+var ynop = []ytab{
+	{Ynone, Ynone, Zpseudo, 0},
+	{Ynone, Yiauto, Zpseudo, 0},
+	{Ynone, Yml, Zpseudo, 0},
+	{Ynone, Yrf, Zpseudo, 0},
+	{Yiauto, Ynone, Zpseudo, 0},
+	{Ynone, Yxr, Zpseudo, 0},
+	{Yml, Ynone, Zpseudo, 0},
+	{Yrf, Ynone, Zpseudo, 0},
+	{Yxr, Ynone, Zpseudo, 1},
 }
 
-var yfuncdata = []uint8{
-	Yi32,
-	Ym,
-	Zpseudo,
-	0,
-	0,
+var yfuncdata = []ytab{
+	{Yi32, Ym, Zpseudo, 0},
 }
 
-var ypcdata = []uint8{
-	Yi32,
-	Yi32,
-	Zpseudo,
-	0,
-	0,
+var ypcdata = []ytab{
+	{Yi32, Yi32, Zpseudo, 0},
 }
 
-var yxorb = []uint8{
-	Yi32,
-	Yal,
-	Zib_,
-	1,
-	Yi32,
-	Ymb,
-	Zibo_m,
-	2,
-	Yrb,
-	Ymb,
-	Zr_m,
-	1,
-	Ymb,
-	Yrb,
-	Zm_r,
-	1,
-	0,
+var yxorb = []ytab{
+	{Yi32, Yal, Zib_, 1},
+	{Yi32, Ymb, Zibo_m, 2},
+	{Yrb, Ymb, Zr_m, 1},
+	{Ymb, Yrb, Zm_r, 1},
 }
 
-var yxorl = []uint8{
-	Yi8,
-	Yml,
-	Zibo_m,
-	2,
-	Yi32,
-	Yax,
-	Zil_,
-	1,
-	Yi32,
-	Yml,
-	Zilo_m,
-	2,
-	Yrl,
-	Yml,
-	Zr_m,
-	1,
-	Yml,
-	Yrl,
-	Zm_r,
-	1,
-	0,
+var yxorl = []ytab{
+	{Yi8, Yml, Zibo_m, 2},
+	{Yi32, Yax, Zil_, 1},
+	{Yi32, Yml, Zilo_m, 2},
+	{Yrl, Yml, Zr_m, 1},
+	{Yml, Yrl, Zm_r, 1},
 }
 
-var yaddl = []uint8{
-	Yi8,
-	Yml,
-	Zibo_m,
-	2,
-	Yi32,
-	Yax,
-	Zil_,
-	1,
-	Yi32,
-	Yml,
-	Zilo_m,
-	2,
-	Yrl,
-	Yml,
-	Zr_m,
-	1,
-	Yml,
-	Yrl,
-	Zm_r,
-	1,
-	0,
+var yaddl = []ytab{
+	{Yi8, Yml, Zibo_m, 2},
+	{Yi32, Yax, Zil_, 1},
+	{Yi32, Yml, Zilo_m, 2},
+	{Yrl, Yml, Zr_m, 1},
+	{Yml, Yrl, Zm_r, 1},
 }
 
-var yincb = []uint8{
-	Ynone,
-	Ymb,
-	Zo_m,
-	2,
-	0,
+var yincb = []ytab{
+	{Ynone, Ymb, Zo_m, 2},
 }
 
-var yincl = []uint8{
-	Ynone,
-	Yrl,
-	Z_rp,
-	1,
-	Ynone,
-	Yml,
-	Zo_m,
-	2,
-	0,
+var yincl = []ytab{
+	{Ynone, Yrl, Z_rp, 1},
+	{Ynone, Yml, Zo_m, 2},
 }
 
-var ycmpb = []uint8{
-	Yal,
-	Yi32,
-	Z_ib,
-	1,
-	Ymb,
-	Yi32,
-	Zm_ibo,
-	2,
-	Ymb,
-	Yrb,
-	Zm_r,
-	1,
-	Yrb,
-	Ymb,
-	Zr_m,
-	1,
-	0,
+var ycmpb = []ytab{
+	{Yal, Yi32, Z_ib, 1},
+	{Ymb, Yi32, Zm_ibo, 2},
+	{Ymb, Yrb, Zm_r, 1},
+	{Yrb, Ymb, Zr_m, 1},
 }
 
-var ycmpl = []uint8{
-	Yml,
-	Yi8,
-	Zm_ibo,
-	2,
-	Yax,
-	Yi32,
-	Z_il,
-	1,
-	Yml,
-	Yi32,
-	Zm_ilo,
-	2,
-	Yml,
-	Yrl,
-	Zm_r,
-	1,
-	Yrl,
-	Yml,
-	Zr_m,
-	1,
-	0,
+var ycmpl = []ytab{
+	{Yml, Yi8, Zm_ibo, 2},
+	{Yax, Yi32, Z_il, 1},
+	{Yml, Yi32, Zm_ilo, 2},
+	{Yml, Yrl, Zm_r, 1},
+	{Yrl, Yml, Zr_m, 1},
 }
 
-var yshb = []uint8{
-	Yi1,
-	Ymb,
-	Zo_m,
-	2,
-	Yi32,
-	Ymb,
-	Zibo_m,
-	2,
-	Ycx,
-	Ymb,
-	Zo_m,
-	2,
-	0,
+var yshb = []ytab{
+	{Yi1, Ymb, Zo_m, 2},
+	{Yi32, Ymb, Zibo_m, 2},
+	{Ycx, Ymb, Zo_m, 2},
 }
 
-var yshl = []uint8{
-	Yi1,
-	Yml,
-	Zo_m,
-	2,
-	Yi32,
-	Yml,
-	Zibo_m,
-	2,
-	Ycl,
-	Yml,
-	Zo_m,
-	2,
-	Ycx,
-	Yml,
-	Zo_m,
-	2,
-	0,
+var yshl = []ytab{
+	{Yi1, Yml, Zo_m, 2},
+	{Yi32, Yml, Zibo_m, 2},
+	{Ycl, Yml, Zo_m, 2},
+	{Ycx, Yml, Zo_m, 2},
 }
 
-var ytestb = []uint8{
-	Yi32,
-	Yal,
-	Zib_,
-	1,
-	Yi32,
-	Ymb,
-	Zibo_m,
-	2,
-	Yrb,
-	Ymb,
-	Zr_m,
-	1,
-	Ymb,
-	Yrb,
-	Zm_r,
-	1,
-	0,
+var ytestb = []ytab{
+	{Yi32, Yal, Zib_, 1},
+	{Yi32, Ymb, Zibo_m, 2},
+	{Yrb, Ymb, Zr_m, 1},
+	{Ymb, Yrb, Zm_r, 1},
 }
 
-var ytestl = []uint8{
-	Yi32,
-	Yax,
-	Zil_,
-	1,
-	Yi32,
-	Yml,
-	Zilo_m,
-	2,
-	Yrl,
-	Yml,
-	Zr_m,
-	1,
-	Yml,
-	Yrl,
-	Zm_r,
-	1,
-	0,
+var ytestl = []ytab{
+	{Yi32, Yax, Zil_, 1},
+	{Yi32, Yml, Zilo_m, 2},
+	{Yrl, Yml, Zr_m, 1},
+	{Yml, Yrl, Zm_r, 1},
 }
 
-var ymovb = []uint8{
-	Yrb,
-	Ymb,
-	Zr_m,
-	1,
-	Ymb,
-	Yrb,
-	Zm_r,
-	1,
-	Yi32,
-	Yrb,
-	Zib_rp,
-	1,
-	Yi32,
-	Ymb,
-	Zibo_m,
-	2,
-	0,
+var ymovb = []ytab{
+	{Yrb, Ymb, Zr_m, 1},
+	{Ymb, Yrb, Zm_r, 1},
+	{Yi32, Yrb, Zib_rp, 1},
+	{Yi32, Ymb, Zibo_m, 2},
 }
 
-var ymovw = []uint8{
-	Yrl,
-	Yml,
-	Zr_m,
-	1,
-	Yml,
-	Yrl,
-	Zm_r,
-	1,
-	Yi0,
-	Yrl,
-	Zclr,
-	1 + 2,
+var ymovw = []ytab{
+	{Yrl, Yml, Zr_m, 1},
+	{Yml, Yrl, Zm_r, 1},
+	{Yi0, Yrl, Zclr, 1 + 2},
 	//	Yi0,	Yml,	Zibo_m,	2,	// shorter but slower AND $0,dst
-	Yi32,
-	Yrl,
-	Zil_rp,
-	1,
-	Yi32,
-	Yml,
-	Zilo_m,
-	2,
-	Yiauto,
-	Yrl,
-	Zaut_r,
-	1,
-	0,
+	{Yi32, Yrl, Zil_rp, 1},
+	{Yi32, Yml, Zilo_m, 2},
+	{Yiauto, Yrl, Zaut_r, 1},
 }
 
-var ymovl = []uint8{
-	Yrl,
-	Yml,
-	Zr_m,
-	1,
-	Yml,
-	Yrl,
-	Zm_r,
-	1,
-	Yi0,
-	Yrl,
-	Zclr,
-	1 + 2,
+var ymovl = []ytab{
+	{Yrl, Yml, Zr_m, 1},
+	{Yml, Yrl, Zm_r, 1},
+	{Yi0, Yrl, Zclr, 1 + 2},
 	//	Yi0,	Yml,	Zibo_m,	2,	// shorter but slower AND $0,dst
-	Yi32,
-	Yrl,
-	Zil_rp,
-	1,
-	Yi32,
-	Yml,
-	Zilo_m,
-	2,
-	Yml,
-	Yxr,
-	Zm_r_xm,
-	2, // XMM MOVD (32 bit)
-	Yxr,
-	Yml,
-	Zr_m_xm,
-	2, // XMM MOVD (32 bit)
-	Yiauto,
-	Yrl,
-	Zaut_r,
-	1,
-	0,
+	{Yi32, Yrl, Zil_rp, 1},
+	{Yi32, Yml, Zilo_m, 2},
+	{Yml, Yxr, Zm_r_xm, 2}, // XMM MOVD (32 bit)
+	{Yxr, Yml, Zr_m_xm, 2}, // XMM MOVD (32 bit)
+	{Yiauto, Yrl, Zaut_r, 1},
 }
 
-var ymovq = []uint8{
-	Yml,
-	Yxr,
-	Zm_r_xm,
-	2,
-	0,
+var ymovq = []ytab{
+	{Yml, Yxr, Zm_r_xm, 2},
 }
 
-var ym_rl = []uint8{
-	Ym,
-	Yrl,
-	Zm_r,
-	1,
-	0,
+var ym_rl = []ytab{
+	{Ym, Yrl, Zm_r, 1},
 }
 
-var yrl_m = []uint8{
-	Yrl,
-	Ym,
-	Zr_m,
-	1,
-	0,
+var yrl_m = []ytab{
+	{Yrl, Ym, Zr_m, 1},
 }
 
-var ymb_rl = []uint8{
-	Ymb,
-	Yrl,
-	Zm_r,
-	1,
-	0,
+var ymb_rl = []ytab{
+	{Ymb, Yrl, Zm_r, 1},
 }
 
-var yml_rl = []uint8{
-	Yml,
-	Yrl,
-	Zm_r,
-	1,
-	0,
+var yml_rl = []ytab{
+	{Yml, Yrl, Zm_r, 1},
 }
 
-var yrb_mb = []uint8{
-	Yrb,
-	Ymb,
-	Zr_m,
-	1,
-	0,
+var yrb_mb = []ytab{
+	{Yrb, Ymb, Zr_m, 1},
 }
 
-var yrl_ml = []uint8{
-	Yrl,
-	Yml,
-	Zr_m,
-	1,
-	0,
+var yrl_ml = []ytab{
+	{Yrl, Yml, Zr_m, 1},
 }
 
-var yml_mb = []uint8{
-	Yrb,
-	Ymb,
-	Zr_m,
-	1,
-	Ymb,
-	Yrb,
-	Zm_r,
-	1,
-	0,
+var yml_mb = []ytab{
+	{Yrb, Ymb, Zr_m, 1},
+	{Ymb, Yrb, Zm_r, 1},
 }
 
-var yxchg = []uint8{
-	Yax,
-	Yrl,
-	Z_rp,
-	1,
-	Yrl,
-	Yax,
-	Zrp_,
-	1,
-	Yrl,
-	Yml,
-	Zr_m,
-	1,
-	Yml,
-	Yrl,
-	Zm_r,
-	1,
-	0,
+var yxchg = []ytab{
+	{Yax, Yrl, Z_rp, 1},
+	{Yrl, Yax, Zrp_, 1},
+	{Yrl, Yml, Zr_m, 1},
+	{Yml, Yrl, Zm_r, 1},
 }
 
-var ydivl = []uint8{
-	Yml,
-	Ynone,
-	Zm_o,
-	2,
-	0,
+var ydivl = []ytab{
+	{Yml, Ynone, Zm_o, 2},
 }
 
-var ydivb = []uint8{
-	Ymb,
-	Ynone,
-	Zm_o,
-	2,
-	0,
+var ydivb = []ytab{
+	{Ymb, Ynone, Zm_o, 2},
 }
 
-var yimul = []uint8{
-	Yml,
-	Ynone,
-	Zm_o,
-	2,
-	Yi8,
-	Yrl,
-	Zib_rr,
-	1,
-	Yi32,
-	Yrl,
-	Zil_rr,
-	1,
-	0,
+var yimul = []ytab{
+	{Yml, Ynone, Zm_o, 2},
+	{Yi8, Yrl, Zib_rr, 1},
+	{Yi32, Yrl, Zil_rr, 1},
 }
 
-var ybyte = []uint8{
-	Yi32,
-	Ynone,
-	Zbyte,
-	1,
-	0,
+var ybyte = []ytab{
+	{Yi32, Ynone, Zbyte, 1},
 }
 
-var yin = []uint8{
-	Yi32,
-	Ynone,
-	Zib_,
-	1,
-	Ynone,
-	Ynone,
-	Zlit,
-	1,
-	0,
+var yin = []ytab{
+	{Yi32, Ynone, Zib_, 1},
+	{Ynone, Ynone, Zlit, 1},
 }
 
-var yint = []uint8{
-	Yi32,
-	Ynone,
-	Zib_,
-	1,
-	0,
+var yint = []ytab{
+	{Yi32, Ynone, Zib_, 1},
 }
 
-var ypushl = []uint8{
-	Yrl,
-	Ynone,
-	Zrp_,
-	1,
-	Ym,
-	Ynone,
-	Zm_o,
-	2,
-	Yi8,
-	Ynone,
-	Zib_,
-	1,
-	Yi32,
-	Ynone,
-	Zil_,
-	1,
-	0,
+var ypushl = []ytab{
+	{Yrl, Ynone, Zrp_, 1},
+	{Ym, Ynone, Zm_o, 2},
+	{Yi8, Ynone, Zib_, 1},
+	{Yi32, Ynone, Zil_, 1},
 }
 
-var ypopl = []uint8{
-	Ynone,
-	Yrl,
-	Z_rp,
-	1,
-	Ynone,
-	Ym,
-	Zo_m,
-	2,
-	0,
+var ypopl = []ytab{
+	{Ynone, Yrl, Z_rp, 1},
+	{Ynone, Ym, Zo_m, 2},
 }
 
-var ybswap = []uint8{
-	Ynone,
-	Yrl,
-	Z_rp,
-	1,
-	0,
+var ybswap = []ytab{
+	{Ynone, Yrl, Z_rp, 1},
 }
 
-var yscond = []uint8{
-	Ynone,
-	Ymb,
-	Zo_m,
-	2,
-	0,
+var yscond = []ytab{
+	{Ynone, Ymb, Zo_m, 2},
 }
 
-var yjcond = []uint8{
-	Ynone,
-	Ybr,
-	Zbr,
-	0,
-	Yi0,
-	Ybr,
-	Zbr,
-	0,
-	Yi1,
-	Ybr,
-	Zbr,
-	1,
-	0,
+var yjcond = []ytab{
+	{Ynone, Ybr, Zbr, 0},
+	{Yi0, Ybr, Zbr, 0},
+	{Yi1, Ybr, Zbr, 1},
 }
 
-var yloop = []uint8{
-	Ynone,
-	Ybr,
-	Zloop,
-	1,
-	0,
+var yloop = []ytab{
+	{Ynone, Ybr, Zloop, 1},
 }
 
-var ycall = []uint8{
-	Ynone,
-	Yml,
-	Zcallindreg,
-	0,
-	Yrx,
-	Yrx,
-	Zcallindreg,
-	2,
-	Ynone,
-	Ycol,
-	Zcallind,
-	2,
-	Ynone,
-	Ybr,
-	Zcall,
-	0,
-	Ynone,
-	Yi32,
-	Zcallcon,
-	1,
-	0,
+var ycall = []ytab{
+	{Ynone, Yml, Zcallindreg, 0},
+	{Yrx, Yrx, Zcallindreg, 2},
+	{Ynone, Ycol, Zcallind, 2},
+	{Ynone, Ybr, Zcall, 0},
+	{Ynone, Yi32, Zcallcon, 1},
 }
 
-var yduff = []uint8{
-	Ynone,
-	Yi32,
-	Zcall,
-	1,
-	0,
+var yduff = []ytab{
+	{Ynone, Yi32, Zcall, 1},
 }
 
-var yjmp = []uint8{
-	Ynone,
-	Yml,
-	Zo_m,
-	2,
-	Ynone,
-	Ybr,
-	Zjmp,
-	0,
-	Ynone,
-	Yi32,
-	Zjmpcon,
-	1,
-	0,
+var yjmp = []ytab{
+	{Ynone, Yml, Zo_m, 2},
+	{Ynone, Ybr, Zjmp, 0},
+	{Ynone, Yi32, Zjmpcon, 1},
 }
 
-var yfmvd = []uint8{
-	Ym,
-	Yf0,
-	Zm_o,
-	2,
-	Yf0,
-	Ym,
-	Zo_m,
-	2,
-	Yrf,
-	Yf0,
-	Zm_o,
-	2,
-	Yf0,
-	Yrf,
-	Zo_m,
-	2,
-	0,
+var yfmvd = []ytab{
+	{Ym, Yf0, Zm_o, 2},
+	{Yf0, Ym, Zo_m, 2},
+	{Yrf, Yf0, Zm_o, 2},
+	{Yf0, Yrf, Zo_m, 2},
 }
 
-var yfmvdp = []uint8{
-	Yf0,
-	Ym,
-	Zo_m,
-	2,
-	Yf0,
-	Yrf,
-	Zo_m,
-	2,
-	0,
+var yfmvdp = []ytab{
+	{Yf0, Ym, Zo_m, 2},
+	{Yf0, Yrf, Zo_m, 2},
 }
 
-var yfmvf = []uint8{
-	Ym,
-	Yf0,
-	Zm_o,
-	2,
-	Yf0,
-	Ym,
-	Zo_m,
-	2,
-	0,
+var yfmvf = []ytab{
+	{Ym, Yf0, Zm_o, 2},
+	{Yf0, Ym, Zo_m, 2},
 }
 
-var yfmvx = []uint8{
-	Ym,
-	Yf0,
-	Zm_o,
-	2,
-	0,
+var yfmvx = []ytab{
+	{Ym, Yf0, Zm_o, 2},
 }
 
-var yfmvp = []uint8{
-	Yf0,
-	Ym,
-	Zo_m,
-	2,
-	0,
+var yfmvp = []ytab{
+	{Yf0, Ym, Zo_m, 2},
 }
 
-var yfcmv = []uint8{
-	Yrf,
-	Yf0,
-	Zm_o,
-	2,
-	0,
+var yfcmv = []ytab{
+	{Yrf, Yf0, Zm_o, 2},
 }
 
-var yfadd = []uint8{
-	Ym,
-	Yf0,
-	Zm_o,
-	2,
-	Yrf,
-	Yf0,
-	Zm_o,
-	2,
-	Yf0,
-	Yrf,
-	Zo_m,
-	2,
-	0,
+var yfadd = []ytab{
+	{Ym, Yf0, Zm_o, 2},
+	{Yrf, Yf0, Zm_o, 2},
+	{Yf0, Yrf, Zo_m, 2},
 }
 
-var yfaddp = []uint8{
-	Yf0,
-	Yrf,
-	Zo_m,
-	2,
-	0,
+var yfaddp = []ytab{
+	{Yf0, Yrf, Zo_m, 2},
 }
 
-var yfxch = []uint8{
-	Yf0,
-	Yrf,
-	Zo_m,
-	2,
-	Yrf,
-	Yf0,
-	Zm_o,
-	2,
-	0,
+var yfxch = []ytab{
+	{Yf0, Yrf, Zo_m, 2},
+	{Yrf, Yf0, Zm_o, 2},
 }
 
-var ycompp = []uint8{
-	Yf0,
-	Yrf,
-	Zo_m,
-	2, /* botch is really f0,f1 */
-	0,
+var ycompp = []ytab{
+	{Yf0, Yrf, Zo_m, 2}, /* botch is really f0,f1 */
 }
 
-var ystsw = []uint8{
-	Ynone,
-	Ym,
-	Zo_m,
-	2,
-	Ynone,
-	Yax,
-	Zlit,
-	1,
-	0,
+var ystsw = []ytab{
+	{Ynone, Ym, Zo_m, 2},
+	{Ynone, Yax, Zlit, 1},
 }
 
-var ystcw = []uint8{
-	Ynone,
-	Ym,
-	Zo_m,
-	2,
-	Ym,
-	Ynone,
-	Zm_o,
-	2,
-	0,
+var ystcw = []ytab{
+	{Ynone, Ym, Zo_m, 2},
+	{Ym, Ynone, Zm_o, 2},
 }
 
-var ysvrs = []uint8{
-	Ynone,
-	Ym,
-	Zo_m,
-	2,
-	Ym,
-	Ynone,
-	Zm_o,
-	2,
-	0,
+var ysvrs = []ytab{
+	{Ynone, Ym, Zo_m, 2},
+	{Ym, Ynone, Zm_o, 2},
 }
 
-var ymskb = []uint8{
-	Yxr,
-	Yrl,
-	Zm_r_xm,
-	2,
-	Ymr,
-	Yrl,
-	Zm_r_xm,
-	1,
-	0,
+var ymskb = []ytab{
+	{Yxr, Yrl, Zm_r_xm, 2},
+	{Ymr, Yrl, Zm_r_xm, 1},
 }
 
-var yxm = []uint8{
-	Yxm,
-	Yxr,
-	Zm_r_xm,
-	1,
-	0,
+var yxm = []ytab{
+	{Yxm, Yxr, Zm_r_xm, 1},
 }
 
-var yxcvm1 = []uint8{
-	Yxm,
-	Yxr,
-	Zm_r_xm,
-	2,
-	Yxm,
-	Ymr,
-	Zm_r_xm,
-	2,
-	0,
+var yxcvm1 = []ytab{
+	{Yxm, Yxr, Zm_r_xm, 2},
+	{Yxm, Ymr, Zm_r_xm, 2},
 }
 
-var yxcvm2 = []uint8{
-	Yxm,
-	Yxr,
-	Zm_r_xm,
-	2,
-	Ymm,
-	Yxr,
-	Zm_r_xm,
-	2,
-	0,
+var yxcvm2 = []ytab{
+	{Yxm, Yxr, Zm_r_xm, 2},
+	{Ymm, Yxr, Zm_r_xm, 2},
 }
 
-var yxmq = []uint8{
-	Yxm,
-	Yxr,
-	Zm_r_xm,
-	2,
-	0,
+var yxmq = []ytab{
+	{Yxm, Yxr, Zm_r_xm, 2},
 }
 
-var yxr = []uint8{
-	Yxr,
-	Yxr,
-	Zm_r_xm,
-	1,
-	0,
+var yxr = []ytab{
+	{Yxr, Yxr, Zm_r_xm, 1},
 }
 
-var yxr_ml = []uint8{
-	Yxr,
-	Yml,
-	Zr_m_xm,
-	1,
-	0,
+var yxr_ml = []ytab{
+	{Yxr, Yml, Zr_m_xm, 1},
 }
 
-var yxcmp = []uint8{
-	Yxm,
-	Yxr,
-	Zm_r_xm,
-	1,
-	0,
+var yxcmp = []ytab{
+	{Yxm, Yxr, Zm_r_xm, 1},
 }
 
-var yxcmpi = []uint8{
-	Yxm,
-	Yxr,
-	Zm_r_i_xm,
-	2,
-	0,
+var yxcmpi = []ytab{
+	{Yxm, Yxr, Zm_r_i_xm, 2},
 }
 
-var yxmov = []uint8{
-	Yxm,
-	Yxr,
-	Zm_r_xm,
-	1,
-	Yxr,
-	Yxm,
-	Zr_m_xm,
-	1,
-	0,
+var yxmov = []ytab{
+	{Yxm, Yxr, Zm_r_xm, 1},
+	{Yxr, Yxm, Zr_m_xm, 1},
 }
 
-var yxcvfl = []uint8{
-	Yxm,
-	Yrl,
-	Zm_r_xm,
-	1,
-	0,
+var yxcvfl = []ytab{
+	{Yxm, Yrl, Zm_r_xm, 1},
 }
 
-var yxcvlf = []uint8{
-	Yml,
-	Yxr,
-	Zm_r_xm,
-	1,
-	0,
+var yxcvlf = []ytab{
+	{Yml, Yxr, Zm_r_xm, 1},
 }
 
 /*
-static uchar	yxcvfq[] =
-{
-	Yxm,	Yrl,	Zm_r_xm,	2,
-	0
-};
-static uchar	yxcvqf[] =
-{
-	Yml,	Yxr,	Zm_r_xm,	2,
-	0
-};
+var yxcvfq = []ytab{
+	{Yxm, Yrl, Zm_r_xm, 2},
+}
+
+var yxcvqf = []ytab{
+	{Yml, Yxr, Zm_r_xm, 2},
+}
 */
-var yxrrl = []uint8{
-	Yxr,
-	Yrl,
-	Zm_r,
-	1,
-	0,
+
+var yxrrl = []ytab{
+	{Yxr, Yrl, Zm_r, 1},
 }
 
-var yprefetch = []uint8{
-	Ym,
-	Ynone,
-	Zm_o,
-	2,
-	0,
+var yprefetch = []ytab{
+	{Ym, Ynone, Zm_o, 2},
 }
 
-var yaes = []uint8{
-	Yxm,
-	Yxr,
-	Zlitm_r,
-	2,
-	0,
+var yaes = []ytab{
+	{Yxm, Yxr, Zlitm_r, 2},
 }
 
-var yinsrd = []uint8{
-	Yml,
-	Yxr,
-	Zibm_r,
-	2,
-	0,
+var yinsrd = []ytab{
+	{Yml, Yxr, Zibm_r, 2},
 }
 
-var ymshufb = []uint8{
-	Yxm,
-	Yxr,
-	Zm2_r,
-	2,
-	0,
+var ymshufb = []ytab{
+	{Yxm, Yxr, Zm2_r, 2},
 }
 
-var yxshuf = []uint8{
-	Yxm,
-	Yxr,
-	Zibm_r,
-	2,
-	0,
+var yxshuf = []ytab{
+	{Yxm, Yxr, Zibm_r, 2},
 }
 
-var optab = /*	as, ytab, andproto, opcode */
-[]Optab{
+var optab = []Optab{ /*	as, ytab, andproto, opcode */
 	Optab{obj.AXXX, nil, 0, [13]uint8{}},
 	Optab{AAAA, ynone, Px, [13]uint8{0x37}},
 	Optab{AAAD, ynone, Px, [13]uint8{0xd5, 0x0a}},
@@ -3274,6 +2721,7 @@
 	var rel obj.Reloc
 	var r *obj.Reloc
 	var a *obj.Addr
+	var yt ytab
 
 	ctxt.Curp = p // TODO
 
@@ -3299,18 +2747,13 @@
 	ft = int(p.Ft) * Ymax
 	tt = int(p.Tt) * Ymax
 	o = opindex[p.As]
-	t = o.ytab
-	if t == nil {
-		ctxt.Diag("asmins: noproto %v", p)
-		return
-	}
 
-	for z = 0; t[0] != 0; (func() { z += int(t[3]); t = t[4:] })() {
-		if ycover[ft+int(t[0])] != 0 {
-			if ycover[tt+int(t[1])] != 0 {
-				goto found
-			}
+	z = 0
+	for _, yt = range o.ytab {
+		if ycover[ft+int(yt.from)] != 0 && ycover[tt+int(yt.to)] != 0 {
+			goto found
 		}
+		z += int(yt.zoffset)
 	}
 	goto domov
 
@@ -3344,9 +2787,9 @@
 	}
 
 	op = int(o.op[z])
-	switch t[2] {
+	switch yt.zcase {
 	default:
-		ctxt.Diag("asmins: unknown z %d %v", t[2], p)
+		ctxt.Diag("asmins: unknown z %d %v", yt.zcase, p)
 		return
 
 	case Zpseudo:
@@ -3386,11 +2829,11 @@
 		asmand(ctxt, p, &p.From, reg[p.To.Reg])
 
 	case Zm_r_xm:
-		mediaop(ctxt, o, op, int(t[3]), z)
+		mediaop(ctxt, o, op, int(yt.zoffset), z)
 		asmand(ctxt, p, &p.From, reg[p.To.Reg])
 
 	case Zm_r_i_xm:
-		mediaop(ctxt, o, op, int(t[3]), z)
+		mediaop(ctxt, o, op, int(yt.zoffset), z)
 		asmand(ctxt, p, &p.From, reg[p.To.Reg])
 		ctxt.Andptr[0] = byte(p.To.Offset)
 		ctxt.Andptr = ctxt.Andptr[1:]
@@ -3433,11 +2876,11 @@
 		asmand(ctxt, p, &p.To, reg[p.From.Reg])
 
 	case Zr_m_xm:
-		mediaop(ctxt, o, op, int(t[3]), z)
+		mediaop(ctxt, o, op, int(yt.zoffset), z)
 		asmand(ctxt, p, &p.To, reg[p.From.Reg])
 
 	case Zr_m_i_xm:
-		mediaop(ctxt, o, op, int(t[3]), z)
+		mediaop(ctxt, o, op, int(yt.zoffset), z)
 		asmand(ctxt, p, &p.To, reg[p.From.Reg])
 		ctxt.Andptr[0] = byte(p.From.Offset)
 		ctxt.Andptr = ctxt.Andptr[1:]
@@ -3472,7 +2915,7 @@
 
 	case Z_ib,
 		Zib_:
-		if t[2] == Zib_ {
+		if yt.zcase == Zib_ {
 			a = &p.From
 		} else {
 			a = &p.To
@@ -3511,7 +2954,7 @@
 
 	case Z_il,
 		Zil_:
-		if t[2] == Zil_ {
+		if yt.zcase == Zil_ {
 			a = &p.From
 		} else {
 			a = &p.To
@@ -3532,7 +2975,7 @@
 		Zilo_m:
 		ctxt.Andptr[0] = byte(op)
 		ctxt.Andptr = ctxt.Andptr[1:]
-		if t[2] == Zilo_m {
+		if yt.zcase == Zilo_m {
 			a = &p.From
 			asmand(ctxt, p, &p.To, int(o.op[z+1]))
 		} else {
@@ -3597,7 +3040,7 @@
 		Zjmp,
 		Zloop:
 		if p.To.Sym != nil {
-			if t[2] != Zjmp {
+			if yt.zcase != Zjmp {
 				ctxt.Diag("branch to ATEXT")
 				log.Fatalf("bad code")
 			}
@@ -3633,11 +3076,11 @@
 				ctxt.Andptr = ctxt.Andptr[1:]
 				ctxt.Andptr[0] = byte(v)
 				ctxt.Andptr = ctxt.Andptr[1:]
-			} else if t[2] == Zloop {
+			} else if yt.zcase == Zloop {
 				ctxt.Diag("loop too far: %v", p)
 			} else {
 				v -= 5 - 2
-				if t[2] == Zbr {
+				if yt.zcase == Zbr {
 					ctxt.Andptr[0] = 0x0f
 					ctxt.Andptr = ctxt.Andptr[1:]
 					v--
@@ -3671,10 +3114,10 @@
 			ctxt.Andptr = ctxt.Andptr[1:]
 			ctxt.Andptr[0] = 0
 			ctxt.Andptr = ctxt.Andptr[1:]
-		} else if t[2] == Zloop {
+		} else if yt.zcase == Zloop {
 			ctxt.Diag("loop too far: %v", p)
 		} else {
-			if t[2] == Zbr {
+			if yt.zcase == Zbr {
 				ctxt.Andptr[0] = 0x0f
 				ctxt.Andptr = ctxt.Andptr[1:]
 			}
@@ -3692,7 +3135,7 @@
 
 	case Zcallcon,
 		Zjmpcon:
-		if t[2] == Zcallcon {
+		if yt.zcase == Zcallcon {
 			ctxt.Andptr[0] = byte(op)
 			ctxt.Andptr = ctxt.Andptr[1:]
 		} else {
@@ -3816,7 +3259,7 @@
 		return
 	}
 
-	ctxt.Diag("doasm: notfound t2=%d from=%d to=%d %v", t[2], p.Ft, p.Tt, p)
+	ctxt.Diag("doasm: notfound t2=%d from=%d to=%d %v", yt.zcase, p.Ft, p.Tt, p)
 	return
 
 mfound:
diff --git a/src/cmd/internal/obj/x86/asm6.go b/src/cmd/internal/obj/x86/asm6.go
index 3c1213e..94f1427 100644
--- a/src/cmd/internal/obj/x86/asm6.go
+++ b/src/cmd/internal/obj/x86/asm6.go
@@ -48,11 +48,18 @@
 
 type Optab struct {
 	as     int16
-	ytab   []byte
+	ytab   []ytab
 	prefix uint8
 	op     [23]uint8
 }
 
+type ytab struct {
+	from    uint8
+	to      uint8
+	zcase   uint8
+	zoffset uint8
+}
+
 type Movtab struct {
 	as   int16
 	ft   uint8
@@ -202,1165 +209,482 @@
 
 var regrex [MAXREG + 1]int
 
-var ynone = []uint8{
-	Ynone,
-	Ynone,
-	Zlit,
-	1,
-	0,
+var ynone = []ytab{
+	{Ynone, Ynone, Zlit, 1},
 }
 
-var ytext = []uint8{
-	Ymb,
-	Ytextsize,
-	Zpseudo,
-	1,
-	0,
+var ytext = []ytab{
+	{Ymb, Ytextsize, Zpseudo, 1},
 }
 
-var ynop = []uint8{
-	Ynone,
-	Ynone,
-	Zpseudo,
-	0,
-	Ynone,
-	Yiauto,
-	Zpseudo,
-	0,
-	Ynone,
-	Yml,
-	Zpseudo,
-	0,
-	Ynone,
-	Yrf,
-	Zpseudo,
-	0,
-	Ynone,
-	Yxr,
-	Zpseudo,
-	0,
-	Yiauto,
-	Ynone,
-	Zpseudo,
-	0,
-	Yml,
-	Ynone,
-	Zpseudo,
-	0,
-	Yrf,
-	Ynone,
-	Zpseudo,
-	0,
-	Yxr,
-	Ynone,
-	Zpseudo,
-	1,
-	0,
+var ynop = []ytab{
+	{Ynone, Ynone, Zpseudo, 0},
+	{Ynone, Yiauto, Zpseudo, 0},
+	{Ynone, Yml, Zpseudo, 0},
+	{Ynone, Yrf, Zpseudo, 0},
+	{Ynone, Yxr, Zpseudo, 0},
+	{Yiauto, Ynone, Zpseudo, 0},
+	{Yml, Ynone, Zpseudo, 0},
+	{Yrf, Ynone, Zpseudo, 0},
+	{Yxr, Ynone, Zpseudo, 1},
 }
 
-var yfuncdata = []uint8{
-	Yi32,
-	Ym,
-	Zpseudo,
-	0,
-	0,
+var yfuncdata = []ytab{
+	{Yi32, Ym, Zpseudo, 0},
 }
 
-var ypcdata = []uint8{
-	Yi32,
-	Yi32,
-	Zpseudo,
-	0,
-	0,
+var ypcdata = []ytab{
+	{Yi32, Yi32, Zpseudo, 0},
 }
 
-var yxorb = []uint8{
-	Yi32,
-	Yal,
-	Zib_,
-	1,
-	Yi32,
-	Ymb,
-	Zibo_m,
-	2,
-	Yrb,
-	Ymb,
-	Zr_m,
-	1,
-	Ymb,
-	Yrb,
-	Zm_r,
-	1,
-	0,
+var yxorb = []ytab{
+	{Yi32, Yal, Zib_, 1},
+	{Yi32, Ymb, Zibo_m, 2},
+	{Yrb, Ymb, Zr_m, 1},
+	{Ymb, Yrb, Zm_r, 1},
 }
 
-var yxorl = []uint8{
-	Yi8,
-	Yml,
-	Zibo_m,
-	2,
-	Yi32,
-	Yax,
-	Zil_,
-	1,
-	Yi32,
-	Yml,
-	Zilo_m,
-	2,
-	Yrl,
-	Yml,
-	Zr_m,
-	1,
-	Yml,
-	Yrl,
-	Zm_r,
-	1,
-	0,
+var yxorl = []ytab{
+	{Yi8, Yml, Zibo_m, 2},
+	{Yi32, Yax, Zil_, 1},
+	{Yi32, Yml, Zilo_m, 2},
+	{Yrl, Yml, Zr_m, 1},
+	{Yml, Yrl, Zm_r, 1},
 }
 
-var yaddl = []uint8{
-	Yi8,
-	Yml,
-	Zibo_m,
-	2,
-	Yi32,
-	Yax,
-	Zil_,
-	1,
-	Yi32,
-	Yml,
-	Zilo_m,
-	2,
-	Yrl,
-	Yml,
-	Zr_m,
-	1,
-	Yml,
-	Yrl,
-	Zm_r,
-	1,
-	0,
+var yaddl = []ytab{
+	{Yi8, Yml, Zibo_m, 2},
+	{Yi32, Yax, Zil_, 1},
+	{Yi32, Yml, Zilo_m, 2},
+	{Yrl, Yml, Zr_m, 1},
+	{Yml, Yrl, Zm_r, 1},
 }
 
-var yincb = []uint8{
-	Ynone,
-	Ymb,
-	Zo_m,
-	2,
-	0,
+var yincb = []ytab{
+	{Ynone, Ymb, Zo_m, 2},
 }
 
-var yincw = []uint8{
-	Ynone,
-	Yml,
-	Zo_m,
-	2,
-	0,
+var yincw = []ytab{
+	{Ynone, Yml, Zo_m, 2},
 }
 
-var yincl = []uint8{
-	Ynone,
-	Yml,
-	Zo_m,
-	2,
-	0,
+var yincl = []ytab{
+	{Ynone, Yml, Zo_m, 2},
 }
 
-var ycmpb = []uint8{
-	Yal,
-	Yi32,
-	Z_ib,
-	1,
-	Ymb,
-	Yi32,
-	Zm_ibo,
-	2,
-	Ymb,
-	Yrb,
-	Zm_r,
-	1,
-	Yrb,
-	Ymb,
-	Zr_m,
-	1,
-	0,
+var ycmpb = []ytab{
+	{Yal, Yi32, Z_ib, 1},
+	{Ymb, Yi32, Zm_ibo, 2},
+	{Ymb, Yrb, Zm_r, 1},
+	{Yrb, Ymb, Zr_m, 1},
 }
 
-var ycmpl = []uint8{
-	Yml,
-	Yi8,
-	Zm_ibo,
-	2,
-	Yax,
-	Yi32,
-	Z_il,
-	1,
-	Yml,
-	Yi32,
-	Zm_ilo,
-	2,
-	Yml,
-	Yrl,
-	Zm_r,
-	1,
-	Yrl,
-	Yml,
-	Zr_m,
-	1,
-	0,
+var ycmpl = []ytab{
+	{Yml, Yi8, Zm_ibo, 2},
+	{Yax, Yi32, Z_il, 1},
+	{Yml, Yi32, Zm_ilo, 2},
+	{Yml, Yrl, Zm_r, 1},
+	{Yrl, Yml, Zr_m, 1},
 }
 
-var yshb = []uint8{
-	Yi1,
-	Ymb,
-	Zo_m,
-	2,
-	Yi32,
-	Ymb,
-	Zibo_m,
-	2,
-	Ycx,
-	Ymb,
-	Zo_m,
-	2,
-	0,
+var yshb = []ytab{
+	{Yi1, Ymb, Zo_m, 2},
+	{Yi32, Ymb, Zibo_m, 2},
+	{Ycx, Ymb, Zo_m, 2},
 }
 
-var yshl = []uint8{
-	Yi1,
-	Yml,
-	Zo_m,
-	2,
-	Yi32,
-	Yml,
-	Zibo_m,
-	2,
-	Ycl,
-	Yml,
-	Zo_m,
-	2,
-	Ycx,
-	Yml,
-	Zo_m,
-	2,
-	0,
+var yshl = []ytab{
+	{Yi1, Yml, Zo_m, 2},
+	{Yi32, Yml, Zibo_m, 2},
+	{Ycl, Yml, Zo_m, 2},
+	{Ycx, Yml, Zo_m, 2},
 }
 
-var ytestb = []uint8{
-	Yi32,
-	Yal,
-	Zib_,
-	1,
-	Yi32,
-	Ymb,
-	Zibo_m,
-	2,
-	Yrb,
-	Ymb,
-	Zr_m,
-	1,
-	Ymb,
-	Yrb,
-	Zm_r,
-	1,
-	0,
+var ytestb = []ytab{
+	{Yi32, Yal, Zib_, 1},
+	{Yi32, Ymb, Zibo_m, 2},
+	{Yrb, Ymb, Zr_m, 1},
+	{Ymb, Yrb, Zm_r, 1},
 }
 
-var ytestl = []uint8{
-	Yi32,
-	Yax,
-	Zil_,
-	1,
-	Yi32,
-	Yml,
-	Zilo_m,
-	2,
-	Yrl,
-	Yml,
-	Zr_m,
-	1,
-	Yml,
-	Yrl,
-	Zm_r,
-	1,
-	0,
+var ytestl = []ytab{
+	{Yi32, Yax, Zil_, 1},
+	{Yi32, Yml, Zilo_m, 2},
+	{Yrl, Yml, Zr_m, 1},
+	{Yml, Yrl, Zm_r, 1},
 }
 
-var ymovb = []uint8{
-	Yrb,
-	Ymb,
-	Zr_m,
-	1,
-	Ymb,
-	Yrb,
-	Zm_r,
-	1,
-	Yi32,
-	Yrb,
-	Zib_rp,
-	1,
-	Yi32,
-	Ymb,
-	Zibo_m,
-	2,
-	0,
+var ymovb = []ytab{
+	{Yrb, Ymb, Zr_m, 1},
+	{Ymb, Yrb, Zm_r, 1},
+	{Yi32, Yrb, Zib_rp, 1},
+	{Yi32, Ymb, Zibo_m, 2},
 }
 
-var ymbs = []uint8{
-	Ymb,
-	Ynone,
-	Zm_o,
-	2,
-	0,
+var ymbs = []ytab{
+	{Ymb, Ynone, Zm_o, 2},
 }
 
-var ybtl = []uint8{
-	Yi8,
-	Yml,
-	Zibo_m,
-	2,
-	Yrl,
-	Yml,
-	Zr_m,
-	1,
-	0,
+var ybtl = []ytab{
+	{Yi8, Yml, Zibo_m, 2},
+	{Yrl, Yml, Zr_m, 1},
 }
 
-var ymovw = []uint8{
-	Yrl,
-	Yml,
-	Zr_m,
-	1,
-	Yml,
-	Yrl,
-	Zm_r,
-	1,
-	Yi0,
-	Yrl,
-	Zclr,
-	1,
-	Yi32,
-	Yrl,
-	Zil_rp,
-	1,
-	Yi32,
-	Yml,
-	Zilo_m,
-	2,
-	Yiauto,
-	Yrl,
-	Zaut_r,
-	2,
-	0,
+var ymovw = []ytab{
+	{Yrl, Yml, Zr_m, 1},
+	{Yml, Yrl, Zm_r, 1},
+	{Yi0, Yrl, Zclr, 1},
+	{Yi32, Yrl, Zil_rp, 1},
+	{Yi32, Yml, Zilo_m, 2},
+	{Yiauto, Yrl, Zaut_r, 2},
 }
 
-var ymovl = []uint8{
-	Yrl,
-	Yml,
-	Zr_m,
-	1,
-	Yml,
-	Yrl,
-	Zm_r,
-	1,
-	Yi0,
-	Yrl,
-	Zclr,
-	1,
-	Yi32,
-	Yrl,
-	Zil_rp,
-	1,
-	Yi32,
-	Yml,
-	Zilo_m,
-	2,
-	Yml,
-	Ymr,
-	Zm_r_xm,
-	1, // MMX MOVD
-	Ymr,
-	Yml,
-	Zr_m_xm,
-	1, // MMX MOVD
-	Yml,
-	Yxr,
-	Zm_r_xm,
-	2, // XMM MOVD (32 bit)
-	Yxr,
-	Yml,
-	Zr_m_xm,
-	2, // XMM MOVD (32 bit)
-	Yiauto,
-	Yrl,
-	Zaut_r,
-	2,
-	0,
+var ymovl = []ytab{
+	{Yrl, Yml, Zr_m, 1},
+	{Yml, Yrl, Zm_r, 1},
+	{Yi0, Yrl, Zclr, 1},
+	{Yi32, Yrl, Zil_rp, 1},
+	{Yi32, Yml, Zilo_m, 2},
+	{Yml, Ymr, Zm_r_xm, 1}, // MMX MOVD
+	{Ymr, Yml, Zr_m_xm, 1}, // MMX MOVD
+	{Yml, Yxr, Zm_r_xm, 2}, // XMM MOVD (32 bit)
+	{Yxr, Yml, Zr_m_xm, 2}, // XMM MOVD (32 bit)
+	{Yiauto, Yrl, Zaut_r, 2},
 }
 
-var yret = []uint8{
-	Ynone,
-	Ynone,
-	Zo_iw,
-	1,
-	Yi32,
-	Ynone,
-	Zo_iw,
-	1,
-	0,
+var yret = []ytab{
+	{Ynone, Ynone, Zo_iw, 1},
+	{Yi32, Ynone, Zo_iw, 1},
 }
 
-var ymovq = []uint8{
-	Yrl,
-	Yml,
-	Zr_m,
-	1, // 0x89
-	Yml,
-	Yrl,
-	Zm_r,
-	1, // 0x8b
-	Yi0,
-	Yrl,
-	Zclr,
-	1, // 0x31
-	Ys32,
-	Yrl,
-	Zilo_m,
-	2, // 32 bit signed 0xc7,(0)
-	Yi64,
-	Yrl,
-	Ziq_rp,
-	1, // 0xb8 -- 32/64 bit immediate
-	Yi32,
-	Yml,
-	Zilo_m,
-	2, // 0xc7,(0)
-	Ym,
-	Ymr,
-	Zm_r_xm_nr,
-	1, // MMX MOVQ (shorter encoding)
-	Ymr,
-	Ym,
-	Zr_m_xm_nr,
-	1, // MMX MOVQ
-	Ymm,
-	Ymr,
-	Zm_r_xm,
-	1, // MMX MOVD
-	Ymr,
-	Ymm,
-	Zr_m_xm,
-	1, // MMX MOVD
-	Yxr,
-	Ymr,
-	Zm_r_xm_nr,
-	2, // MOVDQ2Q
-	Yxm,
-	Yxr,
-	Zm_r_xm_nr,
-	2, // MOVQ xmm1/m64 -> xmm2
-	Yxr,
-	Yxm,
-	Zr_m_xm_nr,
-	2, // MOVQ xmm1 -> xmm2/m64
-	Yml,
-	Yxr,
-	Zm_r_xm,
-	2, // MOVD xmm load
-	Yxr,
-	Yml,
-	Zr_m_xm,
-	2, // MOVD xmm store
-	Yiauto,
-	Yrl,
-	Zaut_r,
-	2, // built-in LEAQ
-	0,
+var ymovq = []ytab{
+	{Yrl, Yml, Zr_m, 1},       // 0x89
+	{Yml, Yrl, Zm_r, 1},       // 0x8b
+	{Yi0, Yrl, Zclr, 1},       // 0x31
+	{Ys32, Yrl, Zilo_m, 2},    // 32 bit signed 0xc7,(0)
+	{Yi64, Yrl, Ziq_rp, 1},    // 0xb8 -- 32/64 bit immediate
+	{Yi32, Yml, Zilo_m, 2},    // 0xc7,(0)
+	{Ym, Ymr, Zm_r_xm_nr, 1},  // MMX MOVQ (shorter encoding)
+	{Ymr, Ym, Zr_m_xm_nr, 1},  // MMX MOVQ
+	{Ymm, Ymr, Zm_r_xm, 1},    // MMX MOVD
+	{Ymr, Ymm, Zr_m_xm, 1},    // MMX MOVD
+	{Yxr, Ymr, Zm_r_xm_nr, 2}, // MOVDQ2Q
+	{Yxm, Yxr, Zm_r_xm_nr, 2}, // MOVQ xmm1/m64 -> xmm2
+	{Yxr, Yxm, Zr_m_xm_nr, 2}, // MOVQ xmm1 -> xmm2/m64
+	{Yml, Yxr, Zm_r_xm, 2},    // MOVD xmm load
+	{Yxr, Yml, Zr_m_xm, 2},    // MOVD xmm store
+	{Yiauto, Yrl, Zaut_r, 2},  // built-in LEAQ
 }
 
-var ym_rl = []uint8{
-	Ym,
-	Yrl,
-	Zm_r,
-	1,
-	0,
+var ym_rl = []ytab{
+	{Ym, Yrl, Zm_r, 1},
 }
 
-var yrl_m = []uint8{
-	Yrl,
-	Ym,
-	Zr_m,
-	1,
-	0,
+var yrl_m = []ytab{
+	{Yrl, Ym, Zr_m, 1},
 }
 
-var ymb_rl = []uint8{
-	Ymb,
-	Yrl,
-	Zmb_r,
-	1,
-	0,
+var ymb_rl = []ytab{
+	{Ymb, Yrl, Zmb_r, 1},
 }
 
-var yml_rl = []uint8{
-	Yml,
-	Yrl,
-	Zm_r,
-	1,
-	0,
+var yml_rl = []ytab{
+	{Yml, Yrl, Zm_r, 1},
 }
 
-var yrl_ml = []uint8{
-	Yrl,
-	Yml,
-	Zr_m,
-	1,
-	0,
+var yrl_ml = []ytab{
+	{Yrl, Yml, Zr_m, 1},
 }
 
-var yml_mb = []uint8{
-	Yrb,
-	Ymb,
-	Zr_m,
-	1,
-	Ymb,
-	Yrb,
-	Zm_r,
-	1,
-	0,
+var yml_mb = []ytab{
+	{Yrb, Ymb, Zr_m, 1},
+	{Ymb, Yrb, Zm_r, 1},
 }
 
-var yrb_mb = []uint8{
-	Yrb,
-	Ymb,
-	Zr_m,
-	1,
-	0,
+var yrb_mb = []ytab{
+	{Yrb, Ymb, Zr_m, 1},
 }
 
-var yxchg = []uint8{
-	Yax,
-	Yrl,
-	Z_rp,
-	1,
-	Yrl,
-	Yax,
-	Zrp_,
-	1,
-	Yrl,
-	Yml,
-	Zr_m,
-	1,
-	Yml,
-	Yrl,
-	Zm_r,
-	1,
-	0,
+var yxchg = []ytab{
+	{Yax, Yrl, Z_rp, 1},
+	{Yrl, Yax, Zrp_, 1},
+	{Yrl, Yml, Zr_m, 1},
+	{Yml, Yrl, Zm_r, 1},
 }
 
-var ydivl = []uint8{
-	Yml,
-	Ynone,
-	Zm_o,
-	2,
-	0,
+var ydivl = []ytab{
+	{Yml, Ynone, Zm_o, 2},
 }
 
-var ydivb = []uint8{
-	Ymb,
-	Ynone,
-	Zm_o,
-	2,
-	0,
+var ydivb = []ytab{
+	{Ymb, Ynone, Zm_o, 2},
 }
 
-var yimul = []uint8{
-	Yml,
-	Ynone,
-	Zm_o,
-	2,
-	Yi8,
-	Yrl,
-	Zib_rr,
-	1,
-	Yi32,
-	Yrl,
-	Zil_rr,
-	1,
-	Yml,
-	Yrl,
-	Zm_r,
-	2,
-	0,
+var yimul = []ytab{
+	{Yml, Ynone, Zm_o, 2},
+	{Yi8, Yrl, Zib_rr, 1},
+	{Yi32, Yrl, Zil_rr, 1},
+	{Yml, Yrl, Zm_r, 2},
 }
 
-var yimul3 = []uint8{
-	Yml,
-	Yrl,
-	Zibm_r,
-	2,
-	0,
+var yimul3 = []ytab{
+	{Yml, Yrl, Zibm_r, 2},
 }
 
-var ybyte = []uint8{
-	Yi64,
-	Ynone,
-	Zbyte,
-	1,
-	0,
+var ybyte = []ytab{
+	{Yi64, Ynone, Zbyte, 1},
 }
 
-var yin = []uint8{
-	Yi32,
-	Ynone,
-	Zib_,
-	1,
-	Ynone,
-	Ynone,
-	Zlit,
-	1,
-	0,
+var yin = []ytab{
+	{Yi32, Ynone, Zib_, 1},
+	{Ynone, Ynone, Zlit, 1},
 }
 
-var yint = []uint8{
-	Yi32,
-	Ynone,
-	Zib_,
-	1,
-	0,
+var yint = []ytab{
+	{Yi32, Ynone, Zib_, 1},
 }
 
-var ypushl = []uint8{
-	Yrl,
-	Ynone,
-	Zrp_,
-	1,
-	Ym,
-	Ynone,
-	Zm_o,
-	2,
-	Yi8,
-	Ynone,
-	Zib_,
-	1,
-	Yi32,
-	Ynone,
-	Zil_,
-	1,
-	0,
+var ypushl = []ytab{
+	{Yrl, Ynone, Zrp_, 1},
+	{Ym, Ynone, Zm_o, 2},
+	{Yi8, Ynone, Zib_, 1},
+	{Yi32, Ynone, Zil_, 1},
 }
 
-var ypopl = []uint8{
-	Ynone,
-	Yrl,
-	Z_rp,
-	1,
-	Ynone,
-	Ym,
-	Zo_m,
-	2,
-	0,
+var ypopl = []ytab{
+	{Ynone, Yrl, Z_rp, 1},
+	{Ynone, Ym, Zo_m, 2},
 }
 
-var ybswap = []uint8{
-	Ynone,
-	Yrl,
-	Z_rp,
-	2,
-	0,
+var ybswap = []ytab{
+	{Ynone, Yrl, Z_rp, 2},
 }
 
-var yscond = []uint8{
-	Ynone,
-	Ymb,
-	Zo_m,
-	2,
-	0,
+var yscond = []ytab{
+	{Ynone, Ymb, Zo_m, 2},
 }
 
-var yjcond = []uint8{
-	Ynone,
-	Ybr,
-	Zbr,
-	0,
-	Yi0,
-	Ybr,
-	Zbr,
-	0,
-	Yi1,
-	Ybr,
-	Zbr,
-	1,
-	0,
+var yjcond = []ytab{
+	{Ynone, Ybr, Zbr, 0},
+	{Yi0, Ybr, Zbr, 0},
+	{Yi1, Ybr, Zbr, 1},
 }
 
-var yloop = []uint8{
-	Ynone,
-	Ybr,
-	Zloop,
-	1,
-	0,
+var yloop = []ytab{
+	{Ynone, Ybr, Zloop, 1},
 }
 
-var ycall = []uint8{
-	Ynone,
-	Yml,
-	Zcallindreg,
-	0,
-	Yrx,
-	Yrx,
-	Zcallindreg,
-	2,
-	Ynone,
-	Ybr,
-	Zcall,
-	1,
-	0,
+var ycall = []ytab{
+	{Ynone, Yml, Zcallindreg, 0},
+	{Yrx, Yrx, Zcallindreg, 2},
+	{Ynone, Ybr, Zcall, 1},
 }
 
-var yduff = []uint8{
-	Ynone,
-	Yi32,
-	Zcall,
-	1,
-	0,
+var yduff = []ytab{
+	{Ynone, Yi32, Zcall, 1},
 }
 
-var yjmp = []uint8{
-	Ynone,
-	Yml,
-	Zo_m64,
-	2,
-	Ynone,
-	Ybr,
-	Zjmp,
-	1,
-	0,
+var yjmp = []ytab{
+	{Ynone, Yml, Zo_m64, 2},
+	{Ynone, Ybr, Zjmp, 1},
 }
 
-var yfmvd = []uint8{
-	Ym,
-	Yf0,
-	Zm_o,
-	2,
-	Yf0,
-	Ym,
-	Zo_m,
-	2,
-	Yrf,
-	Yf0,
-	Zm_o,
-	2,
-	Yf0,
-	Yrf,
-	Zo_m,
-	2,
-	0,
+var yfmvd = []ytab{
+	{Ym, Yf0, Zm_o, 2},
+	{Yf0, Ym, Zo_m, 2},
+	{Yrf, Yf0, Zm_o, 2},
+	{Yf0, Yrf, Zo_m, 2},
 }
 
-var yfmvdp = []uint8{
-	Yf0,
-	Ym,
-	Zo_m,
-	2,
-	Yf0,
-	Yrf,
-	Zo_m,
-	2,
-	0,
+var yfmvdp = []ytab{
+	{Yf0, Ym, Zo_m, 2},
+	{Yf0, Yrf, Zo_m, 2},
 }
 
-var yfmvf = []uint8{
-	Ym,
-	Yf0,
-	Zm_o,
-	2,
-	Yf0,
-	Ym,
-	Zo_m,
-	2,
-	0,
+var yfmvf = []ytab{
+	{Ym, Yf0, Zm_o, 2},
+	{Yf0, Ym, Zo_m, 2},
 }
 
-var yfmvx = []uint8{
-	Ym,
-	Yf0,
-	Zm_o,
-	2,
-	0,
+var yfmvx = []ytab{
+	{Ym, Yf0, Zm_o, 2},
 }
 
-var yfmvp = []uint8{
-	Yf0,
-	Ym,
-	Zo_m,
-	2,
-	0,
+var yfmvp = []ytab{
+	{Yf0, Ym, Zo_m, 2},
 }
 
-var yfadd = []uint8{
-	Ym,
-	Yf0,
-	Zm_o,
-	2,
-	Yrf,
-	Yf0,
-	Zm_o,
-	2,
-	Yf0,
-	Yrf,
-	Zo_m,
-	2,
-	0,
+var yfadd = []ytab{
+	{Ym, Yf0, Zm_o, 2},
+	{Yrf, Yf0, Zm_o, 2},
+	{Yf0, Yrf, Zo_m, 2},
 }
 
-var yfaddp = []uint8{
-	Yf0,
-	Yrf,
-	Zo_m,
-	2,
-	0,
+var yfaddp = []ytab{
+	{Yf0, Yrf, Zo_m, 2},
 }
 
-var yfxch = []uint8{
-	Yf0,
-	Yrf,
-	Zo_m,
-	2,
-	Yrf,
-	Yf0,
-	Zm_o,
-	2,
-	0,
+var yfxch = []ytab{
+	{Yf0, Yrf, Zo_m, 2},
+	{Yrf, Yf0, Zm_o, 2},
 }
 
-var ycompp = []uint8{
-	Yf0,
-	Yrf,
-	Zo_m,
-	2, /* botch is really f0,f1 */
-	0,
+var ycompp = []ytab{
+	{Yf0, Yrf, Zo_m, 2}, /* botch is really f0,f1 */
 }
 
-var ystsw = []uint8{
-	Ynone,
-	Ym,
-	Zo_m,
-	2,
-	Ynone,
-	Yax,
-	Zlit,
-	1,
-	0,
+var ystsw = []ytab{
+	{Ynone, Ym, Zo_m, 2},
+	{Ynone, Yax, Zlit, 1},
 }
 
-var ystcw = []uint8{
-	Ynone,
-	Ym,
-	Zo_m,
-	2,
-	Ym,
-	Ynone,
-	Zm_o,
-	2,
-	0,
+var ystcw = []ytab{
+	{Ynone, Ym, Zo_m, 2},
+	{Ym, Ynone, Zm_o, 2},
 }
 
-var ysvrs = []uint8{
-	Ynone,
-	Ym,
-	Zo_m,
-	2,
-	Ym,
-	Ynone,
-	Zm_o,
-	2,
-	0,
+var ysvrs = []ytab{
+	{Ynone, Ym, Zo_m, 2},
+	{Ym, Ynone, Zm_o, 2},
 }
 
-var ymm = []uint8{
-	Ymm,
-	Ymr,
-	Zm_r_xm,
-	1,
-	Yxm,
-	Yxr,
-	Zm_r_xm,
-	2,
-	0,
+var ymm = []ytab{
+	{Ymm, Ymr, Zm_r_xm, 1},
+	{Yxm, Yxr, Zm_r_xm, 2},
 }
 
-var yxm = []uint8{
-	Yxm,
-	Yxr,
-	Zm_r_xm,
-	1,
-	0,
+var yxm = []ytab{
+	{Yxm, Yxr, Zm_r_xm, 1},
 }
 
-var yxcvm1 = []uint8{
-	Yxm,
-	Yxr,
-	Zm_r_xm,
-	2,
-	Yxm,
-	Ymr,
-	Zm_r_xm,
-	2,
-	0,
+var yxcvm1 = []ytab{
+	{Yxm, Yxr, Zm_r_xm, 2},
+	{Yxm, Ymr, Zm_r_xm, 2},
 }
 
-var yxcvm2 = []uint8{
-	Yxm,
-	Yxr,
-	Zm_r_xm,
-	2,
-	Ymm,
-	Yxr,
-	Zm_r_xm,
-	2,
-	0,
+var yxcvm2 = []ytab{
+	{Yxm, Yxr, Zm_r_xm, 2},
+	{Ymm, Yxr, Zm_r_xm, 2},
 }
 
 /*
-static uchar	yxmq[] =
-{
-	Yxm,	Yxr,	Zm_r_xm,	2,
-	0
-};
+var yxmq = []ytab{
+	{Yxm, Yxr, Zm_r_xm, 2},
+}
 */
-var yxr = []uint8{
-	Yxr,
-	Yxr,
-	Zm_r_xm,
-	1,
-	0,
+
+var yxr = []ytab{
+	{Yxr, Yxr, Zm_r_xm, 1},
 }
 
-var yxr_ml = []uint8{
-	Yxr,
-	Yml,
-	Zr_m_xm,
-	1,
-	0,
+var yxr_ml = []ytab{
+	{Yxr, Yml, Zr_m_xm, 1},
 }
 
-var ymr = []uint8{
-	Ymr,
-	Ymr,
-	Zm_r,
-	1,
-	0,
+var ymr = []ytab{
+	{Ymr, Ymr, Zm_r, 1},
 }
 
-var ymr_ml = []uint8{
-	Ymr,
-	Yml,
-	Zr_m_xm,
-	1,
-	0,
+var ymr_ml = []ytab{
+	{Ymr, Yml, Zr_m_xm, 1},
 }
 
-var yxcmp = []uint8{
-	Yxm,
-	Yxr,
-	Zm_r_xm,
-	1,
-	0,
+var yxcmp = []ytab{
+	{Yxm, Yxr, Zm_r_xm, 1},
 }
 
-var yxcmpi = []uint8{
-	Yxm,
-	Yxr,
-	Zm_r_i_xm,
-	2,
-	0,
+var yxcmpi = []ytab{
+	{Yxm, Yxr, Zm_r_i_xm, 2},
 }
 
-var yxmov = []uint8{
-	Yxm,
-	Yxr,
-	Zm_r_xm,
-	1,
-	Yxr,
-	Yxm,
-	Zr_m_xm,
-	1,
-	0,
+var yxmov = []ytab{
+	{Yxm, Yxr, Zm_r_xm, 1},
+	{Yxr, Yxm, Zr_m_xm, 1},
 }
 
-var yxcvfl = []uint8{
-	Yxm,
-	Yrl,
-	Zm_r_xm,
-	1,
-	0,
+var yxcvfl = []ytab{
+	{Yxm, Yrl, Zm_r_xm, 1},
 }
 
-var yxcvlf = []uint8{
-	Yml,
-	Yxr,
-	Zm_r_xm,
-	1,
-	0,
+var yxcvlf = []ytab{
+	{Yml, Yxr, Zm_r_xm, 1},
 }
 
-var yxcvfq = []uint8{
-	Yxm,
-	Yrl,
-	Zm_r_xm,
-	2,
-	0,
+var yxcvfq = []ytab{
+	{Yxm, Yrl, Zm_r_xm, 2},
 }
 
-var yxcvqf = []uint8{
-	Yml,
-	Yxr,
-	Zm_r_xm,
-	2,
-	0,
+var yxcvqf = []ytab{
+	{Yml, Yxr, Zm_r_xm, 2},
 }
 
-var yps = []uint8{
-	Ymm,
-	Ymr,
-	Zm_r_xm,
-	1,
-	Yi8,
-	Ymr,
-	Zibo_m_xm,
-	2,
-	Yxm,
-	Yxr,
-	Zm_r_xm,
-	2,
-	Yi8,
-	Yxr,
-	Zibo_m_xm,
-	3,
-	0,
+var yps = []ytab{
+	{Ymm, Ymr, Zm_r_xm, 1},
+	{Yi8, Ymr, Zibo_m_xm, 2},
+	{Yxm, Yxr, Zm_r_xm, 2},
+	{Yi8, Yxr, Zibo_m_xm, 3},
 }
 
-var yxrrl = []uint8{
-	Yxr,
-	Yrl,
-	Zm_r,
-	1,
-	0,
+var yxrrl = []ytab{
+	{Yxr, Yrl, Zm_r, 1},
 }
 
-var ymfp = []uint8{
-	Ymm,
-	Ymr,
-	Zm_r_3d,
-	1,
-	0,
+var ymfp = []ytab{
+	{Ymm, Ymr, Zm_r_3d, 1},
 }
 
-var ymrxr = []uint8{
-	Ymr,
-	Yxr,
-	Zm_r,
-	1,
-	Yxm,
-	Yxr,
-	Zm_r_xm,
-	1,
-	0,
+var ymrxr = []ytab{
+	{Ymr, Yxr, Zm_r, 1},
+	{Yxm, Yxr, Zm_r_xm, 1},
 }
 
-var ymshuf = []uint8{
-	Ymm,
-	Ymr,
-	Zibm_r,
-	2,
-	0,
+var ymshuf = []ytab{
+	{Ymm, Ymr, Zibm_r, 2},
 }
 
-var ymshufb = []uint8{
-	Yxm,
-	Yxr,
-	Zm2_r,
-	2,
-	0,
+var ymshufb = []ytab{
+	{Yxm, Yxr, Zm2_r, 2},
 }
 
-var yxshuf = []uint8{
-	Yxm,
-	Yxr,
-	Zibm_r,
-	2,
-	0,
+var yxshuf = []ytab{
+	{Yxm, Yxr, Zibm_r, 2},
 }
 
-var yextrw = []uint8{
-	Yxr,
-	Yrl,
-	Zibm_r,
-	2,
-	0,
+var yextrw = []ytab{
+	{Yxr, Yrl, Zibm_r, 2},
 }
 
-var yinsrw = []uint8{
-	Yml,
-	Yxr,
-	Zibm_r,
-	2,
-	0,
+var yinsrw = []ytab{
+	{Yml, Yxr, Zibm_r, 2},
 }
 
-var yinsr = []uint8{
-	Ymm,
-	Yxr,
-	Zibm_r,
-	3,
-	0,
+var yinsr = []ytab{
+	{Ymm, Yxr, Zibm_r, 3},
 }
 
-var ypsdq = []uint8{
-	Yi8,
-	Yxr,
-	Zibo_m,
-	2,
-	0,
+var ypsdq = []ytab{
+	{Yi8, Yxr, Zibo_m, 2},
 }
 
-var ymskb = []uint8{
-	Yxr,
-	Yrl,
-	Zm_r_xm,
-	2,
-	Ymr,
-	Yrl,
-	Zm_r_xm,
-	1,
-	0,
+var ymskb = []ytab{
+	{Yxr, Yrl, Zm_r_xm, 2},
+	{Ymr, Yrl, Zm_r_xm, 1},
 }
 
-var ycrc32l = []uint8{Yml, Yrl, Zlitm_r, 0}
-
-var yprefetch = []uint8{
-	Ym,
-	Ynone,
-	Zm_o,
-	2,
-	0,
+var ycrc32l = []ytab{
+	{Yml, Yrl, Zlitm_r, 0},
 }
 
-var yaes = []uint8{
-	Yxm,
-	Yxr,
-	Zlitm_r,
-	2,
-	0,
+var yprefetch = []ytab{
+	{Ym, Ynone, Zm_o, 2},
 }
 
-var yaes2 = []uint8{
-	Yxm,
-	Yxr,
-	Zibm_r,
-	2,
-	0,
+var yaes = []ytab{
+	{Yxm, Yxr, Zlitm_r, 2},
+}
+
+var yaes2 = []ytab{
+	{Yxm, Yxr, Zibm_r, 2},
 }
 
 /*
@@ -3462,6 +2786,7 @@
 	var rel obj.Reloc
 	var r *obj.Reloc
 	var a *obj.Addr
+	var yt ytab
 
 	ctxt.Curp = p // TODO
 
@@ -3493,19 +2818,13 @@
 	ft = int(p.Ft) * Ymax
 	tt = int(p.Tt) * Ymax
 
-	t = o.ytab
-	if t == nil {
-		ctxt.Diag("asmins: noproto %v", p)
-		return
-	}
-
 	xo = bool2int(o.op[0] == 0x0f)
-	for z = 0; t[0] != 0; (func() { z += int(t[3]) + xo; t = t[4:] })() {
-		if ycover[ft+int(t[0])] != 0 {
-			if ycover[tt+int(t[1])] != 0 {
-				goto found
-			}
+	z = 0
+	for _, yt = range o.ytab {
+		if ycover[ft+int(yt.from)] != 0 && ycover[tt+int(yt.to)] != 0 {
+			goto found
 		}
+		z += int(yt.zoffset) + xo
 	}
 	goto domov
 
@@ -3576,9 +2895,9 @@
 		op = int(o.op[z])
 	}
 
-	switch t[2] {
+	switch yt.zcase {
 	default:
-		ctxt.Diag("asmins: unknown z %d %v", t[2], p)
+		ctxt.Diag("asmins: unknown z %d %v", yt.zcase, p)
 		return
 
 	case Zpseudo:
@@ -3624,16 +2943,16 @@
 		asmand(ctxt, p, &p.From, &p.To)
 
 	case Zm_r_xm:
-		mediaop(ctxt, o, op, int(t[3]), z)
+		mediaop(ctxt, o, op, int(yt.zoffset), z)
 		asmand(ctxt, p, &p.From, &p.To)
 
 	case Zm_r_xm_nr:
 		ctxt.Rexflag = 0
-		mediaop(ctxt, o, op, int(t[3]), z)
+		mediaop(ctxt, o, op, int(yt.zoffset), z)
 		asmand(ctxt, p, &p.From, &p.To)
 
 	case Zm_r_i_xm:
-		mediaop(ctxt, o, op, int(t[3]), z)
+		mediaop(ctxt, o, op, int(yt.zoffset), z)
 		asmand(ctxt, p, &p.From, &p.To)
 		ctxt.Andptr[0] = byte(p.To.Offset)
 		ctxt.Andptr = ctxt.Andptr[1:]
@@ -3683,16 +3002,16 @@
 		asmand(ctxt, p, &p.To, &p.From)
 
 	case Zr_m_xm:
-		mediaop(ctxt, o, op, int(t[3]), z)
+		mediaop(ctxt, o, op, int(yt.zoffset), z)
 		asmand(ctxt, p, &p.To, &p.From)
 
 	case Zr_m_xm_nr:
 		ctxt.Rexflag = 0
-		mediaop(ctxt, o, op, int(t[3]), z)
+		mediaop(ctxt, o, op, int(yt.zoffset), z)
 		asmand(ctxt, p, &p.To, &p.From)
 
 	case Zr_m_i_xm:
-		mediaop(ctxt, o, op, int(t[3]), z)
+		mediaop(ctxt, o, op, int(yt.zoffset), z)
 		asmand(ctxt, p, &p.To, &p.From)
 		ctxt.Andptr[0] = byte(p.From.Offset)
 		ctxt.Andptr = ctxt.Andptr[1:]
@@ -3731,14 +3050,14 @@
 		ctxt.Andptr = ctxt.Andptr[1:]
 
 	case Zibo_m_xm:
-		z = mediaop(ctxt, o, op, int(t[3]), z)
+		z = mediaop(ctxt, o, op, int(yt.zoffset), z)
 		asmando(ctxt, p, &p.To, int(o.op[z+1]))
 		ctxt.Andptr[0] = byte(vaddr(ctxt, p, &p.From, nil))
 		ctxt.Andptr = ctxt.Andptr[1:]
 
 	case Z_ib,
 		Zib_:
-		if t[2] == Zib_ {
+		if yt.zcase == Zib_ {
 			a = &p.From
 		} else {
 			a = &p.To
@@ -3831,7 +3150,7 @@
 
 	case Z_il,
 		Zil_:
-		if t[2] == Zil_ {
+		if yt.zcase == Zil_ {
 			a = &p.From
 		} else {
 			a = &p.To
@@ -3852,7 +3171,7 @@
 		Zilo_m:
 		ctxt.Andptr[0] = byte(op)
 		ctxt.Andptr = ctxt.Andptr[1:]
-		if t[2] == Zilo_m {
+		if yt.zcase == Zilo_m {
 			a = &p.From
 			asmando(ctxt, p, &p.To, int(o.op[z+1]))
 		} else {
@@ -3921,7 +3240,7 @@
 		Zjmp,
 		Zloop:
 		if p.To.Sym != nil {
-			if t[2] != Zjmp {
+			if yt.zcase != Zjmp {
 				ctxt.Diag("branch to ATEXT")
 				log.Fatalf("bad code")
 			}
@@ -3959,11 +3278,11 @@
 				ctxt.Andptr = ctxt.Andptr[1:]
 				ctxt.Andptr[0] = byte(v)
 				ctxt.Andptr = ctxt.Andptr[1:]
-			} else if t[2] == Zloop {
+			} else if yt.zcase == Zloop {
 				ctxt.Diag("loop too far: %v", p)
 			} else {
 				v -= 5 - 2
-				if t[2] == Zbr {
+				if yt.zcase == Zbr {
 					ctxt.Andptr[0] = 0x0f
 					ctxt.Andptr = ctxt.Andptr[1:]
 					v--
@@ -3997,10 +3316,10 @@
 			ctxt.Andptr = ctxt.Andptr[1:]
 			ctxt.Andptr[0] = 0
 			ctxt.Andptr = ctxt.Andptr[1:]
-		} else if t[2] == Zloop {
+		} else if yt.zcase == Zloop {
 			ctxt.Diag("loop too far: %v", p)
 		} else {
-			if t[2] == Zbr {
+			if yt.zcase == Zbr {
 				ctxt.Andptr[0] = 0x0f
 				ctxt.Andptr = ctxt.Andptr[1:]
 			}
@@ -4025,7 +3344,7 @@
 			*ctxt->andptr++ = v;
 		} else {
 			v -= 5-2;
-			if(t[2] == Zbr) {
+			if(yt.zcase == Zbr) {
 				*ctxt->andptr++ = 0x0f;
 				v--;
 			}