/* Opcode table for the ARC.
- Copyright (C) 1994-2019 Free Software Foundation, Inc.
+ Copyright (C) 1994-2021 Free Software Foundation, Inc.
Contributed by Claudiu Zissulescu (claziss@synopsys.com)
}
static long long
-extract_rb (unsigned long long insn,
- bfd_boolean * invalid)
+extract_rb (unsigned long long insn,
+ bool *invalid)
{
int value = (((insn >> 12) & 0x07) << 3) | ((insn >> 24) & 0x07);
if (value == 0x3e && invalid)
- *invalid = TRUE; /* A limm operand, it should be extracted in a
+ *invalid = true; /* A limm operand, it should be extracted in a
different way. */
return value;
return insn | ((value & 0x3F) << 6);
}
+static unsigned long long
+insert_rbd (unsigned long long insn,
+ long long value,
+ const char ** errmsg)
+{
+ if (value & 0x01)
+ *errmsg = _("cannot use odd number source register");
+ if (value == 60)
+ *errmsg = _("LP_COUNT register cannot be used as destination register");
+
+ return insn | ((value & 0x07) << 24) | (((value >> 3) & 0x07) << 12);
+}
+
/* Dummy insert ZERO operand function. */
static unsigned long long
}
static long long
-extract_rhv1 (unsigned long long insn,
- bfd_boolean * invalid ATTRIBUTE_UNUSED)
+extract_rhv1 (unsigned long long insn,
+ bool *invalid ATTRIBUTE_UNUSED)
{
int value = ((insn & 0x7) << 3) | ((insn >> 5) & 0x7);
}
static long long
-extract_rhv2 (unsigned long long insn,
- bfd_boolean * invalid ATTRIBUTE_UNUSED)
+extract_rhv2 (unsigned long long insn,
+ bool *invalid ATTRIBUTE_UNUSED)
{
int value = ((insn >> 5) & 0x07) | ((insn & 0x03) << 3);
static long long
extract_r0 (unsigned long long insn ATTRIBUTE_UNUSED,
- bfd_boolean * invalid ATTRIBUTE_UNUSED)
+ bool *invalid ATTRIBUTE_UNUSED)
{
return 0;
}
static long long
extract_r1 (unsigned long long insn ATTRIBUTE_UNUSED,
- bfd_boolean * invalid ATTRIBUTE_UNUSED)
+ bool* invalid ATTRIBUTE_UNUSED)
{
return 1;
}
static long long
extract_r2 (unsigned long long insn ATTRIBUTE_UNUSED,
- bfd_boolean * invalid ATTRIBUTE_UNUSED)
+ bool *invalid ATTRIBUTE_UNUSED)
{
return 2;
}
static long long
extract_r3 (unsigned long long insn ATTRIBUTE_UNUSED,
- bfd_boolean * invalid ATTRIBUTE_UNUSED)
+ bool *invalid ATTRIBUTE_UNUSED)
{
return 3;
}
static long long
extract_sp (unsigned long long insn ATTRIBUTE_UNUSED,
- bfd_boolean * invalid ATTRIBUTE_UNUSED)
+ bool *invalid ATTRIBUTE_UNUSED)
{
return 28;
}
static long long
extract_gp (unsigned long long insn ATTRIBUTE_UNUSED,
- bfd_boolean * invalid ATTRIBUTE_UNUSED)
+ bool *invalid ATTRIBUTE_UNUSED)
{
return 26;
}
static long long
extract_pcl (unsigned long long insn ATTRIBUTE_UNUSED,
- bfd_boolean * invalid ATTRIBUTE_UNUSED)
+ bool *invalid ATTRIBUTE_UNUSED)
{
return 63;
}
static long long
extract_blink (unsigned long long insn ATTRIBUTE_UNUSED,
- bfd_boolean * invalid ATTRIBUTE_UNUSED)
+ bool *invalid ATTRIBUTE_UNUSED)
{
return 31;
}
static long long
extract_ilink1 (unsigned long long insn ATTRIBUTE_UNUSED,
- bfd_boolean * invalid ATTRIBUTE_UNUSED)
+ bool *invalid ATTRIBUTE_UNUSED)
{
return 29;
}
static long long
extract_ilink2 (unsigned long long insn ATTRIBUTE_UNUSED,
- bfd_boolean * invalid ATTRIBUTE_UNUSED)
+ bool *invalid ATTRIBUTE_UNUSED)
{
return 30;
}
}
static long long
-extract_ras (unsigned long long insn,
- bfd_boolean * invalid ATTRIBUTE_UNUSED)
+extract_ras (unsigned long long insn,
+ bool *invalid ATTRIBUTE_UNUSED)
{
int value = insn & 0x07;
}
static long long
-extract_rbs (unsigned long long insn,
- bfd_boolean * invalid ATTRIBUTE_UNUSED)
+extract_rbs (unsigned long long insn,
+ bool *invalid ATTRIBUTE_UNUSED)
{
int value = (insn >> 8) & 0x07;
}
static long long
-extract_rcs (unsigned long long insn,
- bfd_boolean * invalid ATTRIBUTE_UNUSED)
+extract_rcs (unsigned long long insn,
+ bool *invalid ATTRIBUTE_UNUSED)
{
int value = (insn >> 5) & 0x07;
}
static long long
-extract_simm3s (unsigned long long insn,
- bfd_boolean * invalid ATTRIBUTE_UNUSED)
+extract_simm3s (unsigned long long insn,
+ bool *invalid ATTRIBUTE_UNUSED)
{
int value = (insn >> 8) & 0x07;
}
static long long
-extract_rrange (unsigned long long insn,
- bfd_boolean * invalid ATTRIBUTE_UNUSED)
+extract_rrange (unsigned long long insn,
+ bool *invalid ATTRIBUTE_UNUSED)
{
return (insn >> 1) & 0x0F;
}
}
static long long
-extract_fpel (unsigned long long insn,
- bfd_boolean * invalid ATTRIBUTE_UNUSED)
+extract_fpel (unsigned long long insn,
+ bool *invalid ATTRIBUTE_UNUSED)
{
return (insn & 0x0100) ? 27 : -1;
}
}
static long long
-extract_blinkel (unsigned long long insn,
- bfd_boolean * invalid ATTRIBUTE_UNUSED)
+extract_blinkel (unsigned long long insn,
+ bool *invalid ATTRIBUTE_UNUSED)
{
return (insn & 0x0200) ? 31 : -1;
}
}
static long long
-extract_pclel (unsigned long long insn,
- bfd_boolean * invalid ATTRIBUTE_UNUSED)
+extract_pclel (unsigned long long insn,
+ bool *invalid ATTRIBUTE_UNUSED)
{
return (insn & 0x0400) ? 63 : -1;
}
/* mask = 00000000000000000000111111000000. */
static long long
-extract_w6 (unsigned long long insn,
- bfd_boolean * invalid ATTRIBUTE_UNUSED)
+extract_w6 (unsigned long long insn,
+ bool *invalid ATTRIBUTE_UNUSED)
{
int value = 0;
/* mask = 0000011100022000. */
static long long
-extract_g_s (unsigned long long insn,
- bfd_boolean * invalid ATTRIBUTE_UNUSED)
+extract_g_s (unsigned long long insn,
+ bool *invalid ATTRIBUTE_UNUSED)
{
int value = 0;
int signbit = 1 << (6 - 1);
} \
\
static long long \
-extract_nps_3bit_reg_at_##OFFSET##_##NAME \
- (unsigned long long insn, \
- bfd_boolean * invalid ATTRIBUTE_UNUSED) \
+extract_nps_3bit_reg_at_##OFFSET##_##NAME \
+ (unsigned long long insn, \
+ bool *invalid ATTRIBUTE_UNUSED) \
{ \
int value = (insn >> (OFFSET)) & 0x07; \
if (value > 3) \
}
static long long
-extract_nps_bitop_size_2b (unsigned long long insn,
- bfd_boolean * invalid ATTRIBUTE_UNUSED)
+extract_nps_bitop_size_2b (unsigned long long insn,
+ bool *invalid ATTRIBUTE_UNUSED)
{
return 1 << ((insn >> 10) & 0x3);
}
}
static long long
-extract_nps_bitop_uimm8 (unsigned long long insn,
- bfd_boolean * invalid ATTRIBUTE_UNUSED)
+extract_nps_bitop_uimm8 (unsigned long long insn,
+ bool *invalid ATTRIBUTE_UNUSED)
{
return (((insn >> 12) & 0x7) << 5) | (insn & 0x1f);
}
}
static long long
-extract_nps_rflt_uimm6 (unsigned long long insn,
- bfd_boolean * invalid ATTRIBUTE_UNUSED)
+extract_nps_rflt_uimm6 (unsigned long long insn,
+ bool *invalid ATTRIBUTE_UNUSED)
{
return (insn >> 6) & 0x3f;
}
}
static long long
-extract_nps_dst_pos_and_size (unsigned long long insn,
- bfd_boolean * invalid ATTRIBUTE_UNUSED)
+extract_nps_dst_pos_and_size (unsigned long long insn,
+ bool *invalid ATTRIBUTE_UNUSED)
{
return (insn & 0x1f);
}
}
static long long
-extract_nps_cmem_uimm16 (unsigned long long insn,
- bfd_boolean * invalid ATTRIBUTE_UNUSED)
+extract_nps_cmem_uimm16 (unsigned long long insn,
+ bool *invalid ATTRIBUTE_UNUSED)
{
return (NPS_CMEM_HIGH_VALUE << 16) | (insn & 0xffff);
}
}
static long long
-extract_nps_imm_offset (unsigned long long insn,
- bfd_boolean * invalid ATTRIBUTE_UNUSED)
+extract_nps_imm_offset (unsigned long long insn,
+ bool *invalid ATTRIBUTE_UNUSED)
{
return ((insn >> 10) & 0x7) * 16;
}
}
static long long
-extract_nps_imm_entry (unsigned long long insn,
- bfd_boolean * invalid ATTRIBUTE_UNUSED)
+extract_nps_imm_entry (unsigned long long insn,
+ bool *invalid ATTRIBUTE_UNUSED)
{
int imm_entry = ((insn >> 2) & 0x7);
return (1 << (imm_entry + 4));
}
static long long
-extract_nps_size_16bit (unsigned long long insn,
- bfd_boolean * invalid ATTRIBUTE_UNUSED)
+extract_nps_size_16bit (unsigned long long insn,
+ bool *invalid ATTRIBUTE_UNUSED)
{
return ((insn & 0xfc0) >> 6) ? ((insn & 0xfc0) >> 6) : 64;
}
} \
\
static long long \
-extract_nps_##NAME##_pos (unsigned long long insn, \
- bfd_boolean * invalid ATTRIBUTE_UNUSED) \
+extract_nps_##NAME##_pos (unsigned long long insn, \
+ bool *invalid ATTRIBUTE_UNUSED) \
{ \
return ((insn >> SHIFT) & 0x3) * 8; \
}
} \
\
static long long \
-extract_nps_##NAME (unsigned long long insn, \
- bfd_boolean * invalid ATTRIBUTE_UNUSED) \
+extract_nps_##NAME (unsigned long long insn, \
+ bool *invalid ATTRIBUTE_UNUSED) \
{ \
return ((insn >> SHIFT) & ((1 << BITS) - 1)) + BIAS; \
}
MAKE_BIAS_INSERT_EXTRACT_FUNCS (index3,4,7,2,4,0)
static long long
-extract_nps_qcmp_m3 (unsigned long long insn,
- bfd_boolean * invalid)
+extract_nps_qcmp_m3 (unsigned long long insn,
+ bool *invalid)
{
int m3 = (insn >> 5) & 0xf;
if (m3 == 0xf)
- *invalid = TRUE;
+ *invalid = true;
return m3;
}
static long long
-extract_nps_qcmp_m2 (unsigned long long insn,
- bfd_boolean * invalid)
+extract_nps_qcmp_m2 (unsigned long long insn,
+ bool *invalid)
{
- bfd_boolean tmp_invalid = FALSE;
+ bool tmp_invalid = false;
int m2 = (insn >> 15) & 0x1;
int m3 = extract_nps_qcmp_m3 (insn, &tmp_invalid);
if (m2 == 0 && m3 == 0xf)
- *invalid = TRUE;
+ *invalid = true;
return m2;
}
static long long
-extract_nps_qcmp_m1 (unsigned long long insn,
- bfd_boolean * invalid)
+extract_nps_qcmp_m1 (unsigned long long insn,
+ bool *invalid)
{
- bfd_boolean tmp_invalid = FALSE;
+ bool tmp_invalid = false;
int m1 = (insn >> 14) & 0x1;
int m2 = extract_nps_qcmp_m2 (insn, &tmp_invalid);
int m3 = extract_nps_qcmp_m3 (insn, &tmp_invalid);
if (m1 == 0 && m2 == 0 && m3 == 0xf)
- *invalid = TRUE;
+ *invalid = true;
return m1;
}
}
static long long
-extract_nps_calc_entry_size (unsigned long long insn,
- bfd_boolean * invalid ATTRIBUTE_UNUSED)
+extract_nps_calc_entry_size (unsigned long long insn,
+ bool *invalid ATTRIBUTE_UNUSED)
{
unsigned entry_size = (insn >> 8) & 0xf;
return 1 << entry_size;
}
static long long
-extract_nps_bitop_mod4 (unsigned long long insn,
- bfd_boolean * invalid ATTRIBUTE_UNUSED)
+extract_nps_bitop_mod4 (unsigned long long insn,
+ bool *invalid ATTRIBUTE_UNUSED)
{
return ((insn >> 30) & 0x2) | ((insn >> 47) & 0x1);
}
}
static long long
-extract_nps_bitop_dst_pos3_pos4 (unsigned long long insn,
- bfd_boolean * invalid)
+extract_nps_bitop_dst_pos3_pos4 (unsigned long long insn,
+ bool *invalid)
{
if (((insn >> 42) & 0x1f) != ((insn >> 37) & 0x1f))
- *invalid = TRUE;
+ *invalid = true;
return ((insn >> 37) & 0x1f);
}
}
static long long
-extract_nps_bitop_ins_ext (unsigned long long insn,
- bfd_boolean * invalid)
+extract_nps_bitop_ins_ext (unsigned long long insn,
+ bool *invalid)
{
int value = (insn >> 20) & 0x1f;
if (value > 28)
- *invalid = TRUE;
+ *invalid = true;
return value;
}
} \
\
static long long \
-extract_nps_##NAME (unsigned long long insn, \
- bfd_boolean * invalid ATTRIBUTE_UNUSED) \
+extract_nps_##NAME (unsigned long long insn, \
+ bool *invalid ATTRIBUTE_UNUSED) \
{ \
int value = (insn >> SHIFT) & ((1 << BITS) - 1); \
if (value == 0) \
}
static long long
-extract_nps_min_hofs (unsigned long long insn,
- bfd_boolean * invalid ATTRIBUTE_UNUSED)
+extract_nps_min_hofs (unsigned long long insn,
+ bool *invalid ATTRIBUTE_UNUSED)
{
int value = (insn >> 6) & 0xF;
return value * 16;
} \
\
static long long \
-extract_nps_##NAME (unsigned long long insn ATTRIBUTE_UNUSED, \
- bfd_boolean * invalid ATTRIBUTE_UNUSED) \
+extract_nps_##NAME (unsigned long long insn ATTRIBUTE_UNUSED, \
+ bool *invalid ATTRIBUTE_UNUSED) \
{ \
return ARC_NPS400_ADDRTYPE_##VALUE; \
}
static long long
-extract_nps_rbdouble_64 (unsigned long long insn,
- bfd_boolean * invalid)
+extract_nps_rbdouble_64 (unsigned long long insn,
+ bool *invalid)
{
int value1 = (insn >> 43) & 0x1F;
int value2 = (insn >> 48) & 0x1F;
if (value1 != value2)
- *invalid = TRUE;
+ *invalid = true;
return value1;
}
}
static long long int
-extract_nps_misc_imm_offset (unsigned long long insn,
- bfd_boolean * invalid ATTRIBUTE_UNUSED)
+extract_nps_misc_imm_offset (unsigned long long insn,
+ bool *invalid ATTRIBUTE_UNUSED)
{
return ((insn >> 8) & 0x1f) * 4;
}
static long long int
extract_uimm12_20 (unsigned long long insn ATTRIBUTE_UNUSED,
- bfd_boolean * invalid ATTRIBUTE_UNUSED)
+ bool *invalid ATTRIBUTE_UNUSED)
{
int value = 0;
{ F_CLASS_OPTIONAL, { F_ASFAKE, F_NULL}},
#define C_NE (C_AS + 1)
- { F_CLASS_OPTIONAL, { F_NE, F_NULL}},
+ { F_CLASS_REQUIRED, { F_NE, F_NULL}},
/* ARC NPS400 Support: See comment near head of file. */
#define C_NPS_CL (C_NE + 1)
{ 6, 0, 0, ARC_OPERAND_IR | ARC_OPERAND_TRUNCATE, insert_rad, 0 },
#define RCD (RAD_CHK + 1)
{ 6, 6, 0, ARC_OPERAND_IR | ARC_OPERAND_TRUNCATE, insert_rcd, 0 },
+#define RBD (RCD + 1)
+ { 6, 6, 0, ARC_OPERAND_IR | ARC_OPERAND_TRUNCATE, insert_rbd, extract_rb },
+#define RBDdup (RBD + 1)
+ { 6, 12, 0, ARC_OPERAND_IR | ARC_OPERAND_DUPLICATE | ARC_OPERAND_TRUNCATE,
+ insert_rbd, extract_rb },
/* The plain integer register fields. Used by short
instructions. */
-#define RA16 (RCD + 1)
-#define RA_S (RCD + 1)
+#define RA16 (RBDdup + 1)
+#define RA_S (RBDdup + 1)
{ 4, 0, 0, ARC_OPERAND_IR, insert_ras, extract_ras },
#define RB16 (RA16 + 1)
#define RB_S (RA16 + 1)