114 lines
2.7 KiB
C
114 lines
2.7 KiB
C
/*******
|
|
* Create listing of all
|
|
* possible instructions
|
|
*******/
|
|
|
|
#include<stdio.h>
|
|
#include<stdint.h>
|
|
#include<stdbool.h>
|
|
#include<string.h>
|
|
#include<ctype.h>
|
|
|
|
// Addressing modes
|
|
#define AM_REGTOREG 0x001
|
|
#define AM_IMMTOREG 0x002
|
|
#define AM_MEMTOREG 0x004
|
|
#define AM_REGTOMEM 0x008
|
|
#define AM_IMMTOMEM 0x010
|
|
#define AM_MEMTOMEM 0x020
|
|
#define AM_NONE 0x040
|
|
#define AM_ABSOLUTE 0x080
|
|
#define AM_INDIRECT 0x100
|
|
#define AM_REGISTER 0x200
|
|
|
|
typedef struct
|
|
{
|
|
char*name;
|
|
size_t n_ops;
|
|
} Insn;
|
|
|
|
int main(void)
|
|
{
|
|
bool print_csv=false;
|
|
bool print_listing=true;
|
|
|
|
Insn insns[]={
|
|
{"mov",AM_REGTOREG},
|
|
{"add",AM_REGTOREG},
|
|
{"sub",AM_REGTOREG},
|
|
{"mul",AM_REGTOREG},
|
|
{"div",AM_REGTOREG},
|
|
{"adc",AM_REGTOREG},
|
|
{"shr",AM_REGTOREG},
|
|
{"shl",AM_REGTOREG},
|
|
{"call",AM_NONE},
|
|
{"jmp",AM_ABSOLUTE},
|
|
{"jz",AM_ABSOLUTE},
|
|
{"jnz",AM_ABSOLUTE|AM_INDIRECT},
|
|
{"ret",AM_NONE},
|
|
};
|
|
char*addrmodes[]={ "reg-to-reg", "imm-to-reg", "mem-to-reg", "reg-to-mem", "imm-to-mem", "mem-to-mem", "implicit", "absolute", "indirect", };
|
|
char*genregs[]={ "r1", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15", "r16", };
|
|
/* char*regs[]={"pc", "sf", "sp",}; */
|
|
|
|
size_t n_insns=sizeof(insns)/sizeof(Insn);
|
|
size_t n_addrmodes=sizeof(addrmodes)/sizeof(char*);
|
|
size_t n_genregs=sizeof(genregs)/sizeof(char*);
|
|
/* size_t n_regs=sizeof(regs)/sizeof(char*); */
|
|
|
|
size_t total_instructions=0;
|
|
|
|
// Print headers
|
|
if(print_csv)
|
|
{
|
|
printf("insn%s ",(print_csv?",":""));
|
|
for(size_t i=0;i<n_addrmodes;++i)
|
|
{
|
|
printf("%s",addrmodes[i]);
|
|
if(i<n_addrmodes-1)
|
|
printf("%s ",(print_csv?",":""));
|
|
}
|
|
printf("\n");
|
|
|
|
// Print number of general registers per addressing mode
|
|
for(size_t i=0;i<n_insns;++i)
|
|
{
|
|
printf("%s%s ",insns[i].name,(print_csv?",":""));
|
|
for(size_t j=0;j<n_addrmodes;++j)
|
|
{
|
|
printf("%lu",n_genregs);
|
|
total_instructions+=n_genregs;
|
|
if(j<n_addrmodes-1)
|
|
printf("%s ",(print_csv?",":""));
|
|
}
|
|
printf("\n");
|
|
}
|
|
|
|
printf("\"total_instructions: %lu\"\n",total_instructions);
|
|
printf("\"n_genregs * n_addrmodes: %lu\"\n",n_genregs*n_addrmodes);
|
|
|
|
}
|
|
|
|
// Print all possible instructions and operands
|
|
if(print_listing)
|
|
{
|
|
for(size_t i=0;i<n_insns;++i)
|
|
{
|
|
if(insns[i].n_ops&AM_REGTOREG)
|
|
for(size_t j=0;j<n_genregs;++j)
|
|
for(size_t k=0;k<n_genregs;++k)
|
|
printf("%s %s, %s\n",insns[i].name,genregs[j],genregs[k]);
|
|
if(insns[i].n_ops&AM_REGISTER)
|
|
for(size_t j=0;j<n_genregs;++j)
|
|
printf("%s %s\n",insns[i].name,genregs[j]);
|
|
if(insns[i].n_ops&AM_ABSOLUTE)
|
|
printf("%s ADDR64\n",insns[i].name);
|
|
if(insns[i].n_ops&AM_INDIRECT)
|
|
printf("%s [ADDR64]\n",insns[i].name);
|
|
if(insns[i].n_ops&AM_NONE)
|
|
printf("%s\n",insns[i].name);
|
|
}
|
|
}
|
|
|
|
}
|