instruction listing

This commit is contained in:
corey 2023-10-23 14:36:03 -05:00
parent 8b57757479
commit 418ae61c54
3 changed files with 115 additions and 1 deletions

1
.gitignore vendored
View File

@ -1,3 +1,4 @@
*.o
par
libpar.a
listing

View File

@ -33,4 +33,4 @@ install_vimfiles:
tests: $(TESTS_x86_64) FORCE
./tests/run_tests.sh tests
clean:
$(RM) a.out *.o $(OBJS) par libpar.a $(TESTS_x86_64)
$(RM) a.out *.o $(OBJS) par libpar.a $(TESTS_x86_64) listing

113
listing.c Normal file
View File

@ -0,0 +1,113 @@
/*******
* 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);
}
}
}