]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/6l, cmd/8l: fix MOVL MOVQ optab
authorRuss Cox <rsc@golang.org>
Tue, 10 Sep 2013 18:53:41 +0000 (14:53 -0400)
committerRuss Cox <rsc@golang.org>
Tue, 10 Sep 2013 18:53:41 +0000 (14:53 -0400)
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

src/cmd/6l/l.h
src/cmd/6l/optab.c
src/cmd/8l/l.h
src/cmd/8l/optab.c

index 265a6947e861f6360a6980045de82bb6e3504113..ecab867e4302293b9ba949d00137f3571b70a9e4 100644 (file)
@@ -193,7 +193,7 @@ struct      Optab
        short   as;
        uchar*  ytab;
        uchar   prefix;
-       uchar   op[22];
+       uchar   op[23];
 };
 struct Movtab
 {
index c354967b982a61fa2b35a528e5de2631006d5810..46603ad451fb94a7cb5a61ee325d5c564f424246 100644 (file)
@@ -913,7 +913,7 @@ Optab optab[] =
        { AMOVHLPS,     yxr,    Pm, 0x12 },
        { AMOVHPD,      yxmov,  Pe, 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 },
        { AMOVLPD,      yxmov,  Pe, 0x12,0x13 },
        { AMOVLPS,      yxmov,  Pm, 0x12,0x13 },
@@ -925,7 +925,7 @@ Optab optab[] =
        { AMOVNTPD,     yxr_ml, Pe, 0x2b },
        { AMOVNTPS,     yxr_ml, Pm, 0x2b },
        { 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 },
        { AMOVSB,       ynone,  Pb, 0xa4 },
        { AMOVSD,       yxmov,  Pf2, 0x10,0x11 },
@@ -935,7 +935,7 @@ Optab optab[] =
        { AMOVSW,       ynone,  Pe, 0xa5 },
        { AMOVUPD,      yxmov,  Pe, 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 },
        { AMOVWLZX,     yml_rl, Pm, 0xb7 },
        { AMOVWQSX,     yml_rl, Pw, 0x0f,0xbf },
index 2167ccb003ba0b952b0d13f152dc3d0f901c2785..814aa14582ca5c7bd0774885e6f0c5a79c903409 100644 (file)
@@ -175,7 +175,7 @@ struct      Optab
        short   as;
        uchar*  ytab;
        uchar   prefix;
-       uchar   op[12];
+       uchar   op[13];
 };
 
 enum
index 78fe45238e7b405e2ab5b8144259a164fcea5596..a4c40e8e3797512ede63ff5d5d1f2b8c0422b7d4 100644 (file)
@@ -152,6 +152,17 @@ uchar      ymovb[] =
        Yi32,   Ymb,    Zibo_m, 2,
        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[] =
 {
        Yrl,    Yml,    Zr_m,   1,
@@ -162,7 +173,7 @@ uchar       ymovl[] =
        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, 2,
+       Yiauto, Yrl,    Zaut_r, 1,
        0
 };
 uchar  ymovq[] =
@@ -592,8 +603,8 @@ Optab optab[] =
        { ALSLL,        yml_rl, Pm, 0x03  },
        { ALSLW,        yml_rl, Pq, 0x03  },
        { AMOVB,        ymovb,  Pb, 0x88,0x8a,0xb0,0xc6,(00) },
-       { AMOVL,        ymovl,  Px, 0x89,0x8b,0x31,0x83,(04),0xb8,0xc7,(00),Pe,0x6e,Pe,0x7e },
-       { AMOVW,        ymovl,  Pe, 0x89,0x8b,0x31,0x83,(04),0xb8,0xc7,(00) },
+       { AMOVL,        ymovl,  Px, 0x89,0x8b,0x31,0x83,(04),0xb8,0xc7,(00),Pe,0x6e,Pe,0x7e,0 },
+       { AMOVW,        ymovw,  Pe, 0x89,0x8b,0x31,0x83,(04),0xb8,0xc7,(00),0 },
        { AMOVQ,        ymovq,  Pf3, 0x7e },
        { AMOVBLSX,     ymb_rl, Pm, 0xbe },
        { AMOVBLZX,     ymb_rl, Pm, 0xb6 },