This is the mail archive of the
binutils@sources.redhat.com
mailing list for the binutils project.
Re: PATCH to gas: --pcrel option for m68k
- To: binutils at sources dot redhat dot com
- Subject: Re: PATCH to gas: --pcrel option for m68k
- From: msokolov at ivan dot Harhan dot ORG (Michael Sokolov)
- Date: Mon, 31 Jul 00 20:39:41 CDT
Nick Clifton <nickc@cygnus.com> wrote:
> Approved and applied.
Thanks!
In gas/ChangeLog:
: * doc/c-m68k.texi: Document new command line option.
Thanks for documenting the new option, I should have done this myself in the
original patch. In fact, what I really should have done in the original patch,
and what I've just done now, is to rewrite the whole section about branch
relaxation to match what the current gas relaxer actually does, both with and
without --pcrel on all processors. The old description is nowhere near the
reality. The patch is below. It also describes the --pcrel option more
accurately.
--
Michael Sokolov Harhan Engineering Laboratory
Public Service Agent International Free Computing Task Force
International Engineering and Science Task Force
615 N GOOD LATIMER EXPY STE #4
DALLAS TX 75204-5852 USA
Phone: +1-214-824-7693 (Harhan Eng Lab office)
E-mail: msokolov@ivan.Harhan.ORG (ARPA TCP/SMTP) (UUCP coming soon)
P.S. I believe "PC-relative" is correctly written like this, with a hyphen, but
I'm not a native speaker.
2000-07-31 Michael Sokolov <msokolov@ivan.Harhan.ORG>
* doc/c-m68k.texi (@cindex @samp{--pcrel}): Rewrite option description.
(@node M68K-Branch): Rewrite to match the reality.
Index: c-m68k.texi
===================================================================
RCS file: /cvs/src/src/gas/doc/c-m68k.texi,v
retrieving revision 1.2
diff -c -r1.2 c-m68k.texi
*** c-m68k.texi 2000/07/31 22:08:14 1.2
--- c-m68k.texi 2000/08/01 01:23:06
***************
*** 85,95 ****
@samp{--disp-size-default-32} option to restore the default behaviour.
@cindex @samp{--pcrel}
! Always generate PC relative branches. Actually what this option really
! does is to prevent PC relative branches from being turned into absolute
! jumps. If this cannot be done (because the specific architecture does
! not have a suitable PC relative branch instruction), the assembler will
! generate an error message.
@cindex @samp{-m68000} and related options
@cindex architecture options, M680x0
--- 85,99 ----
@samp{--disp-size-default-32} option to restore the default behaviour.
@cindex @samp{--pcrel}
! Always keep branches PC-relative. In the M680x0 architecture all branches
! are defined as PC-relative. However, on some processors they are limited
! to word displacements maximum. When @code{@value{AS}} needs a long branch
! that is not available, it normally emits an absolute jump instead. This
! option disables this substitution. When this option is given and no long
! branches are available, only word branches will be emitted. An error
! message will be generated if a word branch cannot reach its target. This
! option has no effect on 68020 and other processors that have long branches.
! @pxref{M68K-Branch,,Branch Improvement}.
@cindex @samp{-m68000} and related options
@cindex architecture options, M680x0
***************
*** 410,437 ****
@smallexample
Displacement
! +-------------------------------------------------
! | 68020 68000/10
! Pseudo-Op |BYTE WORD LONG LONG non-PC relative
! +-------------------------------------------------
! jbsr |bsrs bsr bsrl jsr jsr
! jra |bras bra bral jmp jmp
! * jXX |bXXs bXX bXXl bNXs;jmpl bNXs;jmp
! * dbXX |dbXX dbXX dbXX; bra; jmpl
! * fjXX |fbXXw fbXXw fbXXl fbNXw;jmp
XX: condition
NX: negative of condition XX
@end smallexample
@center @code{*}---see full description below
@table @code
@item jbsr
@itemx jra
These are the simplest jump pseudo-operations; they always map to one
particular machine instruction, depending on the displacement to the
! branch target.
@item j@var{XX}
Here, @samp{j@var{XX}} stands for an entire family of pseudo-operations,
--- 414,452 ----
@smallexample
Displacement
! +------------------------------------------------------------
! | 68020 68000/10, not PC-relative OK
! Pseudo-Op |BYTE WORD LONG ABSOLUTE LONG JUMP **
! +------------------------------------------------------------
! jbsr |bsrs bsrw bsrl jsr
! jra |bras braw bral jmp
! * jXX |bXXs bXXw bXXl bNXs;jmp
! * dbXX | N/A dbXXw dbXX;bras;bral dbXX;bras;jmp
! fjXX | N/A fbXXw fbXXl N/A
XX: condition
NX: negative of condition XX
@end smallexample
@center @code{*}---see full description below
+ @center @code{**}---this expansion mode is disallowed by @samp{--pcrel}
@table @code
@item jbsr
@itemx jra
These are the simplest jump pseudo-operations; they always map to one
particular machine instruction, depending on the displacement to the
! branch target. This instruction will be a byte or word branch is that
! is sufficient. Otherwise, a long branch will be emitted if available.
! If no long branches are available and the @samp{--pcrel} option is not
! given, an absolute long jump will be emitted instead. If no long
! branches are available, the @samp{--pcrel} option is given, and a word
! branch cannot reach the target, an error message is generated.
!
! In addition to standard branch operands, @code{@value{AS}} allows these
! pseudo-operations to have all operands that are allowed for jsr and jmp,
! substituting these instructions if the operand given is not valid for a
! branch instruction.
@item j@var{XX}
Here, @samp{j@var{XX}} stands for an entire family of pseudo-operations,
***************
*** 442,451 ****
jvs jpl jmi jge jlt jgt jle
@end smallexample
! For the cases of non-PC relative displacements and long displacements on
! the 68000 or 68010, @code{@value{AS}} issues a longer code fragment in terms of
! @var{NX}, the opposite condition to @var{XX}. For example, for the
! non-PC relative case:
@smallexample
j@var{XX} foo
@end smallexample
--- 457,467 ----
jvs jpl jmi jge jlt jgt jle
@end smallexample
! Usually, each of these pseudo-operations expands to a single branch
! instruction. However, if a word branch is not sufficient, no long branches
! are available, and the @samp{--pcrel} option is not given, @code{@value{AS}}
! issues a longer code fragment in terms of @var{NX}, the opposite condition
! to @var{XX}. For example, under these conditions:
@smallexample
j@var{XX} foo
@end smallexample
***************
*** 464,478 ****
dbf dbra dbt
@end smallexample
! Other than for word and byte displacements, when the source reads
@samp{db@var{XX} foo}, @code{@value{AS}} emits
@smallexample
db@var{XX} oo1
! bra oo2
! oo1:jmpl foo
oo2:
@end smallexample
@item fj@var{XX}
This family includes
@smallexample
--- 480,506 ----
dbf dbra dbt
@end smallexample
! Motorola @samp{db@var{XX}} instructions allow word displacements only. When
! a word displacement is sufficient, each of these pseudo-operations expands
! to the corresponding Motorola instruction. When a word displacement is not
! sufficient and long branches are available, when the source reads
@samp{db@var{XX} foo}, @code{@value{AS}} emits
@smallexample
db@var{XX} oo1
! bras oo2
! oo1:bral foo
oo2:
@end smallexample
+ If, however, long branches are not available and the @samp{--pcrel} option is
+ not given, @code{@value{AS}} emits
+ @smallexample
+ db@var{XX} oo1
+ bras oo2
+ oo1:jmp foo
+ oo2:
+ @end smallexample
+
@item fj@var{XX}
This family includes
@smallexample
***************
*** 483,495 ****
fjugt fjule fjult fjun
@end smallexample
! For branch targets that are not PC relative, @code{@value{AS}} emits
! @smallexample
! fb@var{NX} oof
! jmp foo
! oof:
! @end smallexample
! when it encounters @samp{fj@var{XX} foo}.
@end table
--- 511,519 ----
fjugt fjule fjult fjun
@end smallexample
! Each of these pseudo-operations always expands to a single Motorola
! coprocessor branch instruction, word or long. All Motorola coprocessor
! branch instructions allow both word and long displacements.
@end table