add 6(a|l) sse support to 8(a|l)

This commit is contained in:
jpathy 2013-05-21 23:15:13 +05:30
parent e3883b050e
commit 213bf50893
9 changed files with 1067 additions and 16 deletions

View file

@ -20,9 +20,9 @@
%left '+' '-'
%left '*' '/' '%'
%token <lval> LTYPE0 LTYPE1 LTYPE2 LTYPE3 LTYPE4
%token <lval> LTYPEC LTYPED LTYPEN LTYPER LTYPET LTYPES LTYPEM LTYPEI LTYPEG
%token <lval> LTYPEC LTYPED LTYPEN LTYPER LTYPET LTYPES LTYPEM LTYPEI LTYPEG LTYPEXC LTYPEX
%token <lval> LCONST LFP LPC LSB
%token <lval> LBREG LLREG LSREG LFREG
%token <lval> LBREG LLREG LSREG LFREG LMREG LXREG
%token <dval> LFCONST
%token <sval> LSCONST LSP
%token <sym> LNAME LLAB LVAR
@ -30,7 +30,7 @@
%type <con2> con2
%type <gen> mem imm imm2 reg nam rel rem rim rom omem nmem
%type <gen2> nonnon nonrel nonrem rimnon rimrem remrim
%type <gen2> spec1 spec2 spec3 spec4 spec5 spec6 spec7 spec8
%type <gen2> spec1 spec2 spec3 spec4 spec5 spec6 spec7 spec8 spec9 spec10
%%
prog:
| prog line
@ -79,6 +79,8 @@ inst:
| LTYPEM spec6 { outcode($1, &$2); }
| LTYPEI spec7 { outcode($1, &$2); }
| LTYPEG spec8 { outcode($1, &$2); }
| LTYPEXC spec9 { outcode($1, &$2); }
| LTYPEX spec10 { outcode($1, &$2); }
nonnon:
{
@ -237,6 +239,23 @@ spec8: /* GLOBL */
$$.from.scale = $3;
$$.to = $5;
}
spec9: /* CMPPS/CMPPD */
reg ',' rem ',' con
{
$$.from = $1;
$$.to = $3;
$$.from.offset = $5;
}
spec10: /* shufl */
imm ',' rem ',' reg
{
$$.from = $3;
$$.to = $5;
if($1.type != D_CONST)
yyerror("illegal constant");
$$.to.offset = $1.offset;
}
rem:
reg
@ -301,6 +320,11 @@ reg:
$$ = nullgen;
$$.type = $1;
}
| LMREG
{
$$ = nullgen;
$$.type = $1;
}
| LSP
{
$$ = nullgen;
@ -311,6 +335,11 @@ reg:
$$ = nullgen;
$$.type = $1;
}
| LXREG
{
$$ = nullgen;
$$.type = $1;
}
imm:
'$' con

View file

@ -192,6 +192,24 @@ struct
"F6", LFREG, D_F0+6,
"F7", LFREG, D_F0+7,
"M0", LMREG, D_M0+0,
"M1", LMREG, D_M0+1,
"M2", LMREG, D_M0+2,
"M3", LMREG, D_M0+3,
"M4", LMREG, D_M0+4,
"M5", LMREG, D_M0+5,
"M6", LMREG, D_M0+6,
"M7", LMREG, D_M0+7,
"X0", LXREG, D_X0+0,
"X1", LXREG, D_X0+1,
"X2", LXREG, D_X0+2,
"X3", LXREG, D_X0+3,
"X4", LXREG, D_X0+4,
"X5", LXREG, D_X0+5,
"X6", LXREG, D_X0+6,
"X7", LXREG, D_X0+7,
"CS", LSREG, D_CS,
"SS", LSREG, D_SS,
"DS", LSREG, D_DS,
@ -277,6 +295,7 @@ struct
"CMPXCHGB", LTYPE3, ACMPXCHGB,
"CMPXCHGL", LTYPE3, ACMPXCHGL,
"CMPXCHGW", LTYPE3, ACMPXCHGW,
"CPUID", LTYPE0, ACPUID,
"DAA", LTYPE0, ADAA,
"DAS", LTYPE0, ADAS,
"DATA", LTYPED, ADATA,
@ -639,6 +658,188 @@ struct
"FYL2X", LTYPE0, AFYL2X,
"FYL2XP1", LTYPE0, AFYL2XP1,
"ADDPD", LTYPE3, AADDPD,
"ADDPS", LTYPE3, AADDPS,
"ADDSD", LTYPE3, AADDSD,
"ADDSS", LTYPE3, AADDSS,
"ANDNPD", LTYPE3, AANDNPD,
"ANDNPS", LTYPE3, AANDNPS,
"ANDPD", LTYPE3, AANDPD,
"ANDPS", LTYPE3, AANDPS,
"CMPPD", LTYPEXC,ACMPPD,
"CMPPS", LTYPEXC,ACMPPS,
"CMPSD", LTYPEXC,ACMPSD,
"CMPSS", LTYPEXC,ACMPSS,
"COMISD", LTYPE3, ACOMISD,
"COMISS", LTYPE3, ACOMISS,
"CVTPL2PD", LTYPE3, ACVTPL2PD,
"CVTPL2PS", LTYPE3, ACVTPL2PS,
"CVTPD2PL", LTYPE3, ACVTPD2PL,
"CVTPD2PS", LTYPE3, ACVTPD2PS,
"CVTPS2PL", LTYPE3, ACVTPS2PL,
"PF2IW", LTYPE3, APF2IW,
"PF2IL", LTYPE3, APF2IL,
"PF2ID", LTYPE3, APF2IL, /* syn */
"PI2FL", LTYPE3, API2FL,
"PI2FD", LTYPE3, API2FL, /* syn */
"PI2FW", LTYPE3, API2FW,
"CVTPS2PD", LTYPE3, ACVTPS2PD,
"CVTSD2SL", LTYPE3, ACVTSD2SL,
"CVTSD2SS", LTYPE3, ACVTSD2SS,
"CVTSL2SD", LTYPE3, ACVTSL2SD,
"CVTSL2SS", LTYPE3, ACVTSL2SS,
"CVTSS2SD", LTYPE3, ACVTSS2SD,
"CVTSS2SL", LTYPE3, ACVTSS2SL,
"CVTTPD2PL", LTYPE3, ACVTTPD2PL,
"CVTTPS2PL", LTYPE3, ACVTTPS2PL,
"CVTTSD2SL", LTYPE3, ACVTTSD2SL,
"CVTTSS2SL", LTYPE3, ACVTTSS2SL,
"DIVPD", LTYPE3, ADIVPD,
"DIVPS", LTYPE3, ADIVPS,
"DIVSD", LTYPE3, ADIVSD,
"DIVSS", LTYPE3, ADIVSS,
"FXRSTOR", LTYPE2, AFXRSTOR,
"FXSAVE", LTYPE1, AFXSAVE,
"LDMXCSR", LTYPE2, ALDMXCSR,
"MASKMOVOU", LTYPE3, AMASKMOVOU,
"MASKMOVDQU", LTYPE3, AMASKMOVOU, /* syn */
"MAXPD", LTYPE3, AMAXPD,
"MAXPS", LTYPE3, AMAXPS,
"MAXSD", LTYPE3, AMAXSD,
"MAXSS", LTYPE3, AMAXSS,
"MINPD", LTYPE3, AMINPD,
"MINPS", LTYPE3, AMINPS,
"MINSD", LTYPE3, AMINSD,
"MINSS", LTYPE3, AMINSS,
"MOVAPD", LTYPE3, AMOVAPD,
"MOVAPS", LTYPE3, AMOVAPS,
"MOVO", LTYPE3, AMOVO,
"MOVOA", LTYPE3, AMOVO, /* syn */
"MOVOU", LTYPE3, AMOVOU,
"MOVHLPS", LTYPE3, AMOVHLPS,
"MOVHPD", LTYPE3, AMOVHPD,
"MOVHPS", LTYPE3, AMOVHPS,
"MOVLHPS", LTYPE3, AMOVLHPS,
"MOVLPD", LTYPE3, AMOVLPD,
"MOVLPS", LTYPE3, AMOVLPS,
"MOVMSKPD", LTYPE3, AMOVMSKPD,
"MOVMSKPS", LTYPE3, AMOVMSKPS,
"MOVNTO", LTYPE3, AMOVNTO,
"MOVNTDQ", LTYPE3, AMOVNTO, /* syn */
"MOVNTPD", LTYPE3, AMOVNTPD,
"MOVNTPS", LTYPE3, AMOVNTPS,
"MOVNTQ", LTYPE3, AMOVNTQ,
"MOVQOZX", LTYPE3, AMOVQOZX,
"MOVSD", LTYPE3, AMOVSD,
"MOVSS", LTYPE3, AMOVSS,
"MOVUPD", LTYPE3, AMOVUPD,
"MOVUPS", LTYPE3, AMOVUPS,
"MULPD", LTYPE3, AMULPD,
"MULPS", LTYPE3, AMULPS,
"MULSD", LTYPE3, AMULSD,
"MULSS", LTYPE3, AMULSS,
"ORPD", LTYPE3, AORPD,
"ORPS", LTYPE3, AORPS,
"PACKSSLW", LTYPE3, APACKSSLW,
"PACKSSWB", LTYPE3, APACKSSWB,
"PACKUSWB", LTYPE3, APACKUSWB,
"PADDB", LTYPE3, APADDB,
"PADDL", LTYPE3, APADDL,
"PADDQ", LTYPE3, APADDQ,
"PADDSB", LTYPE3, APADDSB,
"PADDSW", LTYPE3, APADDSW,
"PADDUSB", LTYPE3, APADDUSB,
"PADDUSW", LTYPE3, APADDUSW,
"PADDW", LTYPE3, APADDW,
"PAND", LTYPE3, APAND,
"PANDB", LTYPE3, APANDB,
"PANDL", LTYPE3, APANDL,
"PANDSB", LTYPE3, APANDSB,
"PANDSW", LTYPE3, APANDSW,
"PANDUSB", LTYPE3, APANDUSB,
"PANDUSW", LTYPE3, APANDUSW,
"PANDW", LTYPE3, APANDW,
"PANDN", LTYPE3, APANDN,
"PAVGB", LTYPE3, APAVGB,
"PAVGW", LTYPE3, APAVGW,
"PCMPEQB", LTYPE3, APCMPEQB,
"PCMPEQL", LTYPE3, APCMPEQL,
"PCMPEQW", LTYPE3, APCMPEQW,
"PCMPGTB", LTYPE3, APCMPGTB,
"PCMPGTL", LTYPE3, APCMPGTL,
"PCMPGTW", LTYPE3, APCMPGTW,
"PEXTRW", LTYPEX, APEXTRW,
"PINSRW", LTYPEX, APINSRW,
"PMADDWL", LTYPE3, APMADDWL,
"PMAXSW", LTYPE3, APMAXSW,
"PMAXUB", LTYPE3, APMAXUB,
"PMINSW", LTYPE3, APMINSW,
"PMINUB", LTYPE3, APMINUB,
"PMOVMSKB", LTYPE3, APMOVMSKB,
"PMULHRW", LTYPE3, APMULHRW,
"PMULHUW", LTYPE3, APMULHUW,
"PMULHW", LTYPE3, APMULHW,
"PMULLW", LTYPE3, APMULLW,
"PMULULQ", LTYPE3, APMULULQ,
"POR", LTYPE3, APOR,
"PSADBW", LTYPE3, APSADBW,
"PSHUFHW", LTYPEX, APSHUFHW,
"PSHUFL", LTYPEX, APSHUFL,
"PSHUFLW", LTYPEX, APSHUFLW,
"PSHUFW", LTYPEX, APSHUFW,
"PSLLO", LTYPE3, APSLLO,
"PSLLDQ", LTYPE3, APSLLO, /* syn */
"PSLLL", LTYPE3, APSLLL,
"PSLLQ", LTYPE3, APSLLQ,
"PSLLW", LTYPE3, APSLLW,
"PSRAL", LTYPE3, APSRAL,
"PSRAW", LTYPE3, APSRAW,
"PSRLO", LTYPE3, APSRLO,
"PSRLDQ", LTYPE3, APSRLO, /* syn */
"PSRLL", LTYPE3, APSRLL,
"PSRLQ", LTYPE3, APSRLQ,
"PSRLW", LTYPE3, APSRLW,
"PSUBB", LTYPE3, APSUBB,
"PSUBL", LTYPE3, APSUBL,
"PSUBQ", LTYPE3, APSUBQ,
"PSUBSB", LTYPE3, APSUBSB,
"PSUBSW", LTYPE3, APSUBSW,
"PSUBUSB", LTYPE3, APSUBUSB,
"PSUBUSW", LTYPE3, APSUBUSW,
"PSUBW", LTYPE3, APSUBW,
"PUNPCKHBW", LTYPE3, APUNPCKHBW,
"PUNPCKHLQ", LTYPE3, APUNPCKHLQ,
"PUNPCKHQDQ", LTYPE3, APUNPCKHQDQ,
"PUNPCKHWL", LTYPE3, APUNPCKHWL,
"PUNPCKLBW", LTYPE3, APUNPCKLBW,
"PUNPCKLLQ", LTYPE3, APUNPCKLLQ,
"PUNPCKLQDQ", LTYPE3, APUNPCKLQDQ,
"PUNPCKLWL", LTYPE3, APUNPCKLWL,
"PXOR", LTYPE3, APXOR,
"RCPPS", LTYPE3, ARCPPS,
"RCPSS", LTYPE3, ARCPSS,
"RSQRTPS", LTYPE3, ARSQRTPS,
"RSQRTSS", LTYPE3, ARSQRTSS,
"SHUFPD", LTYPEX, ASHUFPD,
"SHUFPS", LTYPEX, ASHUFPS,
"SQRTPD", LTYPE3, ASQRTPD,
"SQRTPS", LTYPE3, ASQRTPS,
"SQRTSD", LTYPE3, ASQRTSD,
"SQRTSS", LTYPE3, ASQRTSS,
"STMXCSR", LTYPE1, ASTMXCSR,
"SUBPD", LTYPE3, ASUBPD,
"SUBPS", LTYPE3, ASUBPS,
"SUBSD", LTYPE3, ASUBSD,
"SUBSS", LTYPE3, ASUBSS,
"UCOMISD", LTYPE3, AUCOMISD,
"UCOMISS", LTYPE3, AUCOMISS,
"UNPCKHPD", LTYPE3, AUNPCKHPD,
"UNPCKHPS", LTYPE3, AUNPCKHPS,
"UNPCKLPD", LTYPE3, AUNPCKLPD,
"UNPCKLPS", LTYPE3, AUNPCKLPS,
"XORPD", LTYPE3, AXORPD,
"XORPS", LTYPE3, AXORPS,
0
};

View file

@ -361,6 +361,7 @@ enum as
ACMPXCHGB,
ACMPXCHGL,
ACMPXCHGW,
ACPUID,
/* conditional move */
ACMOVLCC,
@ -405,6 +406,185 @@ enum as
AFCMOVNU,
AFCMOVUN,
/* media */
AADDPD,
AADDPS,
AADDSD,
AADDSS,
AANDNPD,
AANDNPS,
AANDPD,
AANDPS,
ACMPPD,
ACMPPS,
ACMPSD,
ACMPSS,
ACOMISD,
ACOMISS,
ACVTPD2PL,
ACVTPD2PS,
ACVTPL2PD,
ACVTPL2PS,
ACVTPS2PD,
ACVTPS2PL,
ACVTSD2SL,
ACVTSD2SS,
ACVTSL2SD,
ACVTSL2SS,
ACVTSS2SD,
ACVTSS2SL,
ACVTTPD2PL,
ACVTTPS2PL,
ACVTTSD2SL,
ACVTTSS2SL,
ADIVPD,
ADIVPS,
ADIVSD,
ADIVSS,
AFXRSTOR,
AFXSAVE,
ALDMXCSR,
AMASKMOVOU,
AMASKMOVQ,
AMAXPD,
AMAXPS,
AMAXSD,
AMAXSS,
AMINPD,
AMINPS,
AMINSD,
AMINSS,
AMOVAPD,
AMOVAPS,
AMOVOU,
AMOVHLPS,
AMOVHPD,
AMOVHPS,
AMOVLHPS,
AMOVLPD,
AMOVLPS,
AMOVMSKPD,
AMOVMSKPS,
AMOVNTO,
AMOVNTPD,
AMOVNTPS,
AMOVNTQ,
AMOVO,
AMOVQOZX,
AMOVSD,
AMOVSS,
AMOVUPD,
AMOVUPS,
AMULPD,
AMULPS,
AMULSD,
AMULSS,
AORPD,
AORPS,
APACKSSLW,
APACKSSWB,
APACKUSWB,
APADDB,
APADDL,
APADDQ,
APADDSB,
APADDSW,
APADDUSB,
APADDUSW,
APADDW,
APANDB,
APANDL,
APANDSB,
APANDSW,
APANDUSB,
APANDUSW,
APANDW,
APAND,
APANDN,
APAVGB,
APAVGW,
APCMPEQB,
APCMPEQL,
APCMPEQW,
APCMPGTB,
APCMPGTL,
APCMPGTW,
APEXTRW,
APINSRW,
APMADDWL,
APMAXSW,
APMAXUB,
APMINSW,
APMINUB,
APMOVMSKB,
APMULHRW,
APMULHUW,
APMULHW,
APMULLW,
APMULULQ,
APOR,
APSADBW,
APSHUFHW,
APSHUFL,
APSHUFLW,
APSHUFW,
APSLLO,
APSLLL,
APSLLQ,
APSLLW,
APSRAL,
APSRAW,
APSRLO,
APSRLL,
APSRLQ,
APSRLW,
APSUBB,
APSUBL,
APSUBQ,
APSUBSB,
APSUBSW,
APSUBUSB,
APSUBUSW,
APSUBW,
APSWAPL,
APUNPCKHBW,
APUNPCKHLQ,
APUNPCKHQDQ,
APUNPCKHWL,
APUNPCKLBW,
APUNPCKLLQ,
APUNPCKLQDQ,
APUNPCKLWL,
APXOR,
ARCPPS,
ARCPSS,
ARSQRTPS,
ARSQRTSS,
ASHUFPD,
ASHUFPS,
ASQRTPD,
ASQRTPS,
ASQRTSD,
ASQRTSS,
ASTMXCSR,
ASUBPD,
ASUBPS,
ASUBSD,
ASUBSS,
AUCOMISD,
AUCOMISS,
AUNPCKHPD,
AUNPCKHPS,
AUNPCKLPD,
AUNPCKLPS,
AXORPD,
AXORPS,
APF2IW,
APF2IL,
API2FW,
API2FL,
/* add new operations here. nowhere else. here. */
ALAST
};
@ -471,6 +651,10 @@ enum
D_SIZE, /* 8l internal */
D_M0,
D_X0 = D_M0 + 8,
D_XNONE = D_X0 + 8,
T_TYPE = 1<<0,
T_INDEX = 1<<1,
T_OFFSET = 1<<2,

View file

@ -340,6 +340,7 @@ char* anames[] =
"CMPXCHGB",
"CMPXCHGL",
"CMPXCHGW",
"CPUID",
"CMOVLCC",
"CMOVLCS",
"CMOVLEQ",
@ -380,5 +381,181 @@ char* anames[] =
"FCMOVNE",
"FCMOVNU",
"FCMOVUN",
"ADDPD",
"ADDPS",
"ADDSD",
"ADDSS",
"ANDNPD",
"ANDNPS",
"ANDPD",
"ANDPS",
"CMPPD",
"CMPPS",
"CMPSD",
"CMPSS",
"COMISD",
"COMISS",
"CVTPD2PL",
"CVTPD2PS",
"CVTPL2PD",
"CVTPL2PS",
"CVTPS2PD",
"CVTPS2PL",
"CVTSD2SL",
"CVTSD2SS",
"CVTSL2SD",
"CVTSL2SS",
"CVTSS2SD",
"CVTSS2SL",
"CVTTPD2PL",
"CVTTPS2PL",
"CVTTSD2SL",
"CVTTSS2SL",
"DIVPD",
"DIVPS",
"DIVSD",
"DIVSS",
"FXRSTOR",
"FXSAVE",
"LDMXCSR",
"MASKMOVOU",
"MASKMOVQ",
"MAXPD",
"MAXPS",
"MAXSD",
"MAXSS",
"MINPD",
"MINPS",
"MINSD",
"MINSS",
"MOVAPD",
"MOVAPS",
"MOVOU",
"MOVHLPS",
"MOVHPD",
"MOVHPS",
"MOVLHPS",
"MOVLPD",
"MOVLPS",
"MOVMSKPD",
"MOVMSKPS",
"MOVNTO",
"MOVNTPD",
"MOVNTPS",
"MOVNTQ",
"MOVO",
"MOVQOZX",
"MOVSD",
"MOVSS",
"MOVUPD",
"MOVUPS",
"MULPD",
"MULPS",
"MULSD",
"MULSS",
"ORPD",
"ORPS",
"PACKSSLW",
"PACKSSWB",
"PACKUSWB",
"PADDB",
"PADDL",
"PADDQ",
"PADDSB",
"PADDSW",
"PADDUSB",
"PADDUSW",
"PADDW",
"PANDB",
"PANDL",
"PANDSB",
"PANDSW",
"PANDUSB",
"PANDUSW",
"PANDW",
"PAND",
"PANDN",
"PAVGB",
"PAVGW",
"PCMPEQB",
"PCMPEQL",
"PCMPEQW",
"PCMPGTB",
"PCMPGTL",
"PCMPGTW",
"PEXTRW",
"PINSRW",
"PMADDWL",
"PMAXSW",
"PMAXUB",
"PMINSW",
"PMINUB",
"PMOVMSKB",
"PMULHRW",
"PMULHUW",
"PMULHW",
"PMULLW",
"PMULULQ",
"POR",
"PSADBW",
"PSHUFHW",
"PSHUFL",
"PSHUFLW",
"PSHUFW",
"PSLLO",
"PSLLL",
"PSLLQ",
"PSLLW",
"PSRAL",
"PSRAW",
"PSRLO",
"PSRLL",
"PSRLQ",
"PSRLW",
"PSUBB",
"PSUBL",
"PSUBQ",
"PSUBSB",
"PSUBSW",
"PSUBUSB",
"PSUBUSW",
"PSUBW",
"PSWAPL",
"PUNPCKHBW",
"PUNPCKHLQ",
"PUNPCKHQDQ",
"PUNPCKHWL",
"PUNPCKLBW",
"PUNPCKLLQ",
"PUNPCKLQDQ",
"PUNPCKLWL",
"PXOR",
"RCPPS",
"RCPSS",
"RSQRTPS",
"RSQRTSS",
"SHUFPD",
"SHUFPS",
"SQRTPD",
"SQRTPS",
"SQRTSD",
"SQRTSS",
"STMXCSR",
"SUBPD",
"SUBPS",
"SUBSD",
"SUBSS",
"UCOMISD",
"UCOMISS",
"UNPCKHPD",
"UNPCKHPS",
"UNPCKLPD",
"UNPCKLPS",
"XORPD",
"XORPS",
"PF2IW",
"PF2IL",
"PI2FW",
"PI2FL",
"LAST",
};

View file

@ -90,7 +90,7 @@ struct Optab
short as;
uchar* ytab;
uchar prefix;
uchar op[10];
uchar op[20];
};
enum
@ -142,6 +142,8 @@ enum
Ycr0, Ycr1, Ycr2, Ycr3, Ycr4, Ycr5, Ycr6, Ycr7,
Ydr0, Ydr1, Ydr2, Ydr3, Ydr4, Ydr5, Ydr6, Ydr7,
Ytr0, Ytr1, Ytr2, Ytr3, Ytr4, Ytr5, Ytr6, Ytr7,
Ymr, Ymm,
Yxr, Yxm,
Ymax,
Zxxx = 0,
@ -153,6 +155,7 @@ enum
Zib_,
Zib_rp,
Zibo_m,
Zibo_m_xm,
Zil_,
Zil_rp,
Zilo_m,
@ -160,10 +163,16 @@ enum
Zloop,
Zm_o,
Zm_r,
Zm_r_xm,
Zm_r_i_xm,
Zm_r_3d,
Zibm_r, /* mmx1,mmx2/mem64,imm8 */
Zaut_r,
Zo_m,
Zpseudo,
Zr_m,
Zr_m_xm,
Zr_m_i_xm,
Zrp_,
Z_ib,
Z_il,
@ -181,6 +190,8 @@ enum
Pm = 0x0f, /* 2byte opcode escape */
Pq = 0xff, /* both escape */
Pb = 0xfe, /* byte operands */
Pf2 = 0xf2, /* xmm escape 1 */
Pf3 = 0xf3, /* xmm escape 2 */
Roffset = 22, /* no. bits for offset in relocation address */
Rindex = 10, /* no. bits for index in relocation address */
@ -250,7 +261,7 @@ EXTERN char inuxi4[4];
EXTERN char ycover[Ymax*Ymax];
EXTERN uchar* andptr;
EXTERN uchar and[30];
EXTERN char reg[D_NONE];
EXTERN char reg[D_XNONE];
EXTERN Prog* lastp;
EXTERN long lcsize;
EXTERN int nerrors;
@ -279,6 +290,7 @@ EXTERN Prog undefp;
#define UP (&undefp)
extern Optab optab[];
extern Optab* opindex[];
extern char* anames[];
int Aconv(Fmt*);

View file

@ -61,7 +61,7 @@ Dconv(Fmt *fp)
a = va_arg(fp->args, Adr*);
i = a->type;
if(i >= D_INDIR) {
if(i >= D_INDIR && i < D_M0) {
if(a->offset)
snprint(str, sizeof(str), "%ld(%R)", a->offset, i-D_INDIR);
else
@ -208,6 +208,24 @@ char* regstr[] =
"TR7",
"NONE", /* [D_NONE] */
[D_M0] "M0", /* [D_M0] */
"M1",
"M2",
"M3",
"M4",
"M5",
"M6",
"M7",
[D_X0] "X0", /* [D_X0] */
"X1",
"X2",
"X3",
"X4",
"X5",
"X6",
"X7",
};
int
@ -217,7 +235,7 @@ Rconv(Fmt *fp)
int r;
r = va_arg(fp->args, int);
if(r >= D_AL && r <= D_NONE)
if((r >= D_AL && r <= D_NONE) || (r >= D_M0 && r <= D_X0+7))
snprint(str, sizeof(str), "%s", regstr[r-D_AL]);
else
snprint(str, sizeof(str), "gok(%d)", r);

View file

@ -195,11 +195,14 @@ main(int argc, char *argv[])
Bprint(&bso, "HEADER = -H0x%ld -T0x%lux -D0x%lux -R0x%lux\n",
HEADTYPE, INITTEXT, INITDAT, INITRND);
Bflush(&bso);
for(i=1; optab[i].as; i++)
if(i != optab[i].as) {
diag("phase error in optab: %d", i);
for(i=1; optab[i].as; i++) {
c = optab[i].as;
if(opindex[c] != nil) {
diag("phase error in optab: %d (%A)", i, c);
errorexit();
}
opindex[c] = &optab[i];
}
for(i=0; i<Ymax; i++)
ycover[i*Ymax + i] = 1;
@ -240,7 +243,13 @@ main(int argc, char *argv[])
ycover[Yrl*Ymax + Yml] = 1;
ycover[Ym*Ymax + Yml] = 1;
for(i=0; i<D_NONE; i++) {
ycover[Ym*Ymax + Ymm] = 1;
ycover[Ymr*Ymax + Ymm] = 1;
ycover[Ym*Ymax + Yxm] = 1;
ycover[Yxr*Ymax + Yxm] = 1;
for(i=0; i<D_XNONE; i++) {
reg[i] = -1;
if(i >= D_AL && i <= D_BH)
reg[i] = (i-D_AL) & 7;
@ -248,6 +257,10 @@ main(int argc, char *argv[])
reg[i] = (i-D_AX) & 7;
if(i >= D_F0 && i <= D_F0+7)
reg[i] = (i-D_F0) & 7;
if(i >= D_M0 && i <= D_M0+7)
reg[i] = (i-D_M0) & 7;
if(i >= D_X0 && i <= D_X0+7)
reg[i] = (i-D_X0) & 7;
}
zprg.link = P;
@ -988,6 +1001,13 @@ loop:
case AFDIVRF:
case AFCOMF:
case AFCOMFP:
case AMOVSS:
case AADDSS:
case ASUBSS:
case AMULSS:
case ADIVSS:
case ACOMISS:
case AUCOMISS:
if(skip)
goto casdef;
if(p->from.type == D_FCONST) {
@ -1026,6 +1046,13 @@ loop:
case AFDIVRD:
case AFCOMD:
case AFCOMDP:
case AMOVSD:
case AADDSD:
case ASUBSD:
case AMULSD:
case ADIVSD:
case ACOMISD:
case AUCOMISD:
if(skip)
goto casdef;
if(p->from.type == D_FCONST) {

View file

@ -15,8 +15,10 @@ uchar ynop[] =
Ynone, Ynone, Zpseudo,1,
Ynone, Yml, Zpseudo,1,
Ynone, Yrf, Zpseudo,1,
Ynone, Yxr, Zpseudo,1,
Yml, Ynone, Zpseudo,1,
Yrf, Ynone, Zpseudo,1,
Yxr, Ynone, Zpseudo,1,
0
};
uchar yxorb[] =
@ -120,6 +122,10 @@ uchar ymovl[] =
// Yi0, Yml, Zibo_m, 2, // shorter but slower AND $0,dst
Yi32, Yrl, Zil_rp, 1,
Yi32, Yml, Zilo_m, 2,
Yml, Ymr, Zm_r_xm, 1, // MMX MOVD
Ymr, Yml, Zr_m_xm, 1, // MMX MOVD
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,
0
};
@ -306,6 +312,134 @@ uchar ysvrs[] =
Ym, Ynone, Zm_o, 2,
0
};
uchar ymm[] =
{
Ymm, Ymr, Zm_r_xm, 1,
Yxm, Yxr, Zm_r_xm, 2,
0
};
uchar yxm[] =
{
Yxm, Yxr, Zm_r_xm, 1,
0
};
uchar yxcvm1[] =
{
Yxm, Yxr, Zm_r_xm, 2,
0
};
uchar yxcvm2[] =
{
Yxm, Yxr, Zm_r_xm, 2,
0
};
uchar yxmq[] =
{
Yxm, Yxr, Zm_r_xm, 2,
0
};
uchar yxr[] =
{
Yxr, Yxr, Zm_r_xm, 1,
0
};
uchar yxr_ml[] =
{
Yxr, Yml, Zr_m_xm, 1,
0
};
uchar ymr[] =
{
Ymr, Ymr, Zm_r, 1,
0
};
uchar ymr_ml[] =
{
Ymr, Yml, Zr_m_xm, 1,
0
};
uchar yxcmp[] =
{
Yxm, Yxr, Zm_r_xm, 1,
0
};
uchar yxcmpi[] =
{
Yxm, Yxr, Zm_r_i_xm, 2,
0
};
uchar yxmov[] =
{
Yxm, Yxr, Zm_r_xm, 1,
Yxr, Yxm, Zr_m_xm, 1,
0
};
uchar yxcvfl[] =
{
Yxm, Yrl, Zm_r_xm, 1,
0
};
uchar yxcvlf[] =
{
Yml, Yxr, Zm_r_xm, 1,
0
};
uchar yps[] =
{
Ymm, Ymr, Zm_r_xm, 1,
Yi8, Ymr, Zibo_m_xm, 2,
Yxm, Yxr, Zm_r_xm, 2,
Yi8, Yxr, Zibo_m_xm, 3,
0
};
uchar yxrrl[] =
{
Yxr, Yrl, Zm_r, 1,
0
};
uchar ymfp[] =
{
Ymm, Ymr, Zm_r_3d, 1,
0,
};
uchar ymrxr[] =
{
Ymr, Yxr, Zm_r, 1,
Yxm, Yxr, Zm_r_xm, 1,
0
};
uchar ymshuf[] =
{
Ymm, Ymr, Zibm_r, 1,
0
};
uchar yxshuf[] =
{
Yxm, Yxr, Zibm_r, 1,
0
};
uchar yextrw[] =
{
Yxr, Yrl, Zibm_r, 1,
0
};
uchar ypsdq[] =
{
Yi8, Yxr, Zibo_m, 2,
0
};
uchar ymskb[] =
{
Yxr, Yrl, Zm_r_xm, 2,
Ymr, Yrl, Zm_r_xm, 1,
0
};
uchar yxaes[] =
{
Yxm, Yxr, Zm_r_xm, 2,
Yxm, Yxr, Zm_r_i_xm, 2,
0
};
Optab optab[] =
/* as, ytab, andproto, opcode */
@ -320,10 +454,18 @@ Optab optab[] =
{ AADCW, yxorl, Pe, 0x83,(02),0x15,0x81,(02),0x11,0x13 },
{ AADDB, yxorb, Px, 0x04,0x80,(00),0x00,0x02 },
{ AADDL, yaddl, Px, 0x83,(00),0x05,0x81,(00),0x01,0x03 },
{ AADDPD, yxm, Pq, 0x58 },
{ AADDPS, yxm, Pm, 0x58 },
{ AADDSD, yxm, Pf2, 0x58 },
{ AADDSS, yxm, Pf3, 0x58 },
{ AADDW, yaddl, Pe, 0x83,(00),0x05,0x81,(00),0x01,0x03 },
{ AADJSP },
{ AANDB, yxorb, Pb, 0x24,0x80,(04),0x20,0x22 },
{ AANDL, yxorl, Px, 0x83,(04),0x25,0x81,(04),0x21,0x23 },
{ AANDNPD, yxm, Pq, 0x55 },
{ AANDNPS, yxm, Pm, 0x55 },
{ AANDPD, yxm, Pq, 0x54 },
{ AANDPS, yxm, Pq, 0x54 },
{ AANDW, yxorl, Pe, 0x83,(04),0x25,0x81,(04),0x21,0x23 },
{ AARPL, yrl_ml, Px, 0x63 },
{ ABOUNDL, yrl_m, Px, 0x62 },
@ -349,9 +491,32 @@ Optab optab[] =
{ ACMC, ynone, Px, 0xf5 },
{ ACMPB, ycmpb, Pb, 0x3c,0x80,(07),0x38,0x3a },
{ ACMPL, ycmpl, Px, 0x83,(07),0x3d,0x81,(07),0x39,0x3b },
{ ACMPPD, yxcmpi, Px, Pe,0xc2 },
{ ACMPPS, yxcmpi, Pm, 0xc2,0 },
{ ACMPW, ycmpl, Pe, 0x83,(07),0x3d,0x81,(07),0x39,0x3b },
{ ACOMISD, yxcmp, Pe, 0x2f },
{ ACOMISS, yxcmp, Pm, 0x2f },
{ ACPUID, ynone, Pm, 0xa2 },
{ ACVTPL2PD, yxcvm2, Px, Pf3,0xe6 },
{ ACVTPL2PS, yxcvm2, Pm, 0x5b },
{ ACVTPD2PL, yxcvm1, Px, Pf2,0xe6 },
{ ACVTPD2PS, yxm, Pe, 0x5a },
{ ACVTPS2PL, yxcvm1, Px, Pe,0x5b },
{ ACVTPS2PD, yxm, Pm, 0x5a },
{ ACVTSD2SL, yxcvfl, Pf2, 0x2d },
{ ACVTSD2SS, yxm, Pf2, 0x5a },
{ ACVTSL2SD, yxcvlf, Pf2, 0x2a },
{ ACVTSL2SS, yxcvlf, Pf3, 0x2a },
{ ACVTSS2SD, yxm, Pf3, 0x5a },
{ ACVTSS2SL, yxcvfl, Pf3, 0x2d },
{ ACVTTPD2PL, yxcvm1, Px, Pe,0xe6 },
{ ACVTTPS2PL, yxcvm1, Px, Pf3,0x5b },
{ ACVTTSD2SL, yxcvfl, Pf2, 0x2c },
{ ACVTTSS2SL, yxcvfl, Pf3, 0x2c },
{ ACMPSB, ynone, Pb, 0xa6 },
{ ACMPSD, yxcmpi, Px, Pf2,0xc2 },
{ ACMPSL, ynone, Px, 0xa7 },
{ ACMPSS, yxcmpi, Px, Pf3,0xc2 },
{ ACMPSW, ynone, Pe, 0xa7 },
{ ADAA, ynone, Px, 0x27 },
{ ADAS, ynone, Px, 0x2f },
@ -361,8 +526,14 @@ Optab optab[] =
{ ADECW, yincl, Pe, 0x48,0xff,(01) },
{ ADIVB, ydivb, Pb, 0xf6,(06) },
{ ADIVL, ydivl, Px, 0xf7,(06) },
{ ADIVPD, yxm, Pe, 0x5e },
{ ADIVPS, yxm, Pm, 0x5e },
{ ADIVSD, yxm, Pf2, 0x5e },
{ ADIVSS, yxm, Pf3, 0x5e },
{ ADIVW, ydivl, Pe, 0xf7,(06) },
{ AENTER }, /* botch */
{ AFXRSTOR, ysvrs, Pm, 0xae,(01),0xae,(01) },
{ AFXSAVE, ysvrs, Pm, 0xae,(00),0xae,(00) },
{ AGLOBL },
{ AGOK },
{ AHISTORY },
@ -407,6 +578,7 @@ Optab optab[] =
{ ALAHF, ynone, Px, 0x9f },
{ ALARL, yml_rl, Pm, 0x02 },
{ ALARW, yml_rl, Pq, 0x02 },
{ ALDMXCSR, ysvrs, Pm, 0xae,(02),0xae,(02) },
{ ALEAL, ym_rl, Px, 0x8d },
{ ALEAW, ym_rl, Pe, 0x8d },
{ ALEAVEL, ynone, Px, 0xc9 },
@ -421,8 +593,20 @@ Optab optab[] =
{ ALOOPNE, yloop, Px, 0xe0 },
{ ALSLL, yml_rl, Pm, 0x03 },
{ ALSLW, yml_rl, Pq, 0x03 },
{ AMASKMOVOU, yxr, Pe, 0xf7 },
{ AMASKMOVQ, ymr, Pm, 0xf7 },
{ AMAXPD, yxm, Pe, 0x5f },
{ AMAXPS, yxm, Pm, 0x5f },
{ AMAXSD, yxm, Pf2, 0x5f },
{ AMAXSS, yxm, Pf3, 0x5f },
{ AMINPD, yxm, Pe, 0x5d },
{ AMINPS, yxm, Pm, 0x5d },
{ AMINSD, yxm, Pf2, 0x5d },
{ AMINSS, yxm, Pf3, 0x5d },
{ AMOVAPD, yxmov, Pe, 0x28,0x29 },
{ AMOVAPS, yxmov, Pm, 0x28,0x29 },
{ AMOVB, ymovb, Pb, 0x88,0x8a,0xb0,0xc6,(00) },
{ AMOVL, ymovl, Px, 0x89,0x8b,0x31,0x83,(04),0xb8,0xc7,(00) },
{ AMOVL, ymovl, Px, 0x89,0x8b,0x31,0x83,(04),0xb8,0xc7,(00),0x6e,0x7e,Pe,0x6e,Pe,0x7e },
{ AMOVW, ymovl, Pe, 0x89,0x8b,0x31,0x83,(04),0xb8,0xc7,(00) },
{ AMOVBLSX, ymb_rl, Pm, 0xbe },
{ AMOVBLZX, ymb_rl, Pm, 0xb6 },
@ -430,11 +614,34 @@ Optab optab[] =
{ AMOVBWZX, ymb_rl, Pq, 0xb6 },
{ AMOVWLSX, yml_rl, Pm, 0xbf },
{ AMOVWLZX, yml_rl, Pm, 0xb7 },
{ AMOVO, yxmov, Pe, 0x6f,0x7f },
{ AMOVOU, yxmov, Pf3, 0x6f,0x7f },
{ AMOVHLPS, yxr, Pm, 0x12 },
{ AMOVHPD, yxmov, Pe, 0x16,0x17 },
{ AMOVHPS, yxmov, Pm, 0x16,0x17 },
{ AMOVLHPS, yxr, Pm, 0x16 },
{ AMOVLPD, yxmov, Pe, 0x12,0x13 },
{ AMOVLPS, yxmov, Pm, 0x12,0x13 },
{ AMOVMSKPD, yxrrl, Pq, 0x50 },
{ AMOVMSKPS, yxrrl, Pm, 0x50 },
{ AMOVNTO, yxr_ml, Pe, 0xe7 },
{ AMOVNTPD, yxr_ml, Pe, 0x2b },
{ AMOVNTPS, yxr_ml, Pm, 0x2b },
{ AMOVNTQ, ymr_ml, Pm, 0xe7 },
{ AMOVQOZX, ymrxr, Pf3, 0xd6,0x7e },
{ AMOVSB, ynone, Pb, 0xa4 },
{ AMOVSD, yxmov, Pf2, 0x10,0x11 },
{ AMOVSL, ynone, Px, 0xa5 },
{ AMOVSS, yxmov, Pf3, 0x10,0x11 },
{ AMOVSW, ynone, Pe, 0xa5 },
{ AMOVUPD, yxmov, Pe, 0x10,0x11 },
{ AMOVUPS, yxmov, Pm, 0x10,0x11 },
{ AMULB, ydivb, Pb, 0xf6,(04) },
{ AMULL, ydivl, Px, 0xf7,(04) },
{ AMULPD, yxm, Pe, 0x59 },
{ AMULPS, yxm, Ym, 0x59 },
{ AMULSD, yxm, Pf2, 0x59 },
{ AMULSS, yxm, Pf3, 0x59 },
{ AMULW, ydivl, Pe, 0xf7,(04) },
{ ANAME },
{ ANEGB, yscond, Px, 0xf6,(03) },
@ -446,6 +653,8 @@ Optab optab[] =
{ ANOTW, yscond, Pe, 0xf7,(02) },
{ AORB, yxorb, Pb, 0x0c,0x80,(01),0x08,0x0a },
{ AORL, yxorl, Px, 0x83,(01),0x0d,0x81,(01),0x09,0x0b },
{ AORPD, yxm, Pq, 0x56 },
{ AORPS, yxm, Pm, 0x56 },
{ AORW, yxorl, Pe, 0x83,(01),0x0d,0x81,(01),0x09,0x0b },
{ AOUTB, yin, Pb, 0xe6,0xee },
{ AOUTL, yin, Px, 0xe7,0xef },
@ -453,21 +662,94 @@ Optab optab[] =
{ AOUTSB, ynone, Pb, 0x6e },
{ AOUTSL, ynone, Px, 0x6f },
{ AOUTSW, ynone, Pe, 0x6f },
{ APACKSSLW, ymm, Px, 0x6b,Pe,0x6b },
{ APACKSSWB, ymm, Px, 0x63,Pe,0x63 },
{ APACKUSWB, ymm, Px, 0x67,Pe,0x67 },
{ APADDB, ymm, Px, 0xfc,Pe,0xfc },
{ APADDL, ymm, Px, 0xfe,Pe,0xfe },
{ APADDQ, yxm, Pe, 0xd4 },
{ APADDSB, ymm, Px, 0xec,Pe,0xec },
{ APADDSW, ymm, Px, 0xed,Pe,0xed },
{ APADDUSB, ymm, Px, 0xdc,Pe,0xdc },
{ APADDUSW, ymm, Px, 0xdd,Pe,0xdd },
{ APADDW, ymm, Px, 0xfd,Pe,0xfd },
{ APAND, ymm, Px, 0xdb,Pe,0xdb },
{ APANDN, ymm, Px, 0xdf,Pe,0xdf },
{ APAVGB, ymm, Px, 0xe0,Pe,0xe0 },
{ APAVGW, ymm, Px, 0xe3,Pe,0xe3 },
{ APCMPEQB, ymm, Px, 0x74,Pe,0x74 },
{ APCMPEQL, ymm, Px, 0x76,Pe,0x76 },
{ APCMPEQW, ymm, Px, 0x75,Pe,0x75 },
{ APCMPGTB, ymm, Px, 0x64,Pe,0x64 },
{ APCMPGTL, ymm, Px, 0x66,Pe,0x66 },
{ APCMPGTW, ymm, Px, 0x65,Pe,0x65 },
{ APEXTRW, yextrw, Pq, 0xc5 },
{ APF2IL, ymfp, Px, 0x1d },
{ APF2IW, ymfp, Px, 0x1c },
{ API2FL, ymfp, Px, 0x0d },
{ API2FW, ymfp, Px, 0x0c },
{ APINSRW, yextrw, Pq, 0xc4 },
{ APMADDWL, ymm, Px, 0xf5,Pe,0xf5 },
{ APMAXSW, yxm, Pe, 0xee },
{ APMAXUB, yxm, Pe, 0xde },
{ APMINSW, yxm, Pe, 0xea },
{ APMINUB, yxm, Pe, 0xda },
{ APMOVMSKB, ymskb, Px, Pe,0xd7,0xd7 },
{ APMULHRW, ymfp, Px, 0xb7 },
{ APMULHUW, ymm, Px, 0xe4,Pe,0xe4 },
{ APMULHW, ymm, Px, 0xe5,Pe,0xe5 },
{ APMULLW, ymm, Px, 0xd5,Pe,0xd5 },
{ APMULULQ, ymm, Px, 0xf4,Pe,0xf4 },
{ APOPAL, ynone, Px, 0x61 },
{ APOPAW, ynone, Pe, 0x61 },
{ APOPFL, ynone, Px, 0x9d },
{ APOPFW, ynone, Pe, 0x9d },
{ APOPL, ypopl, Px, 0x58,0x8f,(00) },
{ APOPW, ypopl, Pe, 0x58,0x8f,(00) },
{ APOR, ymm, Px, 0xeb,Pe,0xeb },
{ APSADBW, yxm, Pq, 0xf6 },
{ APSHUFHW, yxshuf, Pf3, 0x70 },
{ APSHUFL, yxshuf, Pq, 0x70 },
{ APSHUFLW, yxshuf, Pf2, 0x70 },
{ APSHUFW, ymshuf, Pm, 0x70 },
{ APSLLO, ypsdq, Pq, 0x73,(07) },
{ APSLLL, yps, Px, 0xf2, 0x72,(06), Pe,0xf2, Pe,0x72,(06) },
{ APSLLQ, yps, Px, 0xf3, 0x73,(06), Pe,0xf3, Pe,0x7e,(06) },
{ APSLLW, yps, Px, 0xf1, 0x71,(06), Pe,0xf1, Pe,0x71,(06) },
{ APSRAL, yps, Px, 0xe2, 0x72,(04), Pe,0xe2, Pe,0x72,(04) },
{ APSRAW, yps, Px, 0xe1, 0x71,(04), Pe,0xe1, Pe,0x71,(04) },
{ APSRLO, ypsdq, Pq, 0x73,(03) },
{ APSRLL, yps, Px, 0xd2, 0x72,(02), Pe,0xd2, Pe,0x72,(02) },
{ APSRLQ, yps, Px, 0xd3, 0x73,(02), Pe,0xd3, Pe,0x73,(02) },
{ APSRLW, yps, Px, 0xd1, 0x71,(02), Pe,0xe1, Pe,0x71,(02) },
{ APSUBB, yxm, Pe, 0xf8 },
{ APSUBL, yxm, Pe, 0xfa },
{ APSUBQ, yxm, Pe, 0xfb },
{ APSUBSB, yxm, Pe, 0xe8 },
{ APSUBSW, yxm, Pe, 0xe9 },
{ APSUBUSB, yxm, Pe, 0xd8 },
{ APSUBUSW, yxm, Pe, 0xd9 },
{ APSUBW, yxm, Pe, 0xf9 },
{ APUNPCKHBW, ymm, Px, 0x68,Pe,0x68 },
{ APUNPCKHLQ, ymm, Px, 0x6a,Pe,0x6a },
{ APUNPCKHQDQ, yxm, Pe, 0x6d },
{ APUNPCKHWL, ymm, Px, 0x69,Pe,0x69 },
{ APUNPCKLBW, ymm, Px, 0x60,Pe,0x60 },
{ APUNPCKLLQ, ymm, Px, 0x62,Pe,0x62 },
{ APUNPCKLQDQ, yxm, Pe, 0x6c },
{ APUNPCKLWL, ymm, Px, 0x61,Pe,0x61 },
{ APUSHAL, ynone, Px, 0x60 },
{ APUSHAW, ynone, Pe, 0x60 },
{ APUSHFL, ynone, Px, 0x9c },
{ APUSHFW, ynone, Pe, 0x9c },
{ APUSHL, ypushl, Px, 0x50,0xff,(06),0x6a,0x68 },
{ APUSHW, ypushl, Pe, 0x50,0xff,(06),0x6a,0x68 },
{ APXOR, ymm, Px, 0xef,Pe,0xef },
{ ARCLB, yshb, Pb, 0xd0,(02),0xc0,(02),0xd2,(02) },
{ ARCLL, yshl, Px, 0xd1,(02),0xc1,(02),0xd3,(02),0xd3,(02) },
{ ARCLW, yshl, Pe, 0xd1,(02),0xc1,(02),0xd3,(02),0xd3,(02) },
{ ARCPPS, yxm, Pm, 0x53 },
{ ARCPSS, yxm, Pf3, 0x53 },
{ ARCRB, yshb, Pb, 0xd0,(03),0xc0,(03),0xd2,(03) },
{ ARCRL, yshl, Px, 0xd1,(03),0xc1,(03),0xd3,(03),0xd3,(03) },
{ ARCRW, yshl, Pe, 0xd1,(03),0xc1,(03),0xd3,(03),0xd3,(03) },
@ -480,6 +762,8 @@ Optab optab[] =
{ ARORB, yshb, Pb, 0xd0,(01),0xc0,(01),0xd2,(01) },
{ ARORL, yshl, Px, 0xd1,(01),0xc1,(01),0xd3,(01),0xd3,(01) },
{ ARORW, yshl, Pe, 0xd1,(01),0xc1,(01),0xd3,(01),0xd3,(01) },
{ ARSQRTPS, yxm, Pm, 0x52 },
{ ARSQRTSS, yxm, Pf3, 0x52 },
{ ASAHF, ynone, Px, 0x9e },
{ ASALB, yshb, Pb, 0xd0,(04),0xc0,(04),0xd2,(04) },
{ ASALL, yshl, Px, 0xd1,(04),0xc1,(04),0xd3,(04),0xd3,(04) },
@ -517,20 +801,37 @@ Optab optab[] =
{ ASHRB, yshb, Pb, 0xd0,(05),0xc0,(05),0xd2,(05) },
{ ASHRL, yshl, Px, 0xd1,(05),0xc1,(05),0xd3,(05),0xd3,(05) },
{ ASHRW, yshl, Pe, 0xd1,(05),0xc1,(05),0xd3,(05),0xd3,(05) },
{ ASHUFPD, yxshuf, Pq, 0xc6 },
{ ASHUFPS, yxshuf, Pm, 0xc6 },
{ ASQRTPD, yxm, Pe, 0x51 },
{ ASQRTPS, yxm, Pm, 0x51 },
{ ASQRTSD, yxm, Pf2, 0x51 },
{ ASQRTSS, yxm, Pf3, 0x51 },
{ ASTC, ynone, Px, 0xf9 },
{ ASTD, ynone, Px, 0xfd },
{ ASTI, ynone, Px, 0xfb },
{ ASTMXCSR, ysvrs, Pm, 0xae,(03),0xae,(03) },
{ ASTOSB, ynone, Pb, 0xaa },
{ ASTOSL, ynone, Px, 0xab },
{ ASTOSW, ynone, Pe, 0xab },
{ ASUBB, yxorb, Pb, 0x2c,0x80,(05),0x28,0x2a },
{ ASUBL, yaddl, Px, 0x83,(05),0x2d,0x81,(05),0x29,0x2b },
{ ASUBPD, yxm, Pe, 0x5c },
{ ASUBPS, yxm, Pm, 0x5c },
{ ASUBSD, yxm, Pf2, 0x5c },
{ ASUBSS, yxm, Pf3, 0x5c },
{ ASUBW, yaddl, Pe, 0x83,(05),0x2d,0x81,(05),0x29,0x2b },
{ ASYSCALL, ynone, Px, 0xcd,100 },
{ ATESTB, ytestb, Pb, 0xa8,0xf6,(00),0x84,0x84 },
{ ATESTL, ytestl, Px, 0xa9,0xf7,(00),0x85,0x85 },
{ ATESTW, ytestl, Pe, 0xa9,0xf7,(00),0x85,0x85 },
{ ATEXT, ytext, Px },
{ AUCOMISD, yxcmp, Pe, 0x2e },
{ AUCOMISS, yxcmp, Pm, 0x2e },
{ AUNPCKHPD, yxm, Pe, 0x15 },
{ AUNPCKHPS, yxm, Pm, 0x15 },
{ AUNPCKLPD, yxm, Pe, 0x14 },
{ AUNPCKLPS, yxm, Pm, 0x14 },
{ AVERR, ydivl, Pm, 0x00,(04) },
{ AVERW, ydivl, Pm, 0x00,(05) },
{ AWAIT, ynone, Px, 0x9b },
@ -541,6 +842,8 @@ Optab optab[] =
{ AXLAT, ynone, Px, 0xd7 },
{ AXORB, yxorb, Pb, 0x34,0x80,(06),0x30,0x32 },
{ AXORL, yxorl, Px, 0x83,(06),0x35,0x81,(06),0x31,0x33 },
{ AXORPD, yxm, Pe, 0x57 },
{ AXORPS, yxm, Pm, 0x57 },
{ AXORW, yxorl, Pe, 0x83,(06),0x35,0x81,(06),0x31,0x33 },
{ AFMOVB, yfmvx, Px, 0xdf,(04) },
@ -649,6 +952,9 @@ Optab optab[] =
{ AFXTRACT, ynone, Px, 0xd9, 0xf4 },
{ AFYL2X, ynone, Px, 0xd9, 0xf1 },
{ AFYL2XP1, ynone, Px, 0xd9, 0xf9 },
{ AEND },
0
};
Optab* opindex[ALAST+1];

View file

@ -326,7 +326,7 @@ oclass(Adr *a)
{
long v;
if(a->type >= D_INDIR || a->index != D_NONE) {
if((a->type >= D_INDIR && a->type < D_M0) || a->index != D_NONE) {
if(a->index != D_NONE && a->scale == 0) {
if(a->type == D_ADDR) {
switch(a->index) {
@ -387,6 +387,26 @@ oclass(Adr *a)
case D_F0+7:
return Yrf;
case D_M0+0:
case D_M0+1:
case D_M0+2:
case D_M0+3:
case D_M0+4:
case D_M0+5:
case D_M0+6:
case D_M0+7:
return Ymr;
case D_X0+0:
case D_X0+1:
case D_X0+2:
case D_X0+3:
case D_X0+4:
case D_X0+5:
case D_X0+6:
case D_X0+7:
return Yxr;
case D_NONE:
return Ynone;
@ -576,7 +596,7 @@ asmand(Adr *a, int r)
v = a->offset;
t = a->type;
if(a->index != D_NONE) {
if(t >= D_INDIR) {
if(t >= D_INDIR && t < D_M0) {
t -= D_INDIR;
if(t == D_NONE) {
*andptr++ = (0 << 6) | (4 << 0) | (r << 3);
@ -624,7 +644,13 @@ asmand(Adr *a, int r)
*andptr++ = (3 << 6) | (reg[t] << 0) | (r << 3);
return;
}
if(t >= D_INDIR) {
if(t >= D_M0 && t <= D_X0+7) {
if(v)
goto bad;
*andptr++ = (3 << 6) | (reg[t] << 0) | (r << 3);
return;
}
if(t >= D_INDIR && t < D_M0) {
t -= D_INDIR;
if(t == D_NONE || D_CS <= t && t <= D_GS) {
*andptr++ = (0 << 6) | (5 << 0) | (r << 3);
@ -835,6 +861,30 @@ subreg(Prog *p, int from, int to)
print("%P\n", p);
}
static int
mediaop(Optab *o, int op, int osize, int z)
{
switch(op){
case Pm:
case Pe:
case Pf2:
case Pf3:
if(osize != 1){
if(op != Pm)
*andptr++ = op;
*andptr++ = Pm;
op = o->op[++z];
break;
}
default:
if(andptr == and || andptr[-1] != Pm)
*andptr++ = Pm;
break;
}
*andptr++ = op;
return z;
}
void
doasm(Prog *p)
{
@ -851,7 +901,7 @@ doasm(Prog *p)
if(pre)
*andptr++ = pre;
o = &optab[p->as];
o = opindex[p->as];
ft = oclass(&p->from) * Ymax;
tt = oclass(&p->to) * Ymax;
t = o->ytab;
@ -872,6 +922,12 @@ found:
*andptr++ = Pm;
break;
case Pf2: /* xmm opcode escape */
case Pf3:
*andptr++ = o->prefix;
*andptr++ = Pm;
break;
case Pm: /* opcode escape */
*andptr++ = Pm;
break;
@ -903,6 +959,30 @@ found:
asmand(&p->from, reg[p->to.type]);
break;
case Zm_r_xm:
mediaop(o, op, t[3], z);
asmand(&p->from, reg[p->to.type]);
break;
case Zm_r_i_xm:
mediaop(o, op, t[3], z);
asmand(&p->from, reg[p->to.type]);
*andptr++ = p->to.offset;
break;
case Zm_r_3d:
*andptr++ = 0x0f;
*andptr++ = 0x0f;
asmand(&p->from, reg[p->to.type]);
*andptr++ = op;
break;
case Zibm_r:
*andptr++ = op;
asmand(&p->from, reg[p->to.type]);
*andptr++ = p->to.offset;
break;
case Zaut_r:
*andptr++ = 0x8d; /* leal */
if(p->from.type != D_ADDR)
@ -924,6 +1004,17 @@ found:
asmand(&p->to, reg[p->from.type]);
break;
case Zr_m_xm:
mediaop(o, op, t[3], z);
asmand(&p->to, reg[p->from.type]);
break;
case Zr_m_i_xm:
mediaop(o, op, t[3], z);
asmand(&p->to, reg[p->from.type]);
*andptr++ = p->from.offset;
break;
case Zo_m:
*andptr++ = op;
asmand(&p->to, o->op[z+1]);
@ -942,6 +1033,12 @@ found:
*andptr++ = v;
break;
case Zibo_m_xm:
z = mediaop(o, op, t[3], z);
asmand(&p->to, o->op[z+1]);
*andptr++ = v;
break;
case Z_ib:
v = vaddr(&p->to);
case Zib_: