From 734584c6a75cfba5c3ebf456c3bb03269157536b Mon Sep 17 00:00:00 2001 From: mrb0nk500 Date: Tue, 18 Jan 2022 10:54:23 -0400 Subject: opcode-bitmask-gen: Invert the addressing mode bitmask after all bits have been found, if inverting is enabled. --- opcode-bitmask-gen.c | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/opcode-bitmask-gen.c b/opcode-bitmask-gen.c index c4fa446..f59969f 100644 --- a/opcode-bitmask-gen.c +++ b/opcode-bitmask-gen.c @@ -417,24 +417,28 @@ void set_extension(int *ext, int ext2, int force, const char *reason, ...) { } uint32_t get_addr_mode_bits(const char **list, int *ext) { + const int is_inv = (list[0][0] == '~'); + const uint32_t ext_mask = (AM_ORTHO|AM_ORTHO2|AM_EIND|AM_EIND2|AM_AIND|AM_AINDX|AM_AINDY); const uint32_t max_addr_mode_mask = -(uint32_t)1 >> (32-AMT_LEN); - uint32_t addr_modes = 0; int is_ext = 0; + uint32_t addr_modes = 0; + uint32_t bits = 0; + for (int i = 0; list[i] != NULL; ++i) { - const int is_inv = (list[i][0] == '~'); - const char *str = list[i]+is_inv; - const uint32_t ext_mask = (AM_ORTHO|AM_ORTHO2|AM_EIND|AM_EIND2|AM_AIND|AM_AINDX|AM_AINDY); - uint32_t bits = 0; + const int inv = (!i) ? is_inv : 0; + const char *str = list[i]+inv; for (int j = 0; j < AMT_LEN; ++j) { if (!strcasecmp(str, adrmode[j])) { //printf("i: %i, str: %s, adrmode: %s\n", i, str, adrmode[i]); bits |= (1 << j); } } - is_ext = (bits & ext_mask) ? 1 : is_ext; - addr_modes |= (is_inv) ? ~(bits) & (max_addr_mode_mask & (is_ext) ? -1 : ~ext_mask) : bits; - addr_modes &= (is_ext && (bits & ~(AM_ORTHO|AM_ORTHO2))) ? ~(AM_ORTHO|AM_ORTHO2) : -1; } + + is_ext = (bits & ext_mask) ? 1 : is_ext; + addr_modes |= (is_inv) ? ~(bits) & (max_addr_mode_mask & (is_ext) ? -1 : ~ext_mask) : bits; + addr_modes &= (is_ext && (bits & ~(AM_ORTHO|AM_ORTHO2))) ? ~(AM_ORTHO|AM_ORTHO2) : -1; + if (is_ext) { const int ext2 = (addr_modes & AM_ORTHO) ? ORTHO : EXT; const char *addr_mode_reason = (ext2 == ORTHO) ? "was set to ortho" : "is a base extension addressing mode"; -- cgit v1.2.3-13-gbd6f