On 8/18/20 8:50 AM, Taylor Simpson wrote:
> +extern const char *opcode_names[];
> +
> +extern const char *opcode_reginfo[];
> +extern const char *opcode_rregs[];
> +extern const char *opcode_wregs[];
const char * const
> +extern opcode_encoding_t opcode_encodings[XX_LAST_OPCODE];
const.
> +extern size4u_t
> + opcode_attribs[XX_LAST_OPCODE][(A_ZZ_LASTATTRIB / ATTRIB_WIDTH) + 1];
const.
And using qemu/bitops.h if possible, as discussed earlier vs attribs.h.
> +const char *opcode_short_semantics[] = {
> +#define OPCODE(X) NULL
> +#include "opcodes_def_generated.h"
> +#undef OPCODE
> + NULL
> +};
...
> +#define DEF_SHORTCODE(TAG, SHORTCODE) \
> + opcode_short_semantics[TAG] = #SHORTCODE;
> +#include "shortcode_generated.h"
> +#undef DEF_SHORTCODE
Just initialize opcode_short_semantics with shortcode_generated.h in the first
place. Then you don't need to create a table of NULL and overwrite at startup.
And you can also make the table constant.
> + if (p == NULL) {
> + g_assert_not_reached();
> + return 0;
> + }
I prefer assert(p != NULL) to if (test) { abort(); }, where possible. E.g.
this later one is fine:
> + if (islower(*p)) {
> + return 0;
> + } else if (isupper(*p)) {
> + return 1;
> + } else {
> + g_assert_not_reached();
> + }
r~