Commit 9e423e6d by John Wehle Committed by Jeff Law

acconfig.h (HAVE_GAS_MAX_SKIP_P2ALIGN): New tag.

	* acconfig.h (HAVE_GAS_MAX_SKIP_P2ALIGN): New tag.
	* configure.in: Check for it.
	* i386/gas.h (ASM_OUTPUT_MAX_SKIP_ALIGN): Use it.
	* final.c (uid_align, uid_shuid, label_align): Make static.
	(label_align): Change type to struct label_alignment pointer.
	(LABEL_TO_ALIGNMENT, shorten_branches): Update due to type change.
	(LABEL_TO_MAX_SKIP): Define.
	(LABEL_ALIGN_MAX_SKIP, LOOP_ALIGN_MAX_SKIP,
	LABEL_ALIGN_AFTER_BARRIER_MAX_SKIP): Provide defaults.
	(shorten_branches): Record the maximum bytes to skip when
	aligning a label.
	(final_scan_insn): Use the maximum bytes to skip when aligning a label
	if ASM_OUTPUT_MAX_SKIP_ALIGN is available.
	* i386.h (LOOP_ALIGN_MAX_SKIP,
	LABEL_ALIGN_AFTER_BARRIER_MAX_SKIP): Define.
	* i386.c (override_options): i386_align_jumps and i386_align_loops
	default to 4 if ASM_OUTPUT_MAX_SKIP_ALIGN is available.
	* invoke.texi: Document new i386 align-loops and align-jumps behavior.

From-SVN: r19933
parent 1cc75298
Wed May 20 23:44:28 EDT 1998 John Wehle (john@feith.com)
* acconfig.h (HAVE_GAS_MAX_SKIP_P2ALIGN): New tag.
* configure.in: Check for it.
* i386/gas.h (ASM_OUTPUT_MAX_SKIP_ALIGN): Use it.
* final.c (uid_align, uid_shuid, label_align): Make static.
(label_align): Change type to struct label_alignment pointer.
(LABEL_TO_ALIGNMENT, shorten_branches): Update due to type change.
(LABEL_TO_MAX_SKIP): Define.
(LABEL_ALIGN_MAX_SKIP, LOOP_ALIGN_MAX_SKIP,
LABEL_ALIGN_AFTER_BARRIER_MAX_SKIP): Provide defaults.
(shorten_branches): Record the maximum bytes to skip when
aligning a label.
(final_scan_insn): Use the maximum bytes to skip when aligning a label
if ASM_OUTPUT_MAX_SKIP_ALIGN is available.
* i386.h (LOOP_ALIGN_MAX_SKIP,
LABEL_ALIGN_AFTER_BARRIER_MAX_SKIP): Define.
* i386.c (override_options): i386_align_jumps and i386_align_loops
default to 4 if ASM_OUTPUT_MAX_SKIP_ALIGN is available.
* invoke.texi: Document new i386 align-loops and align-jumps behavior.
1998-05-21 Mark Mitchell <mmitchell@usa.net> 1998-05-21 Mark Mitchell <mmitchell@usa.net>
* cplus-dem.c (do_type): Handle volatile qualification. * cplus-dem.c (do_type): Handle volatile qualification.
......
...@@ -10,6 +10,10 @@ ...@@ -10,6 +10,10 @@
/* Define if your compiler understands volatile. */ /* Define if your compiler understands volatile. */
#undef HAVE_VOLATILE #undef HAVE_VOLATILE
/* Define if your assembler supports specifying the maximum number
of bytes to skip when using the GAS .p2align command. */
#undef HAVE_GAS_MAX_SKIP_P2ALIGN
/* Define if you have a working <inttypes.h> header file. */ /* Define if you have a working <inttypes.h> header file. */
#undef HAVE_INTTYPES_H #undef HAVE_INTTYPES_H
......
...@@ -11,6 +11,10 @@ ...@@ -11,6 +11,10 @@
/* Define if your compiler understands volatile. */ /* Define if your compiler understands volatile. */
#undef HAVE_VOLATILE #undef HAVE_VOLATILE
/* Define if your assembler supports specifying the maximum number
of bytes to skip when using the GAS .p2align command. */
#undef HAVE_GAS_MAX_SKIP_P2ALIGN
/* Define if you have a working <inttypes.h> header file. */ /* Define if you have a working <inttypes.h> header file. */
#undef HAVE_INTTYPES_H #undef HAVE_INTTYPES_H
......
...@@ -85,6 +85,19 @@ Boston, MA 02111-1307, USA. */ ...@@ -85,6 +85,19 @@ Boston, MA 02111-1307, USA. */
#define ASM_OUTPUT_ALIGN(FILE,LOG) \ #define ASM_OUTPUT_ALIGN(FILE,LOG) \
if ((LOG)!=0) fprintf ((FILE), "\t.balign %d\n", 1<<(LOG)) if ((LOG)!=0) fprintf ((FILE), "\t.balign %d\n", 1<<(LOG))
#endif #endif
/* A C statement to output to the stdio stream FILE an assembler
command to advance the location counter to a multiple of 1<<LOG
bytes if it is within MAX_SKIP bytes.
This is used to align code labels according to Intel recommendations. */
#ifdef HAVE_GAS_MAX_SKIP_P2ALIGN
# define ASM_OUTPUT_MAX_SKIP_ALIGN(FILE,LOG,MAX_SKIP) \
if ((LOG)!=0) \
if ((MAX_SKIP)==0) fprintf ((FILE), "\t.p2align %d\n", (LOG)); \
else fprintf ((FILE), "\t.p2align %d,,%d\n", (LOG), (MAX_SKIP))
#endif
/* A C statement or statements which output an assembler instruction /* A C statement or statements which output an assembler instruction
opcode to the stdio stream STREAM. The macro-operand PTR is a opcode to the stdio stream STREAM. The macro-operand PTR is a
......
...@@ -332,7 +332,11 @@ override_options () ...@@ -332,7 +332,11 @@ override_options ()
i386_align_loops, MAX_CODE_ALIGN); i386_align_loops, MAX_CODE_ALIGN);
} }
else else
#ifdef ASM_OUTPUT_MAX_SKIP_ALIGN
i386_align_loops = 4;
#else
i386_align_loops = 2; i386_align_loops = 2;
#endif
/* Validate -malign-jumps= value, or provide default. */ /* Validate -malign-jumps= value, or provide default. */
if (i386_align_jumps_string) if (i386_align_jumps_string)
...@@ -343,7 +347,11 @@ override_options () ...@@ -343,7 +347,11 @@ override_options ()
i386_align_jumps, MAX_CODE_ALIGN); i386_align_jumps, MAX_CODE_ALIGN);
} }
else else
#ifdef ASM_OUTPUT_MAX_SKIP_ALIGN
i386_align_jumps = 4;
#else
i386_align_jumps = def_align; i386_align_jumps = def_align;
#endif
/* Validate -malign-functions= value, or provide default. */ /* Validate -malign-functions= value, or provide default. */
if (i386_align_funcs_string) if (i386_align_funcs_string)
......
...@@ -506,11 +506,13 @@ extern int ix86_arch; ...@@ -506,11 +506,13 @@ extern int ix86_arch;
/* Align loop starts for optimal branching. */ /* Align loop starts for optimal branching. */
#define LOOP_ALIGN(LABEL) (i386_align_loops) #define LOOP_ALIGN(LABEL) (i386_align_loops)
#define LOOP_ALIGN_MAX_SKIP (i386_align_loops_string ? 0 : 7)
/* This is how to align an instruction for optimal branching. /* This is how to align an instruction for optimal branching.
On i486 we'll get better performance by aligning on a On i486 we'll get better performance by aligning on a
cache line (i.e. 16 byte) boundary. */ cache line (i.e. 16 byte) boundary. */
#define LABEL_ALIGN_AFTER_BARRIER(LABEL) (i386_align_jumps) #define LABEL_ALIGN_AFTER_BARRIER(LABEL) (i386_align_jumps)
#define LABEL_ALIGN_AFTER_BARRIER_MAX_SKIP (i386_align_jumps_string ? 0 : 7)
/* Standard register usage. */ /* Standard register usage. */
......
...@@ -5070,6 +5070,53 @@ if [ -f ../ld/Makefile ]; then ...@@ -5070,6 +5070,53 @@ if [ -f ../ld/Makefile ]; then
# fi # fi
fi fi
# Figure out what assembler alignment features are present.
echo $ac_n "checking assembler alignment features""... $ac_c" 1>&6
echo "configure:5076: checking assembler alignment features" >&5
gcc_cv_as=
gcc_cv_as_alignment_features=
if [ -x as$host_exeext ]; then
# Build using assembler in the current directory.
gcc_cv_as=./as$host_exeext
elif [ -f $srcdir/../gas/configure.in ]; then
# Single tree build which includes gas.
for f in $srcdir/../gas/configure.in $srcdir/../gas/Makefile.in
do
gcc_cv_gas_version=`grep '^VERSION=[0-9]*\.[0-9]*' $f`
if [ x$gcc_cv_gas_version != x ]; then
break
fi
done
gcc_cv_gas_major_version=`expr "$gcc_cv_gas_version" : "VERSION=\([0-9]*\)"`
gcc_cv_gas_minor_version=`expr "$gcc_cv_gas_version" : "VERSION=[0-9]*\.\([0-9]*\)"`
# Gas version 2.8 and later support specifying the maximum
# bytes to skip when using .p2align.
if [ "$gcc_cv_gas_major_version" -eq 2 -a "$gcc_cv_gas_minor_version" -ge 8 -o "$gcc_cv_gas_major_version" -gt 2 ]; then
gcc_cv_as_alignment_features=".p2align including maximum skip"
cat >> confdefs.h <<\EOF
#define HAVE_GAS_MAX_SKIP_P2ALIGN 1
EOF
fi
elif [ x$host = x$target ]; then
# Native build.
gcc_cv_as=as$host_exeext
fi
if [ x$gcc_cv_as != x ]; then
# Check if specifying the maximum bytes to skip when
# using .p2align is supported.
echo ".p2align 4,,7" > conftest.s
if $gcc_cv_as -o conftest.o conftest.s > /dev/null 2>&1; then
gcc_cv_as_alignment_features=".p2align including maximum skip"
cat >> confdefs.h <<\EOF
#define HAVE_GAS_MAX_SKIP_P2ALIGN 1
EOF
fi
rm -f conftest.s conftest.o
fi
echo "$ac_t""$gcc_cv_as_alignment_features" 1>&6
# Figure out what language subdirectories are present. # Figure out what language subdirectories are present.
subdirs= subdirs=
for lang in ${srcdir}/*/config-lang.in .. for lang in ${srcdir}/*/config-lang.in ..
......
...@@ -3226,6 +3226,46 @@ if [[ -f ../ld/Makefile ]]; then ...@@ -3226,6 +3226,46 @@ if [[ -f ../ld/Makefile ]]; then
# fi # fi
fi fi
# Figure out what assembler alignment features are present.
AC_MSG_CHECKING(assembler alignment features)
gcc_cv_as=
gcc_cv_as_alignment_features=
if [[ -x as$host_exeext ]]; then
# Build using assembler in the current directory.
gcc_cv_as=./as$host_exeext
elif [[ -f $srcdir/../gas/configure.in ]]; then
# Single tree build which includes gas.
for f in $srcdir/../gas/configure.in $srcdir/../gas/Makefile.in
do
gcc_cv_gas_version=`grep '^VERSION=[[0-9]]*\.[[0-9]]*' $f`
if [[ x$gcc_cv_gas_version != x ]]; then
break
fi
done
gcc_cv_gas_major_version=`expr "$gcc_cv_gas_version" : "VERSION=\([[0-9]]*\)"`
gcc_cv_gas_minor_version=`expr "$gcc_cv_gas_version" : "VERSION=[[0-9]]*\.\([[0-9]]*\)"`
# Gas version 2.8 and later support specifying the maximum
# bytes to skip when using .p2align.
if [[ "$gcc_cv_gas_major_version" -eq 2 -a "$gcc_cv_gas_minor_version" -ge 8 -o "$gcc_cv_gas_major_version" -gt 2 ]]; then
gcc_cv_as_alignment_features=".p2align including maximum skip"
AC_DEFINE(HAVE_GAS_MAX_SKIP_P2ALIGN)
fi
elif [[ x$host = x$target ]]; then
# Native build.
gcc_cv_as=as$host_exeext
fi
if [[ x$gcc_cv_as != x ]]; then
# Check if specifying the maximum bytes to skip when
# using .p2align is supported.
echo ".p2align 4,,7" > conftest.s
if $gcc_cv_as -o conftest.o conftest.s > /dev/null 2>&1; then
gcc_cv_as_alignment_features=".p2align including maximum skip"
AC_DEFINE(HAVE_GAS_MAX_SKIP_P2ALIGN)
fi
rm -f conftest.s conftest.o
fi
AC_MSG_RESULT($gcc_cv_as_alignment_features)
# Figure out what language subdirectories are present. # Figure out what language subdirectories are present.
subdirs= subdirs=
for lang in ${srcdir}/*/config-lang.in .. for lang in ${srcdir}/*/config-lang.in ..
......
...@@ -649,9 +649,14 @@ int insn_current_align; ...@@ -649,9 +649,14 @@ int insn_current_align;
for each insn we'll call the alignment chain of this insn in the following for each insn we'll call the alignment chain of this insn in the following
comments. */ comments. */
rtx *uid_align; struct label_alignment {
int *uid_shuid; short alignment;
short *label_align; short max_skip;
};
static rtx *uid_align;
static int *uid_shuid;
static struct label_alignment *label_align;
/* Indicate that branch shortening hasn't yet been done. */ /* Indicate that branch shortening hasn't yet been done. */
...@@ -794,14 +799,26 @@ get_attr_length (insn) ...@@ -794,14 +799,26 @@ get_attr_length (insn)
#define LABEL_ALIGN(LABEL) 0 #define LABEL_ALIGN(LABEL) 0
#endif #endif
#ifndef LABEL_ALIGN_MAX_SKIP
#define LABEL_ALIGN_MAX_SKIP 0
#endif
#ifndef LOOP_ALIGN #ifndef LOOP_ALIGN
#define LOOP_ALIGN(LABEL) 0 #define LOOP_ALIGN(LABEL) 0
#endif #endif
#ifndef LOOP_ALIGN_MAX_SKIP
#define LOOP_ALIGN_MAX_SKIP 0
#endif
#ifndef LABEL_ALIGN_AFTER_BARRIER #ifndef LABEL_ALIGN_AFTER_BARRIER
#define LABEL_ALIGN_AFTER_BARRIER(LABEL) 0 #define LABEL_ALIGN_AFTER_BARRIER(LABEL) 0
#endif #endif
#ifndef LABEL_ALIGN_AFTER_BARRIER_MAX_SKIP
#define LABEL_ALIGN_AFTER_BARRIER_MAX_SKIP 0
#endif
#ifndef ADDR_VEC_ALIGN #ifndef ADDR_VEC_ALIGN
int int
final_addr_vec_align (addr_vec) final_addr_vec_align (addr_vec)
...@@ -826,7 +843,10 @@ final_addr_vec_align (addr_vec) ...@@ -826,7 +843,10 @@ final_addr_vec_align (addr_vec)
static int min_labelno, max_labelno; static int min_labelno, max_labelno;
#define LABEL_TO_ALIGNMENT(LABEL) \ #define LABEL_TO_ALIGNMENT(LABEL) \
(label_align[CODE_LABEL_NUMBER (LABEL) - min_labelno]) (label_align[CODE_LABEL_NUMBER (LABEL) - min_labelno].alignment)
#define LABEL_TO_MAX_SKIP(LABEL) \
(label_align[CODE_LABEL_NUMBER (LABEL) - min_labelno].max_skip)
/* For the benefit of port specific code do this also as a function. */ /* For the benefit of port specific code do this also as a function. */
int int
...@@ -962,6 +982,7 @@ shorten_branches (first) ...@@ -962,6 +982,7 @@ shorten_branches (first)
int max_uid; int max_uid;
int i; int i;
int max_log; int max_log;
int max_skip;
#ifdef HAVE_ATTR_length #ifdef HAVE_ATTR_length
#define MAX_CODE_ALIGN 16 #define MAX_CODE_ALIGN 16
rtx seq; rtx seq;
...@@ -1001,10 +1022,10 @@ shorten_branches (first) ...@@ -1001,10 +1022,10 @@ shorten_branches (first)
max_labelno = max_label_num (); max_labelno = max_label_num ();
min_labelno = get_first_label_num (); min_labelno = get_first_label_num ();
label_align label_align = (struct label_alignment *) xmalloc (
= (short*) xmalloc ((max_labelno - min_labelno + 1) * sizeof (short)); (max_labelno - min_labelno + 1) * sizeof (struct label_alignment));
bzero ((char *) label_align, bzero (label_align,
(max_labelno - min_labelno + 1) * sizeof (short)); (max_labelno - min_labelno + 1) * sizeof (struct label_alignment));
uid_shuid = (int *) xmalloc (max_uid * sizeof *uid_shuid); uid_shuid = (int *) xmalloc (max_uid * sizeof *uid_shuid);
...@@ -1014,7 +1035,10 @@ shorten_branches (first) ...@@ -1014,7 +1035,10 @@ shorten_branches (first)
impose on the next CODE_LABEL (or the current one if we are processing impose on the next CODE_LABEL (or the current one if we are processing
the CODE_LABEL itself). */ the CODE_LABEL itself). */
for (max_log = 0, insn = get_insns (), i = 1; insn; insn = NEXT_INSN (insn)) max_log = 0;
max_skip = 0;
for (insn = get_insns (), i = 1; insn; insn = NEXT_INSN (insn))
{ {
int log; int log;
...@@ -1033,7 +1057,10 @@ shorten_branches (first) ...@@ -1033,7 +1057,10 @@ shorten_branches (first)
log = LABEL_ALIGN (insn); log = LABEL_ALIGN (insn);
if (max_log < log) if (max_log < log)
max_log = log; {
max_log = log;
max_skip = LABEL_ALIGN_MAX_SKIP;
}
next = NEXT_INSN (insn); next = NEXT_INSN (insn);
/* ADDR_VECs only take room if read-only data goes into the text section. */ /* ADDR_VECs only take room if read-only data goes into the text section. */
#if !defined(READONLY_DATA_SECTION) || defined(JUMP_TABLES_IN_TEXT_SECTION) #if !defined(READONLY_DATA_SECTION) || defined(JUMP_TABLES_IN_TEXT_SECTION)
...@@ -1045,12 +1072,17 @@ shorten_branches (first) ...@@ -1045,12 +1072,17 @@ shorten_branches (first)
{ {
log = ADDR_VEC_ALIGN (next); log = ADDR_VEC_ALIGN (next);
if (max_log < log) if (max_log < log)
max_log = log; {
max_log = log;
max_skip = LABEL_ALIGN_MAX_SKIP;
}
} }
} }
#endif #endif
LABEL_TO_ALIGNMENT (insn) = max_log; LABEL_TO_ALIGNMENT (insn) = max_log;
LABEL_TO_MAX_SKIP (insn) = max_skip;
max_log = 0; max_log = 0;
max_skip = 0;
} }
else if (GET_CODE (insn) == BARRIER) else if (GET_CODE (insn) == BARRIER)
{ {
...@@ -1062,7 +1094,10 @@ shorten_branches (first) ...@@ -1062,7 +1094,10 @@ shorten_branches (first)
{ {
log = LABEL_ALIGN_AFTER_BARRIER (insn); log = LABEL_ALIGN_AFTER_BARRIER (insn);
if (max_log < log) if (max_log < log)
max_log = log; {
max_log = log;
max_skip = LABEL_ALIGN_AFTER_BARRIER_MAX_SKIP;
}
break; break;
} }
} }
...@@ -1078,7 +1113,10 @@ shorten_branches (first) ...@@ -1078,7 +1113,10 @@ shorten_branches (first)
{ {
log = LOOP_ALIGN (insn); log = LOOP_ALIGN (insn);
if (max_log < log) if (max_log < log)
max_log = log; {
max_log = log;
max_skip = LOOP_ALIGN_MAX_SKIP;
}
break; break;
} }
} }
...@@ -2222,9 +2260,14 @@ final_scan_insn (insn, file, optimize, prescan, nopeepholes) ...@@ -2222,9 +2260,14 @@ final_scan_insn (insn, file, optimize, prescan, nopeepholes)
if (CODE_LABEL_NUMBER (insn) <= max_labelno) if (CODE_LABEL_NUMBER (insn) <= max_labelno)
{ {
int align = LABEL_TO_ALIGNMENT (insn); int align = LABEL_TO_ALIGNMENT (insn);
int max_skip = LABEL_TO_MAX_SKIP (insn);
if (align && NEXT_INSN (insn)) if (align && NEXT_INSN (insn))
#ifdef ASM_OUTPUT_MAX_SKIP_ALIGN
ASM_OUTPUT_MAX_SKIP_ALIGN (file, align, max_skip);
#else
ASM_OUTPUT_ALIGN (file, align); ASM_OUTPUT_ALIGN (file, align);
#endif
} }
CC_STATUS_INIT; CC_STATUS_INIT;
if (prescan > 0) if (prescan > 0)
......
...@@ -4905,12 +4905,18 @@ startup modules. ...@@ -4905,12 +4905,18 @@ startup modules.
@item -malign-loops=@var{num} @item -malign-loops=@var{num}
Align loops to a 2 raised to a @var{num} byte boundary. If Align loops to a 2 raised to a @var{num} byte boundary. If
@samp{-malign-loops} is not specified, the default is 2. @samp{-malign-loops} is not specified, the default is 2 unless
gas 2.8 (or later) is being used in which case the default is
to align the loop on a 16 byte boundary if it is less than 8
bytes away.
@item -malign-jumps=@var{num} @item -malign-jumps=@var{num}
Align instructions that are only jumped to to a 2 raised to a @var{num} Align instructions that are only jumped to to a 2 raised to a @var{num}
byte boundary. If @samp{-malign-jumps} is not specified, the default is byte boundary. If @samp{-malign-jumps} is not specified, the default is
2 if optimizing for a 386, and 4 if optimizing for a 486. 2 if optimizing for a 386, and 4 if optimizing for a 486 unless
gas 2.8 (or later) is being used in which case the default is
to align the instruction on a 16 byte boundary if it is less
than 8 bytes away.
@item -malign-functions=@var{num} @item -malign-functions=@var{num}
Align the start of functions to a 2 raised to @var{num} byte boundary. Align the start of functions to a 2 raised to @var{num} byte boundary.
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment