* 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.
This commit is contained in:
Alexandre Oliva
2002-02-04 12:29:15 +00:00
parent 0b3301c329
commit 7679ead9b5
2 changed files with 22 additions and 5 deletions

View 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> 2002-02-04 Hans-Peter Nilsson <hp@bitrange.com>
* config/tc-mmix.c (tc_gen_reloc): Don't try and take the value of * config/tc-mmix.c (tc_gen_reloc): Don't try and take the value of

View File

@ -984,10 +984,12 @@ parse_at (src, op)
/* Turn a plain @(4,pc) into @(.+4,pc). */ /* Turn a plain @(4,pc) into @(.+4,pc). */
if (op->immediate.X_op == O_constant) 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->immediate.X_op = O_symbol;
op->type = A_DISP_PC;
} }
op->type = A_DISP_PC; else
op->type = A_DISP_PC_ABS;
} }
else else
{ {
@ -1169,11 +1171,14 @@ get_specific (opcode, operands)
switch (arg) switch (arg)
{ {
case A_DISP_PC:
if (user->type == A_DISP_PC_ABS)
break;
/* Fall through. */
case A_IMM: case A_IMM:
case A_BDISP12: case A_BDISP12:
case A_BDISP8: case A_BDISP8:
case A_DISP_GBR: case A_DISP_GBR:
case A_DISP_PC:
case A_MACH: case A_MACH:
case A_PR: case A_PR:
case A_MACL: case A_MACL:
@ -1603,10 +1608,12 @@ build_Mytes (opcode, operand)
insert (output + low_byte, BFD_RELOC_SH_IMM8, 0, operand + 1); insert (output + low_byte, BFD_RELOC_SH_IMM8, 0, operand + 1);
break; break;
case PCRELIMM_8BY4: 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; break;
case PCRELIMM_8BY2: 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; break;
case REPEAT: case REPEAT:
output = insert_loop_bounds (output, operand); output = insert_loop_bounds (output, operand);