instruction listing
This commit is contained in:
parent
8b57757479
commit
418ae61c54
1
.gitignore
vendored
1
.gitignore
vendored
|
@ -1,3 +1,4 @@
|
|||
*.o
|
||||
par
|
||||
libpar.a
|
||||
listing
|
||||
|
|
2
Makefile
2
Makefile
|
@ -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
113
listing.c
Normal 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);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
Loading…
Reference in New Issue
Block a user