Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 12 additions & 1 deletion include/opcode/arc.h
Original file line number Diff line number Diff line change
Expand Up @@ -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. */
Expand Down
123 changes: 71 additions & 52 deletions opcodes/arc-flag-classes.def
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand All @@ -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)
Expand Down Expand Up @@ -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)
28 changes: 14 additions & 14 deletions opcodes/arc64-opc.c
Original file line number Diff line number Diff line change
Expand Up @@ -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.

Expand Down