aboutsummaryrefslogtreecommitdiff
path: root/gas
diff options
context:
space:
mode:
authorSandra Loosemore <sandra@codesourcery.com>2014-11-28 14:41:32 -0800
committerSandra Loosemore <sandra@codesourcery.com>2014-11-28 14:41:32 -0800
commitd306ce58b4c7d544721ba328c447240cb2228fe5 (patch)
tree70459796d4bf71af113f8a509653a72482ebad35 /gas
parentd7fc3181f73ab3d5549b396198645558127e0584 (diff)
downloadgdb-d306ce58b4c7d544721ba328c447240cb2228fe5.zip
gdb-d306ce58b4c7d544721ba328c447240cb2228fe5.tar.gz
gdb-d306ce58b4c7d544721ba328c447240cb2228fe5.tar.bz2
Remove broken nios2 assembler dwim support.
2014-11-28 Sandra Loosemore <sandra@codesourcery.com> include/opcode/ * nios2.h (NIOS2_INSN_ADDI, NIOS2_INSN_ANDI): Delete. (NIOS2_INSN_ORI, NIOS2_INSN_XORI): Delete. (NIOS2_INSN_OPTARG): Renumber. opcodes/ * nios2-opc.c (nios2_r1_opcodes): Remove deleted attributes from descriptors. gas/ * config/tc-nios2.c (can_evaluate_expr, get_expr_value): Delete. (output_addi, output_andi, output_ori, output_xori): Delete. (md_assemble): Remove calls to deleted functions. gas/testsuite/ * gas/nios2/nios2.exp: Make "movi" a list test. * gas/nios2/movi.s: Adjust comments, add another case. * gas/nios2/movi.l: New. * gas/nios2/movi.d: Delete.
Diffstat (limited to 'gas')
-rw-r--r--gas/ChangeLog6
-rw-r--r--gas/config/tc-nios2.c137
-rw-r--r--gas/testsuite/ChangeLog7
-rw-r--r--gas/testsuite/gas/nios2/movi.d13
-rw-r--r--gas/testsuite/gas/nios2/movi.l6
-rw-r--r--gas/testsuite/gas/nios2/movi.s18
-rw-r--r--gas/testsuite/gas/nios2/nios2.exp1
7 files changed, 29 insertions, 159 deletions
diff --git a/gas/ChangeLog b/gas/ChangeLog
index b0119c6..3508468 100644
--- a/gas/ChangeLog
+++ b/gas/ChangeLog
@@ -1,3 +1,9 @@
+2014-11-28 Sandra Loosemore <sandra@codesourcery.com>
+
+ * config/tc-nios2.c (can_evaluate_expr, get_expr_value): Delete.
+ (output_addi, output_andi, output_ori, output_xori): Delete.
+ (md_assemble): Remove calls to deleted functions.
+
2014-11-25 Max Filippov <jcmvbkbc@gmail.com>
* config/tc-xtensa.c (search_trampolines): Move post-loop
diff --git a/gas/config/tc-nios2.c b/gas/config/tc-nios2.c
index 7691fd1..59e9709 100644
--- a/gas/config/tc-nios2.c
+++ b/gas/config/tc-nios2.c
@@ -2062,34 +2062,6 @@ const int nios2_num_ps_insn_info_structs = NIOS2_NUM_PSEUDO_INSNS;
/** Assembler output support. */
-static int
-can_evaluate_expr (nios2_insn_infoS *insn)
-{
- /* Remove this check for null and the invalid insn "ori r9, 1234" seg faults. */
- if (!insn->insn_reloc)
- /* ??? Ideally we should do something other than as_fatal here as we can
- continue to assemble.
- However this function (actually the output_* functions) should not
- have been called in the first place once an illegal instruction had
- been encountered. */
- as_fatal (_("Invalid instruction encountered, cannot recover. No assembly attempted."));
-
- if (insn->insn_reloc->reloc_expression.X_op == O_constant)
- return 1;
-
- return 0;
-}
-
-static int
-get_expr_value (nios2_insn_infoS *insn)
-{
- int value = 0;
-
- if (insn->insn_reloc->reloc_expression.X_op == O_constant)
- value = insn->insn_reloc->reloc_expression.X_add_number;
- return value;
-}
-
/* Output a normal instruction. */
static void
output_insn (nios2_insn_infoS *insn)
@@ -2203,107 +2175,6 @@ output_call (nios2_insn_infoS *insn)
dwarf2_emit_insn (4);
}
-/* Output an addi - will silently convert to
- orhi if rA = r0 and (expr & 0xffff0000) == 0. */
-static void
-output_addi (nios2_insn_infoS *insn)
-{
- if (can_evaluate_expr (insn))
- {
- int expr_val = get_expr_value (insn);
- unsigned int rega = GET_IW_I_A (insn->insn_code);
- unsigned int regb = GET_IW_I_B (insn->insn_code);
-
- if (rega == 0
- && (expr_val & 0xffff) == 0
- && expr_val != 0)
- {
- /* We really want a movhi (orhi) here. */
- insn->insn_code
- = MATCH_R1_ORHI | SET_IW_I_A (rega) | SET_IW_I_B (regb);
- insn->insn_reloc->reloc_expression.X_add_number
- = (expr_val >> 16) & 0xffff;
- insn->insn_reloc->reloc_type = BFD_RELOC_NIOS2_U16;
- }
- }
-
- /* Output an instruction. */
- output_insn (insn);
-}
-
-static void
-output_andi (nios2_insn_infoS *insn)
-{
- if (can_evaluate_expr (insn))
- {
- int expr_val = get_expr_value (insn);
- if (expr_val != 0 && (expr_val & 0xffff) == 0)
- {
- unsigned int rega = GET_IW_I_A (insn->insn_code);
- unsigned int regb = GET_IW_I_B (insn->insn_code);
-
- /* We really want an andhi here. */
- insn->insn_code
- = MATCH_R1_ANDHI | SET_IW_I_A (rega) | SET_IW_I_B (regb);
- insn->insn_reloc->reloc_expression.X_add_number
- = (expr_val >> 16) & 0xffff;
- insn->insn_reloc->reloc_type = BFD_RELOC_NIOS2_U16;
- }
- }
-
- /* Output an instruction. */
- output_insn (insn);
-}
-
-static void
-output_ori (nios2_insn_infoS *insn)
-{
- if (can_evaluate_expr (insn))
- {
- int expr_val = get_expr_value (insn);
- if (expr_val != 0 && (expr_val & 0xffff) == 0)
- {
- unsigned int rega = GET_IW_I_A (insn->insn_code);
- unsigned int regb = GET_IW_I_B (insn->insn_code);
-
- /* We really want a movhi (orhi) here. */
- insn->insn_code
- = MATCH_R1_ORHI | SET_IW_I_A (rega) | SET_IW_I_B (regb);
- insn->insn_reloc->reloc_expression.X_add_number
- = (expr_val >> 16) & 0xffff;
- insn->insn_reloc->reloc_type = BFD_RELOC_NIOS2_U16;
- }
- }
-
- /* Output an instruction. */
- output_insn (insn);
-}
-
-static void
-output_xori (nios2_insn_infoS *insn)
-{
- if (can_evaluate_expr (insn))
- {
- int expr_val = get_expr_value (insn);
- if (expr_val != 0 && (expr_val & 0xffff) == 0)
- {
- unsigned int rega = GET_IW_I_A (insn->insn_code);
- unsigned int regb = GET_IW_I_B (insn->insn_code);
-
- /* We really want an xorhi here. */
- insn->insn_code
- = MATCH_R1_XORHI | SET_IW_I_A (rega) | SET_IW_I_B (regb);
- insn->insn_reloc->reloc_expression.X_add_number
- = (expr_val >> 16) & 0xffff;
- insn->insn_reloc->reloc_type = BFD_RELOC_NIOS2_U16;
- }
- }
-
- /* Output an instruction. */
- output_insn (insn);
-}
-
-
/* Output a movhi/addi pair for the movia pseudo-op. */
static void
output_movia (nios2_insn_infoS *insn)
@@ -2540,14 +2411,6 @@ md_assemble (char *op_str)
|| (insn->insn_reloc->reloc_type
== BFD_RELOC_NIOS2_CALL26_NOAT)))
output_call (insn);
- else if (insn->insn_nios2_opcode->pinfo & NIOS2_INSN_ANDI)
- output_andi (insn);
- else if (insn->insn_nios2_opcode->pinfo & NIOS2_INSN_ORI)
- output_ori (insn);
- else if (insn->insn_nios2_opcode->pinfo & NIOS2_INSN_XORI)
- output_xori (insn);
- else if (insn->insn_nios2_opcode->pinfo & NIOS2_INSN_ADDI)
- output_addi (insn);
else if (saved_pinfo == NIOS2_INSN_MACRO_MOVIA)
output_movia (insn);
else
diff --git a/gas/testsuite/ChangeLog b/gas/testsuite/ChangeLog
index 3c2f81a..54d7560 100644
--- a/gas/testsuite/ChangeLog
+++ b/gas/testsuite/ChangeLog
@@ -1,3 +1,10 @@
+2014-11-28 Sandra Loosemore <sandra@codesourcery.com>
+
+ * gas/nios2/nios2.exp: Make "movi" a list test.
+ * gas/nios2/movi.s: Adjust comments, add another case.
+ * gas/nios2/movi.l: New.
+ * gas/nios2/movi.d: Delete.
+
2014-11-25 Max Filippov <jcmvbkbc@gmail.com>
* gas/xtensa/trampoline.d: Add expected output for branches.
* gas/xtensa/trampoline.s: Add test case for branches.
diff --git a/gas/testsuite/gas/nios2/movi.d b/gas/testsuite/gas/nios2/movi.d
deleted file mode 100644
index e306017..0000000
--- a/gas/testsuite/gas/nios2/movi.d
+++ /dev/null
@@ -1,13 +0,0 @@
-#objdump: -dr --prefix-addresses --show-raw-insn
-#name: NIOS2 movi
-
-# Test implicit conversion of movi/movhi etc
-.*: file format elf32-littlenios2
-
-Disassembly of section .text:
-0+0000 <[^>]*> 00800804 movi r2,32
-0+0004 <[^>]*> 00880034 movhi r2,8192
-0+0008 <[^>]*> 00bffff4 movhi r2,65535
-0+000c <[^>]*> 28bffff4 orhi r2,r5,65535
-0+0010 <[^>]*> 50bffffc xorhi r2,r10,65535
-0+0014 <[^>]*> 78bfffec andhi r2,r15,65535
diff --git a/gas/testsuite/gas/nios2/movi.l b/gas/testsuite/gas/nios2/movi.l
new file mode 100644
index 0000000..2eb47a1
--- /dev/null
+++ b/gas/testsuite/gas/nios2/movi.l
@@ -0,0 +1,6 @@
+.*movi.s: Assembler messages:
+.*movi.s:9: Error: immediate value 536870912 out of range -32768 to 32767
+.*movi.s:12: Error: immediate value -65536 out of range -32768 to 32767
+.*movi.s:15: Error: immediate value 4294901760 out of range 0 to 65535
+.*movi.s:16: Error: immediate value 4294901760 out of range 0 to 65535
+.*movi.s:17: Error: immediate value 4294901760 out of range 0 to 65535
diff --git a/gas/testsuite/gas/nios2/movi.s b/gas/testsuite/gas/nios2/movi.s
index 07d9fed..20df564 100644
--- a/gas/testsuite/gas/nios2/movi.s
+++ b/gas/testsuite/gas/nios2/movi.s
@@ -1,21 +1,21 @@
-# Source file used to test silent conversion of
-# movi to orhi etc
+# Source file used to test that former silent conversion of
+# movi to orhi etc now gives range errors instead.
foo:
-# this doesn't get converted
+# This doesn't get converted.
movi r2, 0x20
-# this does
+# This used to convert.
movi r2, 0x20000000
-# addi should convert only if the source register is r0
+# addi used to convert only if the source register is r0.
addi r2, r0, 0xffff0000
-# but we can't test for non-conversion because the value would
-# be out of range
-# logical ops should convert for any register
+# Logical ops used to convert to equivalent *hi for any register.
ori r2, r5, 0xffff0000
xori r2, r10, 0xffff0000
andi r2, r15, 0xffff0000
-
+# This one used to be buggy and convert even though it wasn't supposed to,
+# because it was failing to take the %lo relocation into account.
+ori r23,r23,%lo(0x12340000)
diff --git a/gas/testsuite/gas/nios2/nios2.exp b/gas/testsuite/gas/nios2/nios2.exp
index bd68c6c..a4e7d7a 100644
--- a/gas/testsuite/gas/nios2/nios2.exp
+++ b/gas/testsuite/gas/nios2/nios2.exp
@@ -24,4 +24,5 @@ if { [istarget nios2-*-*] } {
run_list_test "illegal" ""
run_list_test "warn_nobreak" ""
run_list_test "warn_noat" ""
+ run_list_test "movi" ""
}