summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlan Modra <amodra@bigpond.net.au>2001-05-04 11:15:50 +0000
committerAlan Modra <amodra@bigpond.net.au>2001-05-04 11:15:50 +0000
commit08374ad5fa035cd2569c18c2d6d51b8213fb2316 (patch)
tree04ba41add297bdcc66608745c1d11097a97c2ef3
parent3b3f2856c6c02d263b46eb1ec9acf11a96ed6606 (diff)
downloadgdb-08374ad5fa035cd2569c18c2d6d51b8213fb2316.tar.gz
Assorted fixes to pinsrw, pextrw, pmovmskb, movmskp, maskmovq.
Merge 2001-04-06 i386-dis.c ffreep addition.
-rw-r--r--include/opcode/ChangeLog5
-rw-r--r--include/opcode/i386.h8
-rw-r--r--opcodes/ChangeLog14
-rw-r--r--opcodes/i386-dis.c47
4 files changed, 52 insertions, 22 deletions
diff --git a/include/opcode/ChangeLog b/include/opcode/ChangeLog
index 6a5da3efe69..79f7a7a8417 100644
--- a/include/opcode/ChangeLog
+++ b/include/opcode/ChangeLog
@@ -1,3 +1,8 @@
+2001-05-04 Alan Modra <amodra@one.net.au>
+
+ * i386.h (i386_optab): Move InvMem to first operand of pmovmskb
+ and pextrw to swap reg/rm assignments.
+
2001-03-24 Alan Modra <alan@linuxcare.com.au>
* i386.h (i386_optab): Correct entry for "movntdq". Add "punpcklqdq".
diff --git a/include/opcode/i386.h b/include/opcode/i386.h
index 9deffcc8a7c..36097485687 100644
--- a/include/opcode/i386.h
+++ b/include/opcode/i386.h
@@ -1152,8 +1152,8 @@ static const template i386_optab[] = {
{"pavgb", 2, 0x660fe0, X, CpuSSE2,FP|Modrm, { RegXMM|LLongMem, RegXMM, 0 } },
{"pavgw", 2, 0x0fe3, X, CpuSSE, FP|Modrm, { RegMMX|LLongMem, RegMMX, 0 } },
{"pavgw", 2, 0x660fe3, X, CpuSSE2,FP|Modrm, { RegXMM|LLongMem, RegXMM, 0 } },
-{"pextrw", 3, 0x0fc5, X, CpuSSE, FP|Modrm, { Imm8, RegMMX, Reg32|InvMem } },
-{"pextrw", 3, 0x660fc5, X, CpuSSE2,FP|Modrm, { Imm8, RegXMM, Reg32|InvMem } },
+{"pextrw", 3, 0x0fc5, X, CpuSSE, FP|Modrm, { Imm8, RegMMX|InvMem, Reg32 } },
+{"pextrw", 3, 0x660fc5, X, CpuSSE2,FP|Modrm, { Imm8, RegXMM|InvMem, Reg32 } },
{"pinsrw", 3, 0x0fc4, X, CpuSSE, FP|Modrm, { Imm8, Reg32|ShortMem, RegMMX } },
{"pinsrw", 3, 0x660fc4, X, CpuSSE2, FP|Modrm, { Imm8, Reg32|ShortMem, RegXMM } },
{"pmaxsw", 2, 0x0fee, X, CpuSSE, FP|Modrm, { RegMMX|LLongMem, RegMMX, 0 } },
@@ -1164,8 +1164,8 @@ static const template i386_optab[] = {
{"pminsw", 2, 0x660fea, X, CpuSSE2,FP|Modrm, { RegXMM|LLongMem, RegXMM, 0 } },
{"pminub", 2, 0x0fda, X, CpuSSE, FP|Modrm, { RegMMX|LLongMem, RegMMX, 0 } },
{"pminub", 2, 0x660fda, X, CpuSSE2,FP|Modrm, { RegXMM|LLongMem, RegXMM, 0 } },
-{"pmovmskb", 2, 0x0fd7, X, CpuSSE, FP|Modrm, { RegMMX, Reg32|InvMem, 0 } },
-{"pmovmskb", 2, 0x660fd7, X, CpuSSE2,FP|Modrm, { RegXMM, Reg32|InvMem, 0 } },
+{"pmovmskb", 2, 0x0fd7, X, CpuSSE, FP|Modrm, { RegMMX|InvMem, Reg32, 0 } },
+{"pmovmskb", 2, 0x660fd7, X, CpuSSE2,FP|Modrm, { RegXMM|InvMem, Reg32, 0 } },
{"pmulhuw", 2, 0x0fe4, X, CpuSSE, FP|Modrm, { RegMMX|LLongMem, RegMMX, 0 } },
{"pmulhuw", 2, 0x660fe4, X, CpuSSE2,FP|Modrm, { RegXMM|LLongMem, RegXMM, 0 } },
{"prefetchnta", 1, 0x0f18, 0, CpuSSE, FP|Modrm, { LLongMem, 0, 0 } },
diff --git a/opcodes/ChangeLog b/opcodes/ChangeLog
index dd8cb594a86..d9a7476a485 100644
--- a/opcodes/ChangeLog
+++ b/opcodes/ChangeLog
@@ -1,3 +1,17 @@
+2001-05-04 Alan Modra <amodra@one.net.au>
+
+ * i386-dis.c (Ev, Ed): Remove duplicate define.
+ (Gd): Define.
+ (XS): Define.
+ (OP_XS): New function.
+ (dis386_twobyte_att): Correct pinsrw, pextrw, pmovmskb, and
+ movmskp operands.
+ (dis386_twobyte_intel): Likewise.
+ (prefix_user_table): Use MS for maskmovq operand.
+
+ Merge mainline: 2001-04-06 Andreas Jaeger <aj@suse.de>
+ * i386-dis.c: Add ffreep instruction.
+
2001-03-30 Alexandre Oliva <aoliva@redhat.com>
* ppc-opc.c (insert_mbe): Shift mask initializer as long.
diff --git a/opcodes/i386-dis.c b/opcodes/i386-dis.c
index 61ec71e936c..005a12cc9ad 100644
--- a/opcodes/i386-dis.c
+++ b/opcodes/i386-dis.c
@@ -149,15 +149,14 @@ fetch_data (info, addr)
#define Ev OP_E, v_mode
#define Ed OP_E, d_mode
#define indirEb OP_indirE, b_mode
-#define Gb OP_G, b_mode
-#define Ev OP_E, v_mode
-#define Ed OP_E, d_mode
#define indirEv OP_indirE, v_mode
#define Ew OP_E, w_mode
#define Ma OP_E, v_mode
#define M OP_E, 0 /* lea */
#define Mp OP_E, 0 /* 32 or 48 bit memory operand for LDS, LES etc */
+#define Gb OP_G, b_mode
#define Gv OP_G, v_mode
+#define Gd OP_G, d_mode
#define Gw OP_G, w_mode
#define Rd OP_Rd, d_mode
#define Rm OP_Rd, m_mode
@@ -246,6 +245,7 @@ fetch_data (info, addr)
#define EM OP_EM, v_mode
#define EX OP_EX, v_mode
#define MS OP_MS, v_mode
+#define XS OP_XS, v_mode
#define None OP_E, 0
#define OPSUF OP_3DNowSuffix, 0
#define OPSIMD OP_SIMD_Suffix, 0
@@ -287,6 +287,7 @@ static void OP_XMM PARAMS ((int, int));
static void OP_EM PARAMS ((int, int));
static void OP_EX PARAMS ((int, int));
static void OP_MS PARAMS ((int, int));
+static void OP_XS PARAMS ((int, int));
static void OP_3DNowSuffix PARAMS ((int, int));
static void OP_SIMD_Suffix PARAMS ((int, int));
static void SIMD_Fixup PARAMS ((int, int));
@@ -1708,7 +1709,7 @@ static const struct dis386 dis386_twobyte_att[] = {
{ "cmovle", Gv, Ev, XX },
{ "cmovg", Gv, Ev, XX },
/* 50 */
- { "movmskpX", Gv, EX, XX },
+ { "movmskpX", Gd, XS, XX },
{ PREGRP13 },
{ PREGRP12 },
{ PREGRP11 },
@@ -1838,8 +1839,8 @@ static const struct dis386 dis386_twobyte_att[] = {
{ "xaddS", Ev, Gv, XX },
{ PREGRP1 },
{ "movntiS", Ev, Gv, XX },
- { "pinsrw", MX, Ev, Ib },
- { "pextrw", Ev, MX, Ib },
+ { "pinsrw", MX, Ed, Ib },
+ { "pextrw", Gd, MS, Ib },
{ "shufpX", XM, EX, Ib },
{ GRP9 },
/* c8 */
@@ -1859,7 +1860,7 @@ static const struct dis386 dis386_twobyte_att[] = {
{ "paddq", MX, EM, XX },
{ "pmullw", MX, EM, XX },
{ PREGRP21 },
- { "pmovmskb", Ev, MX, XX },
+ { "pmovmskb", Gd, MS, XX },
/* d8 */
{ "psubusb", MX, EM, XX },
{ "psubusw", MX, EM, XX },
@@ -1927,8 +1928,8 @@ static const struct dis386 dis386_twobyte_intel[] = {
{ "femms" , XX, XX, XX},
{ "", MX, EM, OPSUF }, /* See OP_3DNowSuffix */
/* 10 */
- { PREGRP8 },
- { PREGRP9 },
+ { PREGRP8 },
+ { PREGRP9 },
{ "movlpX", XM, EX, SIMD_Fixup, 'h' }, /* really only 2 operands */
{ "movlpX", EX, XM, SIMD_Fixup, 'h' },
{ "unpcklpX", XM, EX, XX },
@@ -2000,7 +2001,7 @@ static const struct dis386 dis386_twobyte_intel[] = {
{ "cmovle", Gv, Ev, XX },
{ "cmovg", Gv, Ev, XX },
/* 50 */
- { "movmskpX", Gv, EX, XX },
+ { "movmskpX", Gd, XS, XX },
{ PREGRP13 },
{ PREGRP12 },
{ PREGRP11 },
@@ -2130,8 +2131,8 @@ static const struct dis386 dis386_twobyte_intel[] = {
{ "xadd", Ev, Gv, XX },
{ PREGRP1 },
{ "movnti", Ev, Gv, XX },
- { "pinsrw", MX, Ev, Ib },
- { "pextrw", Ev, MX, Ib },
+ { "pinsrw", MX, Ed, Ib },
+ { "pextrw", Gd, MS, Ib },
{ "shufpX", XM, EX, Ib },
{ GRP9 },
/* c8 */
@@ -2151,7 +2152,7 @@ static const struct dis386 dis386_twobyte_intel[] = {
{ "paddq", MX, EM, XX },
{ "pmullw", MX, EM, XX },
{ PREGRP21 },
- { "pmovmskb", Ev, MX, XX },
+ { "pmovmskb", Gd, MS, XX },
/* d8 */
{ "psubusb", MX, EM, XX },
{ "psubusw", MX, EM, XX },
@@ -2296,7 +2297,7 @@ static const char *names8[] = {
"%al","%cl","%dl","%bl","%ah","%ch","%dh","%bh",
};
static const char *names8rex[] = {
- "%al","%cl","%dl","%bl","%spl", "%bpl", "%sil", "%dil",
+ "%al","%cl","%dl","%bl","%spl", "%bpl", "%sil", "%dil",
"%r8b", "%r9b", "%r10b", "%r11b", "%r12b", "%r13b", "%r14b", "%r15b"
};
static const char *names_seg[] = {
@@ -2693,7 +2694,7 @@ static const struct dis386 prefix_user_table[][4] = {
},
/* PREGRP18 */
{
- { "maskmovq", MX, EM, XX },
+ { "maskmovq", MX, MS, XX },
{ "(bad)", XM, EX, XX },
{ "maskmovdqu", XM, EX, XX },
{ "(bad)", XM, EX, XX },
@@ -3170,7 +3171,6 @@ print_insn_i386 (pc, info)
used_prefixes |= (prefixes & PREFIX_REPNZ);
if (prefixes & PREFIX_REPNZ)
index = 3;
-
}
}
dp = &prefix_user_table[dp->bytemode1][index];
@@ -3540,7 +3540,7 @@ static const struct dis386 float_reg[][8] = {
},
/* df */
{
- { "(bad)", XX, XX, XX },
+ { "ffreep", STi, XX, XX },
{ "(bad)", XX, XX, XX },
{ "(bad)", XX, XX, XX },
{ "(bad)", XX, XX, XX },
@@ -3760,7 +3760,7 @@ putop (template, sizeflag)
USED_REX (REX_MODE64);
if (rex & REX_MODE64)
*obufp++ = 'q';
- else
+ else
{
if (sizeflag & DFLAG)
*obufp++ = 'l';
@@ -4967,6 +4967,17 @@ OP_MS (bytemode, sizeflag)
BadOp();
}
+static void
+OP_XS (bytemode, sizeflag)
+ int bytemode;
+ int sizeflag;
+{
+ if (mod == 3)
+ OP_EX (bytemode, sizeflag);
+ else
+ BadOp();
+}
+
static const char *Suffix3DNow[] = {
/* 00 */ NULL, NULL, NULL, NULL,
/* 04 */ NULL, NULL, NULL, NULL,