/* EPC Imp to C Translation Release 4 Version Apr 95 */ #include "imptoc.h" /** p5defs7.2*/ /** 02Aug97 Included updateds version of p5spdefs */ /** p5defs7 */ /** 02Feb97 Corrected movb table entry to disallow 32 bit literal **/ /** 28Nov96 Added Pentium PRO only opcodes to tables **/ /** p5defs6 */ /** 15Nov96 used UPPER CASE for constintegers as for C */ /** p5defs5 */ /** 21Oct96 Ame ended instrmnem for GCC assembler which is less tolerant */ /** p5defs4 */ /** 29Nov95 Corrected side effects table for INC &DEC which set the */ /** the flags register in a slightly nonstandard way(pds) */ /** 23Nov95 Added movb & retn to help optimise bit operations(pds) */ /** p5defs3 */ /** 08Aug95 Added 80 bit load and store instructions(pds) */ /** p5defs2 */ /** 01Jun95 Changes to make assembler acceptable to GNU as */ /** p5defs1 */ /** 11Oct93 Initial version */ /***/ /**/ /* Copyright (c) 1991 Edinburgh Portable Compiler Ltd. All Rights Reserved */ /**/ /**/ /*************************************************************************/ /** Internal respresentation of P5 opcodes **/ /** **/ /** All opcodes are represented as Pseudo ops with a Form and Class **/ /** **/ /** Form defines the format of the binary instruction **/ /** Class defines the resources used for instruction scheduling **/ /** **/ /** **/ /*************************************************************************/ /**/ /* Definition of forms */ /**/ #define NOFORM 0 /* No register fields */ #define JFORM 1 /* Jump Relative Form */ #define JRFORM 2 /* jump to dest in register */ #define X2LFORM 3 /* register form with rd&literal */ #define X2FORM 4 /* Normal two operans form */ #define X2IFORM 5 /* As above but one operand implied(eax or ecx) */ #define X1FORM 6 /* One operand only */ #define X1LFORM 7 /* Single literal operand */ #define F1FORM 8 /* Floating op Stktos only */ #define F2FORM 9 /* Floating op 2 Registers */ #define FMFORM 10 /* Floating op mem & TOS */ #define F2pFORM 11 /* Floating op 2 items tos pooped */ #define F2ppFORM 12 /* Floating op top 2 items both popped */ #define SLITFORM 13 /* Shift by literal instruction */ #define SHFORM 14 /* Shift by ECX */ #define STKFORM 15 /* One operand is popped or pushed */ #define F2rFORM 16 /* Floating op 2 Registers( Result -> deepest not tos) */ /***/ /**/ /* definition of instruction groups */ /**/ /*************************************************************************/ /** **/ /** n represents functional grouping as follows **/ /** **/ /** 1 integer loads **/ /** 2 floating point loads **/ /** 3 integer stores **/ /** 4 floating point stores **/ /** 5 memory read/write (load multiple etc) **/ /** 6 integer arithmetic and logical ops **/ /** 7 integer op (Unfailing ie can be executed speculatively) **/ /** 8 branch on condition **/ /** 9 branch and link on condition **/ /** 10 special register red/write **/ /** 11 floating-point unary op (rs2 => rd) **/ /** 12 floating-point binary arithmetic (rs1 op rs2 => rd) **/ /** 13 shifts **/ /** 14 floating-point comparison **/ /** **/ /** **********************************************************************/ /**/ #define SPECIAL 0 #define INTLOAD 1 #define FPLOAD 2 #define INTSTORE 3 #define FPSTORE 4 #define RWMEM 5 #define INTOPS 6 #define INTOPSu 7 #define BCC 8 #define JUMPLINK 9 #define SPECREGrw 10 #define FPOPS1 11 #define FPOPS2 12 #define SHIFTS 13 #define FPCOMPARE 14 #define FPLlit 15 #define STROP 16 #define HICODEFIX 17 #define MAXCODEGROUP HICODEFIX /**/ /**/ /* prefix indices */ /**/ #define iprefix 0 /* instruction prefix comes first */ #define asprefix 1 /* address size prefix comes second */ #define osprefix 2 /* operand size prefix is third */ #define soprefix 3 /* segment override prefix is last */ /**/ /* values for iprefiz */ /**/ #define LOOPNZ 224 /*E0*/ #define LOOPNE 224 /*E0*/ #define LOOPZ 225 /*E1*/ #define LOOPE 225 /*E1*/ #define JCXZ 227 /*E3*/ #define REPNZ 242 /*F2*/ #define REP 243 /*F3*/ #define REPE 243 /*F3*/ /**/ /* value for as&osprefix */ /**/ #define SHORTADDR 103 /*67*/ #define SHORTOPND 102 /*66*/ /**/ /* value fos segment override */ /**/ /**/ /* pseudoop group Form explanation */ #define Unimp 0 /*NOFORM*/ /* SPECIAL Unimplemnted */ #define ADC 1 /*X2FORM*/ /* INTOPS Add with carry */ #define ADD 2 /*X2FORM*/ /* INTOPS Add integers */ #define AND 3 /*X2FORM*/ /* INTOPSu Logically and integers */ #define bound 4 /*X2FORM*/ /* INTOPSu Interrupt on bound check */ #define bt 5 /*X2FORM*/ /* INTOPSu Copy bit(1st Opnd) of (2nd opnd) to carry flag*/ #define CALL 6 /*JFORM*/ /* JUMPLINK Call relative */ #define CALLPTR 7 /*JRFORM*/ /* JUMPLINK Call via ptr */ #define cwde 8 /*NOFORM*/ /* INTOPS Convert 16 to 32 bits in acc */ #define clc 9 /*NOFORM*/ /* SPECREGrw Clear carry */ #define CLD 10 /*NOFORM*/ /* SPECREGrw Clear direction flag */ #define cmc 11 /*NOFORM*/ /* SPECREGrw Complement carry flag */ #define CMP 12 /*X2FORM*/ /* INTOPS Compare Two integers */ #define CMPSB 13 /*NOFORM*/ /* STROP Compare signed bytes */ #define CMPSD 14 /*NOFORM*/ /* STROP Compare signed words */ #define CMPB 15 /*X2FORM*/ /* INTOPS Compare Two bytes */ #define CDQ 16 /*NOFORM*/ /* INTOPS Convert double to Quad */ #define DEC 17 /*X1FORM*/ /* INTOPS Decrement register or store word*/ #define DIV 18 /*X2IFORM*/ /* INTOPSu Divide integerin EDX:EAX by operand*/ #define ENTER 19 /*STKFORM*/ /* SPECIAL Enter procedure */ #define IDIVIDE 20 /*X2IFORM*/ /* INTOPS Signed version of div */ #define IMUL 21 /*X2IFORM*/ /* INTOPS Signed multiply of EAX */ #define IMULD 22 /*X2IFORM*/ /* INTOPS Multiply Eax by operand => edx:eax*/ #define INC 23 /*X1FORM*/ /* INTOPS Increment reg or store by one */ #define JO 24 /*JFORM*/ /* BCC Jump relative if overflow */ #define JNO 25 /*JFORM*/ /* BCC Jump relative if not overflow */ #define JB 26 /*JFORM*/ /* BCC Jump relative if below ie unsigned <*/ #define JNB 27 /*JFORM*/ /* BCC Jump relative if not below ie u>=*/ #define JE 28 /*JFORM*/ /* BCC Jump relative if equal */ #define JNE 29 /*JFORM*/ /* BCC Jump relative if not equal */ #define JBE 30 /*JFORM*/ /* BCC Jump relative if below or equal */ #define JA 32 /*JFORM*/ /* BCC Jump relative if above */ #define JS 33 /*JFORM*/ /* BCC Jump relative if sigend */ #define JNS 34 /*JFORM*/ /* BCC Jump relative if not signed */ #define JP 35 /*JFORM*/ /* BCC Jump relative if parity even */ #define JNP 36 /*JFORM*/ /* BCC Jump relative if parity odd */ #define JL 37 /*JFORM*/ /* BCC Jump relative if low ie < */ #define JGE 38 /*JFORM*/ /* BCC Jump relative if greter or equal*/ #define JLE 39 /*JFORM*/ /* BCC Jump relative if less than or equall*/ #define JG 40 /*JFORM*/ /* BCC Jump relative if greater */ #define JMP 41 /*JFORM*/ /* BCC Unconditional PC relative jump */ #define JMPPTR 42 /*JRFORM*/ /* BCC Unconditional jump via a ptr */ #define LAHF 43 /*NOFORM*/ /* SPECREGrw Load AH with flags */ #define les 44 /*X2FORM*/ /* INTLOAD Load ES & register with long pointer*/ #define lds 45 /*X2FORM*/ /* INTLOAD Load DS & register with long pointer*/ #define LEA 46 /*X2FORM*/ /* INTOPS Load effective address to register*/ #define LBNOX 47 /*X2FORM*/ /* INTLOAD Load byte with no sign extension */ #define LB 48 /*X2FORM*/ /* INTLOAD Load byte */ #define LBU 49 /*X2FORM*/ /* INTLOAD Load byte unsigned */ #define LH 50 /*X2FORM*/ /* INTLOAD Load halfword */ #define LHU 51 /*X2FORM*/ /* INTLOAD Load halfword unsigned */ #define LW 52 /*X2FORM*/ /* INTLOAD Load word */ #define LEAVE 53 /*STKFORM*/ /* SPECIAL Leave procedure */ #define LODSB 54 /*NOFORM*/ /* STROP Move byte to eax from [SI] */ #define LODSD 55 /*NOFORM*/ /* STROP Move word from [SI] to EAX reg*/ #define MOV 56 /*X2FORM*/ /* INTOPSu Move reg or literal to reg(not loads)*/ #define movsr 57 /*X1FORM*/ /* SPECREGrw MOve to(from) Segment REgs */ #define MOVSB 58 /*NOFORM*/ /* STROP Move signed byte from [si] to [di]*/ #define MOVSD 59 /*NOFORM*/ /* STROP Move signed word from [si] to [di]*/ #define MOVSX 60 /*X2FORM*/ /* STROP Move with sign extension */ #define MOVZX 61 /*X2FORM*/ /* STROP Move with zero extension */ #define MOVB 62 /*X2FORM*/ /* INTOPSu Move bytereg or literal to bytereg*/ #define MUL 63 /*X2IFORM*/ /* INTOPSu Multiply EAX by integer */ #define NEG 64 /*X1FORM*/ /* INTOPS Negate signed integer */ #define NOP 65 /*NOFORM*/ /* SPECIAL No operation */ #define NOT 66 /*X1FORM*/ /* INTOPSu Not integer */ #define OR 67 /*X2FORM*/ /* INTOPSu Or integers */ #define POP 68 /*STKFORM*/ /* SPECIAL POP operand from stack */ #define PUSH 69 /*STKFORM*/ /* SPECIAL Push operand onto stack */ #define ROL 70 /*SLITFORM*/ /* SHIFTS Rotate left by lit */ #define ROLV 71 /*X2IFORM*/ /* SHIFTS Rotate left ECX times */ #define ROR 72 /*SLITFORM*/ /* SHIFTS Rotate right by lit */ #define RORV 73 /*X2IFORM*/ /* SHIFTS Rotate right ECX times */ #define SAHF 74 /*NOFORM*/ /* SPECREGrw Store AH into flags */ #define SB 75 /*X2FORM*/ /* INTSTORE Store byte */ #define ST 76 /*X2FORM*/ /* INTSTORE Store word */ #define SH 77 /*X2FORM*/ /* INTSTORE Store halfword */ #define SETO 78 /*X1FORM*/ /* INTOPSu Set Byte if overflow */ #define SETNO 80 /*X1FORM*/ /* INTOPSu Set Byte if not overflow */ #define SETB 81 /*X1FORM*/ /* INTOPSu Set Byte if below ie unsigned <*/ #define SETNB 82 /*X1FORM*/ /* INTOPSu Set Byte if not below ie u>= */ #define SETE 83 /*X1FORM*/ /* INTOPSu Set Byte if equal */ #define SETNEQ 84 /*X1FORM*/ /* INTOPSu Set Byte if not equal */ #define SETBE 85 /*X1FORM*/ /* INTOPSu Set Byte if below or equal */ #define SETA 86 /*X1FORM*/ /* INTOPSu Set Byte if above */ #define SETS 87 /*X1FORM*/ /* INTOPSu Set Byte if sigend */ #define SETNS 88 /*X1FORM*/ /* INTOPSu Set Byte if not signed */ #define SETP 89 /*X1FORM*/ /* INTOPSu Set Byte if parity even */ #define SETNP 90 /*X1FORM*/ /* INTOPSu Set Byte if parity odd */ #define SETL 91 /*X1FORM*/ /* INTOPSu Set Byte if low ie < */ #define SETGE 92 /*X1FORM*/ /* INTOPSu Set Byte if greter or equal */ #define SETLEQ 93 /*X1FORM*/ /* INTOPSu Set Byte if less than or equall*/ #define SETG 94 /*X1FORM*/ /* INTOPSu Set Byte if greater */ #define salunused 96 /*SLITFORM*/ /* SHIFTS shift left arithmetic by constant*/ #define salvunused 97 /*X2IFORM*/ /* SHIFTS shift left arithmetic by ECX*/ #define SHL 98 /*SLITFORM*/ /* SHIFTS shift left logical by constant */ #define SHLV 99 /*X2IFORM*/ /* SHIFTS shift left logical by ECX */ #define SAR 100 /*SLITFORM*/ /* SHIFTS shift right arithmetic by constant*/ #define SARV 101 /*X2IFORM*/ /* SHIFTS shift right arithmetic by ECX */ #define SHR 102 /*SLITFORM*/ /* SHIFTS shift right logical by constant*/ #define SHRV 103 /*X2IFORM*/ /* SHIFTS shift right logical by ECX */ #define SHLD 104 /*SLITFORM*/ /* SHIFTS Shift left double (unusual) */ #define SHLDV 105 /*SHFORM*/ /* SHIFTS Shift left double (unusual) */ #define SHRD 106 /*SLITFORM*/ /* SHIFTS Shift right double (unusual) */ #define SHRDV 107 /*SHFORM*/ /* SHIFTS Shift right double (unusual) */ #define SBB 108 /*X2FORM*/ /* INTOPS Subtract integers with borrow */ #define SUB 109 /*X2FORM*/ /* INTOPS Subtract integers */ #define stc 110 /*NOFORM*/ /* SPECREGrw Set carry flag */ #define STD 112 /*NOFORM*/ /* SPECREGrw Set direction flag */ #define STOSB 113 /*NOFORM*/ /* STROP Store string byte */ #define STOSW 114 /*NOFORM*/ /* STROP Store string word */ #define TESTI 115 /*X1LFORM*/ /* INTOPSu test against immediate opnd */ #define TEST 116 /*X2FORM*/ /* INTOPSu Test 2 operands */ #define wait 117 /*NOFORM*/ /* SPECIAL wait (for ints pending ) */ #define XCHG 118 /*X2FORM*/ /* INTSTORE Exchange register with data */ #define XOR 119 /*X2FORM*/ /* INTOPSu Exclusive or integers */ #define XORI 120 /*X2FORM*/ /* INTOPSu Exclusive or integer with immediate value*/ #define RET 121 /*NOFORM*/ /* SPECIAL Return form procedure */ #define POPFD 122 /*NOFORM*/ /* SPECREGrw Pop the condition flags */ #define PUSHFD 123 /*NOFORM*/ /* SPECREGrw Push the condition flags */ #define BSWAP 124 /*X1FORM*/ /* INTOPSu Swap the nominated reg */ #define RETN 125 /*NOFORM*/ /* SPECIAL Return from procedure & pop params*/ /** the next 16 opcodes only work on Pentium PRO chips */ #define CMOVO 126 /*X2FORM*/ /* INTOPSu Conditional Move if overflow */ #define CMOVNO 127 /*X2FORM*/ /* INTOPSu Conditional Move if not overflow*/ #define CMOVB 128 /*X2FORM*/ /* INTOPSu Conditional Move if below ie unsigned <*/ #define CMOVNB 129 /*X2FORM*/ /* INTOPSu Conditional Move if not below ie u>=*/ #define CMOVE 130 /*X2FORM*/ /* INTOPSu Conditional Move if equal */ #define CMOVNEQ 131 /*X2FORM*/ /* INTOPSu Conditional Move if not equal*/ #define CMOVBE 132 /*X2FORM*/ /* INTOPSu Conditional Move if below or equal*/ #define CMOVA 133 /*X2FORM*/ /* INTOPSu Conditional Move if above */ #define CMOVS 134 /*X2FORM*/ /* INTOPSu Conditional Move if sigend */ #define CMOVNS 135 /*X2FORM*/ /* INTOPSu Conditional Move if not signed*/ #define CMOVP 136 /*X2FORM*/ /* INTOPSu Conditional Move if parity even*/ #define CMOVNP 137 /*X2FORM*/ /* INTOPSu Conditional Move if parity odd*/ #define CMOVL 138 /*X2FORM*/ /* INTOPSu Conditional Move if low ie < */ #define CMOVGE 139 /*X2FORM*/ /* INTOPSu Conditional Move if greter or equal*/ #define CMOVLEQ 140 /*X2FORM*/ /* INTOPSu Conditional Move if less than or equall*/ #define CMOVG 141 /*X2FORM*/ /* INTOPSu Conditional Move if greater */ /***/ /**/ /* Now the floating ops */ /**/ #define FILD (16+128) /*F1FORM*/ /* FPLOAD Load integer as float to TOS*/ #define FLDd (16+129) /*F1FORM*/ /* FPLOAD Load Double to TOS */ #define FLDm (16+130) /*F1FORM*/ /* FPLOAD Load REal to TOS */ #define FISTP (16+131) /*F2pFORM*/ /* FPSTORE Store TOS as integer and POP*/ #define FSTPd (16+132) /*F2pFORM*/ /* FPSTORE Store tos as double and POP*/ #define FSTPm (16+133) /*F2pFORM*/ /* FPSTORE Store tos as real and POP*/ #define FIST (16+134) /*F2FORM*/ /* FPSTORE Store tos as integer */ #define FSTd (16+135) /*F2FORM*/ /* FPSTORE Store tos as double */ #define FSTm (16+136) /*F2FORM*/ /* FPSTORE Store tos as real */ #define FIADDm (16+137) /*FMFORM*/ /* FPOPS2 Add memory integer to Tos*/ #define FADDd (16+138) /*FMFORM*/ /* FPOPS2 Add memory double to TOS*/ #define FADDm (16+139) /*FMFORM*/ /* FPOPS2 Add memory real to TOS */ #define FADDP (16+140) /*F2FORM*/ /* FPOPS2 Add to stack items and pop Tos*/ #define FADD (16+141) /*F2FORM*/ /* FPOPS2 Add two stack items */ #define FIMULm (16+142) /*FMFORM*/ /* FPOPS2 Multiply memory integer to Tos*/ #define FMULd (16+144) /*FMFORM*/ /* FPOPS2 Multiply memory double to Tos*/ #define FMULm (16+145) /*FMFORM*/ /* FPOPS2 Multiply memory real to TOS*/ #define FMULP (16+146) /*F2FORM*/ /* FPOPS2 Multiply two stack items and pop tos*/ #define FMUL (16+147) /*F2FORM*/ /* FPOPS2 Multiply two stack items */ #define FISUBm (16+148) /*FMFORM*/ /* FPOPS2 Subtract memory integer from tos*/ #define FSUBd (16+149) /*FMFORM*/ /* FPOPS2 Subtract memory double from tos*/ #define FSUBm (16+150) /*FMFORM*/ /* FPOPS2 Subtract memory real from tos*/ #define FSUBP (16+151) /*F2FORM*/ /* FPOPS2 Subtract two stack items and pop tos*/ #define FSUB (16+152) /*F2FORM*/ /* FPOPS2 Subtract two stack items */ #define FISUBRm (169) /*FMFORM*/ /* FPOPS2 Reversesub memory integer from tos*/ #define FSUBRd (16+154) /*FMFORM*/ /* FPOPS2 Reversesub memory double from tos*/ #define FSUBRm (16+155) /*FMFORM*/ /* FPOPS2 Reversesub memory real from tos*/ #define FSUBRP (172) /*F2pFORM*/ /* FPOPS2 Reversesub two stack items and pop*/ #define FSUBR (16+157) /*F2FORM*/ /* FPOPS2 Reversesub two stack items*/ #define FIDIVm (16+158) /*FMFORM*/ /* FPOPS2 Divide memory integer into tos*/ #define FDIVd (16+160) /*FMFORM*/ /* FPOPS2 Divide memory double into tos*/ #define FDIVm (16+161) /*FMFORM*/ /* FPOPS2 Divide memory real into tos*/ #define FDIVP (16+162) /*F2FORM*/ /* FPOPS2 Divide two stack items and pop*/ #define FDIV (16+163) /*F2FORM*/ /* FPOPS2 Divide two stack items */ #define FIDIVRm (180) /*FMFORM*/ /* FPOPS2 Reverse Divide memory integer into tos*/ #define FDIVRd (16+165) /*FMFORM*/ /* FPOPS2 Reverse Divide memory double into tos*/ #define FDIVRm (16+166) /*FMFORM*/ /* FPOPS2 Reverse Divide memory real into tos*/ #define FDIVRP (16+167) /*F2FORM*/ /* FPOPS2 Reverse Divide two stack items and pop*/ #define FDIVR (16+168) /*F2FORM*/ /* FPOPS2 Reverse Divide two stack items*/ #define FICOMm (16+169) /*FMFORM*/ /* FPCOMPARE Compare integer with TOS*/ #define FICOMPm (186) /*FMFORM*/ /* FPCOMPARE Compare integer with TOS and POP*/ #define FCOMd (16+171) /*FMFORM*/ /* FPCOMPARE Compare memory double with TOS*/ #define FCOMm (16+172) /*FMFORM*/ /* FPCOMPARE Compare memory real with TOS*/ #define FCOM (16+173) /*F2FORM*/ /* FPCOMPARE Compare two stack items */ #define FCOMPd (16+174) /*FMFORM*/ /* FPCOMPARE Compare memory double with TOS*/ #define FCOMPm (16+176) /*FMFORM*/ /* FPCOMPARE Compare memory real with TOS*/ #define FCOMP (16+177) /*F2pFORM*/ /* FPCOMPARE Compare two stack items %AND pop tos*/ #define FCOMPP (16+178) /*F2ppFORM*/ /* FPCOMPARE Compare tos and tos-1 %AND pop both*/ #define FLDCW (16+179) /*X2IFORM*/ /* SPECREGrw Load F control word from Memory*/ #define FSTCW (16+180) /*X2IFORM*/ /* SPECREGrw Store F control word from Memory*/ #define FSTSW (16+181) /*X2IFORM*/ /* SPECREGrw Store F status word to memory or AX*/ #define FTST (16+182) /*F1FORM*/ /* FPCOMPARE Compare TOS with zero */ #define FCHS (16+183) /*F1FORM*/ /* FPOPS1 Change sign of TOS */ #define FLDZ (16+184) /*F1FORM*/ /* FPOPS1 Push zero onto stack */ #define FLD1 (16+185) /*F1FORM*/ /* FPOPS1 Push 1.0 onto stack */ #define FLDL2E (16+186) /*F1FORM*/ /* FPOPS1 Push log(2)e onto stack*/ #define FLDLN2 (16+187) /*F1FORM*/ /* FPOPS1 Push log(e)2 onto stack*/ #define FLDLG2 (16+188) /*F1FORM*/ /* FPOPS1 Push log(10)2 onto stack*/ #define FLDPI (16+189) /*F1FORM*/ /* FPOPS1 Push PI onto stack */ #define FABS (16+190) /*F1FORM*/ /* FPOPS1 Take ABS of TOS */ #define FDECSTP (208) /*NOFORM*/ /* SPECREGrw Decrement stack pointer*/ #define FRNDINT (209) /*F1FORM*/ /* FPOPS1 Round TOS to integer per FCW*/ #define FXCH (16+194) /*F1FORM*/ /* FPOPS1 Permute stack */ #define FSQRT (16+195) /*F1FORM*/ /* FPOPS1 Replace Tos by sqrt(tos)*/ #define FSIN (16+196) /*F1FORM*/ /* FPOPS1 Replace Tos by sin(tos) */ #define FCOS (16+197) /*F1FORM*/ /* FPOPS1 Replace Tos by cos(tos) */ #define FPTAN (16+198) /*F2FORM*/ /* FPOPS1 Remove TOS push tan(tos) and1.0*/ #define FPATAN (16+199) /*F2pFORM*/ /* FPOPS2 push atan(tos/(tos-1)) */ #define F2XM1 (16+200) /*F1FORM*/ /* FPOPS1 Computes (288tos-1) */ #define FYL2X (16+201) /*F2pFORM*/ /* FPOPS2 computes (tos-1)*log(2)tos and pops*/ #define FPREM (16+202) /*F2FORM*/ /* FPOPS2 Computes 287 partialy remainder*/ #define FPREM1 (16+203) /*F2FORM*/ /* FPOPS2 Computes IEEE partialy remainder*/ #define FILDd (16+204) /*F1FORM*/ /* FPLOAD Load 64 bit integer as float*/ #define FINIT (16+205) /*NOFORM*/ /* SPECREGrw Initialise stack pointer*/ #define FINCSTP (222) /*NOFORM*/ /* SPECREGrw Increment stack pointer*/ #define rFADD (16+208) /*F2rFORM*/ /* FPOPS2 Add two stack items (Result->deepest)*/ #define rFSUB (16+209) /*F2rFORM*/ /* FPOPS2 Subtract two stack items (Result->deepest)*/ #define rFSUBR (16+210) /*F2rFORM*/ /* FPOPS2 Reverse SUB two stack items (Result->deepest)*/ #define rFMUL (16+211) /*F2rFORM*/ /* FPOPS2 Multiply two stack items (Result->deepest)*/ #define rFDIV (16+212) /*F2rFORM*/ /* FPOPS2 Divide two stack items (Result->deepest)*/ #define rFDIVR (16+213) /*F2rFORM*/ /* FPOPS2 Reverse DIV two stack items (Result->deepest)*/ #define rFADDP (16+214) /*F2rFORM*/ /* FPOPS2 Add two stack items &pop(Result->deepest)*/ #define rFSUBP (16+215) /*F2rFORM*/ /* FPOPS2 Subtract two stack items&pop(Result->deepest)*/ #define rFSUBRP (232) /*F2rFORM*/ /* FPOPS2 Reverse SUB two stack items&pop(Result->deepest)*/ #define rFMULP (16+217) /*F2rFORM*/ /* FPOPS2 Multiply two stack items&pop(Result->deepest)*/ #define rFDIVP (16+218) /*F2rFORM*/ /* FPOPS2 Divide two stack items&pop(Result->deepest)*/ #define rFDIVRP (235) /*F2rFORM*/ /* FPOPS2 Reverse DIV two stack items&pop(Result->deepest)*/ #define FISTPd (16+220) /*F2pFORM*/ /* FPSTORE Store tos as 64 bit integer}*/ #define FLDq (16+221) /*F1FORM*/ /* FPLOAD Load Quad to TOS */ #define FSTPq (16+222) /*F2pFORM*/ /* FPSTORE Store tos as quad and POP*/ #define FCMOVB 239 /*F2FORM*/ /* FPOPS2 Set Byte if below ie unsigned <*/ #define FCMOVE 240 /*F2FORM*/ /* FPOPS2 Set Byte if equal */ #define FCMOVBE 241 /*F2FORM*/ /* FPOPS2 Set Byte if below or equal */ #define FCMOVU 242 /*F2FORM*/ /* FPOPS2 Set Byte if above */ #define FCMOVGE 243 /*F2FORM*/ /* FPOPS2 Set Byte if not below ie u>=*/ #define FCMOVNE 244 /*F2FORM*/ /* FPOPS2 Set Byte if not equal */ #define FCMOVG 245 /*F2FORM*/ /* FPOPS2 Set Byte if greater */ #define FCMOVNU 246 /*F2FORM*/ /* FPOPS2 Set Byte if not signed */ #define FCOMI 247 /*F2FORM*/ /* FPOPS2 Compare 2 items => integer CC*/ #define FUCOMI 248 /*F2FORM*/ /* FPOPS2 Compare 2 (unordered) => integer CC*/ #define FCOMIP 249 /*F2pFORM*/ /* FPOPS2 Compare 2 items => integer CC and pop once*/ #define FUCOMIP 250 /*F2PFORM*/ /* FPOPS2 Compare 2 (unordered?) => integer CC and pop once*/ #define mMAXMNEM 250 /**/ /* More familiar or duplicate forms of some instructions */ /**/ #define JNAE JB #define JAE JNB #define JZ JE #define JNZ JNE #define JNA JBE #define JNBE JA #define JPE JP #define JNGE JL #define JNL JGE #define JNG JLE #define JNLE JG #define JPO JNP #define SETNAE SETB #define SETAE SETNB #define SETZ SETE #define SETNZ SETNEQ #define SETNA SETBE #define SETNBE SETA #define SETPE SETP #define SETPO SETNP #define SETNGE SETL #define SETNL SETGE #define SETNG SETLEQ #define SETNLE SETG #define ld LW #define lhz LHU #define lbz LBU #define sth SH #define stb SB /***/ /*%IF modulename="code" %OR modulename="targetprocs" %OR modulename="bprocs"%START*/ static const unsigned char instrgroup [mMAXMNEM+1] = { /*0*/ SPECIAL,INTOPS,INTOPS,INTOPSu, INTOPSu,INTOPSu,JUMPLINK,JUMPLINK, INTOPS,SPECREGrw,SPECREGrw,SPECREGrw, INTOPS,STROP,STROP,INTOPS, /*16*/ INTOPS,INTOPS,INTOPSu,SPECIAL, INTOPS,INTOPS,INTOPS,INTOPS, BCC,BCC,BCC,BCC, BCC,BCC,BCC,0, /*32*/ BCC,BCC,BCC,BCC, BCC,BCC,BCC,BCC, BCC,BCC,BCC,SPECREGrw, INTLOAD,INTLOAD,INTOPS,INTLOAD, /*48*/ INTLOAD,INTLOAD,INTLOAD,INTLOAD, INTLOAD,SPECIAL,STROP,STROP, INTOPSu,SPECREGrw,STROP,STROP, STROP,STROP,INTOPSu,INTOPSu, /*64*/ INTOPS,SPECIAL,INTOPSu,INTOPSu, SPECIAL,SPECIAL,SHIFTS,SHIFTS, SHIFTS,SHIFTS,SPECREGrw,INTSTORE, INTSTORE,INTSTORE,INTOPSu,0, /*80*/ INTOPSu,INTOPSu,INTOPSu,INTOPSu, INTOPSu,INTOPSu,INTOPSu,INTOPSu, INTOPSu,INTOPSu,INTOPSu,INTOPSu, INTOPSu,INTOPSu,INTOPSu,0, /*96*/ SHIFTS,SHIFTS,SHIFTS,SHIFTS, SHIFTS,SHIFTS,SHIFTS,SHIFTS, SHIFTS ,SHIFTS ,SHIFTS ,SHIFTS , INTOPS,INTOPS,SPECREGrw,0, /*112*/SPECREGrw,STROP,STROP,INTOPSu, INTOPSu,SPECIAL,INTSTORE,INTOPSu, INTOPSu,SPECIAL,SPECREGrw,SPECREGrw, INTOPSu,SPECIAL,INTOPSu,INTOPSu, /*128*/INTOPSu, INTOPSu, INTOPSu, INTOPSu, INTOPSu, INTOPSu, INTOPSu, INTOPSu, INTOPSu, INTOPSu, INTOPSu, INTOPSu, INTOPSu, INTOPSu, 0, 0, /*144*/ FPLOAD ,FPLOAD ,FPLOAD ,FPSTORE , FPSTORE ,FPSTORE ,FPSTORE ,FPSTORE , FPSTORE ,FPOPS2 ,FPOPS2 ,FPOPS2 , FPOPS2 ,FPOPS2 ,FPOPS2 ,0, /*160*/ FPOPS2 ,FPOPS2 ,FPOPS2 ,FPOPS2 , FPOPS2 ,FPOPS2 ,FPOPS2 ,FPOPS2 , FPOPS2 ,FPOPS2 ,FPOPS2 ,FPOPS2 , FPOPS2 ,FPOPS2 ,FPOPS2 ,0, /*176*/ FPOPS2 ,FPOPS2 ,FPOPS2 ,FPOPS2 , FPOPS2 ,FPOPS2 ,FPOPS2 ,FPOPS2 , FPOPS2 ,FPCOMPARE,FPCOMPARE,FPCOMPARE, FPCOMPARE,FPCOMPARE,FPCOMPARE,0, /*192*/ FPCOMPARE,FPCOMPARE,FPCOMPARE,SPECREGrw, SPECREGrw,SPECREGrw,FPCOMPARE,FPOPS1 , FPOPS1 ,FPOPS1 ,FPOPS1 ,FPOPS1 , FPOPS1 ,FPOPS1 ,FPOPS1 ,0, /*208*/ SPECREGrw,FPOPS1 ,FPOPS1 ,FPOPS1 , FPOPS1 ,FPOPS1 ,FPOPS1 ,FPOPS2 , FPOPS1 ,FPOPS2 ,FPOPS2 ,FPOPS2 , FPLOAD ,SPECREGrw,SPECREGrw,0, /*224*/ FPOPS2 ,FPOPS2 ,FPOPS2 ,FPOPS2 , FPOPS2 ,FPOPS2 ,FPOPS2 ,FPOPS2 , FPOPS2 ,FPOPS2 ,FPOPS2 ,FPOPS2 ,FPSTORE ,FPLOAD ,FPSTORE ,FPOPS2 , /*240*/ FPOPS2 ,FPOPS2 ,FPOPS2 ,FPOPS2 , FPOPS2 ,FPOPS2 ,FPOPS2 ,FPOPS2 , FPOPS2 ,FPOPS2 ,FPOPS2}; /*%FINISH */ /*%IF modulename="code" %OR modulename="targetprocs" %START */ #if(TargetABI==LynxOS) static char * instrmnem [mMAXMNEM+1] = { /*0*/ "unimp ","adcl ","addl ","andl ", "bound ","bt ","call ","call ", "cwde ","clc ","cld ","cmc ", "cmpl ","cmpsb ","cmpsd ","cmpb ", /*16*/ "cltd ","dec ","divl ","enter ", "idivl ","imull ","unusd ","inc ", "jo ","jno ","jb ","jnb ", "je ","jne ","jbe ","", /*32*/ "ja ","js ","jns ","jp ", "jnp ","jl ","jge ","jle ", "jg ","jmp ","jmp ","lahf ", "les ","lds ","lea ","movb ", /*48*/ "movsbl ","movzbl ","movswl ","movzwl ", "movl ","leave ","lodsb ","lodsd ", "movl ","movsr ","movsb ","movsl ", "movswl ","movzx ","movb ","mull ", /*64*/ "negl ","nop ","notl ","orl ", "popl ","pushl ","roll ","roll ", "rorl ","rorl ","sahf ","movb ", "movl ","movw ","seto ","", /*80*/ "setno ","setb ","setnb ","sete ", "setne ","setbe ","seta ","sets ", "setns ","setp ","setnp ","setl ", "setge ","setle ","setg ","", /*96*/ "sall ","sall ","shll ","shll ", "sarl ","sarl ","shrl ","shrl ", "shld ","shldv ","shrd ","shrdv ", "sbbl ","subl ","stc ","", /*112*/ "std ","stosb ","stosw ","testi ", "testl ","wait ","xchgl ","xorl ", "xori ","ret ","popfl ","pushfl ", "bswap ","ret ","cmovo ","cmovno ", /*128*/ "cmovb ","cmovnb ","cmove ","cmovne ", "cmovbe ","cmova ","cmovs ","cmovns ", "cmovp ","cmovnp ","cmovl ","cmovge ", "cmovle ","cmovg ","","", /*144*/ "fildl ","fldl ","flds ","fistpl ", "fstpl ","fstps ","fistl ","fstl ", "fsts ","fiaddl ","faddl ","fadds ", "faddp ","fadd ","fimull ","", /*160*/ "fmull ","fmuls ","fmulp ","fmul ", "fisubl ","fsubl ","fsubs ","fsubrp ", "fsub ","fisubrl","fsubrl ","fsubrs ", "fsubp ","fsubr ","fidivl ","", /*176*/ "fdivl ","fdivs ","fdivrp ","fdiv ", "fidivrl","fdivrl ","fdivrs ","fdivp ", "fdivr ","ficoml ","ficompl","fcoml ", "fcoms ","fcom ","fcompl ","", /*192*/ "fcomps ","fcomp ","fcompp ","fldcw ", "fstcw ","fnstsw ","ftst ","fchs ", "fldz ","fld1 ","fldl2e ","fldln2 ", "fldlg2 ","fldpi ","fabs ","", /*208*/ "fdecstp","frndint","fxch ","fsqrt ", "fsin ","fcos ","fptan ","fpatan ", "f2xm1 ","fyl2x ","fprem ","fprem1 ", "fildq ","finit ","fincstp","", /*224*/ "rfadd ","rfsub ","rfsubr ","rfmul ", "rfdiv ","rfdivr ","rfaddp ","rfsubp ", "rfsubrp","rfmulp ","rfdivp ","rfdivrp", "fistpll","fldt ","fstpt ","fcmovb ", /*240*/ "fcmove ","fcmovbe","fcmovu ","fcmovnb", "fcmovne","fcmovnbe","fcmovnu","fcomi ", "fucomi ","fcomip ","fucomip"}; #else static char * instrmnem [mMAXMNEM+1] = { /*0*/ "unimp ", "adcl ","addl ","andl ", "bound ","bt ","call ","call ", "cwde ","clc ","cld ","cmc ", "cmpl ","cmpsb ","cmpsd ","cmpb ", /*16*/ "cltd ","dec ","divl ","enter ", "idiv ","imull ","unusd ","inc ", "jo ","jno ","jb ","jnb ", "je ","jne ","jbe ","", /*32*/ "ja ","js ","jns ","jp ", "jnp ","jl ","jge ","jle ", "jg ","jmp ","jmp ","lahf ", "les ","lds ","lea ","movb ", /*48*/ "movsbl ","movzbl ","movswl ","movzwl ", "movl ","leave ","lodsb ","lodsd ", "movl ","movsr ","movsb ","movsl ", "movswl ","movzx ","movb ","mull ", /*64*/ "negl ","nop ","notl ","orl ", "popl ","pushl ","roll ","roll ", "rorl ","rorl ","sahf ","movb ", "movl ","movw ","seto ","", /*80*/ "setno ","setb ","setnb ","sete ", "setne ","setbe ","seta ","sets ", "setns ","setp ","setnp ","setl ", "setge ","setle ","setg ","", /*96*/ "sall ","sall ","shll ","shll ", "sarl ","sarl ","shrl ","shrl ", "shld ","shldv ","shrd ","shrdv ", "sbbl ","subl ","stc ","", /*112*/ "std ","stosb ","stosw ","testi ", "testl ","wait ","xchgl ","xorl ", "xori ","ret ","popfl ","pushfl ", "bswap ","ret ","cmovo ","cmovno ", /*128*/ "cmovb ","cmovnb ","cmove ","cmovne ", "cmovbe ","cmova ","cmovs ","cmovns ", "cmovp ","cmovnp ","cmovl ","cmovge ", "cmovle ","cmovg ","","", /*144*/ "fildl ","fldl ","flds ","fistpl ", "fstpl ","fstps ","fistl ","fstl ", "fsts ","fiaddl ","faddl ","fadds ", "faddp ","fadd ","fimull ","", /*160*/ "fmull ","fmuls ","fmulp ","fmul ", "fisubl ","fsubl ","fsubs ","fsubrp ", "fsub ","fisubrl","fsubrl ","fsubrs ", "fsubp ","fsubr ","fidivl ","", /*176*/ "fdivl ","fdivs ","fdivrp ","fdiv ", "fidivrl","fdivrl ","fdivrs ","fdivp ", "fdivr ","ficoml ","ficompl","fcoml ", "fcoms ","fcom ","fcompl ","", /*192*/ "fcomps ","fcomp ","fcompp ","fldcw ", "fstcw ","fnstsw ","ftst ","fchs ", "fldz ","fld1 ","fldl2e ","fldln2 ", "fldlg2 ","fldpi ","fabs ","", /*208*/ "fdecstp","frndint","fxch ","fsqrt ", "fsin ","fcos ","fptan ","fpatan ", "f2xm1 ","fyl2x ","fprem ","fprem1 ", "fildll ","finit ","fincstp","", /*224*/ "rfadd ","rfsub ","rfsubr ","rfmul ", "rfdiv ","rfdivr ","rfaddp ","rfsubp ", "rfsubrp","rfmulp ","rfdivp ","rfdivrp", "fistpll","fldt ","fstpt ","fcmovb ", /*240*/ "fcmove ","fcmovbe","fcmovu ","fcmovnb", "fcmovne","fcmovnbe","fcmovnu","fcomi ", "fucomi ","fcomip ","fucomip"}; #endif; /***/ static const unsigned char instrform [mMAXMNEM+1] = { /*0*/ NOFORM,X2FORM,X2FORM,X2FORM, X2FORM,X2FORM,JFORM,JRFORM, NOFORM,NOFORM,NOFORM,NOFORM, X2FORM,NOFORM,NOFORM,X2FORM, NOFORM,X1FORM,X2IFORM,STKFORM, X2IFORM,X2IFORM,X2IFORM,X1FORM, JFORM,JFORM,JFORM,JFORM, JFORM,JFORM,JFORM,0, /*32*/ JFORM,JFORM,JFORM,JFORM, JFORM,JFORM,JFORM,JFORM, JFORM,JFORM,JRFORM,NOFORM, X2FORM,X2FORM,X2FORM,X2FORM, X2FORM,X2FORM,X2FORM,X2FORM, X2FORM,STKFORM,NOFORM,NOFORM, X2FORM,X1FORM,NOFORM,NOFORM, X2FORM,X2FORM,X2FORM,X2IFORM, /*64*/ X1FORM,NOFORM,X1FORM,X2FORM, STKFORM,STKFORM,SLITFORM,X2IFORM, SLITFORM,X2IFORM,NOFORM,X2FORM, X2FORM,X2FORM,X1FORM,0, X1FORM,X1FORM,X1FORM,X1FORM, X1FORM,X1FORM,X1FORM,X1FORM, X1FORM,X1FORM,X1FORM,X1FORM, X1FORM,X1FORM,X1FORM,0, /*96*/ SLITFORM,X2IFORM,SLITFORM,X2IFORM, SLITFORM,X2IFORM,SLITFORM,X2IFORM, SLITFORM,SHFORM,SLITFORM,SHFORM, X2FORM,X2FORM,NOFORM,0, NOFORM,NOFORM,NOFORM,X1LFORM, X2FORM,NOFORM,X2FORM,X2FORM, X2FORM,NOFORM,NOFORM,NOFORM, X1FORM,NOFORM,X2FORM,X2FORM, X2FORM,X2FORM,X2FORM,X2FORM, X2FORM,X2FORM,X2FORM,X2FORM, X2FORM,X2FORM,X2FORM,X2FORM, X2FORM,X2FORM,0,0, /*144*/F1FORM,F1FORM,F1FORM,F2pFORM, F2pFORM,F2pFORM,F2FORM,F2FORM, F2FORM,FMFORM,FMFORM,FMFORM, F2FORM,F2FORM,FMFORM,0, /*160*/FMFORM,FMFORM,F2FORM,F2FORM, FMFORM,FMFORM,FMFORM,F2FORM, F2FORM,FMFORM,FMFORM,FMFORM, F2pFORM,F2FORM,FMFORM,0, /*176*/FMFORM,FMFORM,F2FORM,F2FORM, FMFORM,FMFORM,FMFORM,F2FORM, F2FORM,FMFORM,FMFORM,FMFORM, FMFORM,F2FORM,FMFORM,0, /*192*/FMFORM,F2pFORM,F2ppFORM,X2IFORM, X2IFORM,X2IFORM,F1FORM,F1FORM, F1FORM,F1FORM,F1FORM,F1FORM, F1FORM,F1FORM,F1FORM,0, /*208*/NOFORM,F1FORM,F1FORM,F1FORM, F1FORM,F1FORM,F2FORM,F2pFORM, F1FORM,F2pFORM,F2FORM,F2FORM, F1FORM,NOFORM,NOFORM,0, /*224*/F2rFORM,F2rFORM,F2rFORM,F2rFORM, F2rFORM,F2rFORM,F2rFORM,F2rFORM, F2rFORM,F2rFORM,F2rFORM,F2rFORM, F2pFORM,F1FORM,F2pFORM,F2FORM, /*240*/F2FORM,F2FORM,F2FORM,F2FORM, F2FORM,F2FORM,F2FORM,F2FORM, F2FORM,F2pFORM,F2pFORM}; /***/ /*%FINISH */ /***/ /*%IF modulename="targetprocs" %OR modulename="code" %START */ struct instrvariants{ short int valid; union { short int onlyop; short int oprrm; } u0; short int oprmr; short int oprmlit; short int oprmslit; short int oprm; short int opplusreg; short int other; short int oppcrel; unsigned char eaxlit; unsigned char subop; unsigned char allit; unsigned char opbrmlit; }; #define instrvarels 11 /* the no of elements per instr */ /**/ /* valid bits for variants */ /* at code generation time the variant is checked against these */ /* valid bits and the relevant opcode extracted. If the valid */ /* bit is zero then abort unless an escape code is set somewhere */ /**/ /**/ #define oponlyval (0x8000) /* This is only opcode*/ #define oprrmval (0x4000) /* r,r/m form is available*/ #define oprmrval (0x2000) /* r/m,r dest=store form available*/ #define oprmlitval (0x1000) /* r/m,imm32 form available */ #define oprmslitval (0x800) /* r/m,signed imm8 form available */ #define oprmval (0x400) /* Memmory form available eg inc*/ #define opplusregval (0x200) /* Only reg added to opcode */ #define otherval (0x100) /* Stll further form available eg shortreljump*/ #define oppcrelval (0x80) /* Pc relative form available(4byte)*/ #define subopval (0x40) /* Subopcode for r-m byte available*/ #define opeaxlitval (0x20) /* Specail for for op on eax with lit */ #define opallitval (0x10) /* Op on btm byte of eax with lit */ #define opbrlitval (0x8) /* Op on byte with literal */ #define opbrmlitval (0x4) /* byte r/m,imm8 form available */ /**/ /* the last 2 camn occur on almost every op from 80086 days but */ /* are only used when useful in 32 bit form ie on OR,XOR and TEST */ /**/ static const unsigned short int instrops [((instrvarels*mMAXMNEM)+instrvarels)-1+1] = { /*Unimp */ 0, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, /*adc */ oprrmval|oprmrval|oprmlitval|oprmslitval|subopval|opeaxlitval, 0x0013,0x0011,0x0081,0x0083,0x0000,0x0000, 0x0000,0x0000,0x0215,0x0000, /*add */ oprrmval|oprmrval|oprmlitval|oprmslitval|subopval|opeaxlitval, 0x0003,0x0001,0x0081,0x0083,0x0000,0x0000, 0x0000,0x0000,0x0005,0x0000, /*and */ oprrmval|oprmrval|oprmlitval|oprmslitval|subopval|opeaxlitval|opbrmlitval, 0x0023,0x0021,0x0081,0x0083,0x0000,0x0000, 0x0080,0x0000,0x0425,0x0000, /*bound */ oprrmval, 0x0062,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, /*bt */ oprrmval|subopval, 0x0fa3,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0400,0x0000, /*call */ oppcrelval, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x00e8,0x0000,0x0000, /*callptr*/ oprmval|subopval, 0x0000,0x0000,0x0000,0x0000,0x00ff,0x0000, 0x0000,0x0000,0x0200,0x0000, /*cwde */ oponlyval, 0x0098,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, /*clc */ oponlyval, 0x00f8,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, /*cld */ oponlyval, 0x00fc,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, /*cmc */ oponlyval, 0x00f5,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, /*cmp */ oprrmval|oprmrval|oprmlitval|oprmslitval|subopval|opeaxlitval|opbrlitval|opallitval| opbrmlitval, 0x003b,0x0039,0x0081,0x0083,0x0000,0x0000, 0x0080,0x0000,0x073d,0x803c, /*cmpsb */ oponlyval, 0x00a6,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, /*cmpsd */ oponlyval, 0x00a7,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, /*cmpb */ oprrmval|oprmrval|oprmlitval|oprmslitval|subopval|opbrlitval|opallitval| opbrmlitval, 0x003a,0x0038,0x0080,0x0000,0x0000,0x0000, 0x0080,0x0000,0x073c,0x803c, /*cdq */ oponlyval, 0x0099,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, /*dec */ oprrmval|subopval|opplusregval, 0x0000,0x0000,0x0000,0x0000,0x00ff,0x0048, 0x0000,0x0000,0x0000,0x0000, /*div */ oprmval|subopval, 0x0000,0x0000,0x0000,0x0000,0x00f7,0x0000, 0x0000,0x0000,0x0600,0x0000, /*enter */ oponlyval, 0x00c8,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, /*idivide*/ oprmval|subopval, 0x0000,0x0000,0x0000,0x0000,0x00f7,0x0000, 0x0000,0x0000,0x0700,0x0000, /*imul */ oprrmval|oprmlitval|oprmslitval, 0x0faf,0x0000,0x0069,0x006b,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, /*imuld */ oponlyval, 0x00f5,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, /*inc */ oprrmval|subopval|opplusregval, 0x0000,0x0000,0x0000,0x0000,0x00fe,0x0040, 0x0000,0x0000,0x0000,0x0000, /*JO */ oppcrelval|otherval, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0070,0x0f80,0x0000,0x0000, /*JNO */ oppcrelval|otherval, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0071,0x0f81,0x0000,0x0000, /*JB */ oppcrelval|otherval, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0072,0x0f82,0x0000,0x0000, /*JNB */ oppcrelval|otherval, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0073,0x0f83,0x0000,0x0000, /*JE */ oppcrelval|otherval, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0074,0x0f84,0x0000,0x0000, /*JNE */ oppcrelval|otherval, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0075,0x0f85,0x0000,0x0000, /*JBE */ oppcrelval|otherval, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0076,0x0f86,0x0000,0x0000, 0, 0,0,0,0,0, 0,0,0,0,0, /*JA */ oppcrelval|otherval, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0077,0x0f87,0x0000,0x0000, /*JS */ oppcrelval|otherval, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0078,0x0f88,0x0000,0x0000, /*JNS */ oppcrelval|otherval, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0079,0x0f89,0x0000,0x0000, /*JP */ oppcrelval|otherval, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x007a,0x0f8a,0x0000,0x0000, /*JNP */ oppcrelval|otherval, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x007b,0x0f8b,0x0000,0x0000, /*JL */ oppcrelval|otherval, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x007c,0x0f8c,0x0000,0x0000, /*JGE */ oppcrelval|otherval, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x007d,0x0f8d,0x0000,0x0000, /*JLE */ oppcrelval|otherval, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x007e,0x0f8e,0x0000,0x0000, /*JG */ oppcrelval|otherval, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x007f,0x0f8f,0x0000,0x0000, /*jmp */ oppcrelval|otherval, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x00eb,0x00e9,0x0000,0x0000, /*jmpptr */ oprmval|subopval, 0x0000,0x0000,0x0000,0x0000,0x00ff,0x0000, 0x0000,0x0000,0x0400,0x0000, /*LAHF */ oponlyval, 0x009f,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, /*les */ oprrmval, 0x00c4,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, /*lds */ oprrmval, 0x00c5,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, /*lea */ oprrmval, 0x008d,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, /*lbnox */ oprrmval|otherval, 0x008a,0x0000,0x0000,0x0000,0x0000,0x0000, 0x00a0,0x0000,0x0000,0x0000, /*lb */ oprrmval, 0x0fbe,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, /*lbu */ oprrmval, 0x0fb6,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, /*lh */ oprrmval, 0x0fbf,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, /*lhu */ oprrmval, 0x0fb7,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, /*lw */ oprrmval|otherval, 0x008b,0x0000,0x0000,0x0000,0x0000,0x0000, 0x00a1,0x0000,0x0000,0x0000, /*leave */ oponlyval, 0x00c9,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, /*lodsb */ oponlyval, 0x00ac,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, /*lodsd */ oponlyval, 0x00ad,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, /*mov */ oprrmval|oprmrval|oprmlitval|opbrmlitval|opplusregval|otherval, 0x008b,0x0089,0x00c7,0x00c6,0x0000,0x00b8, 0x00c6,0x0000,0x0000,0xc600, /*movsr */ oprrmval, 0x008e,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, /*movsb */ oponlyval, 0x00a4,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, /*movsd */ oponlyval, 0x00a5,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, /*movsx */ oprrmval, 0x0fbf,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, /*movzx */ oprrmval, 0x0fb7,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, /*movb */ oprrmval|oprmrval|oprmslitval|opbrmlitval|opplusregval|otherval, 0x008a,0x0088,0x00c6,0x00c6,0x0000,0x00b0, 0x00c6,0x0000,0x0000,0xc600, /*mul */ oprmval|subopval, 0x0000,0x0000,0x0000,0x0000,0x00f7,0x0000, 0x0000,0x0000,0x0400,0x0000, /*neg */ oprmval|subopval, 0x0000,0x0000,0x0000,0x0000,0x00f7,0x0000, 0x0000,0x0000,0x0300,0x0000, /*nop */ oponlyval, 0x0090,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, /*not */ oprmval|subopval, 0x0000,0x0000,0x0000,0x0000,0x00f7,0x0000, 0x0000,0x0000,0x0200,0x0000, /*or */ oprrmval|oprmrval|oprmlitval|oprmslitval|subopval|opeaxlitval|opbrlitval|opallitval|opbrmlitval, 0x000b,0x0009,0x0081,0x0083,0x0000,0x0000, 0x0080,0x0000,0x010d,0x800c, /*pop */ oprmval|opplusregval|subopval, 0x0000,0x0000,0x0000,0x0000,0x008f,0x0058, 0x0000,0x0000,0x0000,0x0000, /*push */ oprmval|oprmlitval|oprmslitval|opplusregval|subopval, 0x0000,0x0000,0x0068,0x006a,0x00ff,0x0050, 0x0000,0x0000,0x0600,0x0000, /*rol */ oprmslitval|subopval, 0x0000,0x0000,0x0000,0x00c1,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, /*rolv */ oprmval|subopval, 0x0000,0x0000,0x0000,0x000,0x00d3,0x0000, 0x0000,0x0000,0x0000,0x0000, /*ror */ oprmslitval|subopval, 0x0000,0x0000,0x0000,0x00c1,0x0000,0x0000, 0x0000,0x0000,0x0100,0x0000, /*v */ oprmval|subopval, 0x0000,0x0000,0x0000,0x0000,0x00d3,0x0000, 0x0000,0x0000,0x0100,0x0000, /*SAHF */ oponlyval, 0x009e,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, /*sb */ oprmrval|oprmslitval|otherval|opbrmlitval, 0x0000,0x0088,0x0000,0x00c6,0x0000,0x0000, 0x00a2,0x0000,0x0000,0xc600, /*st */ oprmrval|oprmlitval|otherval, 0x0000,0x0089,0x00c7,0x0000,0x0000,0x0000, 0x00a3,0x0000,0x0000,0x0000, /*sh */ oprmrval|oprmlitval, 0x0000,0x0089,0x00c7,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, /*SETO */ oprmval, 0x0000,0x0000,0x0000,0x0000,0x0f90,0x0000, 0x0000,0x0000,0x0000,0x0000, 0, 0,0,0,0,0, 0,0,0,0,0, /*SETNO */ oprmval, 0x0000,0x0000,0x0000,0x0000,0x0f91,0x0000, 0x0000,0x0000,0x0000,0x0000, /*SETB */ oprmval, 0x0000,0x0000,0x0000,0x0000,0x0f92,0x0000, 0x0000,0x0000,0x0000,0x0000, /*SETNB */ oprmval, 0x0000,0x0000,0x0000,0x0000,0x0f93,0x0000, 0x0000,0x0000,0x0000,0x0000, /*SETE */ oprmval, 0x0000,0x0000,0x0000,0x0000,0x0f94,0x0000, 0x0000,0x0000,0x0000,0x0000, /*SETNEQ */ oprmval, 0x0000,0x0000,0x0000,0x0000,0x0f95,0x0000, 0x0000,0x0000,0x0000,0x0000, /*SETBE */ oprmval, 0x0000,0x0000,0x0000,0x0000,0x0f96,0x0000, 0x0000,0x0000,0x0000,0x0000, /*SETA */ oprmval, 0x0000,0x0000,0x0000,0x0000,0x0f97,0x0000, 0x0000,0x0000,0x0000,0x0000, /*SETS */ oprmval, 0x0000,0x0000,0x0000,0x0000,0x0f98,0x0000, 0x0000,0x0000,0x0000,0x0000, /*SETNS */ oprmval, 0x0000,0x0000,0x0000,0x0000,0x0f99,0x0000, 0x0000,0x0000,0x0000,0x0000, /*SETP */ oprmval, 0x0000,0x0000,0x0000,0x0000,0x0f9a,0x0000, 0x0000,0x0000,0x0000,0x0000, /*SETNP */ oprmval, 0x0000,0x0000,0x0000,0x0000,0x0f9b,0x0000, 0x0000,0x0000,0x0000,0x0000, /*SETL */ oprmval, 0x0000,0x0000,0x0000,0x0000,0x0f9c,0x0000, 0x0000,0x0000,0x0000,0x0000, /*SETGE */ oprmval, 0x0000,0x0000,0x0000,0x0000,0x0f9d,0x0000, 0x0000,0x0000,0x0000,0x0000, /*SETLEQ */ oprmval, 0x0000,0x0000,0x0000,0x0000,0x0f9e,0x0000, 0x0000,0x0000,0x0000,0x0000, /*SETG */ oprmval, 0x0000,0x0000,0x0000,0x0000,0x0f9f,0x0000, 0x0000,0x0000,0x0000,0x0000, 0, 0,0,0,0,0, 0,0,0,0,0, /*sal */ oprmslitval|subopval, 0x0000,0x0000,0x0000,0x00c1,0x0000,0x0000, 0x0000,0x0000,0x0700,0x0000, /*salv */ oprmval|subopval, 0x0000,0x0000,0x0000,0x0000,0x00d3,0x0000, 0x0000,0x0000,0x0700,0x0000, /*shl */ oprmslitval|subopval, 0x0000,0x0000,0x0000,0x00c1,0x0000,0x0000, 0x0000,0x0000,0x0400,0x0000, /*shlv */ oprmval|subopval, 0x0000,0x0000,0x0000,0x0000,0x00d3,0x0000, 0x0000,0x0000,0x0400,0x0000, /*sar */ oprmslitval|subopval, 0x0000,0x0000,0x0000,0x00c1,0x0000,0x0000, 0x0000,0x0000,0x0700,0x0000, /*sarv */ oprmval|subopval, 0x0000,0x0000,0x0000,0x0000,0x00d3,0x0000, 0x0000,0x0000,0x0700,0x0000, /*shr */ oprmslitval|subopval, 0x0000,0x0000,0x0000,0x00c1,0x0000,0x0000, 0x0000,0x0000,0x0500,0x0000, /*shrv */ oprmval|subopval, 0x0000,0x0000,0x0000,0x0000,0x00d3,0x0000, 0x0000,0x0000,0x0500,0x0000, /*shld */ oponlyval, 0x0fa4,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, /*shldv */ oponlyval, 0x0fa5,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, /*shrd */ oponlyval, 0x0fac,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, /*shrdv */ oponlyval, 0x0fad,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, /*sbb */ oprrmval|oprmrval|oprmlitval|oprmslitval|subopval|opeaxlitval, 0x001b,0x0019,0x0081,0x0083,0x0000,0x0000, 0x0000,0x0000,0x031d,0x0000, /*sub */ oprrmval|oprmrval|oprmlitval|oprmslitval|subopval|opeaxlitval, 0x002b,0x0029,0x0081,0x0083,0x0000,0x0000, 0x0000,0x0000,0x052d,0x0000, /*stc */ oponlyval, 0x00f9,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, 0, 0,0,0,0,0, 0,0,0,0,0, /*std */ oponlyval, 0x00fd,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, /*stosb */ oponlyval, 0x00aa,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, /*stosw */ oponlyval, 0x00ab,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, /*testi */ 0, /*unused*/ 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, /*test */ oprrmval|oprmlitval|opeaxlitval|subopval|opbrlitval|opallitval|opbrmlitval, 0x0085,0x0000,0x00f7,0x0000,0x0000,0x0000, 0x00f6,0x0000,0x00a9,0xf6a8, /*wait */ oponlyval, 0x009b,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, /*xchg */ oprrmval, 0x0087,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, /*xor */ oprrmval|oprmrval|oprmlitval|oprmslitval|subopval|opeaxlitval|opbrlitval|opallitval|opbrmlitval, 0x0033,0x0031,0x0081,0x0083,0x0000,0x0000, 0x0080,0x0000,0x0635,0x8034, /*xori */ 0, /* probably redundant */ 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, /*ret */ oponlyval, 0x00c3,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, /*POPFD */ oponlyval, 0x009d,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, /*PUSHFD */ oponlyval, 0x009c,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, /*bswap */ opplusregval, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0fc8, 0x0000,0x0000,0x0000,0x0000, /*retn */ oponlyval, 0x00c2,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, /*cmovO */ oprrmval, 0x0f40,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, /*cmovNO */ oprrmval, 0x0f41,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, /*cmovB */ oprrmval, 0x0f42,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, /*cmovNB */ oprrmval, 0x0f43,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, /*cmovE */ oprrmval, 0x0f44,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, /*cmovNEQ*/ oprrmval, 0x0f45,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, /*cmovBE */ oprrmval, 0x0f46,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, /*cmovA */ oprrmval, 0x0f47,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, /*cmovS */ oprrmval, 0x0f48,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, /*cmovNS */ oprrmval, 0x0f49,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, /*cmovP */ oprrmval, 0x0f4a,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, /*cmovNP */ oprrmval, 0x0f4b,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, /*cmovL */ oprrmval, 0x0f4c,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, /*cmovGE */ oprrmval, 0x0f4d,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, /*cmovLEQ*/ oprrmval, 0x0f4e,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, /*cmovG */ oprrmval, 0x0f4f,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, 0, 0,0,0,0,0, 0,0,0,0,0, 0, 0,0,0,0,0, 0,0,0,0,0, /*FILD */ oprmval|subopval, 0x0000,0x0000,0x0000,0x0000,0x00db,0x0000, 0x0000,0x0000,0x0000,0x0000, /*FLDd */ oprmval|subopval|opplusregval, 0x0000,0x0000,0x0000,0x0000,0x00dd,0xd9c0, 0x0000,0x0000,0x0000,0x0000, /*FLDm */ oprmval|subopval, 0x0000,0x0000,0x0000,0x0000,0x00d9,0x0000, 0x0000,0x0000,0x0000,0x0000, /*FISTP */ oprmval|subopval, 0x0000,0x0000,0x0000,0x0000,0x00db,0x0000, 0x0000,0x0000,0x0300,0x0000, /*FSTPd */ oprmval|opplusregval|subopval, 0x0000,0x0000,0x0000,0x0000,0x00dd,0xddd8, 0x0000,0x0000,0x0300,0x0000, /*FSTPm */ oprmval|subopval, 0x0000,0x0000,0x0000,0x0000,0x00d9,0x0000, 0x0000,0x0000,0x0300,0x0000, /*FIST */ oprmval|subopval, 0x0000,0x0000,0x0000,0x0000,0x00dd,0x0000, 0x0000,0x0000,0x0200,0x0000, /*FSTd */ oprmval|subopval, 0x0000,0x0000,0x0000,0x0000,0x00dd,0x0000, 0x0000,0x0000,0x0200,0x0000, /*FSTm */ oprmval|subopval, 0x0000,0x0000,0x0000,0x0000,0x00d9,0x0000, 0x0000,0x0000,0x0200,0x0000, /*FIADDm */ oprmval|subopval, 0x0000,0x0000,0x0000,0x0000,0x00da,0x0000, 0x0000,0x0000,0x0000,0x0000, /*FADDd */ oprmval|subopval, 0x0000,0x0000,0x0000,0x0000,0x00dc,0x0000, 0x0000,0x0000,0x0000,0x0000, /*FADDm */ oprmval|subopval, 0x0000,0x0000,0x0000,0x0000,0x00d8,0x0000, 0x0000,0x0000,0x0000,0x0000, /*FADDP */ opplusregval, 0x0000,0x0000,0x0000,0x0000,0x0000,0xdec0, 0x0000,0x0000,0x0000,0x0000, /*FADD */ opplusregval, 0x0000,0x0000,0x0000,0x0000,0x0000,0xd8c0, 0x0000,0x0000,0x0000,0x0000, /*FIMULm */ oprmval|subopval, 0x0000,0x0000,0x0000,0x0000,0x00da,0x0000, 0x0000,0x0000,0x0100,0x0000, 0, 0,0,0,0,0, 0,0,0,0,0, /*FMULd */ oprmval|subopval, 0x0000,0x0000,0x0000,0x0000,0x00dc,0x0000, 0x0000,0x0000,0x0100,0x0000, /*FMULm */ oprmval|subopval, 0x0000,0x0000,0x0000,0x0000,0x00d8,0x0000, 0x0000,0x0000,0x0100,0x0000, /*FMULP */ opplusregval, 0x0000,0x0000,0x0000,0x0000,0x0000,0xdec8, 0x0000,0x0000,0x0000,0x0000, /*FMUL */ opplusregval, 0x0000,0x0000,0x0000,0x0000,0x0000,0xd8c8, 0x0000,0x0000,0x0000,0x0000, /*FISUBm */ oprmval|subopval, 0x0000,0x0000,0x0000,0x0000,0x00da,0x0000, 0x0000,0x0000,0x0400,0x0000, /*FSUBd */ oprmval|subopval, 0x0000,0x0000,0x0000,0x0000,0x00dc,0x0000, 0x0000,0x0000,0x0400,0x0000, /*FSUBm */ oprmval|subopval, 0x0000,0x0000,0x0000,0x0000,0x00d8,0x0000, 0x0000,0x0000,0x0400,0x0000, /*FSUBP */ opplusregval, 0x0000,0x0000,0x0000,0x0000,0x0000,0xdee8, 0x0000,0x0000,0x0000,0x0000, /*FSUB */ opplusregval, 0x0000,0x0000,0x0000,0x0000,0x0000,0xd8e0, 0x0000,0x0000,0x0000,0x0000, /*FISUBRm*/ oprmval|subopval, 0x0000,0x0000,0x0000,0x0000,0x00da,0x0000, 0x0000,0x0000,0x0500,0x0000, /*FSUBRd */ oprmval|subopval, 0x0000,0x0000,0x0000,0x0000,0x00dc,0x0000, 0x0000,0x0000,0x0500,0x0000, /*FSUBRm */ oprmval|subopval, 0x0000,0x0000,0x0000,0x0000,0x00d8,0x0000, 0x0000,0x0000,0x0500,0x0000, /*FSUBRP */ opplusregval, 0x0000,0x0000,0x0000,0x0000,0x0000,0xdee0, 0x0000,0x0000,0x0000,0x0000, /*FSUBR */ opplusregval, 0x0000,0x0000,0x0000,0x0000,0x0000,0xd8e8, 0x0000,0x0000,0x0000,0x0000, /*FIDIVm */ oprmval|subopval, 0x0000,0x0000,0x0000,0x0000,0x00da,0x0000, 0x0000,0x0000,0x0600,0x0000, 0, 0,0,0,0,0, 0,0,0,0,0, /*FDIVd */ oprmval|subopval, 0x0000,0x0000,0x0000,0x0000,0x00dc,0x0000, 0x0000,0x0000,0x0600,0x0000, /*FDIVm */ oprmval|subopval, 0x0000,0x0000,0x0000,0x0000,0x00d8,0x0000, 0x0000,0x0000,0x0600,0x0000, /*FDIVP */ opplusregval, 0x0000,0x0000,0x0000,0x0000,0x0000,0xdef8, 0x0000,0x0000,0x0000,0x0000, /*FDIV */ opplusregval, 0x0000,0x0000,0x0000,0x0000,0x0000,0xd8f0, 0x0000,0x0000,0x0000,0x0000, /*FIDIVRm*/ oprmval|subopval, 0x0000,0x0000,0x0000,0x0000,0x00da,0x0000, 0x0000,0x0000,0x0700,0x0000, /*FDIVRd */ oprmval|subopval, 0x0000,0x0000,0x0000,0x0000,0x00dc,0x0000, 0x0000,0x0000,0x0700,0x0000, /*FDIVRm */ oprmval|subopval, 0x0000,0x0000,0x0000,0x0000,0x00d8,0x0000, 0x0000,0x0000,0x0700,0x0000, /*FDIVRP */ opplusregval, 0x0000,0x0000,0x0000,0x0000,0x0000,0xdef0, 0x0000,0x0000,0x0000,0x0000, /*FDIVR */ opplusregval, 0x0000,0x0000,0x0000,0x0000,0x0000,0xd8f8, 0x0000,0x0000,0x0000,0x0000, /*FICOMm */ oprmval|subopval, 0x0000,0x0000,0x0000,0x0000,0x00da,0x0000, 0x0000,0x0000,0x0200,0x0000, /*FICOMPm*/ oprmval|subopval, 0x0000,0x0000,0x0000,0x0000,0x00da,0x0000, 0x0000,0x0000,0x0300,0x0000, /*FCOMd */ oprmval|subopval, 0x0000,0x0000,0x0000,0x0000,0x00dc,0x0000, 0x0000,0x0000,0x0200,0x0000, /*FCOMm */ oprmval|subopval, 0x0000,0x0000,0x0000,0x0000,0x00d8,0x0000, 0x0000,0x0000,0x0200,0x0000, /*FCOM */ opplusregval, 0x0000,0x0000,0x0000,0x0000,0x0000,0xd8d0, 0x0000,0x0000,0x0000,0x0000, /*FCOMPd */ oprmval|subopval, 0x0000,0x0000,0x0000,0x0000,0x00dc,0x0000, 0x0000,0x0000,0x0300,0x0000, 0, 0,0,0,0,0, 0,0,0,0,0, /*FCOMPm */ oprmval|subopval, 0x0000,0x0000,0x0000,0x0000,0x00d8,0x0000, 0x0000,0x0000,0x0300,0x0000, /*FCOMP */ opplusregval, 0x0000,0x0000,0x0000,0x0000,0x0000,0xd8d8, 0x0000,0x0000,0x0000,0x0000, /*FCOMPP */ oponlyval|opplusregval, 0xded9,0x0000,0x0000,0x0000,0x0000,0xded8, 0x0000,0x0000,0x0000,0x0000, /*FLDCW */ oprmval|subopval, 0x0000,0x0000,0x0000,0x0000,0x00d9,0x0000, 0x0000,0x0000,0x0500,0x0000, /*FSTCW */ oprmval|subopval, 0x0000,0x0000,0x0000,0x0000,0x00d9,0x0000, 0x0000,0x0000,0x0700,0x0000, /*FSTSW */ oponlyval|oprmval|subopval, 0xdfe0,0x0000,0x0000,0x0000,0x00dd,0x0000, 0x0000,0x0000,0x0700,0x0000, /*FTST */ oponlyval, 0xd9e4,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, /*FCHS */ oponlyval, 0xd9e0,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, /*FLDZ */ oponlyval, 0xd9ee,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, /*FLD1 */ oponlyval, 0xd9e8,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, /*FLDL2E */ oponlyval, 0xd9ea,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, /*FLDLN2 */ oponlyval, 0xd9ed,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, /*FLDLG2 */ oponlyval, 0xd9ec,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, /*FLDPI */ oponlyval, 0xd9eb,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, /*FABS */ oponlyval, 0xd9e1,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, 0, 0,0,0,0,0, 0,0,0,0,0, /*FDECSTP*/ oponlyval, 0xd9f6,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, /*FRNDINT*/ oponlyval, 0xd9fc,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, /*FXCH */ opplusregval, 0x0000,0x0000,0x0000,0x0000,0x0000,0xd9c8, 0x0000,0x0000,0x0000,0x0000, /*FSQRT */ oponlyval, 0xd9fa,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, /*FSIN */ oponlyval, 0xd9fe,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, /*FCOS */ oponlyval, 0xd9ff,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, /*FPTAN */ oponlyval, 0xd9f2,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, /*FPATAN */ oponlyval, 0xd9f3,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, /*F2XM1 */ oponlyval, 0xd9f0,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, /*FYL2X */ oponlyval, 0xd9f1,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, /*FPREM */ oponlyval, 0xd9f8,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, /*FPREM1 */ oponlyval, 0xd9f5,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, /*FILDd */ oprmval|subopval, 0x0000,0x0000,0x0000,0x0000,0x00df,0x0000, 0x0000,0x0000,0x0500,0x0000, /*FINIT */ oponlyval, 0xdbe3,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, /*FINCSTP*/ oponlyval, 0xd9f7,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000, 0, 0,0,0,0,0, 0,0,0,0,0, /*rFADD */ opplusregval, 0x0000,0x0000,0x0000,0x0000,0x0000,0xdcc0, 0x0000,0x0000,0x0000,0x0000, /*rFSUB */ opplusregval, 0x0000,0x0000,0x0000,0x0000,0x0000,0xdce8, 0x0000,0x0000,0x0000,0x0000, /*rFSUBR */ opplusregval, 0x0000,0x0000,0x0000,0x0000,0x0000,0xdce0, 0x0000,0x0000,0x0000,0x0000, /*rFMUL */ opplusregval, 0x0000,0x0000,0x0000,0x0000,0x0000,0xdcc8, 0x0000,0x0000,0x0000,0x0000, /*rFDIV */ opplusregval, 0x0000,0x0000,0x0000,0x0000,0x0000,0xdcf8, 0x0000,0x0000,0x0000,0x0000, /*rFDIVR */ opplusregval, 0x0000,0x0000,0x0000,0x0000,0x0000,0xdcf0, 0x0000,0x0000,0x0000,0x0000, /*rFADDP */ opplusregval, 0x0000,0x0000,0x0000,0x0000,0x0000,0xdec0, 0x0000,0x0000,0x0000,0x0000, /*rFSUBP */ opplusregval, 0x0000,0x0000,0x0000,0x0000,0x0000,0xdee8, 0x0000,0x0000,0x0000,0x0000, /*rFSUBRP*/ opplusregval, 0x0000,0x0000,0x0000,0x0000,0x0000,0xdee0, 0x0000,0x0000,0x0000,0x0000, /*rFMULP */ opplusregval, 0x0000,0x0000,0x0000,0x0000,0x0000,0xdec8, 0x0000,0x0000,0x0000,0x0000, /*rFDIVP */ opplusregval, 0x0000,0x0000,0x0000,0x0000,0x0000,0xdef8, 0x0000,0x0000,0x0000,0x0000, /*rFDIVRP*/ opplusregval, 0x0000,0x0000,0x0000,0x0000,0x0000,0xdef0, 0x0000,0x0000,0x0000,0x0000, /*FISTPd */ oprmval|subopval, 0x0000,0x0000,0x0000,0x0000,0x00df,0x0000, 0x0000,0x0000,0x0700,0x0000, /*FLDq */ oprmval|subopval, 0x0000,0x0000,0x0000,0x0000,0x00db,0x0000, 0x0000,0x0000,0x0500,0x0000, /*FSTPq */ oprmval|subopval, 0x0000,0x0000,0x0000,0x0000,0x00db,0x0000, 0x0000,0x0000,0x0700,0x0000, /*FCMOVB */ opplusregval, 0x0000,0x0000,0x0000,0x0000,0x0000,0xdac0, 0x0000,0x0000,0x0000,0x0000, /*FCMOVE */ opplusregval, 0x0000,0x0000,0x0000,0x0000,0x0000,0xdac8, 0x0000,0x0000,0x0000,0x0000, /*FCMOVBE */ opplusregval, 0x0000,0x0000,0x0000,0x0000,0x0000,0xdad0, 0x0000,0x0000,0x0000,0x0000, /*FCMOVU */ opplusregval, 0x0000,0x0000,0x0000,0x0000,0x0000,0xdad8, 0x0000,0x0000,0x0000,0x0000, /*FCMOVGE */ opplusregval, 0x0000,0x0000,0x0000,0x0000,0x0000,0xdbc0, 0x0000,0x0000,0x0000,0x0000, /*FCMOVGE */ opplusregval, 0x0000,0x0000,0x0000,0x0000,0x0000,0xdbc8, 0x0000,0x0000,0x0000,0x0000, /*FCMOVG */ opplusregval, 0x0000,0x0000,0x0000,0x0000,0x0000,0xdbd0, 0x0000,0x0000,0x0000,0x0000, /*FCMOVNU */ opplusregval, 0x0000,0x0000,0x0000,0x0000,0x0000,0xdbd8, 0x0000,0x0000,0x0000,0x0000, /*FCOMI */ opplusregval, 0x0000,0x0000,0x0000,0x0000,0x0000,0xdbf0, 0x0000,0x0000,0x0000,0x0000, /*FUCOMI */ opplusregval, 0x0000,0x0000,0x0000,0x0000,0x0000,0xdbe8, 0x0000,0x0000,0x0000,0x0000, /*FCOMIP */ opplusregval, 0x0000,0x0000,0x0000,0x0000,0x0000,0xdff0, 0x0000,0x0000,0x0000,0x0000, /*FUCOMIP*/ opplusregval, 0x0000,0x0000,0x0000,0x0000,0x0000,0xdfe8, 0x0000,0x0000,0x0000,0x0000} ; /***/ /**/ /* side effects are defined as follows */ /* x'01' reads the flags register */ /* x'02' write the flag register in standard way */ /* x'04' erase the flags register (various non standard writes) */ /* x'10' reads the Floating stack pointer register */ /* x'20' updates the Floating stack pointer register */ /* x'40' read the Floating condition fields */ /* x'80' set the Floating condition fields */ static const unsigned char instrsideeffects [mMAXMNEM+1] = { /*0*/ 0x0,0x2,0x2,0x2,0x0,0x2,0x0,0x0, 0x0,0x4,0x4,0x4,0x2,0x3,0x3,0x2, /*16*/ 0x0,0x4,0x2,0x0,0x4,0x4,0x4,0x4, 0x1,0x1,0x1,0x1,0x1,0x1,0x1,0xFF, /*32*/ 0x1,0x1,0x1,0x1,0x1,0x1,0x1,0x1, 0x1,0x0,0x0,0x1,0x0,0x0,0x0,0xFF, /*48*/ 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, 0x0,0x0,0x1,0x1,0x0,0x0,0x4,0x0, /*64*/ 0x2,0x0,0x0,0x2,0x0,0x0,0x1,0x1, 0x4,0x4,0x4,0x0,0x0,0x0,0x1,0xFF, /*80*/ 0x1,0x1,0x1,0x1,0x1,0x1,0x1,0x1, 0x1,0x1,0x1,0x1,0x1,0x1,0x1,0xFF, /*96*/ 0x4,0x4,0x4,0x4,0x4,0x4,0x4,0x4, 0x4,0x4,0x4,0x4,0x2,0x2,0x4,0xFF, /*112*/ 0x4,0x1,0x1,0x2,0x2,0x0,0x0,0x2, 0x0,0x0,0x4,0x1,0x0,0x0,0x1,0x1, /*128*/ 0x1,0x1,0x1,0x1,0x1,0x1,0x1,0x1, 0x1,0x1,0x1,0x1,0x1,0x1,0xFF,0xFF, /*144*/ 0x30,0x30,0x30,0x30,0x30,0x30,0x10,0x10, 0x10,0x10,0x10,0x10,0x30,0x10,0x10,0xFF, /*160*/ 0x10,0x10,0x30,0x10,0x10,0x10,0x10,0x30, 0x10,0x10,0x10,0x10,0x30,0x10,0x10,0xFF, /*176*/ 0x10,0x10,0x30,0x10,0x10,0x10,0x10,0x30, 0x10,0x90,0xB0,0x90,0x90,0x90,0xB0,0xFF, /*192*/ 0xB0,0xB0,0xB0,0x10,0x0,0x40,0x90,0x10, 0x30,0x30,0x30,0x30,0x30,0x30,0x10,0xFF, /*208*/ 0x30,0x10,0x10,0x90,0x90,0x90,0xB0,0xB0, 0x90,0xB0,0x90,0x90,0x30,0x20,0x30,0xFF, /*224*/ 0x10,0x10,0x10,0x10,0x10,0x10,0x30,0x30, 0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x11, /*240*/ 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x12, 0x12,0x32,0x32}; /*%FINISH */ /***/ #define EAX 0 #define ECX 1 #define EDX 2 #define EBX 3 #define ESP 4 #define EBP 5 #define ESI 6 #define EDI 7 #define STACKPOINTER ESP /*%sp = $esp*/ #define RETURNREG EAX /* Here reside integer fn results */ #define RESULTREG EAX /* alias for above */ #define FRETURNREG 8 /*$f0*/ /* Here reside FP fn results */ #define FRESULTREG 8 /*$f0*/ /* alias for above */ #define FRAMEPOINTER EBP #define f0REG 8 /*$f0*/ #define GOTREG EBX /*$gp = $EBX*/ /***/ /** SPECIAL registers on Pentium */ /***/ #define FLAGREG 0 /* Quotient register or multiply lower 32 bits */ #define FSTP 1 /* The floating stackt pointer */ #define FPSCR 2 /* Floating Status and control reg */ #define FCCBIT 3 /* FP true false(is in fpscr but lower latency */ /* when set by compare than set by MTC) */ #define FOPR 4 /* Fixup order psuedo register - used to */ /* force ordering of Hi16 and Low16 fixups */ #define Maxcreg 4 /* Highest currently used */ /***/ #define REGCEILING 15 /* highest numbered register */ static char * regtext [REGCEILING+1] = { "%eax","%ecx","%edx","%ebx","%esp","%ebp","%esi","%edi", "FR8","FR9","FRA","FRB","FRC","FRD","FRE","FRF"}; static char * wregtext [REGCEILING+1] = { "%ax","%cx","%dx","%bx","%sp","%bp","%si","%di", "FR8","FR9","FRA","FRB","FRC","FRD","FRE","FRF"}; static char * bregtext [7+1] = { "%al","%cl","%dl","%bl","%ah","%ch","%dh","%bh"}; /***/ static char * Qregtext [Maxcreg+1] = {"FLGS","FSTP", "FSCR","FPCC", "FOPR"}; /***/ #define HASWINDOWREGS 0 /*MIPS doesn't have a windowed register scheme*/ /***/ #define AreaBaseOffset 0 /***/ /***/ #define REGPARAMNUM 0 /* No params in registers*/ #define Regparamsize 4 /* Avoid an arrayinsideout */ #define PARAMBASE 8 /* Params start at EBP+8 */ /***/ #define FRBASE 8 /* base of floating registers */ #define FRSTEP 1 /* step when allocatind fregs */ #define FDRSTEP 2 /* step for when allocating pairs */ /***/ /**/ /* Tregs gives the registers available to the code generator as temporary */ /* registers in the absence of any register variables. Register variables are*/ /* claimed by th Front End via a mask. This is more flexible than assuming an*/ /* order eg when one varaible is used in two successive loops */ /**/ /**/ static const unsigned char Tregs [5+1] = { EAX,ECX,EDX,EBX,ESI,EDI}; /***/ #define LOWVOLREG 0 /* The lowest actual volatile register */ #define HIGHVOLREG 2 /* The highest actual volatile register */ /***/ #define LOWTREG 0 #define HIGHVOLTREG 2 /* highest volatile reg as Treg Index*/ #define HIGHTREG 5 /***/ #define FIRSTFREG 8 /*%f0 */ /* Lowest actual freg */ #define LASTFREG 15 /*%f15*/ /* Highest actual freg */ /***/ #define FIRSTTFREG 0 /* First usable freg as index into Tfregs */ #define LASTTFREG 0 /* Last usable freg as index into Tfregs */ /***/ #define LOWVOLFREG 8 /*%f0 */ #define HIGHVOLFREG 15 /*%f7*/ #define CALLEESAVEDREGS (0xC8) #define CALLEESAVEDFREGS 0 /***/ /**/ /* constants describinf manipulations of the Floating register stack */ /**/ #define NEWPOSN 1 /* Reg is repositioned by EXCH*/ #define INTERCH 2 /* Two reg record to be swopped*/ #define FASTTOTOP 3 /* Nominated reg direct to top */ #define BUBBLETOTOP 4 /* Nominated reg to top without*/ /* disturbing the order of others*/ #define FDISCARD 5 /* Get rid of register & unlock */ /***/ /***/ /***/ /************************** end of mipsdefs.inc ***********************************/ /* argument to Mspcall */ enum ExpProc { #define _EXP(x,op,name,retype,nargs,p1,p2,p3,p4,p5) exp_##op, #define _SP(x,op,name,retype,nargs) #include "p5spdefs3.h" #undef _EXP #undef _SP num_ExpProcs }; /* argument to Mspcall */ enum SpProc { #define _EXP(x,op,name,retype,nargs,p1,p2,p3,p4,p5) #define _SP(x,op,name,retype,nargs) sp_##op, #include "p5spdefs3.h" #undef _EXP #undef _SP num_SpProcs }; /* end of automatic translation */