summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorH.J. Lu <hjl@lucon.org>2004-03-03 19:26:26 +0000
committerH.J. Lu <hjl@lucon.org>2004-03-03 19:26:26 +0000
commitedd17440632743bf71dc239abd930fe9534ff93d (patch)
treefdcdfcbbbd0d9fe803c3c65631b3400506643c16
parent34b96226959e4bcd86a9853020d84fee0de61e26 (diff)
downloadbinutils-redhat-edd17440632743bf71dc239abd930fe9534ff93d.tar.gz
2004-03-03 H.J. Lu <hongjiu.lu@intel.com>
* config/tc-ia64.c (dot_align): New. (ia64_do_align): Make it static. (md_pseudo_table): Use "dot_align" for "align". (ia64_md_do_align): Don't set align_frag here. (ia64_handle_align): Add a stop bit to the previous bundle if needed. * config/tc-ia64.h (ia64_do_align): Removed.
-rw-r--r--gas/ChangeLog11
-rw-r--r--gas/config/tc-ia64.c30
-rw-r--r--gas/config/tc-ia64.h1
3 files changed, 35 insertions, 7 deletions
diff --git a/gas/ChangeLog b/gas/ChangeLog
index 21acef086c..223a01e3fb 100644
--- a/gas/ChangeLog
+++ b/gas/ChangeLog
@@ -1,3 +1,14 @@
+2004-03-03 H.J. Lu <hongjiu.lu@intel.com>
+
+ * config/tc-ia64.c (dot_align): New.
+ (ia64_do_align): Make it static.
+ (md_pseudo_table): Use "dot_align" for "align".
+ (ia64_md_do_align): Don't set align_frag here.
+ (ia64_handle_align): Add a stop bit to the previous bundle if
+ needed.
+
+ * config/tc-ia64.h (ia64_do_align): Removed.
+
2003-03-03 Andrew Stubbs <andrew.stubbs@superh.com>
* config/tc-sh.c (md_parse_option): Add -isa=sh4-nofpu and
diff --git a/gas/config/tc-ia64.c b/gas/config/tc-ia64.c
index 96a0ef503f..57ed9b3a7c 100644
--- a/gas/config/tc-ia64.c
+++ b/gas/config/tc-ia64.c
@@ -705,6 +705,7 @@ static int ar_is_in_integer_unit PARAMS ((int regnum));
static void set_section PARAMS ((char *name));
static unsigned int set_regstack PARAMS ((unsigned int, unsigned int,
unsigned int, unsigned int));
+static void dot_align (int);
static void dot_radix PARAMS ((int));
static void dot_special_section PARAMS ((int));
static void dot_proc PARAMS ((int));
@@ -1135,9 +1136,8 @@ ia64_flush_insns ()
as_bad ("qualifying predicate not followed by instruction");
}
-void
-ia64_do_align (nbytes)
- int nbytes;
+static void
+ia64_do_align (int nbytes)
{
char *saved_input_line_pointer = input_line_pointer;
@@ -3034,6 +3034,14 @@ convert_expr_to_xy_reg (e, xy, regp)
}
static void
+dot_align (int arg)
+{
+ /* The current frag is an alignment frag. */
+ align_frag = frag_now;
+ s_align_bytes (arg);
+}
+
+static void
dot_radix (dummy)
int dummy ATTRIBUTE_UNUSED;
{
@@ -4960,7 +4968,7 @@ const pseudo_typeS md_pseudo_table[] =
{ "lb", dot_scope, 0 },
{ "le", dot_scope, 1 },
#endif
- { "align", s_align_bytes, 0 },
+ { "align", dot_align, 0 },
{ "regstk", dot_regstk, 0 },
{ "rotr", dot_rot, DYNREG_GR },
{ "rotf", dot_rot, DYNREG_FR },
@@ -10828,8 +10836,6 @@ ia64_md_do_align (n, fill, len, max)
int len ATTRIBUTE_UNUSED;
int max ATTRIBUTE_UNUSED;
{
- /* The current frag is an alignment frag. */
- align_frag = frag_now;
if (subseg_text_p (now_seg))
ia64_flush_insns ();
}
@@ -10862,6 +10868,18 @@ ia64_handle_align (fragp)
bytes = fragp->fr_next->fr_address - fragp->fr_address - fragp->fr_fix;
p = fragp->fr_literal + fragp->fr_fix;
+ /* If no paddings are needed, we check if we need a stop bit. */
+ if (!bytes && fragp->tc_frag_data)
+ {
+ if (fragp->fr_fix < 16)
+ as_bad_where (fragp->fr_file, fragp->fr_line,
+ _("Can't add stop bit to mark end of instruction group"));
+ else
+ /* Bundles are always in little-endian byte order. Make sure
+ the previous bundle has the stop bit. */
+ *(p - 16) |= 1;
+ }
+
/* Make sure we are on a 16-byte boundary, in case someone has been
putting data into a text section. */
if (bytes & 15)
diff --git a/gas/config/tc-ia64.h b/gas/config/tc-ia64.h
index b112e752a4..dcc2c29960 100644
--- a/gas/config/tc-ia64.h
+++ b/gas/config/tc-ia64.h
@@ -86,7 +86,6 @@ struct ia64_fix
enum ia64_opnd opnd;
};
-extern void ia64_do_align PARAMS((int n));
extern void ia64_end_of_source PARAMS((void));
extern void ia64_start_line PARAMS((void));
extern int ia64_unrecognized_line PARAMS((int ch));