From: Aaron Sawdey Date: Fri, 24 Jul 2020 19:13:48 +0000 (-0500) Subject: rs6000: add option -mblock-ops-unaligned-vsx X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=e398fcb9ce8eed5df3bc3ef1549450979028230f;p=gcc.git rs6000: add option -mblock-ops-unaligned-vsx This option is mostly being added to provide -mno-block-ops-unaligned-vsx. The default is set the same as -mefficient-unaligned-vsx. This option will control the use of unaligned VSX loads/stores in the inline expansion of memcpy() and memmove(). The use case for this would be if you're compiling code that is doing a memcpy to memory mapped device memory that is cache-inhibited. On some powerpc processors this requires the unaligned vsx ops to be emulated by the kernel which is very slow. gcc/ChangeLog: * config/rs6000/rs6000.c (rs6000_option_override_internal): Set the default value for -mblock-ops-unaligned-vsx. * config/rs6000/rs6000.opt: Add -mblock-ops-unaligned-vsx. * doc/invoke.texi: Document -mblock-ops-unaligned-vsx. --- diff --git a/gcc/config/rs6000/rs6000.c b/gcc/config/rs6000/rs6000.c index 6bea544d26a..0c7506ff85d 100644 --- a/gcc/config/rs6000/rs6000.c +++ b/gcc/config/rs6000/rs6000.c @@ -3979,6 +3979,14 @@ rs6000_option_override_internal (bool global_init_p) } } + if (!(rs6000_isa_flags_explicit & OPTION_MASK_BLOCK_OPS_UNALIGNED_VSX)) + { + if (TARGET_EFFICIENT_UNALIGNED_VSX) + rs6000_isa_flags |= OPTION_MASK_BLOCK_OPS_UNALIGNED_VSX; + else + rs6000_isa_flags &= ~OPTION_MASK_BLOCK_OPS_UNALIGNED_VSX; + } + /* Use long double size to select the appropriate long double. We use TYPE_PRECISION to differentiate the 3 different long double types. We map 128 into the precision used for TFmode. */ @@ -23167,6 +23175,8 @@ struct rs6000_opt_mask { static struct rs6000_opt_mask const rs6000_opt_masks[] = { { "altivec", OPTION_MASK_ALTIVEC, false, true }, + { "block-ops-unaligned-vsx", OPTION_MASK_BLOCK_OPS_UNALIGNED_VSX, + false, true }, { "cmpb", OPTION_MASK_CMPB, false, true }, { "crypto", OPTION_MASK_CRYPTO, false, true }, { "direct-move", OPTION_MASK_DIRECT_MOVE, false, true }, diff --git a/gcc/config/rs6000/rs6000.opt b/gcc/config/rs6000/rs6000.opt index 59106753997..9d3e740e930 100644 --- a/gcc/config/rs6000/rs6000.opt +++ b/gcc/config/rs6000/rs6000.opt @@ -324,6 +324,10 @@ mblock-move-inline-limit= Target Report Var(rs6000_block_move_inline_limit) Init(0) RejectNegative Joined UInteger Save Max number of bytes to move inline. +mblock-ops-unaligned-vsx +Target Report Mask(BLOCK_OPS_UNALIGNED_VSX) Var(rs6000_isa_flags) +Generate unaligned VSX load/store for inline expansion of memcpy/memmove. + mblock-compare-inline-limit= Target Report Var(rs6000_block_compare_inline_limit) Init(63) RejectNegative Joined UInteger Save Max number of bytes to compare without loops. diff --git a/gcc/doc/invoke.texi b/gcc/doc/invoke.texi index ba18e05fb1a..5449c338370 100644 --- a/gcc/doc/invoke.texi +++ b/gcc/doc/invoke.texi @@ -1182,6 +1182,7 @@ See RS/6000 and PowerPC Options. -mblock-move-inline-limit=@var{num} @gol -mblock-compare-inline-limit=@var{num} @gol -mblock-compare-inline-loop-limit=@var{num} @gol +-mno-block-ops-unaligned-vsx @gol -mstring-compare-inline-limit=@var{num} @gol -misel -mno-isel @gol -mvrsave -mno-vrsave @gol @@ -27023,6 +27024,13 @@ store instructions when the option @option{-mcpu=future} is used. @opindex mno-mma Generate (do not generate) the MMA instructions when the option @option{-mcpu=future} is used. + +@item -mblock-ops-unaligned-vsx +@itemx -mno-block-ops-unaligned-vsx +@opindex block-ops-unaligned-vsx +@opindex no-block-ops-unaligned-vsx +Generate (do not generate) unaligned vsx loads and stores for +inline expansion of @code{memcpy} and @code{memmove}. @end table @node RX Options