#include "hppa-opcode.h"
#include <stdio.h>
extern uint32_t random();
#define RANGE(number) (random() % (number))
#define COIN (RANGE(2))
#define IMM_NUM(range) { int tmp000111000usv = RANGE(range); \
if (tmp000111000usv == 0) \
printf(" %d", tmp000111000usv); \
else \
printf(" %c%d", (COIN) ? '-' : ' ', \
tmp000111000usv); \
}
typedef struct condition_decode {
char condition[4];
} condT;
char *get_cond_str(const condT table[8][2], int c, int f );
const condT c_comp_sub[8][2] = {
{ "", "TR" },
{ "=", "<>" },
{ "<", ">=" },
{ "<=", ">" },
{ "<<", ">>=" },
{ "<<=", ">>" },
{ "SV", "NSV" },
{ "OD", "EV" }
};
const condT c_add[8][2] = {
{ "", "TR" },
{ "=", "<>" },
{ "<", ">=" },
{ "<=", ">" },
{ "NUV", "UV" },
{ "ZNV", "VNZ" },
{ "SV", "NSV" },
{ "OD", "EV" }
};
const condT c_logical[8][2] = {
{ "", "TR" },
{ "=", "<>" },
{ "<", ">=" },
{ "<=", ">" },
{ "???", "???" },
{ "???", "???" },
{ "???", "???" },
{ "OD", "EV" }
};
const condT c_unit[8][2] = {
{ "", "TR" },
{ "???", "???" },
{ "SBZ", "NBZ" },
{ "SHZ", "NHZ" },
{ "SDC", "NDC" },
{ "???", "???" },
{ "SBC", "NBC" },
{ "SHC", "NHC" }
};
const condT c_shift_extract_deposit[8][2] = {
{ "", "???" },
{ "=", "???" },
{ "<", "???" },
{ "OD", "???" },
{ "TR", "???" },
{ "<>", "???" },
{ ">=", "???" },
{ "EV", "???" }
};
char *controlregs[] = { "fir", "psr", "epsr", "dirbase", "db", "fsr" };
#define NCREGS (sizeof controlregs / sizeof controlregs[0])
char *textlabels[] = { "foo", "bar", "baz", "xork" };
#define NTLABELS (sizeof textlabels / sizeof textlabels[0])
char *datalabels[] = { "data1", "data2", "data3", "data4" };
#define NDLABELS (sizeof datalabels / sizeof datalabels[0])
char *fp_cmp_cond[] = {
"false?","false", "true?", "true", "!<=>", "!?>=", "!?<=",
"!<>", "!>=", "!?>", "?<=", "!<=", "!?<", "?>=", "!?=",
"!=t", "<=>", "=t", "?=", "?<", "<=", "!>", "?>", ">=",
"!<", "<>", "!=", "!?", "?", "=", "<", ">"
};
#define NFPCOND (sizeof fp_cmp_cond / sizeof fp_cmp_cond[0])
char *fp_format_str[] = { "sgl", "dbl", "quad" };
#define NFPFMT (sizeof fp_format_str / sizeof fp_format_str[0])
void
main()
{
int i;
const char *arg;
int do_not_nullify = 0;
printf( "\t.text\n%s:", textlabels[0] );
printf("label1:\n");
for ( i = 0; i < NUMOPCODES; ++i )
{
if ( i == (NUMOPCODES/3) )
printf( "%s:", textlabels[1] );
if ( i == (NUMOPCODES/2) )
printf( "%s:", textlabels[2] );
printf( "\t%s", pa_opcodes[i].name );
for ( arg = pa_opcodes[i].args; *arg != '\0'; ++arg )
{
switch( *arg ) {
case '\0':
break;
case '(':
putchar(' ');
case ')':
case ',':
case ' ':
putchar(*arg);
break;
case 'b':
case 'x':
case 't':
case 'v':
case 'E':
case 'X':
case '4':
case '6':
case '7':
case '8':
case '9':
printf(" %%r%d", RANGE(32));
break;
case 'r':
case 'R':
printf(" %d", RANGE(32));
break;
case 'T':
printf(" %d", RANGE(31) + 1);
break;
case '5':
case 'V':
case 'p':
case 'P':
case 'Q':
IMM_NUM(15);
continue;
case 's':
printf(" %d", RANGE(4));
break;
case 'S':
printf(" %%sr%d", RANGE(8));
break;
case 'c':
{
int m, u, i;
m = COIN;
u = COIN;
i = 0;
if (COIN)
while (i < 2) {
if (m==1 && u==1) {
printf(",sm");
i++;
}
else if (m==1)
printf(",m");
else if (u==1)
printf(",s");
else {
printf(",sm");
i++;
}
i++;
}
continue;
}
case 'C':
if (COIN)
if (COIN)
printf(",mb");
else
printf(",ma");
continue;
case 'Y':
{
int i = 0, m, a;
while ( i < 2 ) {
m = COIN;
a = COIN;
if (m==1)
printf(",m");
else if (a==0)
printf(",b");
else if (a==1)
printf(",e");
i++;
}
continue;
}
case '<':
{
int cmpltr;
do {
cmpltr = RANGE(4);
} while (cmpltr == 0);
printf(",%s", get_cond_str(c_comp_sub, cmpltr, 0));
}
continue;
case '?':
case '-':
{
int flag, cmpltr;
char *tmp;
do {
flag = COIN;
cmpltr = RANGE(8);
} while ((flag & cmpltr) == 0 || (cmpltr == 0));
tmp = get_cond_str(c_comp_sub, cmpltr, flag);
if (*tmp != '\0')
printf(",%s", tmp);
}
continue;
case '+':
case '!':
{
int flag, cmpltr;
char *tmp;
do {
flag = COIN;
cmpltr = RANGE(8);
} while ((flag & cmpltr) == 0 || (cmpltr == 0));
tmp = get_cond_str(c_add, cmpltr, flag);
if (COIN && (*tmp != '\0')) {
printf(",%s", tmp);
if (COIN) {
printf(",n ");
do_not_nullify = 1;
}
}
}
continue;
case '&':
{
int flag, cmpltr;
char *tmp;
flag = COIN;
do {
cmpltr = RANGE(8);
} while (cmpltr == 4 || cmpltr == 5 || cmpltr == 6);
tmp = get_cond_str(c_logical, cmpltr, flag);
if (COIN && (*tmp != '\0'))
printf(",%s", tmp);
}
continue;
case 'U':
{
int flag, cmpltr;
char *tmp;
flag = COIN;
do {
cmpltr = RANGE(8);
} while (cmpltr == 1 || cmpltr == 5);
tmp = get_cond_str(c_unit, cmpltr, flag);
if (COIN && (*tmp != '\0'))
printf(",%s", tmp);
}
continue;
case '>':
{
int cmpltr;
char *tmp;
cmpltr = RANGE(8);
tmp = get_cond_str(c_shift_extract_deposit, cmpltr, 0);
if (COIN && (*tmp != '\0'))
printf(",%s", tmp);
}
continue;
case '~':
if (COIN)
printf(",<");
else
printf(",>=");
continue;
case 'i':
IMM_NUM(1024);
continue;
case 'j':
case 'a':
{
int field_selector = RANGE(3);
switch (field_selector) {
case 2:
printf(" R`");
break;
case 1:
printf(" L`");
break;
default:
break;
}
IMM_NUM(8192);
continue;
}
case 'k':
{
int field_selector = RANGE(3);
switch (field_selector) {
case 2:
printf(" R`");
break;
case 1:
printf(" L`");
break;
default:
break;
}
IMM_NUM(1048576);
continue;
}
case 'n':
if (!do_not_nullify)
if (COIN)
printf(",n");
else
do_not_nullify = 0;
continue;
case 'w':
IMM_NUM(2048);
continue;
case 'W':
case '@':
case 'z':
IMM_NUM(65536);
continue;
case 'B':
if (COIN)
printf(" %d,", RANGE(4));
printf(" %%r%d", RANGE(32));
break;
case 'A':
printf(" %d", RANGE(4096));
continue;
case 'Z':
if (COIN)
printf(",M");
continue;
case 'D':
IMM_NUM(33554432);
continue;
case 'f':
case 'u':
printf("%d", RANGE(8));
continue;
case 'O':
printf("%d", RANGE(1048576));
continue;
case 'o':
case '1':
printf("%d", RANGE(32768));
continue;
case '2':
printf("%d", RANGE(4194304));
continue;
case '0':
printf("%d", RANGE(1024));
continue;
case 'G':
case 'F':
printf(",%s", fp_format_str[RANGE(NFPFMT)]);
continue;
case 'M':
printf(",%s", fp_cmp_cond[RANGE(NFPCOND)]);
continue;
#if 0
case 'H':
f = pa_parse_fp_format(&s);
switch (f) {
case SGL:
opcode |= 0x20;
case DBL:
the_insn.fpof1 = f;
continue;
case QUAD:
case ILLEGAL_FMT:
default:
as_bad("Illegal Floating Point Operand Format for"
"this instruction: '%s'",*s);
}
break;
default:
abort();
#endif
}
}
putchar( '\n' );
}
printf("label2:\n");
printf( "%s:\n", textlabels[3] );
printf( "\t.data\n" );
printf( "data1: .space 1024\n" );
printf( "data2: .space 1024\n" );
printf( "data3: .space 1024\n" );
printf( "data4: .space 1024\n" );
}
char *get_cond_str(const condT table[8][2], int c, int f )
{
return (c<0 || c>7 || f<0 || f>1)
? (char *)NULL : table[c][f].condition ;
}