diff --git a/simplify.c b/simplify.c index 3f39819..6e113d9 100644 --- a/simplify.c +++ b/simplify.c @@ -438,22 +438,24 @@ static int compare_opcode(int opcode, int inverse) static int compare_swap(int opcode) { - switch (opcode) { - case OP_SET_EQ: return OP_SET_EQ; - case OP_SET_NE: return OP_SET_NE; - - case OP_SET_LT: return OP_SET_GT; - case OP_SET_LE: return OP_SET_GE; - case OP_SET_GT: return OP_SET_LT; - case OP_SET_GE: return OP_SET_LE; - - case OP_SET_A: return OP_SET_B; - case OP_SET_AE: return OP_SET_BE; - case OP_SET_B: return OP_SET_A; - case OP_SET_BE: return OP_SET_AE; - default: - return opcode; - } + +#define CMP_OFFSET(opcode) ((opcode) - OP_BINCMP) + static const int swap_opcodes[CMP_OFFSET(OP_BINCMP_END) + 1] = { + [CMP_OFFSET(OP_SET_EQ)] = OP_SET_EQ, + [CMP_OFFSET(OP_SET_NE)] = OP_SET_NE, + + [CMP_OFFSET(OP_SET_LT)] = OP_SET_GT, + [CMP_OFFSET(OP_SET_GT)] = OP_SET_LT, + [CMP_OFFSET(OP_SET_LE)] = OP_SET_GE, + [CMP_OFFSET(OP_SET_GE)] = OP_SET_LE, + + [CMP_OFFSET(OP_SET_A)] = OP_SET_B, + [CMP_OFFSET(OP_SET_B)] = OP_SET_A, + [CMP_OFFSET(OP_SET_AE)] = OP_SET_BE, + [CMP_OFFSET(OP_SET_BE)] = OP_SET_AE, + }; + assert(opcode >= OP_BINCMP && opcode <= OP_BINCMP_END); + return swap_opcodes[CMP_OFFSET(opcode)]; } static int simplify_seteq_setne(struct instruction *insn, long long value)