Add AMD athlon support to x86 assembler and disassembler.
authorAlan Modra <amodra@gmail.com>
Sat, 21 Aug 1999 12:40:39 +0000 (12:40 +0000)
committerAlan Modra <amodra@gmail.com>
Sat, 21 Aug 1999 12:40:39 +0000 (12:40 +0000)
include/opcode/ChangeLog
include/opcode/i386.h
opcodes/ChangeLog
opcodes/i386-dis.c

index 41c3eea..40c3189 100644 (file)
@@ -1,3 +1,9 @@
+1999-08-21  Alan Modra  <alan@spri.levels.unisa.edu.au>
+
+       * i386.h: Add AMD athlon instructions, pfnacc, pfpnacc, pswapd.
+       Document pf2iw and pi2fw as athlon insns.  Remove pswapw.
+       Alphabetically sort PIII insns.
+
 Wed Aug 18 18:14:40 1999  Doug Evans  <devans@canuck.cygnus.com>
 
        * cgen.h (CGEN_INSN_MACH_HAS_P): New macro.
index 9d73ebd..3df27f2 100644 (file)
@@ -917,36 +917,35 @@ static const template i386_optab[] = {
 {"addss",     2, 0xf30f58,  X, FP|Modrm,       { RegXMM|WordMem, RegXMM, 0 } },
 {"andnps",    2, 0x0f55,    X, FP|Modrm,       { RegXMM|LLongMem, RegXMM, 0 } },
 {"andps",     2, 0x0f54,    X, FP|Modrm,       { RegXMM|WordMem, RegXMM, 0 } },
-{"cmpps",     3, 0x0fc2,    X, FP|Modrm,       { Imm8, RegXMM|LLongMem, RegXMM } },
-{"cmpss",     3, 0xf30fc2,  X, FP|Modrm,       { Imm8, RegXMM|WordMem, RegXMM } },
 {"cmpeqps",   2, 0x0fc2,    0, FP|Modrm|ImmExt,        { RegXMM|LLongMem, RegXMM, 0 } },
 {"cmpeqss",   2, 0xf30fc2,  0, FP|Modrm|ImmExt,        { RegXMM|WordMem, RegXMM, 0 } },
-{"cmpltps",   2, 0x0fc2,    1, FP|Modrm|ImmExt,        { RegXMM|LLongMem, RegXMM, 0 } },
-{"cmpltss",   2, 0xf30fc2,  1, FP|Modrm|ImmExt,        { RegXMM|WordMem, RegXMM, 0 } },
 {"cmpleps",   2, 0x0fc2,    2, FP|Modrm|ImmExt,        { RegXMM|LLongMem, RegXMM, 0 } },
 {"cmpless",   2, 0xf30fc2,  2, FP|Modrm|ImmExt,        { RegXMM|WordMem, RegXMM, 0 } },
-{"cmpunordps",2, 0x0fc2,    3, FP|Modrm|ImmExt,        { RegXMM|LLongMem, RegXMM, 0 } },
-{"cmpunordss",2, 0xf30fc2,  3, FP|Modrm|ImmExt,        { RegXMM|WordMem, RegXMM, 0 } },
+{"cmpltps",   2, 0x0fc2,    1, FP|Modrm|ImmExt,        { RegXMM|LLongMem, RegXMM, 0 } },
+{"cmpltss",   2, 0xf30fc2,  1, FP|Modrm|ImmExt,        { RegXMM|WordMem, RegXMM, 0 } },
 {"cmpneqps",  2, 0x0fc2,    4, FP|Modrm|ImmExt,        { RegXMM|LLongMem, RegXMM, 0 } },
 {"cmpneqss",  2, 0xf30fc2,  4, FP|Modrm|ImmExt,        { RegXMM|WordMem, RegXMM, 0 } },
-{"cmpnltps",  2, 0x0fc2,    5, FP|Modrm|ImmExt,        { RegXMM|LLongMem, RegXMM, 0 } },
-{"cmpnltss",  2, 0xf30fc2,  5, FP|Modrm|ImmExt,        { RegXMM|WordMem, RegXMM, 0 } },
 {"cmpnleps",  2, 0x0fc2,    6, FP|Modrm|ImmExt,        { RegXMM|LLongMem, RegXMM, 0 } },
 {"cmpnless",  2, 0xf30fc2,  6, FP|Modrm|ImmExt,        { RegXMM|WordMem, RegXMM, 0 } },
+{"cmpnltps",  2, 0x0fc2,    5, FP|Modrm|ImmExt,        { RegXMM|LLongMem, RegXMM, 0 } },
+{"cmpnltss",  2, 0xf30fc2,  5, FP|Modrm|ImmExt,        { RegXMM|WordMem, RegXMM, 0 } },
 {"cmpordps",  2, 0x0fc2,    7, FP|Modrm|ImmExt,        { RegXMM|LLongMem, RegXMM, 0 } },
 {"cmpordss",  2, 0xf30fc2,  7, FP|Modrm|ImmExt,        { RegXMM|WordMem, RegXMM, 0 } },
+{"cmpunordps",2, 0x0fc2,    3, FP|Modrm|ImmExt,        { RegXMM|LLongMem, RegXMM, 0 } },
+{"cmpunordss",2, 0xf30fc2,  3, FP|Modrm|ImmExt,        { RegXMM|WordMem, RegXMM, 0 } },
+{"cmpps",     3, 0x0fc2,    X, FP|Modrm,       { Imm8, RegXMM|LLongMem, RegXMM } },
+{"cmpss",     3, 0xf30fc2,  X, FP|Modrm,       { Imm8, RegXMM|WordMem, RegXMM } },
 {"comiss",    2, 0x0f2f,    X, FP|Modrm,       { RegXMM|WordMem, RegXMM, 0 } },
 {"cvtpi2ps",  2, 0x0f2a,    X, FP|Modrm,       { RegMMX|LLongMem, RegXMM, 0 } },
-{"cvtsi2ss",  2, 0xf30f2a,  X, FP|Modrm,       { Reg32|WordMem, RegXMM, 0 } },
 {"cvtps2pi",  2, 0x0f2d,    X, FP|Modrm,       { RegXMM|LLongMem, RegMMX, 0 } },
+{"cvtsi2ss",  2, 0xf30f2a,  X, FP|Modrm,       { Reg32|WordMem, RegXMM, 0 } },
 {"cvtss2si",  2, 0xf30f2d,  X, FP|Modrm,       { RegXMM|WordMem, Reg32, 0 } },
 {"cvttps2pi", 2, 0x0f2c,    X, FP|Modrm,       { RegXMM|LLongMem, RegMMX, 0 } },
 {"cvttss2si", 2, 0xf30f2c,  X, FP|Modrm,       { RegXMM|WordMem, Reg32, 0 } },
 {"divps",     2, 0x0f5e,    X, FP|Modrm,       { RegXMM|LLongMem, RegXMM, 0 } },
 {"divss",     2, 0xf30f5e,  X, FP|Modrm,       { RegXMM|WordMem, RegXMM, 0 } },
 {"ldmxcsr",   1, 0x0fae,    2, FP|Modrm,       { WordMem, 0, 0 } },
-{"stmxcsr",   1, 0x0fae,    3, FP|Modrm,       { WordMem, 0, 0 } },
-{"sfence",    0, 0x0faef8,  X, FP,             { 0, 0, 0 } },
+{"maskmovq",  2, 0x0ff7,    X, FP|Modrm,       { RegMMX|InvMem, RegMMX, 0 } },
 {"maxps",     2, 0x0f5f,    X, FP|Modrm,       { RegXMM|LLongMem, RegXMM, 0 } },
 {"maxss",     2, 0xf30f5f,  X, FP|Modrm,       { RegXMM|WordMem, RegXMM, 0 } },
 {"minps",     2, 0x0f5d,    X, FP|Modrm,       { RegXMM|LLongMem, RegXMM, 0 } },
@@ -960,26 +959,15 @@ static const template i386_optab[] = {
 {"movlps",    2, 0x0f12,    X, FP|Modrm,       { LLongMem, RegXMM, 0 } },
 {"movlps",    2, 0x0f13,    X, FP|Modrm,       { RegXMM, LLongMem, 0 } },
 {"movmskps",  2, 0x0f50,    X, FP|Modrm,       { RegXMM|InvMem, Reg32, 0 } },
-{"movups",    2, 0x0f10,    X, FP|Modrm,       { RegXMM|LLongMem, RegXMM, 0 } },
-{"movups",    2, 0x0f11,    X, FP|Modrm,       { RegXMM, RegXMM|LLongMem, 0 } },
+{"movntps",   2, 0x0f2b,    X, FP|Modrm,       { RegXMM, LLongMem, 0 } },
+{"movntq",    2, 0x0fe7,    X, FP|Modrm,       { RegMMX, LLongMem, 0 } },
 {"movss",     2, 0xf30f10,  X, FP|Modrm,       { RegXMM|WordMem, RegXMM, 0 } },
 {"movss",     2, 0xf30f11,  X, FP|Modrm,       { RegXMM, RegXMM|WordMem, 0 } },
+{"movups",    2, 0x0f10,    X, FP|Modrm,       { RegXMM|LLongMem, RegXMM, 0 } },
+{"movups",    2, 0x0f11,    X, FP|Modrm,       { RegXMM, RegXMM|LLongMem, 0 } },
 {"mulps",     2, 0x0f59,    X, FP|Modrm,       { RegXMM|LLongMem, RegXMM, 0 } },
 {"mulss",     2, 0xf30f59,  X, FP|Modrm,       { RegXMM|WordMem, RegXMM, 0 } },
 {"orps",      2, 0x0f56,    X, FP|Modrm,       { RegXMM|LLongMem, RegXMM, 0 } },
-{"rcpps",     2, 0x0f53,    X, FP|Modrm,       { RegXMM|LLongMem, RegXMM, 0 } },
-{"rcpss",     2, 0xf30f53,  X, FP|Modrm,       { RegXMM|WordMem, RegXMM, 0 } },
-{"rsqrtps",   2, 0x0f52,    X, FP|Modrm,       { RegXMM|LLongMem, RegXMM, 0 } },
-{"rsqrtss",   2, 0xf30f52,  X, FP|Modrm,       { RegXMM|WordMem, RegXMM, 0 } },
-{"shufps",    3, 0x0fc6,    X, FP|Modrm,       { Imm8, RegXMM|LLongMem, RegXMM } },
-{"sqrtps",    2, 0x0f51,    X, FP|Modrm,       { RegXMM|LLongMem, RegXMM, 0 } },
-{"sqrtss",    2, 0xf30f51,  X, FP|Modrm,       { RegXMM|WordMem, RegXMM, 0 } },
-{"subps",     2, 0x0f5c,    X, FP|Modrm,       { RegXMM|LLongMem, RegXMM, 0 } },
-{"subss",     2, 0xf30f5c,  X, FP|Modrm,       { RegXMM|WordMem, RegXMM, 0 } },
-{"ucomiss",   2, 0x0f2e,    X, FP|Modrm,       { RegXMM|WordMem, RegXMM, 0 } },
-{"unpckhps",  2, 0x0f15,    X, FP|Modrm,       { RegXMM|LLongMem, RegXMM, 0 } },
-{"unpcklps",  2, 0x0f14,    X, FP|Modrm,       { RegXMM|LLongMem, RegXMM, 0 } },
-{"xorps",     2, 0x0f57,    X, FP|Modrm,       { RegXMM|LLongMem, RegXMM, 0 } },
 {"pavgb",     2, 0x0fe0,    X, FP|Modrm,       { RegMMX|LLongMem, RegMMX, 0 } },
 {"pavgw",     2, 0x0fe3,    X, FP|Modrm,       { RegMMX|LLongMem, RegMMX, 0 } },
 {"pextrw",    3, 0x0fc5,    X, FP|Modrm,       { Imm8, RegMMX, Reg32|InvMem } },
@@ -990,15 +978,27 @@ static const template i386_optab[] = {
 {"pminub",    2, 0x0fda,    X, FP|Modrm,       { RegMMX|LLongMem, RegMMX, 0 } },
 {"pmovmskb",  2, 0x0fd7,    X, FP|Modrm,       { RegMMX, Reg32|InvMem, 0 } },
 {"pmulhuw",   2, 0x0fe4,    X, FP|Modrm,       { RegMMX|LLongMem, RegMMX, 0 } },
-{"psadbw",    2, 0x0ff6,    X, FP|Modrm,       { RegMMX|LLongMem, RegMMX, 0 } },
-{"pshufw",    3, 0x0f70,    X, FP|Modrm,       { Imm8, RegMMX|LLongMem, RegMMX } },
-{"maskmovq",  2, 0x0ff7,    X, FP|Modrm,       { RegMMX|InvMem, RegMMX, 0 } },
-{"movntps",   2, 0x0f2b,    X, FP|Modrm,       { RegXMM, LLongMem, 0 } },
-{"movntq",    2, 0x0fe7,    X, FP|Modrm,       { RegMMX, LLongMem, 0 } },
 {"prefetchnta", 1, 0x0f18,  0, FP|Modrm,       { LLongMem, 0, 0 } },
 {"prefetcht0",  1, 0x0f18,  1, FP|Modrm,       { LLongMem, 0, 0 } },
 {"prefetcht1",  1, 0x0f18,  2, FP|Modrm,       { LLongMem, 0, 0 } },
 {"prefetcht2",  1, 0x0f18,  3, FP|Modrm,       { LLongMem, 0, 0 } },
+{"psadbw",    2, 0x0ff6,    X, FP|Modrm,       { RegMMX|LLongMem, RegMMX, 0 } },
+{"pshufw",    3, 0x0f70,    X, FP|Modrm,       { Imm8, RegMMX|LLongMem, RegMMX } },
+{"rcpps",     2, 0x0f53,    X, FP|Modrm,       { RegXMM|LLongMem, RegXMM, 0 } },
+{"rcpss",     2, 0xf30f53,  X, FP|Modrm,       { RegXMM|WordMem, RegXMM, 0 } },
+{"rsqrtps",   2, 0x0f52,    X, FP|Modrm,       { RegXMM|LLongMem, RegXMM, 0 } },
+{"rsqrtss",   2, 0xf30f52,  X, FP|Modrm,       { RegXMM|WordMem, RegXMM, 0 } },
+{"sfence",    0, 0x0faef8,  X, FP,             { 0, 0, 0 } },
+{"shufps",    3, 0x0fc6,    X, FP|Modrm,       { Imm8, RegXMM|LLongMem, RegXMM } },
+{"sqrtps",    2, 0x0f51,    X, FP|Modrm,       { RegXMM|LLongMem, RegXMM, 0 } },
+{"sqrtss",    2, 0xf30f51,  X, FP|Modrm,       { RegXMM|WordMem, RegXMM, 0 } },
+{"stmxcsr",   1, 0x0fae,    3, FP|Modrm,       { WordMem, 0, 0 } },
+{"subps",     2, 0x0f5c,    X, FP|Modrm,       { RegXMM|LLongMem, RegXMM, 0 } },
+{"subss",     2, 0xf30f5c,  X, FP|Modrm,       { RegXMM|WordMem, RegXMM, 0 } },
+{"ucomiss",   2, 0x0f2e,    X, FP|Modrm,       { RegXMM|WordMem, RegXMM, 0 } },
+{"unpckhps",  2, 0x0f15,    X, FP|Modrm,       { RegXMM|LLongMem, RegXMM, 0 } },
+{"unpcklps",  2, 0x0f14,    X, FP|Modrm,       { RegXMM|LLongMem, RegXMM, 0 } },
+{"xorps",     2, 0x0f57,    X, FP|Modrm,       { RegXMM|LLongMem, RegXMM, 0 } },
 
 /* AMD 3DNow! instructions */
 
@@ -1007,7 +1007,7 @@ static const template i386_optab[] = {
 {"femms",    0, 0x0f0e,           X, FP,               { 0, 0, 0 } },
 {"pavgusb",  2, 0x0f0f, 0xbf, FP|Modrm|ImmExt, { RegMMX|LongMem, RegMMX, 0 } },
 {"pf2id",    2, 0x0f0f, 0x1d, FP|Modrm|ImmExt, { RegMMX|LongMem, RegMMX, 0 } },
-{"pf2iw",    2, 0x0f0f, 0x1c, FP|Modrm|ImmExt, { RegMMX|LongMem, RegMMX, 0 } }, /* Unofficial! See http://www.x86.org/articles/3dnow/amd_3dnow.html */
+{"pf2iw",    2, 0x0f0f, 0x1c, FP|Modrm|ImmExt, { RegMMX|LongMem, RegMMX, 0 } }, /* Athlon */
 {"pfacc",    2, 0x0f0f, 0xae, FP|Modrm|ImmExt, { RegMMX|LongMem, RegMMX, 0 } },
 {"pfadd",    2, 0x0f0f, 0x9e, FP|Modrm|ImmExt, { RegMMX|LongMem, RegMMX, 0 } },
 {"pfcmpeq",  2, 0x0f0f, 0xb0, FP|Modrm|ImmExt, { RegMMX|LongMem, RegMMX, 0 } },
@@ -1016,6 +1016,8 @@ static const template i386_optab[] = {
 {"pfmax",    2, 0x0f0f, 0xa4, FP|Modrm|ImmExt, { RegMMX|LongMem, RegMMX, 0 } },
 {"pfmin",    2, 0x0f0f, 0x94, FP|Modrm|ImmExt, { RegMMX|LongMem, RegMMX, 0 } },
 {"pfmul",    2, 0x0f0f, 0xb4, FP|Modrm|ImmExt, { RegMMX|LongMem, RegMMX, 0 } },
+{"pfnacc",   2, 0x0f0f, 0x8a, FP|Modrm|ImmExt, { RegMMX|LongMem, RegMMX, 0 } }, /* Athlon */
+{"pfpnacc",  2, 0x0f0f, 0x8e, FP|Modrm|ImmExt, { RegMMX|LongMem, RegMMX, 0 } }, /* Athlon */
 {"pfrcp",    2, 0x0f0f, 0x96, FP|Modrm|ImmExt, { RegMMX|LongMem, RegMMX, 0 } },
 {"pfrcpit1", 2, 0x0f0f, 0xa6, FP|Modrm|ImmExt, { RegMMX|LongMem, RegMMX, 0 } },
 {"pfrcpit2", 2, 0x0f0f, 0xb6, FP|Modrm|ImmExt, { RegMMX|LongMem, RegMMX, 0 } },
@@ -1024,9 +1026,9 @@ static const template i386_optab[] = {
 {"pfsub",    2, 0x0f0f, 0x9a, FP|Modrm|ImmExt, { RegMMX|LongMem, RegMMX, 0 } },
 {"pfsubr",   2, 0x0f0f, 0xaa, FP|Modrm|ImmExt, { RegMMX|LongMem, RegMMX, 0 } },
 {"pi2fd",    2, 0x0f0f, 0x0d, FP|Modrm|ImmExt, { RegMMX|LongMem, RegMMX, 0 } },
-{"pi2fw",    2, 0x0f0f, 0x0c, FP|Modrm|ImmExt, { RegMMX|LongMem, RegMMX, 0 } }, /* Unofficial! */
+{"pi2fw",    2, 0x0f0f, 0x0c, FP|Modrm|ImmExt, { RegMMX|LongMem, RegMMX, 0 } }, /* Athlon */
 {"pmulhrw",  2, 0x0f0f, 0xb7, FP|Modrm|ImmExt, { RegMMX|LongMem, RegMMX, 0 } },
-{"pswapw",   2, 0x0f0f, 0xbb, FP|Modrm|ImmExt, { RegMMX|LongMem, RegMMX, 0 } }, /* Unofficial! */
+{"pswapd",   2, 0x0f0f, 0xbb, FP|Modrm|ImmExt, { RegMMX|LongMem, RegMMX, 0 } }, /* Athlon */
 
 {NULL, 0, 0, 0, 0, { 0, 0, 0} }        /* sentinel */
 };
index 19349c6..ffaf3e7 100644 (file)
@@ -1,3 +1,7 @@
+1999-08-21  Alan Modra  <alan@spri.levels.unisa.edu.au>
+
+       * i386-dis.c: Add AMD athlon instruction support.
+
 1999-08-10  Ian Lance Taylor  <ian@zembu.com>
 
        From Wally Iimura <iimura@microunity.com>:
index 3c77a74..49201ff 100644 (file)
@@ -3605,11 +3605,11 @@ static const char *Suffix3DNow[] = {
 /* 00 */       NULL,           NULL,           NULL,           NULL,
 /* 04 */       NULL,           NULL,           NULL,           NULL,
 /* 08 */       NULL,           NULL,           NULL,           NULL,
-/* 0C */       NULL,           "pi2fd",        NULL,           NULL,
+/* 0C */       "pi2fw",        "pi2fd",        NULL,           NULL,
 /* 10 */       NULL,           NULL,           NULL,           NULL,
 /* 14 */       NULL,           NULL,           NULL,           NULL,
 /* 18 */       NULL,           NULL,           NULL,           NULL,
-/* 1C */       NULL,           "pf2id",        NULL,           NULL,
+/* 1C */       "pf2iw",        "pf2id",        NULL,           NULL,
 /* 20 */       NULL,           NULL,           NULL,           NULL,
 /* 24 */       NULL,           NULL,           NULL,           NULL,
 /* 28 */       NULL,           NULL,           NULL,           NULL,
@@ -3636,8 +3636,8 @@ static const char *Suffix3DNow[] = {
 /* 7C */       NULL,           NULL,           NULL,           NULL,
 /* 80 */       NULL,           NULL,           NULL,           NULL,
 /* 84 */       NULL,           NULL,           NULL,           NULL,
-/* 88 */       NULL,           NULL,           NULL,           NULL,
-/* 8C */       NULL,           NULL,           NULL,           NULL,
+/* 88 */       NULL,           NULL,           "pfnacc",       NULL,
+/* 8C */       NULL,           NULL,           "pfpnacc",      NULL,
 /* 90 */       "pfcmpge",      NULL,           NULL,           NULL,
 /* 94 */       "pfmin",        NULL,           "pfrcp",        "pfrsqrt",
 /* 98 */       NULL,           NULL,           "pfsub",        NULL,
@@ -3648,7 +3648,7 @@ static const char *Suffix3DNow[] = {
 /* AC */       NULL,           NULL,           "pfacc",        NULL,
 /* B0 */       "pfcmpeq",      NULL,           NULL,           NULL,
 /* B4 */       "pfmul",        NULL,           "pfrcpit2",     "pfmulhrw",
-/* B8 */       NULL,           NULL,           NULL,           NULL,
+/* B8 */       NULL,           NULL,           NULL,           "pswapd",
 /* BC */       NULL,           NULL,           NULL,           "pavgusb",
 /* C0 */       NULL,           NULL,           NULL,           NULL,
 /* C4 */       NULL,           NULL,           NULL,           NULL,