From fdb987ee01ed911144681463cceca4ad666a13ee Mon Sep 17 00:00:00 2001
From: Richard Sandiford <rdsandiford@googlemail.com>
Date: Mon, 12 Aug 2002 08:33:42 +0000
Subject: [PATCH] [gas/] 	* config/tc-mips.c (mips_ip): Don't work out
 the value of 	constant %hi()s here.

[gas/testsuite/]
	* gas/mips/elf-consthilo.[sd]: New test.
	* gas/mips/mips.exp: Run it.
---
 gas/ChangeLog                          |  5 +++++
 gas/config/tc-mips.c                   | 24 +++++++++---------------
 gas/testsuite/ChangeLog                |  5 +++++
 gas/testsuite/gas/mips/elf-consthilo.d | 10 ++++++++++
 gas/testsuite/gas/mips/elf-consthilo.s | 12 ++++++++++++
 gas/testsuite/gas/mips/mips.exp        |  1 +
 6 files changed, 42 insertions(+), 15 deletions(-)
 create mode 100644 gas/testsuite/gas/mips/elf-consthilo.d
 create mode 100644 gas/testsuite/gas/mips/elf-consthilo.s

diff --git a/gas/ChangeLog b/gas/ChangeLog
index acce5717ca3..7f9a5ac9ee7 100644
--- a/gas/ChangeLog
+++ b/gas/ChangeLog
@@ -1,3 +1,8 @@
+2002-08-12  Richard Sandiford  <rsandifo@redhat.com>
+
+	* config/tc-mips.c (mips_ip): Don't work out the value of
+	constant %hi()s here.
+
 2002-08-10  Alan Modra  <amodra@bigpond.net.au>
 
 	* config/tc-i386.c (tc_i386_fix_adjustable): Test OUTPUT_FLAVOR
diff --git a/gas/config/tc-mips.c b/gas/config/tc-mips.c
index 54e2540f1bb..6fea63abe75 100644
--- a/gas/config/tc-mips.c
+++ b/gas/config/tc-mips.c
@@ -8525,9 +8525,11 @@ mips_ip (str, ip)
 		{
 		  if (c != S_EX_LO)
 		    {
-		      if (imm_expr.X_op == O_constant)
-			imm_expr.X_add_number =
-			  (imm_expr.X_add_number >> 16) & 0xffff;
+		      if (c == S_EX_HI)
+			{
+			  *imm_reloc = BFD_RELOC_HI16_S;
+			  imm_unmatched_hi = true;
+			}
 #ifdef OBJ_ELF
 		      else if (c == S_EX_HIGHEST)
 			*imm_reloc = BFD_RELOC_MIPS_HIGHEST;
@@ -8553,11 +8555,6 @@ mips_ip (str, ip)
 			    }
 			}
 #endif
-		      else if (c == S_EX_HI)
-			{
-			  *imm_reloc = BFD_RELOC_HI16_S;
-			  imm_unmatched_hi = true;
-			}
 		      else
 			*imm_reloc = BFD_RELOC_HI16;
 		    }
@@ -8658,10 +8655,7 @@ mips_ip (str, ip)
 		{
 		  if (c != S_EX_LO)
 		    {
-		      if (imm_expr.X_op == O_constant)
-			imm_expr.X_add_number =
-			  (imm_expr.X_add_number >> 16) & 0xffff;
-		      else if (c == S_EX_HI)
+		      if (c == S_EX_HI)
 			{
 			  *imm_reloc = BFD_RELOC_HI16_S;
 			  imm_unmatched_hi = true;
@@ -8695,9 +8689,9 @@ mips_ip (str, ip)
 		  else if (imm_expr.X_op == O_constant)
 		    imm_expr.X_add_number &= 0xffff;
 		}
-	      if (imm_expr.X_op == O_constant
-		  && (imm_expr.X_add_number < 0
-		      || imm_expr.X_add_number >= 0x10000))
+	      else if (imm_expr.X_op == O_constant
+		       && (imm_expr.X_add_number < 0
+			   || imm_expr.X_add_number >= 0x10000))
 		as_bad (_("lui expression not in range 0..65535"));
 	      s = expr_end;
 	      continue;
diff --git a/gas/testsuite/ChangeLog b/gas/testsuite/ChangeLog
index 9079372897a..924865690cc 100644
--- a/gas/testsuite/ChangeLog
+++ b/gas/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2002-08-12  Richard Sandiford  <rsandifo@redhat.com>
+
+	* gas/mips/elf-consthilo.[sd]: New test.
+	* gas/mips/mips.exp: Run it.
+
 2002-08-09  Maciej W. Rozycki  <macro@ds2.pg.gda.pl>
 
 	* gas/mips/empic.d: Treat "addiu" and "daddiu" as equivalent when
diff --git a/gas/testsuite/gas/mips/elf-consthilo.d b/gas/testsuite/gas/mips/elf-consthilo.d
new file mode 100644
index 00000000000..30b27615c5b
--- /dev/null
+++ b/gas/testsuite/gas/mips/elf-consthilo.d
@@ -0,0 +1,10 @@
+#objdump: --prefix-addresses -dr
+#name: MIPS constant hi/lo
+
+.*: +file format elf.*mips.*
+
+Disassembly of section \.text:
+0+00 <.*> lui	a0,0xdeae
+0+04 <.*> jr	ra
+0+08 <.*> lb	v0,-16657\(a0\)
+#pass
diff --git a/gas/testsuite/gas/mips/elf-consthilo.s b/gas/testsuite/gas/mips/elf-consthilo.s
new file mode 100644
index 00000000000..ed7e111a3a5
--- /dev/null
+++ b/gas/testsuite/gas/mips/elf-consthilo.s
@@ -0,0 +1,12 @@
+	.set	noreorder
+	.set	nomacro
+	.set	noat
+	.set	nomips16
+
+	.equ	addr, 0xdeadbeef
+	.ent	foo
+foo:
+	lui	$4,%hi(addr)
+	jr	$31
+	lb	$2,%lo(addr)($4)
+	.end	foo
diff --git a/gas/testsuite/gas/mips/mips.exp b/gas/testsuite/gas/mips/mips.exp
index a3b6911f34c..fa1dbf8ace1 100644
--- a/gas/testsuite/gas/mips/mips.exp
+++ b/gas/testsuite/gas/mips/mips.exp
@@ -215,5 +215,6 @@ if { [istarget mips*-*-*] } then {
 	    run_dump_test "${tmips}mips${el}16-e"
 	    run_dump_test "${tmips}mips${el}16-f"
 	}
+	run_dump_test "elf-consthilo"
     }
 }