summaryrefslogtreecommitdiff
path: root/gas
diff options
context:
space:
mode:
authorH.J. Lu <hjl.tools@gmail.com>2011-03-28 22:47:58 +0000
committerH.J. Lu <hjl.tools@gmail.com>2011-03-28 22:47:58 +0000
commita221b40e15f6723fd477cdcb54f085182f2f4ea1 (patch)
treeb62b91cb025d0112b83a4e35283cfbac5e84d34b /gas
parent10382261265ba86d5d376cc687e3b945ddbed828 (diff)
downloadbinutils-redhat-a221b40e15f6723fd477cdcb54f085182f2f4ea1.tar.gz
Support .quad for x32.
gas/ 2011-03-28 H.J. Lu <hongjiu.lu@intel.com> * config/tc-i386.c (handle_quad): New. (md_pseudo_table): Add "quad". gas/testsuite/ 2011-03-28 H.J. Lu <hongjiu.lu@intel.com> * gas/i386/ilp32/inval.s: Remove .quad. * gas/i386/ilp32/inval.l: Updated. * gas/i386/ilp32/quad.d: New. * gas/i386/ilp32/quad.s: Likewise.
Diffstat (limited to 'gas')
-rw-r--r--gas/ChangeLog5
-rw-r--r--gas/config/tc-i386.c48
-rw-r--r--gas/testsuite/ChangeLog8
-rw-r--r--gas/testsuite/gas/i386/ilp32/inval.l8
-rw-r--r--gas/testsuite/gas/i386/ilp32/inval.s4
-rw-r--r--gas/testsuite/gas/i386/ilp32/quad.d14
-rw-r--r--gas/testsuite/gas/i386/ilp32/quad.s5
7 files changed, 81 insertions, 11 deletions
diff --git a/gas/ChangeLog b/gas/ChangeLog
index e759809514..6ccff48ee2 100644
--- a/gas/ChangeLog
+++ b/gas/ChangeLog
@@ -1,3 +1,8 @@
+2011-03-28 H.J. Lu <hongjiu.lu@intel.com>
+
+ * config/tc-i386.c (handle_quad): New.
+ (md_pseudo_table): Add "quad".
+
2011-03-26 John Marino <binutils@marino.st>
* configure.tgt: Fix support for *-*-dragonfly*.
diff --git a/gas/config/tc-i386.c b/gas/config/tc-i386.c
index e7f9c9aa97..624c78a886 100644
--- a/gas/config/tc-i386.c
+++ b/gas/config/tc-i386.c
@@ -182,6 +182,7 @@ static void s_bss (int);
#endif
#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
static void handle_large_common (int small ATTRIBUTE_UNUSED);
+static void handle_quad (int);
#endif
static const char *default_arch = DEFAULT_ARCH;
@@ -813,6 +814,7 @@ const pseudo_typeS md_pseudo_table[] =
{"sse_check", set_sse_check, 0},
#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
{"largecomm", handle_large_common, 0},
+ {"quad", handle_quad, 8},
#else
{"file", (void (*) (int)) dwarf2_directive_file, 0},
{"loc", dwarf2_directive_loc, 0},
@@ -9149,4 +9151,50 @@ handle_large_common (int small ATTRIBUTE_UNUSED)
bss_section = saved_bss_section;
}
}
+
+static void
+handle_quad (int nbytes)
+{
+ expressionS exp;
+
+ if (x86_elf_abi != X86_64_X32_ABI)
+ {
+ cons (nbytes);
+ return;
+ }
+
+ if (is_it_end_of_statement ())
+ {
+ demand_empty_rest_of_line ();
+ return;
+ }
+
+ do
+ {
+ if (*input_line_pointer == '"')
+ {
+ as_bad (_("unexpected `\"' in expression"));
+ ignore_rest_of_line ();
+ return;
+ }
+ x86_cons (&exp, nbytes);
+ /* Output 4 bytes if not constant. */
+ if (exp.X_op != O_constant)
+ nbytes = 4;
+ emit_expr (&exp, (unsigned int) nbytes);
+ }
+ while (*input_line_pointer++ == ',');
+
+ input_line_pointer--; /* Put terminator back into stream. */
+
+ demand_empty_rest_of_line ();
+
+ /* Zero-extends to 8 bytes if not constant. */
+ if (nbytes == 4)
+ {
+ memset (&exp, '\0', sizeof (exp));
+ exp.X_op = O_constant;
+ emit_expr (&exp, nbytes);
+ }
+}
#endif /* OBJ_ELF || OBJ_MAYBE_ELF */
diff --git a/gas/testsuite/ChangeLog b/gas/testsuite/ChangeLog
index 7975fb851f..4f69afaca4 100644
--- a/gas/testsuite/ChangeLog
+++ b/gas/testsuite/ChangeLog
@@ -1,3 +1,11 @@
+2011-03-28 H.J. Lu <hongjiu.lu@intel.com>
+
+ * gas/i386/ilp32/inval.s: Remove .quad.
+ * gas/i386/ilp32/inval.l: Updated.
+
+ * gas/i386/ilp32/quad.d: New.
+ * gas/i386/ilp32/quad.s: Likewise.
+
2011-03-24 Mike Frysinger <vapier@gentoo.org>
* gas/bfin/expected_errors.s: Add invalid vector add/sub insn tests.
diff --git a/gas/testsuite/gas/i386/ilp32/inval.l b/gas/testsuite/gas/i386/ilp32/inval.l
index 70f9754118..d037baeccc 100644
--- a/gas/testsuite/gas/i386/ilp32/inval.l
+++ b/gas/testsuite/gas/i386/ilp32/inval.l
@@ -3,7 +3,6 @@
.*:4: Error: .*
.*:5: Error: .*
.*:6: Error: .*
-.*:10: Error: .*
GAS LISTING .*
@@ -19,11 +18,6 @@ GAS LISTING .*
[ ]*5[ ]+00000000
[ ]*5[ ]+0000
[ ]*6[ ]+\?\?\?\? 48A10000 movabsq foo,%rax
+\*\*\*\* Error:cannot represent relocation type BFD_RELOC_[ ]*64[ ]+in x32 mode
[ ]*6[ ]+00000000
[ ]*6[ ]+0000
-[ ]*7[ ]+
-[ ]*8[ ]+\.data
-[ ]*9[ ]+xxx:
-[ ]*10[ ]+\?\?\?\? 00000000 \.quad foo
-\*\*\*\* Error:cannot represent relocation type BFD_RELOC_[ ]*64[ ]+in x32 mode
-[ ]*10[ ]+00000000
diff --git a/gas/testsuite/gas/i386/ilp32/inval.s b/gas/testsuite/gas/i386/ilp32/inval.s
index 416c1f8974..f117ca0091 100644
--- a/gas/testsuite/gas/i386/ilp32/inval.s
+++ b/gas/testsuite/gas/i386/ilp32/inval.s
@@ -4,7 +4,3 @@
movabs foo,%rax
movabsq xxx,%rax
movabsq foo,%rax
-
- .data
-xxx:
- .quad foo
diff --git a/gas/testsuite/gas/i386/ilp32/quad.d b/gas/testsuite/gas/i386/ilp32/quad.d
new file mode 100644
index 0000000000..d3e6ff88d2
--- /dev/null
+++ b/gas/testsuite/gas/i386/ilp32/quad.d
@@ -0,0 +1,14 @@
+#objdump: -sr
+#name: xquad
+
+.*: +file format .*
+
+RELOCATION RECORDS FOR \[.data\]:
+OFFSET +TYPE +VALUE
+0+ R_X86_64_32 +foo
+0+10 R_X86_64_32 +bar
+
+
+Contents of section .data:
+ 0000 00000000 00000000 efcdab90 78674512 ............xgE.
+ 0010 00000000 00000000 ffffffff ffffffff ................
diff --git a/gas/testsuite/gas/i386/ilp32/quad.s b/gas/testsuite/gas/i386/ilp32/quad.s
new file mode 100644
index 0000000000..e96653a845
--- /dev/null
+++ b/gas/testsuite/gas/i386/ilp32/quad.s
@@ -0,0 +1,5 @@
+ .data
+ .quad foo
+ .quad 0x1245677890abcdef
+ .quad bar
+ .quad -1