Commit 80a153dd authored by Russ Cox's avatar Russ Cox

cmd/6l, cmd/8l: fix MOVL MOVQ optab

The entry for LEAL/LEAQ in these optabs was listed as having
two data bytes in the y array. In fact they had and expect no data
bytes. However, the general loop expects to be able to look at at
least one data byte, to make sure it is not 0x0f. So give them each
a single data byte set to 0 (not 0x0f).

Since the MOV instructions have the largest optab cases, this
requires growing the size of the data array.

Clang found this bug because the general o->op[z] == 0x0f
test was using z == 22, which was out of bounds.

In practice the next byte in memory was probably not 0x0f
so it wasn't truly broken. But might as well be clean.

Update #5764

R=ken2
CC=golang-dev
https://golang.org/cl/13241050
parent 8edf764f
...@@ -193,7 +193,7 @@ struct Optab ...@@ -193,7 +193,7 @@ struct Optab
short as; short as;
uchar* ytab; uchar* ytab;
uchar prefix; uchar prefix;
uchar op[22]; uchar op[23];
}; };
struct Movtab struct Movtab
{ {
......
...@@ -913,7 +913,7 @@ Optab optab[] = ...@@ -913,7 +913,7 @@ Optab optab[] =
{ AMOVHLPS, yxr, Pm, 0x12 }, { AMOVHLPS, yxr, Pm, 0x12 },
{ AMOVHPD, yxmov, Pe, 0x16,0x17 }, { AMOVHPD, yxmov, Pe, 0x16,0x17 },
{ AMOVHPS, yxmov, Pm, 0x16,0x17 }, { AMOVHPS, yxmov, Pm, 0x16,0x17 },
{ AMOVL, ymovl, Px, 0x89,0x8b,0x31,0xb8,0xc7,(00),0x6e,0x7e,Pe,0x6e,Pe,0x7e }, { AMOVL, ymovl, Px, 0x89,0x8b,0x31,0xb8,0xc7,(00),0x6e,0x7e,Pe,0x6e,Pe,0x7e,0 },
{ AMOVLHPS, yxr, Pm, 0x16 }, { AMOVLHPS, yxr, Pm, 0x16 },
{ AMOVLPD, yxmov, Pe, 0x12,0x13 }, { AMOVLPD, yxmov, Pe, 0x12,0x13 },
{ AMOVLPS, yxmov, Pm, 0x12,0x13 }, { AMOVLPS, yxmov, Pm, 0x12,0x13 },
...@@ -925,7 +925,7 @@ Optab optab[] = ...@@ -925,7 +925,7 @@ Optab optab[] =
{ AMOVNTPD, yxr_ml, Pe, 0x2b }, { AMOVNTPD, yxr_ml, Pe, 0x2b },
{ AMOVNTPS, yxr_ml, Pm, 0x2b }, { AMOVNTPS, yxr_ml, Pm, 0x2b },
{ AMOVNTQ, ymr_ml, Pm, 0xe7 }, { AMOVNTQ, ymr_ml, Pm, 0xe7 },
{ AMOVQ, ymovq, Pw, 0x89, 0x8b, 0x31, 0xc7,(00), 0xb8, 0xc7,(00), 0x6f, 0x7f, 0x6e, 0x7e, Pf2,0xd6, Pf3,0x7e, Pe,0xd6, Pe,0x6e, Pe,0x7e }, { AMOVQ, ymovq, Pw, 0x89, 0x8b, 0x31, 0xc7,(00), 0xb8, 0xc7,(00), 0x6f, 0x7f, 0x6e, 0x7e, Pf2,0xd6, Pf3,0x7e, Pe,0xd6, Pe,0x6e, Pe,0x7e,0 },
{ AMOVQOZX, ymrxr, Pf3, 0xd6,0x7e }, { AMOVQOZX, ymrxr, Pf3, 0xd6,0x7e },
{ AMOVSB, ynone, Pb, 0xa4 }, { AMOVSB, ynone, Pb, 0xa4 },
{ AMOVSD, yxmov, Pf2, 0x10,0x11 }, { AMOVSD, yxmov, Pf2, 0x10,0x11 },
...@@ -935,7 +935,7 @@ Optab optab[] = ...@@ -935,7 +935,7 @@ Optab optab[] =
{ AMOVSW, ynone, Pe, 0xa5 }, { AMOVSW, ynone, Pe, 0xa5 },
{ AMOVUPD, yxmov, Pe, 0x10,0x11 }, { AMOVUPD, yxmov, Pe, 0x10,0x11 },
{ AMOVUPS, yxmov, Pm, 0x10,0x11 }, { AMOVUPS, yxmov, Pm, 0x10,0x11 },
{ AMOVW, ymovw, Pe, 0x89,0x8b,0x31,0xb8,0xc7,(00) }, { AMOVW, ymovw, Pe, 0x89,0x8b,0x31,0xb8,0xc7,(00),0 },
{ AMOVWLSX, yml_rl, Pm, 0xbf }, { AMOVWLSX, yml_rl, Pm, 0xbf },
{ AMOVWLZX, yml_rl, Pm, 0xb7 }, { AMOVWLZX, yml_rl, Pm, 0xb7 },
{ AMOVWQSX, yml_rl, Pw, 0x0f,0xbf }, { AMOVWQSX, yml_rl, Pw, 0x0f,0xbf },
......
...@@ -175,7 +175,7 @@ struct Optab ...@@ -175,7 +175,7 @@ struct Optab
short as; short as;
uchar* ytab; uchar* ytab;
uchar prefix; uchar prefix;
uchar op[12]; uchar op[13];
}; };
enum enum
......
...@@ -152,6 +152,17 @@ uchar ymovb[] = ...@@ -152,6 +152,17 @@ uchar ymovb[] =
Yi32, Ymb, Zibo_m, 2, Yi32, Ymb, Zibo_m, 2,
0 0
}; };
uchar ymovw[] =
{
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
};
uchar ymovl[] = uchar ymovl[] =
{ {
Yrl, Yml, Zr_m, 1, Yrl, Yml, Zr_m, 1,
...@@ -162,7 +173,7 @@ uchar ymovl[] = ...@@ -162,7 +173,7 @@ uchar ymovl[] =
Yi32, Yml, Zilo_m, 2, Yi32, Yml, Zilo_m, 2,
Yml, Yxr, Zm_r_xm, 2, // XMM MOVD (32 bit) Yml, Yxr, Zm_r_xm, 2, // XMM MOVD (32 bit)
Yxr, Yml, Zr_m_xm, 2, // XMM MOVD (32 bit) Yxr, Yml, Zr_m_xm, 2, // XMM MOVD (32 bit)
Yiauto, Yrl, Zaut_r, 2, Yiauto, Yrl, Zaut_r, 1,
0 0
}; };
uchar ymovq[] = uchar ymovq[] =
...@@ -592,8 +603,8 @@ Optab optab[] = ...@@ -592,8 +603,8 @@ Optab optab[] =
{ ALSLL, yml_rl, Pm, 0x03 }, { ALSLL, yml_rl, Pm, 0x03 },
{ ALSLW, yml_rl, Pq, 0x03 }, { ALSLW, yml_rl, Pq, 0x03 },
{ AMOVB, ymovb, Pb, 0x88,0x8a,0xb0,0xc6,(00) }, { AMOVB, ymovb, Pb, 0x88,0x8a,0xb0,0xc6,(00) },
{ AMOVL, ymovl, Px, 0x89,0x8b,0x31,0x83,(04),0xb8,0xc7,(00),Pe,0x6e,Pe,0x7e }, { AMOVL, ymovl, Px, 0x89,0x8b,0x31,0x83,(04),0xb8,0xc7,(00),Pe,0x6e,Pe,0x7e,0 },
{ AMOVW, ymovl, Pe, 0x89,0x8b,0x31,0x83,(04),0xb8,0xc7,(00) }, { AMOVW, ymovw, Pe, 0x89,0x8b,0x31,0x83,(04),0xb8,0xc7,(00),0 },
{ AMOVQ, ymovq, Pf3, 0x7e }, { AMOVQ, ymovq, Pf3, 0x7e },
{ AMOVBLSX, ymb_rl, Pm, 0xbe }, { AMOVBLSX, ymb_rl, Pm, 0xbe },
{ AMOVBLZX, ymb_rl, Pm, 0xb6 }, { AMOVBLZX, ymb_rl, Pm, 0xb6 },
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment