* config/tc-sh.c (parse_at): Set arg type of @(expr,pc) to
authorAlexandre Oliva <aoliva@redhat.com>
Mon, 4 Feb 2002 12:29:15 +0000 (12:29 +0000)
committerAlexandre Oliva <aoliva@redhat.com>
Mon, 4 Feb 2002 12:29:15 +0000 (12:29 +0000)
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
gas/config/tc-sh.c

index 968ce17..a93f323 100644 (file)
@@ -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
index fa9869f..ce780a1 100644 (file)
@@ -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);