From 76cf450b4ce818b298451619e80e041e6eb4ec24 Mon Sep 17 00:00:00 2001 From: "H.J. Lu" Date: Thu, 12 Dec 2019 11:57:03 -0800 Subject: [PATCH] i386: Add -mbranches-within-32B-boundaries Add -mbranches-within-32B-boundaries to enable -malign-branch-boundary=32 -malign-branch=jcc+fused+jmp -malign-branch-prefix-size=5 * config/tc-i386.c (OPTION_MBRANCHES_WITH_32B_BOUNDARIES): New. (md_longopts): Add -mbranches-within-32B-boundaries. (md_parse_option): Handle -mbranches-within-32B-boundaries. (md_show_usage): Add -mbranches-within-32B-boundaries. --- gas/ChangeLog | 7 +++++++ gas/config/tc-i386.c | 13 +++++++++++++ gas/doc/c-i386.texi | 11 +++++++++++ 3 files changed, 31 insertions(+) diff --git a/gas/ChangeLog b/gas/ChangeLog index 7b83a0abd13..c6f776c028f 100644 --- a/gas/ChangeLog +++ b/gas/ChangeLog @@ -1,3 +1,10 @@ +2019-12-12 H.J. Lu + + * config/tc-i386.c (OPTION_MBRANCHES_WITH_32B_BOUNDARIES): New. + (md_longopts): Add -mbranches-within-32B-boundaries. + (md_parse_option): Handle -mbranches-within-32B-boundaries. + (md_show_usage): Add -mbranches-within-32B-boundaries. + 2019-12-12 H.J. Lu * config/tc-i386.c (_i386_insn): Add has_gotpc_tls_reloc. diff --git a/gas/config/tc-i386.c b/gas/config/tc-i386.c index 41a6a0817a8..6c71fc4d223 100644 --- a/gas/config/tc-i386.c +++ b/gas/config/tc-i386.c @@ -12000,6 +12000,7 @@ const char *md_shortopts = "qnO::"; #define OPTION_MALIGN_BRANCH_BOUNDARY (OPTION_MD_BASE + 27) #define OPTION_MALIGN_BRANCH_PREFIX_SIZE (OPTION_MD_BASE + 28) #define OPTION_MALIGN_BRANCH (OPTION_MD_BASE + 29) +#define OPTION_MBRANCHES_WITH_32B_BOUNDARIES (OPTION_MD_BASE + 30) struct option md_longopts[] = { @@ -12038,6 +12039,7 @@ struct option md_longopts[] = {"malign-branch-boundary", required_argument, NULL, OPTION_MALIGN_BRANCH_BOUNDARY}, {"malign-branch-prefix-size", required_argument, NULL, OPTION_MALIGN_BRANCH_PREFIX_SIZE}, {"malign-branch", required_argument, NULL, OPTION_MALIGN_BRANCH}, + {"mbranches-within-32B-boundaries", no_argument, NULL, OPTION_MBRANCHES_WITH_32B_BOUNDARIES}, {"mamd64", no_argument, NULL, OPTION_MAMD64}, {"mintel64", no_argument, NULL, OPTION_MINTEL64}, {NULL, no_argument, NULL, 0} @@ -12500,6 +12502,14 @@ md_parse_option (int c, const char *arg) free (saved); break; + case OPTION_MBRANCHES_WITH_32B_BOUNDARIES: + align_branch_power = 5; + align_branch_prefix_size = 5; + align_branch = (align_branch_jcc_bit + | align_branch_fused_bit + | align_branch_jmp_bit); + break; + case OPTION_MAMD64: intel64 = 0; break; @@ -12763,6 +12773,9 @@ md_show_usage (FILE *stream) -malign-branch-prefix-size=NUM (default: 5)\n\ align branches with NUM prefixes per instruction\n")); fprintf (stream, _("\ + -mbranches-within-32B-boundaries\n\ + align branches within 32 byte boundary\n")); + fprintf (stream, _("\ -mamd64 accept only AMD64 ISA [default]\n")); fprintf (stream, _("\ -mintel64 accept only Intel64 ISA\n")); diff --git a/gas/doc/c-i386.texi b/gas/doc/c-i386.texi index 74296e61f69..08f139cc150 100644 --- a/gas/doc/c-i386.texi +++ b/gas/doc/c-i386.texi @@ -449,6 +449,17 @@ This option specifies the maximum number of prefixes on an instruction to align branches. @var{NUM} should be between 0 and 5. The default @var{NUM} is 5. +@cindex @samp{-mbranches-within-32B-boundaries} option, i386 +@cindex @samp{-mbranches-within-32B-boundaries} option, x86-64 +@item -mbranches-within-32B-boundaries +This option aligns conditional jumps, fused conditional jumps and +unconditional jumps within 32 byte boundary with up to 5 segment prefixes +on an instruction. It is equivalent to +@option{-malign-branch-boundary=32} +@option{-malign-branch=jcc+fused+jmp} +@option{-malign-branch-prefix-size=5}. +The default doesn't align branches. + @cindex @samp{-mx86-used-note=} option, i386 @cindex @samp{-mx86-used-note=} option, x86-64 @item -mx86-used-note=@var{no} -- 2.30.2