Commit aba92f5f by Oleg Endo

re PR target/53512 (SH Target: Allow fsca and fsrra for non-SH4A)

	PR target/53512
	* sh.opt (mfsca, mfsrra): New options.
	* sh.md (rsqrtsf2): Use TARGET_FPU_ANY and TARGET_FSRRA	condition.
	(fsca): Use TARGET_FPU_ANY and TARGET_FSCA condition.
	(sinssf2, cossf2): Fold expanders to ...
	(sincossf3): ... this new expander.  Use TARGET_FPU_ANY and
	TARGET_FSCA condition.
	* sh.c (sh_option_override): Handle TARGET_FSRRA and TARGET_FSCA.
	* doc/invoke.texi (SH Options): Add descriptions for -mfsca,
	-mno-fsca, -mfsrra, -mno-fsrra.

	PR target/53512
	* gcc.target/sh/pr53512-1.c: New.
	* gcc.target/sh/pr53512-2.c: New.
	* gcc.target/sh/pr53512-3.c: New.
	* gcc.target/sh/pr53512-4.c: New.

From-SVN: r188149
parent d58e7d69
2012-06-03 Oleg Endo <olegendo@gcc.gnu.org>
PR target/53512
* sh.opt (mfsca, mfsrra): New options.
* sh.md (rsqrtsf2): Use TARGET_FPU_ANY and TARGET_FSRRA condition.
(fsca): Use TARGET_FPU_ANY and TARGET_FSCA condition.
(sinssf2, cossf2): Fold expanders to ...
(sincossf3): ... this new expander. Use TARGET_FPU_ANY and
TARGET_FSCA condition.
* sh.c (sh_option_override): Handle TARGET_FSRRA and TARGET_FSCA.
* doc/invoke.texi (SH Options): Add descriptions for -mfsca,
-mno-fsca, -mfsrra, -mno-fsrra.
2012-06-03 Matt Turner <mattst88@gmail.com> 2012-06-03 Matt Turner <mattst88@gmail.com>
* config/mips/4600.md (r4700_imul_si): New. * config/mips/4600.md (r4700_imul_si): New.
...@@ -18,7 +31,7 @@ ...@@ -18,7 +31,7 @@
* config/sparc/sparc-protos.h (sparc_initial_elimination_offset): * config/sparc/sparc-protos.h (sparc_initial_elimination_offset):
Prototype it. Prototype it.
2012-06-2 Kenneth Zadeck <zadeck@naturalbridge.com> 2012-06-02 Kenneth Zadeck <zadeck@naturalbridge.com>
* expmed.c (expand_mult, choose_multiplier): Change "2 * * expmed.c (expand_mult, choose_multiplier): Change "2 *
HOST_BITS_PER_WIDE_INT" to "HOST_BITS_PER_DOUBLE_INT". HOST_BITS_PER_WIDE_INT" to "HOST_BITS_PER_DOUBLE_INT".
......
...@@ -876,13 +876,30 @@ sh_option_override (void) ...@@ -876,13 +876,30 @@ sh_option_override (void)
align_functions = min_align; align_functions = min_align;
} }
if (flag_unsafe_math_optimizations)
{
/* Enable fmac insn for "a * b + c" SFmode calculations when -ffast-math /* Enable fmac insn for "a * b + c" SFmode calculations when -ffast-math
is enabled and -mno-fused-madd is not specified by the user. is enabled and -mno-fused-madd is not specified by the user.
The fmac insn can't be enabled by default due to the implied The fmac insn can't be enabled by default due to the implied
FMA semantics. See also PR target/29100. */ FMA semantics. See also PR target/29100. */
if (global_options_set.x_TARGET_FMAC == 0 && flag_unsafe_math_optimizations) if (global_options_set.x_TARGET_FMAC == 0)
TARGET_FMAC = 1; TARGET_FMAC = 1;
/* Enable fsca insn for SH4A if not otherwise specified by the user. */
if (global_options_set.x_TARGET_FSCA == 0 && TARGET_SH4A_FP)
TARGET_FSCA = 1;
/* Enable fsrra insn for SH4A if not otherwise specified by the user. */
if (global_options_set.x_TARGET_FSRRA == 0 && TARGET_SH4A_FP)
TARGET_FSRRA = 1;
}
/* Allow fsrra insn only if -funsafe-math-optimizations and
-ffinite-math-only is enabled. */
TARGET_FSRRA = TARGET_FSRRA
&& flag_unsafe_math_optimizations
&& flag_finite_math_only;
if (sh_fixed_range_str) if (sh_fixed_range_str)
sh_fix_range (sh_fixed_range_str); sh_fix_range (sh_fixed_range_str);
...@@ -896,7 +913,6 @@ sh_option_override (void) ...@@ -896,7 +913,6 @@ sh_option_override (void)
error ("-msoft-atomic and -mhard-atomic cannot be used at the same time"); error ("-msoft-atomic and -mhard-atomic cannot be used at the same time");
if (TARGET_HARD_ATOMIC && ! TARGET_SH4A_ARCH) if (TARGET_HARD_ATOMIC && ! TARGET_SH4A_ARCH)
error ("-mhard-atomic is only available for SH4A targets"); error ("-mhard-atomic is only available for SH4A targets");
} }
/* Print the operand address in x to the stream. */ /* Print the operand address in x to the stream. */
......
...@@ -10689,7 +10689,7 @@ label: ...@@ -10689,7 +10689,7 @@ label:
(div:SF (match_operand:SF 1 "immediate_operand" "i") (div:SF (match_operand:SF 1 "immediate_operand" "i")
(sqrt:SF (match_operand:SF 2 "register_operand" "0")))) (sqrt:SF (match_operand:SF 2 "register_operand" "0"))))
(use (match_operand:PSI 3 "fpscr_operand" "c"))] (use (match_operand:PSI 3 "fpscr_operand" "c"))]
"TARGET_SH4A_FP && flag_unsafe_math_optimizations "TARGET_FPU_ANY && TARGET_FSRRA
&& operands[1] == CONST1_RTX (SFmode)" && operands[1] == CONST1_RTX (SFmode)"
"fsrra %0" "fsrra %0"
[(set_attr "type" "fsrra") [(set_attr "type" "fsrra")
...@@ -10705,47 +10705,35 @@ label: ...@@ -10705,47 +10705,35 @@ label:
(unspec:SF [(mult:SF (float:SF (match_dup 1)) (match_dup 2)) (unspec:SF [(mult:SF (float:SF (match_dup 1)) (match_dup 2))
] UNSPEC_FCOSA))) ] UNSPEC_FCOSA)))
(use (match_operand:PSI 3 "fpscr_operand" "c"))] (use (match_operand:PSI 3 "fpscr_operand" "c"))]
"TARGET_SH4A_FP && flag_unsafe_math_optimizations "TARGET_FPU_ANY && TARGET_FSCA
&& operands[2] == sh_fsca_int2sf ()" && operands[2] == sh_fsca_int2sf ()"
"fsca fpul,%d0" "fsca fpul,%d0"
[(set_attr "type" "fsca") [(set_attr "type" "fsca")
(set_attr "fp_mode" "single")]) (set_attr "fp_mode" "single")])
(define_expand "sinsf2" ;; When the sincos pattern is defined, the builtin functions sin and cos
;; will be expanded to the sincos pattern and one of the output values will
;; remain unused.
(define_expand "sincossf3"
[(set (match_operand:SF 0 "nonimmediate_operand" "") [(set (match_operand:SF 0 "nonimmediate_operand" "")
(unspec:SF [(match_operand:SF 1 "fp_arith_reg_operand" "")] (unspec:SF [(match_operand:SF 2 "fp_arith_reg_operand" "")]
UNSPEC_FSINA))] UNSPEC_FSINA))
"TARGET_SH4A_FP && flag_unsafe_math_optimizations" (set (match_operand:SF 1 "nonimmediate_operand" "")
(unspec:SF [(match_dup 2)] UNSPEC_FCOSA))]
"TARGET_FPU_ANY && TARGET_FSCA"
{ {
rtx scaled = gen_reg_rtx (SFmode); rtx scaled = gen_reg_rtx (SFmode);
rtx truncated = gen_reg_rtx (SImode); rtx truncated = gen_reg_rtx (SImode);
rtx fsca = gen_reg_rtx (V2SFmode); rtx fsca = gen_reg_rtx (V2SFmode);
rtx scale_reg = force_reg (SFmode, sh_fsca_sf2int ()); rtx scale_reg = force_reg (SFmode, sh_fsca_sf2int ());
emit_sf_insn (gen_mulsf3 (scaled, operands[1], scale_reg)); emit_sf_insn (gen_mulsf3 (scaled, operands[2], scale_reg));
emit_sf_insn (gen_fix_truncsfsi2 (truncated, scaled)); emit_sf_insn (gen_fix_truncsfsi2 (truncated, scaled));
emit_sf_insn (gen_fsca (fsca, truncated, sh_fsca_int2sf (), emit_sf_insn (gen_fsca (fsca, truncated, sh_fsca_int2sf (),
get_fpscr_rtx ())); get_fpscr_rtx ()));
emit_move_insn (operands[0], gen_rtx_SUBREG (SFmode, fsca, 0));
DONE;
})
(define_expand "cossf2"
[(set (match_operand:SF 0 "nonimmediate_operand" "")
(unspec:SF [(match_operand:SF 1 "fp_arith_reg_operand" "")]
UNSPEC_FCOSA))]
"TARGET_SH4A_FP && flag_unsafe_math_optimizations"
{
rtx scaled = gen_reg_rtx (SFmode);
rtx truncated = gen_reg_rtx (SImode);
rtx fsca = gen_reg_rtx (V2SFmode);
rtx scale_reg = force_reg (SFmode, sh_fsca_sf2int ());
emit_sf_insn (gen_mulsf3 (scaled, operands[1], scale_reg)); emit_move_insn (operands[0], gen_rtx_SUBREG (SFmode, fsca, 0));
emit_sf_insn (gen_fix_truncsfsi2 (truncated, scaled)); emit_move_insn (operands[1], gen_rtx_SUBREG (SFmode, fsca, 4));
emit_sf_insn (gen_fsca (fsca, truncated, sh_fsca_int2sf (),
get_fpscr_rtx ()));
emit_move_insn (operands[0], gen_rtx_SUBREG (SFmode, fsca, 4));
DONE; DONE;
}) })
......
...@@ -348,3 +348,12 @@ Don't generate privileged-mode only code; implies -mno-inline-ic_invalidate if t ...@@ -348,3 +348,12 @@ Don't generate privileged-mode only code; implies -mno-inline-ic_invalidate if t
mpretend-cmove mpretend-cmove
Target Var(TARGET_PRETEND_CMOVE) Target Var(TARGET_PRETEND_CMOVE)
Pretend a branch-around-a-move is a conditional move. Pretend a branch-around-a-move is a conditional move.
mfsca
Target Var(TARGET_FSCA)
Enable the use of the fsca instruction
mfsrra
Target Var(TARGET_FSRRA)
Enable the use of the fsrra instruction
...@@ -886,7 +886,7 @@ See RS/6000 and PowerPC Options. ...@@ -886,7 +886,7 @@ See RS/6000 and PowerPC Options.
-mindexed-addressing -mgettrcost=@var{number} -mpt-fixed @gol -mindexed-addressing -mgettrcost=@var{number} -mpt-fixed @gol
-maccumulate-outgoing-args -minvalid-symbols -msoft-atomic -mhard-atomic @gol -maccumulate-outgoing-args -minvalid-symbols -msoft-atomic -mhard-atomic @gol
-mbranch-cost=@var{num} -mcbranchdi -mcmpeqdi -mfused-madd -mno-fused-madd @gol -mbranch-cost=@var{num} -mcbranchdi -mcmpeqdi -mfused-madd -mno-fused-madd @gol
-mpretend-cmove -menable-tas} -mfsca -mno-fsca -mfsrra -mno-fsrra -mpretend-cmove -menable-tas}
@emph{Solaris 2 Options} @emph{Solaris 2 Options}
@gccoptlist{-mimpure-text -mno-impure-text @gol @gccoptlist{-mimpure-text -mno-impure-text @gol
...@@ -18302,6 +18302,28 @@ arithmetic. @code{-mfused-madd} is enabled by default by option ...@@ -18302,6 +18302,28 @@ arithmetic. @code{-mfused-madd} is enabled by default by option
disallow the usage of the @code{fmac} instruction for regular calculations disallow the usage of the @code{fmac} instruction for regular calculations
even if @option{-funsafe-math-optimizations} is in effect. even if @option{-funsafe-math-optimizations} is in effect.
@item -mfsca
@itemx -mno-fsca
@opindex mfsca
@opindex mno-fsca
Allow or disallow the compiler to emit the @code{fsca} instruction for sine
and cosine approximations. The option @code{-mfsca} must be used in
combination with @code{-funsafe-math-optimizations}. It is enabled by default
when generating code for SH4A. Using @code{-mno-fsca} disables sine and cosine
approximations even if @code{-funsafe-math-optimizations} is in effect.
@item -mfsrra
@itemx -mno-fsrra
@opindex mfsrra
@opindex mno-fsrra
Allow or disallow the compiler to emit the @code{fsrra} instruction for
reciprocal square root approximations. The option @code{-mfsrra} must be used
in combination with @code{-funsafe-math-optimizations} and
@code{-ffinite-math-only}. It is enabled by default when generating code for
SH4A. Using @code{-mno-fsrra} disables reciprocal square root approximations
even if @code{-funsafe-math-optimizations} and @code{-ffinite-math-only} are
in effect.
@item -mpretend-cmove @item -mpretend-cmove
@opindex mpretend-cmove @opindex mpretend-cmove
Prefer zero-displacement conditional branches for conditional move instruction Prefer zero-displacement conditional branches for conditional move instruction
......
2012-06-03 Oleg Endo <olegendo@gcc.gnu.org>
PR target/53512
* gcc.target/sh/pr53512-1.c: New.
* gcc.target/sh/pr53512-2.c: New.
* gcc.target/sh/pr53512-3.c: New.
* gcc.target/sh/pr53512-4.c: New.
2012-06-01 Jason Merrill <jason@redhat.com> 2012-06-01 Jason Merrill <jason@redhat.com>
PR c++/52973 PR c++/52973
......
/* Verify that the fsca insn is used when specifying -mfsca and
-funsafe-math-optimizations. */
/* { dg-do compile { target "sh*-*-*" } } */
/* { dg-options "-O1 -mfsca -funsafe-math-optimizations" } */
/* { dg-skip-if "" { "sh*-*-*" } { "-m1" "-m2*" "-m4al" "*nofpu" "-m4-340*" "-m4-400*" "-m4-500*" "-m5*" } { "" } } */
/* { dg-final { scan-assembler-times "fsca" 3 } } */
#include <math.h>
float
test_func_00 (float x)
{
return sinf (x) + cosf (x);
}
float
test_func_01 (float x)
{
return sinf (x);
}
float
test_func_02 (float x)
{
return cosf (x);
}
/* Verify that the fsca insn is not used when specifying -mno-fsca and
-funsafe-math-optimizations. */
/* { dg-do compile { target "sh*-*-*" } } */
/* { dg-options "-O1 -mno-fsca -funsafe-math-optimizations" } */
/* { dg-skip-if "" { "sh*-*-*" } { "-m1" "-m2*" "-m4al" "*nofpu" "-m4-340*" "-m4-400*" "-m4-500*" "-m5*" } { "" } } */
/* { dg-final { scan-assembler-not "fsca" } } */
#include <math.h>
float
test_func_00 (float x)
{
return sinf (x) + cosf (x);
}
float
test_func_01 (float x)
{
return sinf (x);
}
float
test_func_02 (float x)
{
return cosf (x);
}
/* Verify that the fsrra insn is used when specifying -mfsrra and
-funsafe-math-optimizations and -ffinite-math-only. */
/* { dg-do compile { target "sh*-*-*" } } */
/* { dg-options "-O1 -mfsrra -funsafe-math-optimizations -ffinite-math-only" } */
/* { dg-skip-if "" { "sh*-*-*" } { "-m1" "-m2*" "-m4al" "*nofpu" "-m4-340*" "-m4-400*" "-m4-500*" "-m5*" } { "" } } */
/* { dg-final { scan-assembler "fsrra" } } */
#include <math.h>
float
test_func_00 (float x)
{
return 1 / sqrtf (x);
}
/* Verify that the fsrra insn is not used when specifying -mno-fsrra and
-funsafe-math-optimizations and -ffinite-math-only. */
/* { dg-do compile { target "sh*-*-*" } } */
/* { dg-options "-O1 -mno-fsrra -funsafe-math-optimizations -ffinite-math-only" } */
/* { dg-skip-if "" { "sh*-*-*" } { "-m1" "-m2*" "-m4al" "*nofpu" "-m4-340*" "-m4-400*" "-m4-500*" "-m5*" } { "" } } */
/* { dg-final { scan-assembler-not "fsrra" } } */
#include <math.h>
float
test_func_00 (float x)
{
return 1 / sqrtf (x);
}
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