Added instructions into generator...

This commit is contained in:
xolatile 2024-07-24 08:14:12 -04:00
parent fae1aedeb5
commit facd80e228
4 changed files with 443 additions and 191 deletions

View File

@ -2,62 +2,62 @@
#define ASSEMBLER_H
enum {
D8, // 8-bit
D16, // 16-bit
D32, // 32-bit
D64 // 64-bit
D8,
D16,
D32,
D64
};
enum {
REL, // Relative
REG, // Register
MEM, // Memory
IMM // Immediate
REL,
REG,
MEM,
IMM
};
enum {
ASMDIRMEM, // Insert memory address directive.
ASMDIRREL, // Insert relative address directive.
ASMDIRIMM, // Insert immediate literal directive.
ASMDIRREP, // Repeat directive.
ADD, // Add registers or memory addresses.
OR, // Bit-or registers or memory addresses.
ADC, // Add-carry registers or memory addresses.
SBB, // Subtract-borrow registers or memory addresses.
AND, // Bit-and registers or memory addresses.
SUB, // Subtract registers or memory addresses.
XOR, // Bit-xor registers or memory addresses.
CMP, // Compare registers or memory addresses.
INC, // Increment register or memory address.
DEC, // Decrement register or memory address.
NOT, // Bit-not register or memory address.
NEG, // Negate register or memory address.
MUL, // Multiply register or memory address.
IMUL, // Sign-multiply register or memory address.
DIV, // Divide register or memory address.
IDIV, // Sign-divide register or memory address.
NOP, // No operation, skip a cycle.
RETN, // Near return to calling procedure.
RETF, // Far return to calling procedure.
LEAVE, // Release the stack frame set up by enter.
LOCK, // Assert CPU lock signal during execution.
HLT, // Stop execution and set CPU to halt state.
POPF, // Pop stack into flags register (16/64 bit).
PUSHF, // Push flags register onto stack (16/64 bit).
WAIT, // Check for and handle pending float exceptions.
CLC, // Clear carry flag.
CLD, // Clear direction flag.
CLI, // Clear interrupt flag.
STC, // Set carry flag.
STD, // Set direction flag.
STI, // Set interrupt flag.
CMC, // Complement carry flag.
INSB, // Input 1 byte from IO port at DX to ES:(E)DI or RDI.
INSD, // Input 4 bytes from IO port at DX to ES:(E)DI or RDI.
OUTSB, // Output 1 byte from DS:(E)SI or RSI to IO port at DX.
OUTSD, // Output 4 bytes from DS:(E)SI or RSI to IO port at DX.
CDQ, // Sign-extend EAX into EDX:EAX.
CWDE, // Sign-extend AX into EAX.
ASMDIRMEM,
ASMDIRREL,
ASMDIRIMM,
ASMDIRREP,
ADD,
OR,
ADC,
SBB,
AND,
SUB,
XOR,
CMP,
INC,
DEC,
NOT,
NEG,
MUL,
IMUL,
DIV,
IDIV,
NOP,
RETN,
RETF,
LEAVE,
LOCK,
HLT,
POPF,
PUSHF,
WAIT,
CLC,
CLD,
CLI,
STC,
STD,
STI,
CMC,
INSB,
INSD,
OUTSB,
OUTSD,
CDQ,
CWDE,
INAL,
INEAX,
INT3,
@ -70,42 +70,42 @@ enum {
SCASD,
STOSB,
STOSD,
SYSENTER, // Execute fast call to ring 0 system procedure.
SYSEXIT, // Execute fast return to ring 3 userland procedure.
SYSCALL, // Execute OS system call handler at kernel.
SYSRET, // Execute return from previous system call.
PAUSE, // Hint CPU for usage of spin-wait loop.
CPUID, // Request CPU identification and information.
EMMS, // Empty MMX technology state (x87 FPU).
RSM, // Resume execution from system management mode.
FNOP, // No operation, skip cycle (x87 FPU).
FCHS, // Complement sign of st0.
FABS, // Replace st0 with its absolute value.
FTST, // Compare st0 with 0.0 literal.
FXAM, // Classify value or literal in st0.
FLD1, // Push 1.0 literal to FPU stack.
FLDL2T, // Push log2 (10) literal to FPU stack.
FLDL2E, // Push log2 (e) literal to FPU stack.
FLDPI, // Push pi literal to FPU stack.
FLDLG2, // Push log10 (2) literal to FPU stack.
FLDLN2, // Push loge (2) literal to FPU stack.
FLDZ, // Push 0.0 literal to FPU stack.
F2XM1, // Replace st0 with 2.0**st0 - 1.0.
FYL2X, // Multiply st1 with log2 (st0), pop FPU stack.
FPTAN, // Compute tan (st0), push 1.0 to FPU stack.
FPATAN, // Compute arctan (st1 / st0), pop FPU stack.
FXTRACT, // Separate st0 into FP elements, push FPU stack.
FPREM1, // Replace st0 with st0 % st1, round up.
FDECSTP, // Decrement FPU stack pointer.
FINCSTP, // Increment FPU stack pointer.
FPREM, // Replace st0 with st0 % st1.
FYL2XP1, // Multiply st1 with log2 (st0) + 1.0, pop FPU stack.
FSQRT, // Compute square root of st0.
FSINCOS, // Compure sin (st0), push cos (st0) to FPU stack.
FRNDINT, // Round st0 to integer value.
FSCALE, // Scale st0 by st1.
FSIN, // Compute sin (st0).
FCOS, // Compure cos (st0).
SYSENTER,
SYSEXIT,
SYSCALL,
SYSRET,
PAUSE,
CPUID,
EMMS,
RSM,
FNOP,
FCHS,
FABS,
FTST,
FXAM,
FLD1,
FLDL2T,
FLDL2E,
FLDPI,
FLDLG2,
FLDLN2,
FLDZ,
F2XM1,
FYL2X,
FPTAN,
FPATAN,
FXTRACT,
FPREM1,
FDECSTP,
FINCSTP,
FPREM,
FYL2XP1,
FSQRT,
FSINCOS,
FRNDINT,
FSCALE,
FSIN,
FCOS,
INSW,
OUTSW,
CWD,
@ -130,98 +130,98 @@ enum {
STOSQ,
WRMSR,
XLATB,
ENTER, // Create a stack frame for procedure call.
CALL, // Call near, relative or absolute procedure.
IN, // Input byte from 8-bit IO port to r0.
OUT, // Output byte from r0 to 8-bit IO port.
JMP, // Jump near, far, relative or absolute offset.
JO, // Conditional jump on overflow flag set.
JNO, // Conditional jump on not overflow flag set.
JB, // Conditional jump on below flag set.
JAE, // Conditional jump on above or equal flag set.
JE, // Conditional jump on equal flag set.
JNE, // Conditional jump on not equal flag set.
JBE, // Conditional jump on below or equal flag set.
JA, // Conditional jump on above flag set.
JS, // Conditional jump on negative flag set.
JNS, // Conditional jump on positive flag set.
JPE, // Conditional jump on parity even flag set.
JPO, // Conditional jump on parity odd flag set.
JL, // Conditional jump on less flag set.
JGE, // Conditional jump on greater or equal flag set.
JLE, // Conditional jump on less or equal flag set.
JG, // Conditional jump on greater flag set.
MOV, // Move registers or memory addresses.
CMOVO, // Conditional move on overflow flag set.
CMOVNO, // Conditional move on not overflow flag set.
CMOVB, // Conditional move on below flag set.
CMOVAE, // Conditional move on above or equal flag set.
CMOVE, // Conditional move on equal flag set.
CMOVNE, // Conditional move on not equal flag set.
CMOVBE, // Conditional move on below or equal flag set.
CMOVA, // Conditional move on above flag set.
CMOVS, // Conditional move on negative flag set.
CMOVNS, // Conditional move on positive flag set.
CMOVPE, // Conditional move on parity even flag set.
CMOVPO, // Conditional move on parity odd flag set.
CMOVL, // Conditional move on less flag set.
CMOVGE, // Conditional move on greater or equal flag set.
CMOVLE, // Conditional move on less or equal flag set.
CMOVG, // Conditional move on greater flag set.
PUSH, // Push a value to stack.
POP, // Pop a value from stack.
BSWAP, // Swap bytes according to little-endian rules.
TEST, // And registers or memory addresses, set flags.
RCL, // Rotate-carry bits left, repeat r1 times.
RCR, // Rotate-carry bits right, repeat r1 times.
ROL, // Rotate bits left, repeat r1 times.
ROR, // Rotate bits right, repeat r1 times.
SHL, // Shift bits left, repeat r1 times.
SHR, // Sign-shift bits right, repeat r1 times.
SAL, // Shift bits left, repeat r1 times.
SAR, // Shift bits right, repeat r1 times.
REP, // Repeat string instruction.
REPE, // Repeat string instruction while equal.
REPNE, // Repeat string instruction while not equal.
REPZ, // Repeat string instruction while zero.
REPNZ, // Repeat string instruction while not zero.
LOOP, // Decrement r1, jump near if not zero.
LOOPE, // Decrement r1, jump near if not zero and zflag.
LOOPNE, // Decrement r1, jump near if not zero and not zflag.
MOVBE, // Swap bytes and move register or memory address.
XADD, // Exchange and add register and memory address.
XCHG, // Exchange registers or memory addresses.
LEA, // Load effective address to register.
POPCNT, // Return count of bits set to 1 to register.
BSF, // Bit scan forward on register or memory address.
BSR, // Bit scan reverse on register or memory address.
FADD, // Add literal or FPU stack with st0.
FMUL, // Multiply literal or FPU stack with st0.
FCOM, // Cmopare literal or FPU stack with st0.
FCOMP, // Cmopare literal or FPU stack with st0 and pop.
FSUB, // Subtract literal or FPU stack with st0.
FSUBR, // Subtract reverse literal or FPU stack with st0.
FDIV, // Divide literal or FPU stack with st0.
FDIVR // Divide reverse literal or FPU stack with st0.
ENTER,
CALL,
IN,
OUT,
JMP,
JO,
JNO,
JB,
JAE,
JE,
JNE,
JBE,
JA,
JS,
JNS,
JPE,
JPO,
JL,
JGE,
JLE,
JG,
MOV,
CMOVO,
CMOVNO,
CMOVB,
CMOVAE,
CMOVE,
CMOVNE,
CMOVBE,
CMOVA,
CMOVS,
CMOVNS,
CMOVPE,
CMOVPO,
CMOVL,
CMOVGE,
CMOVLE,
CMOVG,
PUSH,
POP,
BSWAP,
TEST,
RCL,
RCR,
ROL,
ROR,
SHL,
SHR,
SAL,
SAR,
REP,
REPE,
REPNE,
REPZ,
REPNZ,
LOOP,
LOOPE,
LOOPNE,
MOVBE,
XADD,
XCHG,
LEA,
POPCNT,
BSF,
BSR,
FADD,
FMUL,
FCOM,
FCOMP,
FSUB,
FSUBR,
FDIV,
FDIVR
};
enum {
GR0, // Register: rax, eax, ax, al;
GR1, // Register: rcx, ecx, cx, cl;
GR2, // Register: rdx, edx, dx, dl;
GR3, // Register: rbx, ebx, bx, bl;
GR4, // Register: rsp, esp, sp, spl;
GR5, // Register: rbp, ebp, bp, bpl;
GR6, // Register: rsi, esi, si, sil;
GR7, // Register: rdi, edi, di, dil;
GR8, // Register: r8, r8d, r8w, r8b;
GR9, // Register: r9, r9d, r9w, r9b;
GR10, // Register: r10, r10d, r10w, r10b;
GR11, // Register: r11, r11d, r11w, r11b;
GR12, // Register: r12, r12d, r12w, r12b;
GR13, // Register: r13, r13d, r13w, r13b;
GR14, // Register: r14, r14d, r14w, r14b;
GR15 // Register: r15, r15d, r15w, r15b;
GR0,
GR1,
GR2,
GR3,
GR4,
GR5,
GR6,
GR7,
GR8,
GR9,
GR10,
GR11,
GR12,
GR13,
GR14,
GR15
};
extern unsigned int text_entry_point;

View File

@ -155,34 +155,118 @@ nop { return INOP; }
adc { return ITADC; }
add { return ITADD; }
and { return ITAND; }
cbw { return ITCBW; }
cdq { return ITCDQ; }
cdqe { return ITCDQE; }
clc { return ITCLC; }
cld { return ITCLD; }
cli { return ITCLI; }
clts { return ITCLTS; }
cmc { return ITCMC; }
cmp { return ITCMP; }
cpuid { return ITCPUID; }
cqo { return ITCQO; }
cwd { return ITCWD; }
cwde { return ITCWDE; }
dec { return ITDEC; }
div { return ITDIV; }
emms { return ITEMMS; }
f2xm1 { return ITF2XM1; }
fabs { return ITFABS; }
fchs { return ITFCHS; }
fcos { return ITFCOS; }
fdecstp { return ITFDECSTP; }
fincstp { return ITFINCSTP; }
fld1 { return ITFLD1; }
fldl2e { return ITFLDL2E; }
fldl2t { return ITFLDL2T; }
fldlg2 { return ITFLDLG2; }
fldln2 { return ITFLDLN2; }
fldpi { return ITFLDPI; }
fldz { return ITFLDZ; }
fnop { return ITFNOP; }
fpatan { return ITFPATAN; }
fprem { return ITFPREM; }
fprem1 { return ITFPREM1; }
fptan { return ITFPTAN; }
frndint { return ITFRNDINT; }
fscale { return ITFSCALE; }
fsin { return ITFSIN; }
fsincos { return ITFSINCOS; }
fsqrt { return ITFSQRT; }
ftst { return ITFTST; }
fxam { return ITFXAM; }
fxtract { return ITFXTRACT; }
fyl2x { return ITFYL2X; }
fyl2xp1 { return ITFYL2XP1; }
hlt { return ITHLT; }
idiv { return ITIDIV; }
imul { return ITIMUL; }
inal { return ITINAL; }
inax { return ITINAX; }
inc { return ITINC; }
ineax { return ITINEAX; }
insb { return ITINSB; }
insd { return ITINSD; }
insw { return ITINSW; }
int3 { return ITINT3; }
invd { return ITINVD; }
iretd { return ITIRETD; }
iretq { return ITIRETQ; }
je { return ITJE; }
jmp { return ITJMP; }
jne { return ITJNE; }
leave { return ITLEAVE; }
lock { return ITLOCK; }
lodsb { return ITLODSB; }
lodsd { return ITLODSD; }
lodsq { return ITLODSQ; }
lodsw { return ITLODSW; }
mov { return ITMOV; }
mul { return ITMUL; }
neg { return ITNEG; }
nop { return ITNOP; }
not { return ITNOT; }
or { return ITOR; }
outal { return ITOUTAL; }
outax { return ITOUTAX; }
outeax { return ITOUTEAX; }
outsb { return ITOUTSB; }
outsd { return ITOUTSD; }
outsw { return ITOUTSW; }
pause { return ITPAUSE; }
pop { return ITPOP; }
popf { return ITPOPF; }
pushf { return ITPUSHF; }
rdmsr { return ITRDMSR; }
rdpmc { return ITRDPMC; }
rdtsc { return ITRDTSC; }
retf { return ITRETF; }
retn { return ITRETN; }
rsm { return ITRSM; }
sar { return ITSAR; }
sbb { return ITSBB; }
scasb { return ITSCASB; }
scasd { return ITSCASD; }
scasq { return ITSCASQ; }
scasw { return ITSCASW; }
stc { return ITSTC; }
std { return ITSTD; }
sti { return ITSTI; }
stosb { return ITSTOSB; }
stosd { return ITSTOSD; }
stosq { return ITSTOSQ; }
stosw { return ITSTOSW; }
sub { return ITSUB; }
syscall { return ITSYSCALL; }
sysenter { return ITSYSENTER; }
sysexit { return ITSYSEXIT; }
sysret { return ITSYSRET; }
ud2 { return ITUD2; }
wait { return ITWAIT; }
wbinvd { return ITWBINVD; }
wrmsr { return ITWRMSR; }
xlatb { return ITXLATB; }
xor { return ITXOR; }
/* #placeholder<instruction_scanner_instructions> END

View File

@ -93,7 +93,7 @@
// Instructions
%token INOP
// #placeholder<instruction_token_list> BEGIN
%token ITADC ITADD ITAND ITCMP ITDEC ITDIV ITHLT ITIDIV ITIMUL ITINC ITJE ITJMP ITJNE ITLEAVE ITLOCK ITMOV ITMUL ITNEG ITNOT ITOR ITPAUSE ITPOP ITRETF ITRETN ITSAR ITSBB ITSUB ITSYSCALL ITSYSENTER ITSYSEXIT ITSYSRET ITXOR
%token ITADC ITADD ITAND ITCBW ITCDQ ITCDQE ITCLC ITCLD ITCLI ITCLTS ITCMC ITCMP ITCPUID ITCQO ITCWD ITCWDE ITDEC ITDIV ITEMMS ITF2XM1 ITFABS ITFCHS ITFCOS ITFDECSTP ITFINCSTP ITFLD1 ITFLDL2E ITFLDL2T ITFLDLG2 ITFLDLN2 ITFLDPI ITFLDZ ITFNOP ITFPATAN ITFPREM ITFPREM1 ITFPTAN ITFRNDINT ITFSCALE ITFSIN ITFSINCOS ITFSQRT ITFTST ITFXAM ITFXTRACT ITFYL2X ITFYL2XP1 ITHLT ITIDIV ITIMUL ITINAL ITINAX ITINC ITINEAX ITINSB ITINSD ITINSW ITINT3 ITINVD ITIRETD ITIRETQ ITJE ITJMP ITJNE ITLEAVE ITLOCK ITLODSB ITLODSD ITLODSQ ITLODSW ITMOV ITMUL ITNEG ITNOP ITNOT ITOR ITOUTAL ITOUTAX ITOUTEAX ITOUTSB ITOUTSD ITOUTSW ITPAUSE ITPOP ITPOPF ITPUSHF ITRDMSR ITRDPMC ITRDTSC ITRETF ITRETN ITRSM ITSAR ITSBB ITSCASB ITSCASD ITSCASQ ITSCASW ITSTC ITSTD ITSTI ITSTOSB ITSTOSD ITSTOSQ ITSTOSW ITSUB ITSYSCALL ITSYSENTER ITSYSEXIT ITSYSRET ITUD2 ITWAIT ITWBINVD ITWRMSR ITXLATB ITXOR
// #placeholder<instruction_token_list> END
// Instruction-likes
@ -423,16 +423,100 @@ library_code: %empty
instruction: INOP { append_instructions(NOP); }
// #placeholder<instruction_parser_rules> BEGIN
| ITNOP { append_instructions(NOP); }
| ITRETN { append_instructions(RETN); }
| ITRETF { append_instructions(RETF); }
| ITLEAVE { append_instructions(LEAVE); }
| ITLOCK { append_instructions(LOCK); }
| ITHLT { append_instructions(HLT); }
| ITPOPF { append_instructions(POPF); }
| ITPUSHF { append_instructions(PUSHF); }
| ITWAIT { append_instructions(WAIT); }
| ITCLC { append_instructions(CLC); }
| ITCLD { append_instructions(CLD); }
| ITCLI { append_instructions(CLI); }
| ITSTC { append_instructions(STC); }
| ITSTD { append_instructions(STD); }
| ITSTI { append_instructions(STI); }
| ITCMC { append_instructions(CMC); }
| ITINSB { append_instructions(INSB); }
| ITINSD { append_instructions(INSD); }
| ITOUTSB { append_instructions(OUTSB); }
| ITOUTSD { append_instructions(OUTSD); }
| ITCDQ { append_instructions(CDQ); }
| ITCWDE { append_instructions(CWDE); }
| ITINAL { append_instructions(INAL); }
| ITINEAX { append_instructions(INEAX); }
| ITINT3 { append_instructions(INT3); }
| ITIRETD { append_instructions(IRETD); }
| ITLODSB { append_instructions(LODSB); }
| ITLODSD { append_instructions(LODSD); }
| ITOUTAL { append_instructions(OUTAL); }
| ITOUTEAX { append_instructions(OUTEAX); }
| ITSCASB { append_instructions(SCASB); }
| ITSCASD { append_instructions(SCASD); }
| ITSTOSB { append_instructions(STOSB); }
| ITSTOSD { append_instructions(STOSD); }
| ITSYSENTER { append_instructions(SYSENTER); }
| ITSYSEXIT { append_instructions(SYSEXIT); }
| ITSYSCALL { append_instructions(SYSCALL); }
| ITSYSRET { append_instructions(SYSRET); }
| ITSYSEXIT { append_instructions(SYSEXIT); }
| ITSYSENTER { append_instructions(SYSENTER); }
| ITLEAVE { append_instructions(LEAVE); }
| ITRETF { append_instructions(RETF); }
| ITRETN { append_instructions(RETN); }
| ITPAUSE { append_instructions(PAUSE); }
| ITHLT { append_instructions(HLT); }
| ITLOCK { append_instructions(LOCK); }
| ITCPUID { append_instructions(CPUID); }
| ITEMMS { append_instructions(EMMS); }
| ITRSM { append_instructions(RSM); }
| ITFNOP { append_instructions(FNOP); }
| ITFCHS { append_instructions(FCHS); }
| ITFABS { append_instructions(FABS); }
| ITFTST { append_instructions(FTST); }
| ITFXAM { append_instructions(FXAM); }
| ITFLD1 { append_instructions(FLD1); }
| ITFLDL2T { append_instructions(FLDL2T); }
| ITFLDL2E { append_instructions(FLDL2E); }
| ITFLDPI { append_instructions(FLDPI); }
| ITFLDLG2 { append_instructions(FLDLG2); }
| ITFLDLN2 { append_instructions(FLDLN2); }
| ITFLDZ { append_instructions(FLDZ); }
| ITF2XM1 { append_instructions(F2XM1); }
| ITFYL2X { append_instructions(FYL2X); }
| ITFPTAN { append_instructions(FPTAN); }
| ITFPATAN { append_instructions(FPATAN); }
| ITFXTRACT { append_instructions(FXTRACT); }
| ITFPREM1 { append_instructions(FPREM1); }
| ITFDECSTP { append_instructions(FDECSTP); }
| ITFINCSTP { append_instructions(FINCSTP); }
| ITFPREM { append_instructions(FPREM); }
| ITFYL2XP1 { append_instructions(FYL2XP1); }
| ITFSQRT { append_instructions(FSQRT); }
| ITFSINCOS { append_instructions(FSINCOS); }
| ITFRNDINT { append_instructions(FRNDINT); }
| ITFSCALE { append_instructions(FSCALE); }
| ITFSIN { append_instructions(FSIN); }
| ITFCOS { append_instructions(FCOS); }
| ITINSW { append_instructions(INSW); }
| ITOUTSW { append_instructions(OUTSW); }
| ITCWD { append_instructions(CWD); }
| ITCQO { append_instructions(CQO); }
| ITCBW { append_instructions(CBW); }
| ITCDQE { append_instructions(CDQE); }
| ITINVD { append_instructions(INVD); }
| ITWBINVD { append_instructions(WBINVD); }
| ITUD2 { append_instructions(UD2); }
| ITCLTS { append_instructions(CLTS); }
| ITINAX { append_instructions(INAX); }
| ITIRETQ { append_instructions(IRETQ); }
| ITLODSW { append_instructions(LODSW); }
| ITLODSQ { append_instructions(LODSQ); }
| ITOUTAX { append_instructions(OUTAX); }
| ITRDPMC { append_instructions(RDPMC); }
| ITRDMSR { append_instructions(RDMSR); }
| ITRDTSC { append_instructions(RDTSC); }
| ITSCASW { append_instructions(SCASW); }
| ITSCASQ { append_instructions(SCASQ); }
| ITSTOSW { append_instructions(STOSW); }
| ITSTOSQ { append_instructions(STOSQ); }
| ITWRMSR { append_instructions(WRMSR); }
| ITXLATB { append_instructions(XLATB); }
| ITJMP relative { append_instructions( JMP, D32, REL, $2 ); }
| ITJE relative { append_instructions( JE, D32, REL, $2 ); }
| ITJNE relative { append_instructions( JNE, D32, REL, $2 ); }

View File

@ -1,14 +1,98 @@
set instructions {
{nop}
{retn}
{retf}
{leave}
{lock}
{hlt}
{popf}
{pushf}
{wait}
{clc}
{cld}
{cli}
{stc}
{std}
{sti}
{cmc}
{insb}
{insd}
{outsb}
{outsd}
{cdq}
{cwde}
{inal}
{ineax}
{int3}
{iretd}
{lodsb}
{lodsd}
{outal}
{outeax}
{scasb}
{scasd}
{stosb}
{stosd}
{sysenter}
{sysexit}
{syscall}
{sysret}
{sysexit}
{sysenter}
{leave}
{retf}
{retn}
{pause}
{hlt}
{lock}
{cpuid}
{emms}
{rsm}
{fnop}
{fchs}
{fabs}
{ftst}
{fxam}
{fld1}
{fldl2t}
{fldl2e}
{fldpi}
{fldlg2}
{fldln2}
{fldz}
{f2xm1}
{fyl2x}
{fptan}
{fpatan}
{fxtract}
{fprem1}
{fdecstp}
{fincstp}
{fprem}
{fyl2xp1}
{fsqrt}
{fsincos}
{frndint}
{fscale}
{fsin}
{fcos}
{insw}
{outsw}
{cwd}
{cqo}
{cbw}
{cdqe}
{invd}
{wbinvd}
{ud2}
{clts}
{inax}
{iretq}
{lodsw}
{lodsq}
{outax}
{rdpmc}
{rdmsr}
{rdtsc}
{scasw}
{scasq}
{stosw}
{stosq}
{wrmsr}
{xlatb}
{jmp relative}
{je relative}
{jne relative}
@ -45,7 +129,7 @@ set instructions {
{mov memory register}
{sar register immediate}
}
proc malformed_instruction {i} {
error [format "Instruction {%s} is malformed" [join $i ", "]]
}