From 7679ead9b557680adbce726b7024cb8f6fa0e08f Mon Sep 17 00:00:00 2001
From: Alexandre Oliva <aoliva@redhat.com>
Date: Mon, 4 Feb 2002 12:29:15 +0000
Subject: [PATCH] * config/tc-sh.c (parse_at): Set arg type of @(expr,pc) to
 A_DISP_PC only if it's an integral constant, and to A_DISP_PC_ABS otherwise.
 (get_specific): Accept A_DISP_PC_ABS where A_DISP_PC is expected.
 (build_Mytes): Mark PCRELIMM fix-ups as pc-relative only if the operand type
 is not A_DISP_PC_ABS.

---
 gas/ChangeLog      | 10 ++++++++++
 gas/config/tc-sh.c | 17 ++++++++++++-----
 2 files changed, 22 insertions(+), 5 deletions(-)

diff --git a/gas/ChangeLog b/gas/ChangeLog
index 968ce1727d6..a93f323ee40 100644
--- a/gas/ChangeLog
+++ b/gas/ChangeLog
@@ -1,3 +1,13 @@
+2002-02-04  Alexandre Oliva  <aoliva@redhat.com>
+
+	* config/tc-sh.c (parse_at): Set arg type of @(expr,pc) to
+	A_DISP_PC only if it's an integral constant, and to
+	A_DISP_PC_ABS otherwise.
+	(get_specific): Accept A_DISP_PC_ABS where A_DISP_PC is
+	expected.
+	(build_Mytes): Mark PCRELIMM fix-ups as pc-relative only if
+	the operand type is not A_DISP_PC_ABS.
+
 2002-02-04  Hans-Peter Nilsson  <hp@bitrange.com>
 
 	* config/tc-mmix.c (tc_gen_reloc): Don't try and take the value of
diff --git a/gas/config/tc-sh.c b/gas/config/tc-sh.c
index fa9869fc59b..ce780a1b69a 100644
--- a/gas/config/tc-sh.c
+++ b/gas/config/tc-sh.c
@@ -984,10 +984,12 @@ parse_at (src, op)
 		  /* Turn a plain @(4,pc) into @(.+4,pc).  */
 		  if (op->immediate.X_op == O_constant)
 		    {
-		      op->immediate.X_add_symbol = dot();
+		      op->immediate.X_add_symbol = dot ();
 		      op->immediate.X_op = O_symbol;
+		      op->type = A_DISP_PC;
 		    }
-		  op->type = A_DISP_PC;
+		  else
+		    op->type = A_DISP_PC_ABS;
 		}
 	      else
 		{
@@ -1169,11 +1171,14 @@ get_specific (opcode, operands)
 
 	  switch (arg)
 	    {
+	    case A_DISP_PC:
+	      if (user->type == A_DISP_PC_ABS)
+		break;
+	      /* Fall through.  */
 	    case A_IMM:
 	    case A_BDISP12:
 	    case A_BDISP8:
 	    case A_DISP_GBR:
-	    case A_DISP_PC:
 	    case A_MACH:
 	    case A_PR:
 	    case A_MACL:
@@ -1603,10 +1608,12 @@ build_Mytes (opcode, operand)
 	      insert (output + low_byte, BFD_RELOC_SH_IMM8, 0, operand + 1);
 	      break;
 	    case PCRELIMM_8BY4:
-	      insert (output, BFD_RELOC_SH_PCRELIMM8BY4, 1, operand);
+	      insert (output, BFD_RELOC_SH_PCRELIMM8BY4,
+		      operand->type != A_DISP_PC_ABS, operand);
 	      break;
 	    case PCRELIMM_8BY2:
-	      insert (output, BFD_RELOC_SH_PCRELIMM8BY2, 1, operand);
+	      insert (output, BFD_RELOC_SH_PCRELIMM8BY2,
+		      operand->type != A_DISP_PC_ABS, operand);
 	      break;
 	    case REPEAT:
 	      output = insert_loop_bounds (output, operand);