This is the mail archive of the binutils@sources.redhat.com mailing list for the binutils project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]

Re: PATCH to gas: --pcrel option for m68k


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
  

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]