OSDN Git Service

* hppa.h (pa_opcodes): Handle PA2.0 "bve" instructions.
[pf3gnuchains/pf3gnuchains4x.git] / include / opcode / i386.h
index e7e78c8..7e3a564 100644 (file)
@@ -105,23 +105,23 @@ static const template i386_optab[] = {
 {"movzx",  2, 0x0fb6, X, b_Suf|Modrm,                  { Reg8|ByteMem, WordReg, 0} },
 
 /* push instructions */
-{"push",   1,  0x50, X, wl_Suf|ShortForm,      { WordReg, 0, 0 } },
-{"push",   1,  0xff, 6, wl_Suf|Modrm,          { WordReg|WordMem, 0, 0 } },
-{"push",   1,  0x6a, X, wl_Suf,                { Imm8S, 0, 0} },
-{"push",   1,  0x68, X, wl_Suf,                { Imm16|Imm32, 0, 0} },
-{"push",   1,  0x06, X, wl_Suf|Seg2ShortForm { SReg2, 0, 0 } },
-{"push",   1, 0x0fa0, X, wl_Suf|Seg3ShortForm, { SReg3, 0, 0 } },
+{"push",   1,  0x50, X, wl_Suf|ShortForm|DefaultSize,  { WordReg, 0, 0 } },
+{"push",   1,  0xff, 6, wl_Suf|Modrm|DefaultSize,      { WordReg|WordMem, 0, 0 } },
+{"push",   1,  0x6a, X, wl_Suf|DefaultSize,            { Imm8S, 0, 0} },
+{"push",   1,  0x68, X, wl_Suf|DefaultSize,            { Imm16|Imm32, 0, 0} },
+{"push",   1,  0x06, X, wl_Suf|Seg2ShortForm|DefaultSize, { SReg2, 0, 0 } },
+{"push",   1, 0x0fa0, X, wl_Suf|Seg3ShortForm|DefaultSize, { SReg3, 0, 0 } },
 /* push all */
-{"pusha",  0,  0x60, X, wl_Suf,                { 0, 0, 0 } },
+{"pusha",  0,  0x60, X, wl_Suf|DefaultSize,            { 0, 0, 0 } },
 
 /* pop instructions */
-{"pop",           1,   0x58, X, wl_Suf|ShortForm,      { WordReg, 0, 0 } },
-{"pop",           1,   0x8f, 0, wl_Suf|Modrm,          { WordReg|WordMem, 0, 0 } },
+{"pop",           1,   0x58, X, wl_Suf|ShortForm|DefaultSize,  { WordReg, 0, 0 } },
+{"pop",           1,   0x8f, 0, wl_Suf|Modrm|DefaultSize,      { WordReg|WordMem, 0, 0 } },
 #define POP_SEG_SHORT 0x07
-{"pop",           1,   0x07, X, wl_Suf|Seg2ShortForm { SReg2, 0, 0 } },
-{"pop",           1, 0x0fa1, X, wl_Suf|Seg3ShortForm { SReg3, 0, 0 } },
+{"pop",           1,   0x07, X, wl_Suf|Seg2ShortForm|DefaultSize, { SReg2, 0, 0 } },
+{"pop",           1, 0x0fa1, X, wl_Suf|Seg3ShortForm|DefaultSize, { SReg3, 0, 0 } },
 /* pop all */
-{"popa",   0,  0x61, X, wl_Suf,                { 0, 0, 0 } },
+{"popa",   0,  0x61, X, wl_Suf|DefaultSize,            { 0, 0, 0 } },
 
 /* xchg exchange instructions
    xchg commutes:  we allow both operand orders */
@@ -158,8 +158,8 @@ static const template i386_optab[] = {
 {"cmc",           0,   0xf5, X, NoSuf,                 { 0, 0, 0} },
 {"lahf",   0,  0x9f, X, NoSuf,                 { 0, 0, 0} },
 {"sahf",   0,  0x9e, X, NoSuf,                 { 0, 0, 0} },
-{"pushf",  0,  0x9c, X, wl_Suf,                { 0, 0, 0} },
-{"popf",   0,  0x9d, X, wl_Suf,                { 0, 0, 0} },
+{"pushf",  0,  0x9c, X, wl_Suf|DefaultSize,    { 0, 0, 0} },
+{"popf",   0,  0x9d, X, wl_Suf|DefaultSize,    { 0, 0, 0} },
 {"stc",           0,   0xf9, X, NoSuf,                 { 0, 0, 0} },
 {"std",           0,   0xfd, X, NoSuf,                 { 0, 0, 0} },
 {"sti",           0,   0xfb, X, NoSuf,                 { 0, 0, 0} },
@@ -311,12 +311,12 @@ static const template i386_optab[] = {
 {"sar",           1,   0xd0, 7, bwl_Suf|W|Modrm,       { Reg|AnyMem, 0, 0} },
 
 /* control transfer instructions */
-{"call",   1,  0xe8, X, wl_Suf|JumpDword,      { Disp16|Disp32, 0, 0} },
-{"call",   1,  0xff, 2, wl_Suf|Modrm,          { WordReg|WordMem|JumpAbsolute, 0, 0} },
+{"call",   1,  0xe8, X, wl_Suf|JumpDword|DefaultSize,  { Disp16|Disp32, 0, 0} },
+{"call",   1,  0xff, 2, wl_Suf|Modrm|DefaultSize,      { WordReg|WordMem|JumpAbsolute, 0, 0} },
 /* Intel Syntax */
-{"call",   2,  0x9a, X, wl_Suf|JumpInterSegment, { Imm16, Imm16|Imm32, 0} },
-{"lcall",  2,  0x9a, X, wl_Suf|JumpInterSegment, { Imm16, Imm16|Imm32, 0} },
-{"lcall",  1,  0xff, 3, wl_Suf|Modrm,          { WordMem, 0, 0} },
+{"call",   2,  0x9a, X, wl_Suf|JumpInterSegment|DefaultSize, { Imm16, Imm16|Imm32, 0} },
+{"lcall",  2,  0x9a, X, wl_Suf|JumpInterSegment|DefaultSize, { Imm16, Imm16|Imm32, 0} },
+{"lcall",  1,  0xff, 3, wl_Suf|Modrm|DefaultSize,      { WordMem, 0, 0} },
 
 #define JUMP_PC_RELATIVE 0xeb
 {"jmp",           1,   0xeb, X, NoSuf|Jump,            { Disp, 0, 0} },
@@ -327,12 +327,12 @@ static const template i386_optab[] = {
 {"ljmp",   2,  0xea, X, wl_Suf|JumpInterSegment, { Imm16, Imm16|Imm32, 0} },
 {"ljmp",   1,  0xff, 5, wl_Suf|Modrm,          { WordMem, 0, 0} },
 
-{"ret",           0,   0xc3, X, wl_Suf,                { 0, 0, 0} },
-{"ret",           1,   0xc2, X, wl_Suf,                { Imm16, 0, 0} },
-{"lret",   0,  0xcb, X, wl_Suf,                { 0, 0, 0} },
-{"lret",   1,  0xca, X, wl_Suf,                { Imm16, 0, 0} },
-{"enter",  2,  0xc8, X, wl_Suf,                { Imm16, Imm8, 0} },
-{"leave",  0,  0xc9, X, wl_Suf,                { 0, 0, 0} },
+{"ret",           0,   0xc3, X, wl_Suf|DefaultSize,    { 0, 0, 0} },
+{"ret",           1,   0xc2, X, wl_Suf|DefaultSize,    { Imm16, 0, 0} },
+{"lret",   0,  0xcb, X, wl_Suf|DefaultSize,    { 0, 0, 0} },
+{"lret",   1,  0xca, X, wl_Suf|DefaultSize,    { Imm16, 0, 0} },
+{"enter",  2,  0xc8, X, wl_Suf|DefaultSize,    { Imm16, Imm8, 0} },
+{"leave",  0,  0xc9, X, wl_Suf|DefaultSize,    { 0, 0, 0} },
 
 /* conditional jumps */
 {"jo",    1,   0x70, X, NoSuf|Jump,            { Disp, 0, 0} },
@@ -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 */
 };
@@ -1035,14 +1037,23 @@ static const template i386_optab[] = {
 #undef b_Suf
 #undef w_Suf
 #undef l_Suf
+#undef d_Suf
+#undef x_Suf
 #undef bw_Suf
 #undef bl_Suf
 #undef wl_Suf
 #undef sl_Suf
+#undef sld_Suf
+#undef sldx_Suf
 #undef bwl_Suf
+#undef bwld_Suf
 #undef FP
 #undef l_FP
+#undef d_FP
+#undef x_FP
 #undef sl_FP
+#undef sld_FP
+#undef sldx_FP
 
 #define MAX_MNEM_SIZE 16       /* for parsing insn mnemonics from input */
 
@@ -1050,6 +1061,8 @@ static const template i386_optab[] = {
 /* 386 register table */
 
 static const reg_entry i386_regtab[] = {
+  /* make %st first as we test for it */
+  {"st", FloatReg|FloatAcc, 0},
   /* 8 bit regs */
   {"al", Reg8|Acc, 0},
   {"cl", Reg8|ShiftCount, 1},
@@ -1119,16 +1132,7 @@ static const reg_entry i386_regtab[] = {
   {"tr5", Test, 5},
   {"tr6", Test, 6},
   {"tr7", Test, 7},
-  /* float registers */
-  {"st(0)", FloatReg|FloatAcc, 0},
-  {"st", FloatReg|FloatAcc, 0},
-  {"st(1)", FloatReg, 1},
-  {"st(2)", FloatReg, 2},
-  {"st(3)", FloatReg, 3},
-  {"st(4)", FloatReg, 4},
-  {"st(5)", FloatReg, 5},
-  {"st(6)", FloatReg, 6},
-  {"st(7)", FloatReg, 7},
+  /* mmx and simd registers */
   {"mm0", RegMMX, 0},
   {"mm1", RegMMX, 1},
   {"mm2", RegMMX, 2},
@@ -1147,6 +1151,17 @@ static const reg_entry i386_regtab[] = {
   {"xmm7", RegXMM, 7}
 };
 
+static const reg_entry i386_float_regtab[] = {
+  {"st(0)", FloatReg|FloatAcc, 0},
+  {"st(1)", FloatReg, 1},
+  {"st(2)", FloatReg, 2},
+  {"st(3)", FloatReg, 3},
+  {"st(4)", FloatReg, 4},
+  {"st(5)", FloatReg, 5},
+  {"st(6)", FloatReg, 6},
+  {"st(7)", FloatReg, 7}
+};
+
 #define MAX_REG_NAME_SIZE 8    /* for parsing register names from input */
 
 /* segment stuff */