Add outline-atomics to target attribute.
* common/config/aarch64/aarch64-common.c (aarch64_handle_option): Handle OPT_moutline_atomics. * config/aarch64/aarch64.c: Add outline-atomics to aarch64_attributes. * doc/extend.texi: Document the newly added target attribute. * gcc.target/aarch64/target_attr_20.c: New test. * gcc.target/aarch64/target_attr_21.c: New test.
This commit is contained in:
parent
62b5b53e94
commit
9e02b45ffc
7 changed files with 79 additions and 0 deletions
|
@ -1,3 +1,11 @@
|
|||
2020-05-21 Martin Liska <mliska@suse.cz>
|
||||
|
||||
* common/config/aarch64/aarch64-common.c (aarch64_handle_option):
|
||||
Handle OPT_moutline_atomics.
|
||||
* config/aarch64/aarch64.c: Add outline-atomics to
|
||||
aarch64_attributes.
|
||||
* doc/extend.texi: Document the newly added target attribute.
|
||||
|
||||
2020-05-21 Uroš Bizjak <ubizjak@gmail.com>
|
||||
|
||||
PR target/95218
|
||||
|
|
|
@ -116,6 +116,10 @@ aarch64_handle_option (struct gcc_options *opts,
|
|||
opts->x_flag_omit_leaf_frame_pointer = val;
|
||||
return true;
|
||||
|
||||
case OPT_moutline_atomics:
|
||||
opts->x_aarch64_flag_outline_atomics = val;
|
||||
return true;
|
||||
|
||||
default:
|
||||
return true;
|
||||
}
|
||||
|
|
|
@ -15266,6 +15266,8 @@ static const struct aarch64_attribute_info aarch64_attributes[] =
|
|||
aarch64_handle_attr_branch_protection, OPT_mbranch_protection_ },
|
||||
{ "sign-return-address", aarch64_attr_enum, false, NULL,
|
||||
OPT_msign_return_address_ },
|
||||
{ "outline-atomics", aarch64_attr_bool, true, NULL,
|
||||
OPT_moutline_atomics},
|
||||
{ NULL, aarch64_attr_custom, false, NULL, OPT____ }
|
||||
};
|
||||
|
||||
|
|
|
@ -4066,6 +4066,12 @@ Select the function scope on which branch protection will be applied. The
|
|||
behavior and permissible arguments are the same as for the command-line option
|
||||
@option{-mbranch-protection=}. The default value is @code{none}.
|
||||
|
||||
@item outline-atomics
|
||||
@cindex @code{outline-atomics} function attribute, AArch64
|
||||
Enable or disable calls to out-of-line helpers to implement atomic operations.
|
||||
This corresponds to the behavior of the command line options
|
||||
@option{-moutline-atomics} and @option{-mno-outline-atomics}.
|
||||
|
||||
@end table
|
||||
|
||||
The above target attributes can be specified as follows:
|
||||
|
|
|
@ -1,3 +1,8 @@
|
|||
2020-05-21 Martin Liska <mliska@suse.cz>
|
||||
|
||||
* gcc.target/aarch64/target_attr_20.c: New test.
|
||||
* gcc.target/aarch64/target_attr_21.c: New test.
|
||||
|
||||
2020-05-20 Jozef Lawrynowicz <jozef.l@mittosystems.com>
|
||||
|
||||
* g++.dg/warn/Wconversion-null-2.C: Add explicit declarations for l()
|
||||
|
|
27
gcc/testsuite/gcc.target/aarch64/target_attr_20.c
Normal file
27
gcc/testsuite/gcc.target/aarch64/target_attr_20.c
Normal file
|
@ -0,0 +1,27 @@
|
|||
/* { dg-do compile } */
|
||||
/* { dg-options "-march=armv8-a+nolse -moutline-atomics" } */
|
||||
|
||||
int b, c, d, e, f, h;
|
||||
short g;
|
||||
int foo (int) __attribute__ ((__const__));
|
||||
|
||||
__attribute__ ((target ("no-outline-atomics")))
|
||||
void
|
||||
bar (void)
|
||||
{
|
||||
while (1)
|
||||
{
|
||||
while (1)
|
||||
{
|
||||
__atomic_load_n (&e, 0);
|
||||
if (foo (2))
|
||||
__sync_val_compare_and_swap (&c, 0, f);
|
||||
b = 1;
|
||||
if (h == e)
|
||||
break;
|
||||
}
|
||||
__sync_val_compare_and_swap (&g, -1, f);
|
||||
}
|
||||
}
|
||||
|
||||
/* { dg-final { scan-assembler-not "bl.*__aarch64_cas2_acq_rel" } } */
|
27
gcc/testsuite/gcc.target/aarch64/target_attr_21.c
Normal file
27
gcc/testsuite/gcc.target/aarch64/target_attr_21.c
Normal file
|
@ -0,0 +1,27 @@
|
|||
/* { dg-do compile } */
|
||||
/* { dg-options "-march=armv8-a+nolse -mno-outline-atomics" } */
|
||||
|
||||
int b, c, d, e, f, h;
|
||||
short g;
|
||||
int foo (int) __attribute__ ((__const__));
|
||||
|
||||
__attribute__ ((target ("outline-atomics")))
|
||||
void
|
||||
bar (void)
|
||||
{
|
||||
while (1)
|
||||
{
|
||||
while (1)
|
||||
{
|
||||
__atomic_load_n (&e, 0);
|
||||
if (foo (2))
|
||||
__sync_val_compare_and_swap (&c, 0, f);
|
||||
b = 1;
|
||||
if (h == e)
|
||||
break;
|
||||
}
|
||||
__sync_val_compare_and_swap (&g, -1, f);
|
||||
}
|
||||
}
|
||||
|
||||
/* { dg-final { scan-assembler-times "bl.*__aarch64_cas2_acq_rel" 1 } } */
|
Loading…
Add table
Reference in a new issue