summaryrefslogtreecommitdiff
path: root/opcodes/s390-mkopc.c
diff options
context:
space:
mode:
Diffstat (limited to 'opcodes/s390-mkopc.c')
-rw-r--r--opcodes/s390-mkopc.c57
1 files changed, 49 insertions, 8 deletions
diff --git a/opcodes/s390-mkopc.c b/opcodes/s390-mkopc.c
index 24951db65d4..7274bdce08e 100644
--- a/opcodes/s390-mkopc.c
+++ b/opcodes/s390-mkopc.c
@@ -1,5 +1,5 @@
/* s390-mkopc.c -- Generates opcode table out of s390-opc.txt
- Copyright 2000, 2001, 2003, 2007 Free Software Foundation, Inc.
+ Copyright 2000, 2001, 2003, 2007, 2008 Free Software Foundation, Inc.
Contributed by Martin Schwidefsky (schwidefsky@de.ibm.com).
This file is part of the GNU opcodes library.
@@ -122,22 +122,48 @@ struct s390_cond_ext_format
char extension[4];
};
-/* The mnemonic extensions for conditional branches used to replace
+/* The mnemonic extensions for conditional jumps used to replace
the '*' tag. */
-#define NUM_COND_EXTENSIONS 12
+#define NUM_COND_EXTENSIONS 20
const struct s390_cond_ext_format s390_cond_extensions[NUM_COND_EXTENSIONS] =
-{ { '2', "h" }, /* jump on A high */
+{ { '1', "o" }, /* jump on overflow / if ones */
+ { '2', "h" }, /* jump on A high */
+ { '2', "p" }, /* jump on plus */
{ '3', "nle" }, /* jump on not low or equal */
{ '4', "l" }, /* jump on A low */
+ { '4', "m" }, /* jump on minus / if mixed */
{ '5', "nhe" }, /* jump on not high or equal */
{ '6', "lh" }, /* jump on low or high */
{ '7', "ne" }, /* jump on A not equal B */
+ { '7', "nz" }, /* jump on not zero / if not zeros */
{ '8', "e" }, /* jump on A equal B */
+ { '8', "z" }, /* jump on zero / if zeros */
{ '9', "nlh" }, /* jump on not low or high */
{ 'a', "he" }, /* jump on high or equal */
{ 'b', "nl" }, /* jump on A not low */
+ { 'b', "nm" }, /* jump on not minus / if not mixed */
{ 'c', "le" }, /* jump on low or equal */
{ 'd', "nh" }, /* jump on A not high */
+ { 'd', "np" }, /* jump on not plus */
+ { 'e', "no" }, /* jump on not overflow / if not ones */
+};
+
+/* The mnemonic extensions for conditional branches used to replace
+ the '$' tag. */
+#define NUM_CRB_EXTENSIONS 12
+const struct s390_cond_ext_format s390_crb_extensions[NUM_CRB_EXTENSIONS] =
+{ { '2', "h" }, /* jump on A high */
+ { '2', "nle" }, /* jump on not low or equal */
+ { '4', "l" }, /* jump on A low */
+ { '4', "nhe" }, /* jump on not high or equal */
+ { '6', "ne" }, /* jump on A not equal B */
+ { '6', "lh" }, /* jump on low or high */
+ { '8', "e" }, /* jump on A equal B */
+ { '8', "nlh" }, /* jump on not low or high */
+ { 'a', "nl" }, /* jump on A not low */
+ { 'a', "he" }, /* jump on high or equal */
+ { 'c', "nh" }, /* jump on A not high */
+ { 'c', "le" }, /* jump on low or equal */
};
/* As with insertOpcode instructions are added to the sorted opcode
@@ -156,8 +182,10 @@ insertExpandedMnemonic (char *opcode, char *mnemonic, char *format,
char number[5];
int mask_start, i = 0, tag_found = 0, reading_number = 0;
int number_p = 0, suffix_p = 0, prefix_p = 0;
+ const struct s390_cond_ext_format *ext_table;
+ int ext_table_length;
- if (!(tag = strchr (mnemonic, '*')))
+ if (!(tag = strpbrk (mnemonic, "*$")))
{
insertOpcode (opcode, mnemonic, format, min_cpu, mode_bits);
return;
@@ -217,13 +245,26 @@ insertExpandedMnemonic (char *opcode, char *mnemonic, char *format,
mask_start >>= 2;
- for (i = 0; i < NUM_COND_EXTENSIONS; i++)
+ switch (*tag)
+ {
+ case '*':
+ ext_table = s390_cond_extensions;
+ ext_table_length = NUM_COND_EXTENSIONS;
+ break;
+ case '$':
+ ext_table = s390_crb_extensions;
+ ext_table_length = NUM_CRB_EXTENSIONS;
+ break;
+ default: fprintf (stderr, "Unknown tag char: %c\n", *tag);
+ }
+
+ for (i = 0; i < ext_table_length; i++)
{
char new_mnemonic[15];
strcpy (new_mnemonic, prefix);
- opcode[mask_start] = s390_cond_extensions[i].nibble;
- strcat (new_mnemonic, s390_cond_extensions[i].extension);
+ opcode[mask_start] = ext_table[i].nibble;
+ strcat (new_mnemonic, ext_table[i].extension);
strcat (new_mnemonic, suffix);
insertOpcode (opcode, new_mnemonic, format, min_cpu, mode_bits);
}