diff --git a/include/opcode/arc.h b/include/opcode/arc.h index 118948fb124..03153577407 100644 --- a/include/opcode/arc.h +++ b/include/opcode/arc.h @@ -144,7 +144,18 @@ typedef enum F_CLASS_ZZ = (1 << 5), /* Implicit flag. */ - F_CLASS_IMPLICIT = (1 << 6) + F_CLASS_IMPLICIT = (1 << 6), + + /* Non effect flags. Do not remove. + * This flags are used in QEMU since those describe the semantics + * of the instructions. + */ + F_CLASS_AS = (1 << 15), + F_CLASS_F = (1 << 15), + F_CLASS_D = (1 << 15), + F_CLASS_DI = (1 << 15), + F_CLASS_X = (1 << 15), + } flag_class_t; /* The opcode table is an array of struct arc_opcode. */ diff --git a/opcodes/arc-flag-classes.def b/opcodes/arc-flag-classes.def index 04a8a1e552f..593f1fcc2bc 100644 --- a/opcodes/arc-flag-classes.def +++ b/opcodes/arc-flag-classes.def @@ -21,8 +21,8 @@ Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. */ FLAG_CLASS(EMPTY, F_CLASS_NONE, 0, 0, F_NULL) -FLAG_CLASS(CC_EQ, F_CLASS_IMPLICIT | F_CLASS_COND, 0, 0 , F_EQUAL) -FLAG_CLASS(CC_GE, F_CLASS_IMPLICIT | F_CLASS_COND, 0, 0 , F_GE) +FLAG_CLASS(CC_EQ, F_CLASS_IMPLICIT | F_CLASS_COND, 0, 0, F_EQUAL) +FLAG_CLASS(CC_GE, F_CLASS_IMPLICIT | F_CLASS_COND, 0, 0, F_GE) FLAG_CLASS(CC_GT, F_CLASS_IMPLICIT | F_CLASS_COND, 0, 0, F_GT) FLAG_CLASS(CC_HI, F_CLASS_IMPLICIT | F_CLASS_COND, 0, 0, F_HI) FLAG_CLASS(CC_HS, F_CLASS_IMPLICIT | F_CLASS_COND, 0, 0, F_NOTCARRY) @@ -41,51 +41,75 @@ FLAG_CLASS(ZZ_W, F_CLASS_IMPLICIT | F_CLASS_ZZ, 0, 0, F_SIZEW) FLAG_CLASS(ZZ_H, F_CLASS_IMPLICIT | F_CLASS_ZZ, 0, 0, F_H1) FLAG_CLASS(ZZ_B, F_CLASS_IMPLICIT | F_CLASS_ZZ, 0, 0, F_SIZEB1) -FLAG_CLASS(CC, F_CLASS_OPTIONAL | F_CLASS_EXTEND | F_CLASS_COND, 0, 0, F_ALWAYS, F_RA, F_EQUAL, F_ZERO, F_NOTEQUAL, F_NOTZERO, F_POZITIVE, F_PL, F_NEGATIVE, F_MINUS, F_CARRY, F_CARRYSET, F_LOWER, F_CARRYCLR, F_NOTCARRY, F_HIGHER, F_OVERFLOWSET, F_OVERFLOW, F_NOTOVERFLOW, F_OVERFLOWCLR, F_GT, F_GE, F_LT, F_LE, F_HI, F_LS, F_PNZ, F_NJ, F_NM, F_NO_T) - -FLAG_CLASS(AA_ADDR3, F_CLASS_OPTIONAL | F_CLASS_WB, 0, 0, F_A3, F_AW3, F_AB3, F_AS3) -FLAG_CLASS(AA27, F_CLASS_OPTIONAL | F_CLASS_WB, 0, 0, F_A3, F_AW3, F_AB3, F_AS3) -FLAG_CLASS(AS27, F_CLASS_OPTIONAL, 0, 0, F_AS3) -FLAG_CLASS(AA_ADDR9, F_CLASS_OPTIONAL | F_CLASS_WB, 0, 0, F_A9, F_AW9, F_AB9, F_AS9) -FLAG_CLASS(AA21, F_CLASS_OPTIONAL | F_CLASS_WB, 0, 0, F_A9, F_AW9, F_AB9, F_AS9) -FLAG_CLASS(AAB21, F_CLASS_OPTIONAL | F_CLASS_WB, 0, 0, F_A9, F_AW9, F_AB9) -FLAG_CLASS(AA_ADDR22, F_CLASS_OPTIONAL | F_CLASS_WB, 0, 0, F_A22, F_AW22, F_AB22, F_AS22) -FLAG_CLASS(AA8, F_CLASS_OPTIONAL | F_CLASS_WB, 0, 0, F_A22, F_AW22, F_AB22, F_AS22) -FLAG_CLASS(AAB8, F_CLASS_OPTIONAL | F_CLASS_WB, 0, 0, F_A22, F_AW22, F_AB22) - -FLAG_CLASS(F, F_CLASS_OPTIONAL, 0, 0, F_FLAG) -FLAG_CLASS(FHARD, F_CLASS_OPTIONAL, 0, 0, F_FFAKE) - -FLAG_CLASS(RL, F_CLASS_OPTIONAL, 0, 0, F_RL) -FLAG_CLASS(AQ, F_CLASS_OPTIONAL, 0, 0, F_AQ) - -FLAG_CLASS(ATOP, F_CLASS_REQUIRED, 0, 0, F_ATO_ADD, F_ATO_OR, F_ATO_AND, F_ATO_XOR, F_ATO_MINU, F_ATO_MAXU, F_ATO_MIN, F_ATO_MAX) - -FLAG_CLASS(T, F_CLASS_OPTIONAL, 0, 0, F_NT, F_T) -FLAG_CLASS(D, F_CLASS_OPTIONAL, 0, 0, F_ND, F_D) -FLAG_CLASS(DNZ_D, F_CLASS_OPTIONAL, 0, 0, F_DNZ_ND, F_DNZ_D) - -FLAG_CLASS(DHARD, F_CLASS_OPTIONAL, 0, 0, F_DFAKE) - -FLAG_CLASS(DI20, F_CLASS_OPTIONAL, 0, 0, F_DI11) -FLAG_CLASS(DI14, F_CLASS_OPTIONAL, 0, 0, F_DI14) -FLAG_CLASS(DI16, F_CLASS_OPTIONAL, 0, 0, F_DI15) -FLAG_CLASS(DI26, F_CLASS_OPTIONAL, 0, 0, F_DI5) - -FLAG_CLASS(X25, F_CLASS_OPTIONAL, 0, 0, F_SIGN6) -FLAG_CLASS(X15, F_CLASS_OPTIONAL, 0, 0, F_SIGN16) -FLAG_CLASS(XHARD, F_CLASS_OPTIONAL, 0, 0, F_SIGNX) -FLAG_CLASS(X, F_CLASS_OPTIONAL, 0, 0, F_SIGNX) - -FLAG_CLASS(ZZ13, F_CLASS_OPTIONAL, 0, 0, F_SIZEB17, F_SIZEW17, F_H17) -FLAG_CLASS(ZZ23, F_CLASS_OPTIONAL, 0, 0, F_SIZEB7, F_SIZEW7, F_H7) -FLAG_CLASS(ZZ29, F_CLASS_OPTIONAL, 0, 0, F_SIZEB1, F_SIZEW1, F_H1) -FLAG_CLASS(ZZW6, F_CLASS_OPTIONAL, 0, 0, F_SIZEB1) -FLAG_CLASS(ZZH1, F_CLASS_OPTIONAL, 0, 0, F_SIZEW1, F_H1) - -FLAG_CLASS(AS, F_CLASS_OPTIONAL, 0, 0, F_ASFAKE) -FLAG_CLASS(AAHARD13, F_CLASS_OPTIONAL, 0, 0, F_ASFAKE) -FLAG_CLASS(NE, F_CLASS_REQUIRED, 0, 0, F_NE) +FLAG_CLASS(CC, F_CLASS_OPTIONAL | F_CLASS_EXTEND | F_CLASS_COND, + 0, 0, F_ALWAYS, F_RA, F_EQUAL, F_ZERO, F_NOTEQUAL, + F_NOTZERO, F_POZITIVE, F_PL, F_NEGATIVE, F_MINUS, + F_CARRY, F_CARRYSET, F_LOWER, F_CARRYCLR, + F_NOTCARRY, F_HIGHER, F_OVERFLOWSET, F_OVERFLOW, + F_NOTOVERFLOW, F_OVERFLOWCLR, F_GT, F_GE, F_LT, + F_LE, F_HI, F_LS, F_PNZ, F_NJ, F_NM, F_NO_T) + +FLAG_CLASS(AA_ADDR3, F_CLASS_OPTIONAL | F_CLASS_WB, 0, 0, F_A3, F_AW3, F_AB3, F_AS3) +FLAG_CLASS(AA27, F_CLASS_OPTIONAL | F_CLASS_WB, 0, 0, F_A3, F_AW3, F_AB3, F_AS3) +FLAG_CLASS(AS27, F_CLASS_OPTIONAL | F_CLASS_AS, 0, 0, F_AS3) + +FLAG_CLASS(AA_ADDR9, F_CLASS_OPTIONAL | F_CLASS_WB, 0, 0, F_A9, F_AW9, F_AB9, F_AS9) +FLAG_CLASS(AA21, F_CLASS_OPTIONAL | F_CLASS_WB, 0, 0, F_A9, F_AW9, F_AB9, F_AS9) +FLAG_CLASS(AAB21, F_CLASS_OPTIONAL | F_CLASS_WB, 0, 0, F_A9, F_AW9, F_AB9) + +FLAG_CLASS(AA_ADDR22, F_CLASS_OPTIONAL | F_CLASS_WB, 0, 0, F_A22, F_AW22, F_AB22, F_AS22) +FLAG_CLASS(AA8, F_CLASS_OPTIONAL | F_CLASS_WB, 0, 0, F_A22, F_AW22, F_AB22, F_AS22) +FLAG_CLASS(AAB8, F_CLASS_OPTIONAL | F_CLASS_WB, 0, 0, F_A22, F_AW22, F_AB22) + +FLAG_CLASS(F, F_CLASS_OPTIONAL | F_CLASS_F, 0, 0, F_FLAG) +FLAG_CLASS(FHARD, F_CLASS_OPTIONAL | F_CLASS_F, 0, 0, F_FFAKE) + +FLAG_CLASS(RL, F_CLASS_OPTIONAL, 0, 0, F_RL) +FLAG_CLASS(AQ, F_CLASS_OPTIONAL, 0, 0, F_AQ) + +FLAG_CLASS(ATOP, F_CLASS_REQUIRED, 0, 0, F_ATO_ADD, F_ATO_OR, F_ATO_AND, + F_ATO_XOR, F_ATO_MINU, F_ATO_MAXU, + F_ATO_MIN, F_ATO_MAX) + +FLAG_CLASS(T, F_CLASS_OPTIONAL, 0, 0, F_NT, F_T) +FLAG_CLASS(D, F_CLASS_OPTIONAL | F_CLASS_D, 0, 0, F_ND, F_D) +FLAG_CLASS(DNZ_D, F_CLASS_OPTIONAL | F_CLASS_D, 0, 0, F_DNZ_ND, F_DNZ_D) +FLAG_CLASS(DHARD, F_CLASS_OPTIONAL | F_CLASS_D, 0, 0, F_DFAKE) + +FLAG_CLASS(DI20, F_CLASS_OPTIONAL | F_CLASS_DI, 0, 0, F_DI11) +FLAG_CLASS(DI14, F_CLASS_OPTIONAL | F_CLASS_DI, 0, 0, F_DI14) +FLAG_CLASS(DI16, F_CLASS_OPTIONAL | F_CLASS_DI, 0, 0, F_DI15) +FLAG_CLASS(DI26, F_CLASS_OPTIONAL | F_CLASS_DI, 0, 0, F_DI5) + +FLAG_CLASS(X25, F_CLASS_OPTIONAL | F_CLASS_X, 0, 0, F_SIGN6) +FLAG_CLASS(X15, F_CLASS_OPTIONAL | F_CLASS_X, 0, 0, F_SIGN16) + +FLAG_CLASS(XHARD, F_CLASS_OPTIONAL | F_CLASS_X, 0, 0, F_SIGNX) +FLAG_CLASS(X, F_CLASS_OPTIONAL | F_CLASS_X, 0, 0, F_SIGNX) + +FLAG_CLASS(ZZ13, F_CLASS_OPTIONAL | F_CLASS_ZZ, 0, 0, F_SIZEB17, F_SIZEW17, F_H17) +FLAG_CLASS(ZZ23, F_CLASS_OPTIONAL | F_CLASS_ZZ, 0, 0, F_SIZEB7, F_SIZEW7, F_H7) +FLAG_CLASS(ZZ29, F_CLASS_OPTIONAL | F_CLASS_ZZ, 0, 0, F_SIZEB1, F_SIZEW1, F_H1) +FLAG_CLASS(ZZW6, F_CLASS_OPTIONAL | F_CLASS_ZZ, 0, 0, F_SIZEB1) +FLAG_CLASS(ZZH1, F_CLASS_OPTIONAL | F_CLASS_ZZ, 0, 0, F_SIZEW1, F_H1) + +FLAG_CLASS(AS, F_CLASS_OPTIONAL | F_CLASS_AS, 0, 0, F_ASFAKE) +FLAG_CLASS(AAHARD13, F_CLASS_OPTIONAL | F_CLASS_AS, 0, 0, F_ASFAKE) +FLAG_CLASS(NE, F_CLASS_REQUIRED | F_CLASS_COND, 0, 0, F_NE) + +FLAG_CLASS(FPCC, F_CLASS_OPTIONAL | F_CLASS_EXTEND | F_CLASS_COND, + insert_fs2, extract_fs2, + F_ALWAYS, F_RA, F_EQUAL, F_ZERO, F_NOTEQUAL, + F_NOTZERO, F_POZITIVE, F_PL, F_NEGATIVE, F_MINUS, + F_CARRY, F_CARRYSET, F_LOWER, F_CARRYCLR, + F_NOTCARRY, F_HIGHER, F_OVERFLOWSET, F_OVERFLOW, + F_NOTOVERFLOW, F_OVERFLOWCLR, F_GT, F_GE, F_LT, + F_LE, F_HI, F_LS, F_PNZ, F_NJ, F_NM, F_NO_T) + +FLAG_CLASS(AA_128, F_CLASS_OPTIONAL | F_CLASS_WB, 0, 0, F_AA128, F_AA128W, F_AA128B, F_AA128S) +FLAG_CLASS(AS_128, F_CLASS_OPTIONAL | F_CLASS_AS, 0, 0, F_AA128S) +FLAG_CLASS(AA_128S, F_CLASS_OPTIONAL | F_CLASS_WB, insert_qq, extract_qq, F_AA128, F_AA128W, F_AA128B, F_AA128S) +FLAG_CLASS(AS_128S, F_CLASS_OPTIONAL | F_CLASS_AS, insert_qq, extract_qq, F_AA128S) /* ARC NPS400 Support: See comment near head of file. */ FLAG_CLASS(NPS_CL, F_CLASS_REQUIRED, 0, 0, F_NPS_CL) @@ -118,8 +142,3 @@ FLAG_CLASS(NPS_CLSR, F_CLASS_REQUIRED, 0, 0, F_NPS_CLSR) FLAG_CLASS(NPS_ALL, F_CLASS_REQUIRED, 0, 0, F_NPS_ALL) FLAG_CLASS(NPS_GIC, F_CLASS_REQUIRED, 0, 0, F_NPS_GIC) FLAG_CLASS(NPS_RSPI_GIC, F_CLASS_REQUIRED, 0, 0, F_NPS_RSPI_GIC) -FLAG_CLASS(FPCC, F_CLASS_OPTIONAL | F_CLASS_EXTEND | F_CLASS_COND, insert_fs2, extract_fs2, F_ALWAYS, F_RA, F_EQUAL, F_ZERO, F_NOTEQUAL, F_NOTZERO, F_POZITIVE, F_PL, F_NEGATIVE, F_MINUS, F_CARRY, F_CARRYSET, F_LOWER, F_CARRYCLR, F_NOTCARRY, F_HIGHER, F_OVERFLOWSET, F_OVERFLOW, F_NOTOVERFLOW, F_OVERFLOWCLR, F_GT, F_GE, F_LT, F_LE, F_HI, F_LS, F_PNZ, F_NJ, F_NM, F_NO_T) -FLAG_CLASS(AA_128, F_CLASS_OPTIONAL | F_CLASS_WB, 0, 0, F_AA128, F_AA128W, F_AA128B, F_AA128S) -FLAG_CLASS(AS_128, F_CLASS_OPTIONAL, 0, 0, F_AA128S) -FLAG_CLASS(AA_128S, F_CLASS_OPTIONAL | F_CLASS_WB, insert_qq, extract_qq, F_AA128, F_AA128W, F_AA128B, F_AA128S) -FLAG_CLASS(AS_128S, F_CLASS_OPTIONAL, insert_qq, extract_qq, F_AA128S) diff --git a/opcodes/arc64-opc.c b/opcodes/arc64-opc.c index c1c601683a0..ae3871ce0d9 100644 --- a/opcodes/arc64-opc.c +++ b/opcodes/arc64-opc.c @@ -506,21 +506,21 @@ */ #define STL \ { "stl", STL_ENCODING (0), MSK_STL, ARC_OPCODE_ARC64, STORE, NONE, \ - { RC, BRAKET, RB, SIMM9_8, BRAKETdup }, { C_AA27 }}, \ + { RC, BRAKET, RB, SIMM9_8, BRAKETdup }, { C_ZZ_L, C_AA27 }}, \ { "stl", STL_ENCODING (1), MSK_STL, ARC_OPCODE_ARC64, STORE, NONE, \ - { W6, BRAKET, RB, SIMM9_8, BRAKETdup }, { C_AA27 }}, \ - { "stl", STL_ASYM_ENCODING (0, 60), 0xFFFFF03F, ARC_OPCODE_ARC64, STORE, \ - NONE, { RC, BRAKET, XIMM, BRAKETdup }, { C_AS27 }}, \ - { "stl", STL_ASYM_ENCODING (1, 60), 0xFFFFF03F, ARC_OPCODE_ARC64, STORE, \ - NONE, { W6, BRAKET, XIMM, BRAKETdup }, { C_AS27 }}, \ - { "stl", STL_ASYM_ENCODING (0, 62), 0xFFFFF03F, ARC_OPCODE_ARC64, STORE, \ - NONE, { RC, BRAKET, LIMM, BRAKETdup }, { C_AS27 }}, \ - { "stl", STL_ASYM_ENCODING (1, 62), 0xFFFFF03F, ARC_OPCODE_ARC64, STORE, \ - NONE, { W6, BRAKET, LIMM, BRAKETdup }, { C_AS27 }}, \ - { "stl", STL_DSYM_ENCODING (60), 0xF8000FC7, ARC_OPCODE_ARC64, STORE, \ - NONE, { XIMM, BRAKET, RB, SIMM9_8, BRAKETdup }, { C_AA27 }}, \ - { "stl", STL_DSYM_ENCODING (62), 0xF8000FC7, ARC_OPCODE_ARC64, STORE, \ - NONE, { LIMM, BRAKET, RB, SIMM9_8, BRAKETdup }, { C_AA27 }}, + { W6, BRAKET, RB, SIMM9_8, BRAKETdup }, { C_ZZ_L, C_AA27 }}, \ + { "stl", STL_ASYM_ENCODING (0, 60), 0xFFFFF03F, ARC_OPCODE_ARC64, STORE, \ + NONE, { RC, BRAKET, XIMM, BRAKETdup }, { C_ZZ_L, C_AS27 }}, \ + { "stl", STL_ASYM_ENCODING (1, 60), 0xFFFFF03F, ARC_OPCODE_ARC64, STORE, \ + NONE, { W6, BRAKET, XIMM, BRAKETdup }, { C_ZZ_L, C_AS27 }}, \ + { "stl", STL_ASYM_ENCODING (0, 62), 0xFFFFF03F, ARC_OPCODE_ARC64, STORE, \ + NONE, { RC, BRAKET, LIMM, BRAKETdup }, { C_ZZ_L, C_AS27 }}, \ + { "stl", STL_ASYM_ENCODING (1, 62), 0xFFFFF03F, ARC_OPCODE_ARC64, STORE, \ + NONE, { W6, BRAKET, LIMM, BRAKETdup }, { C_ZZ_L, C_AS27 }}, \ + { "stl", STL_DSYM_ENCODING (60), 0xF8000FC7, ARC_OPCODE_ARC64, STORE, \ + NONE, { XIMM, BRAKET, RB, SIMM9_8, BRAKETdup }, { C_ZZ_L, C_AA27 }}, \ + { "stl", STL_DSYM_ENCODING (62), 0xF8000FC7, ARC_OPCODE_ARC64, STORE, \ + NONE, { LIMM, BRAKET, RB, SIMM9_8, BRAKETdup }, { C_ZZ_L, C_AA27 }}, /* The opcode table.