Index: bfd/cpu-ia64-opc.c |
diff --git a/bfd/cpu-ia64-opc.c b/bfd/cpu-ia64-opc.c |
index b797e4413ec514d5e91cd66f4f6e3f058e1bb117..dcc318e679d57ed506e20146f2cc0d42c0de20ec 100644 |
--- a/bfd/cpu-ia64-opc.c |
+++ b/bfd/cpu-ia64-opc.c |
@@ -380,6 +380,46 @@ ext_cnt2c (const struct ia64_operand *self, ia64_insn code, ia64_insn *valuep) |
} |
static const char* |
+ins_cnt6a (const struct ia64_operand *self, ia64_insn value, |
+ ia64_insn *code) |
+{ |
+ if (value < 1 || value > 64) |
+ return "value must be between 1 and 64"; |
+ return ins_immu (self, value - 1, code); |
+} |
+ |
+static const char* |
+ext_cnt6a (const struct ia64_operand *self, ia64_insn code, |
+ ia64_insn *valuep) |
+{ |
+ const char *result; |
+ |
+ result = ext_immu (self, code, valuep); |
+ if (result) |
+ return result; |
+ |
+ *valuep = *valuep + 1; |
+ return 0; |
+} |
+ |
+static const char* |
+ins_strd5b (const struct ia64_operand *self, ia64_insn value, |
+ ia64_insn *code) |
+{ |
+ if ( value & 0x3f ) |
+ return "value must be a multiple of 64"; |
+ return ins_imms_scaled (self, value, code, 6); |
+} |
+ |
+static const char* |
+ext_strd5b (const struct ia64_operand *self, ia64_insn code, |
+ ia64_insn *valuep) |
+{ |
+ return ext_imms_scaled (self, code, valuep, 6); |
+} |
+ |
+ |
+static const char* |
ins_inc3 (const struct ia64_operand *self, ia64_insn value, ia64_insn *code) |
{ |
BFD_HOST_64_BIT val = value; |
@@ -480,6 +520,8 @@ const struct ia64_operand elf64_ia64_operands[IA64_OPND_COUNT] = |
"a general register" }, |
{ REG, ins_reg, ext_reg, "r", {{ 2, 20}}, 0, /* R3_2 */ |
"a general register r0-r3" }, |
+ { REG, ins_reg, ext_reg, "dahr", {{ 3, 23}}, 0, /* DAHR */ |
+ "a dahr register dahr0-7" }, |
/* memory operands: */ |
{ IND, ins_reg, ext_reg, "", {{7, 20}}, 0, /* MR3 */ |
@@ -504,6 +546,8 @@ const struct ia64_operand elf64_ia64_operands[IA64_OPND_COUNT] = |
"a pmc register" }, |
{ IND, ins_reg, ext_reg, "pmd", {{7, 20}}, 0, /* PMD_R3 */ |
"a pmd register" }, |
+ { IND, ins_reg, ext_reg, "dahr", {{7, 20}}, 0, /* DAHR_R3 */ |
+ "a dahr register" }, |
{ IND, ins_reg, ext_reg, "rr", {{7, 20}}, 0, /* RR_R3 */ |
"an rr register" }, |
@@ -568,9 +612,15 @@ const struct ia64_operand elf64_ia64_operands[IA64_OPND_COUNT] = |
{ ABS, ins_imms, ext_imms, 0, /* IMM14 */ |
{{ 7, 13}, { 6, 27}, { 1, 36}}, SDEC, |
"a 14-bit integer (-8192-8191)" }, |
+ { ABS, ins_immu, ext_immu, 0, /* IMMU16 */ |
+ {{4, 6}, {11, 12}, { 1, 36}}, UDEC, |
+ "a 16-bit unsigned" }, |
{ ABS, ins_imms1, ext_imms1, 0, /* IMM17 */ |
{{ 7, 6}, { 8, 24}, { 1, 36}}, 0, |
"a 17-bit integer (-65536-65535)" }, |
+ { ABS, ins_immu, ext_immu, 0, /* IMMU19 */ |
+ {{4, 6}, {14, 12}, { 1, 36}}, UDEC, |
+ "a 19-bit unsigned" }, |
{ ABS, ins_immu, ext_immu, 0, {{20, 6}, { 1, 36}}, 0, /* IMMU21 */ |
"a 21-bit unsigned" }, |
{ ABS, ins_imms, ext_imms, 0, /* IMM22 */ |
@@ -613,4 +663,8 @@ const struct ia64_operand elf64_ia64_operands[IA64_OPND_COUNT] = |
{ ABS, ins_const, ext_const, 0, {{0, 0}}, 0, /* LDXMOV */ |
"ldxmov target" }, |
+ { ABS, ins_cnt6a, ext_cnt6a, 0, {{6, 6}}, UDEC, /* CNT6a */ |
+ "lfetch count" }, |
+ { ABS, ins_strd5b, ext_strd5b, 0, {{5, 13}}, SDEC, /* STRD5b*/ |
+ "lfetch stride" }, |
}; |