aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorOlivier Hainque <hainque@adacore.com>2010-10-06 14:08:48 +0000
committerOlivier Hainque <hainque@gcc.gnu.org>2010-10-06 14:08:48 +0000
commit35c2682003f74070aab4098770c3444bac2586c4 (patch)
treee7a3421060e9aae3419dd2599cd38ce1859488fb
parentadb18384bdd9a40483f03bed8389cd91ad03d0a4 (diff)
downloadgcc-35c2682003f74070aab4098770c3444bac2586c4.zip
gcc-35c2682003f74070aab4098770c3444bac2586c4.tar.gz
gcc-35c2682003f74070aab4098770c3444bac2586c4.tar.bz2
rs6000.c (rs6000_expand_ternop_builtin): Rewrite switch on insn codes as sequence of ifs.
* config/rs6000/rs6000.c (rs6000_expand_ternop_builtin): Rewrite switch on insn codes as sequence of ifs. From-SVN: r165025
-rw-r--r--gcc/ChangeLog5
-rw-r--r--gcc/config/rs6000/rs6000.c48
2 files changed, 30 insertions, 23 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 66f22dc..441293c 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,8 @@
+2010-10-06 Olivier Hainque <hainque@adacore.com>
+
+ * config/rs6000/rs6000.c (rs6000_expand_ternop_builtin): Rewrite
+ switch on insn codes as sequence of ifs.
+
2010-10-06 Hariharan Sandanagobalane <hariharan@picochip.com>
* config/picochip/picochip.c (TARGET_EXCEPT_UNWIND_INFO): Define it to
be UI_NONE for picochip.
diff --git a/gcc/config/rs6000/rs6000.c b/gcc/config/rs6000/rs6000.c
index 030bb61..adc1d13 100644
--- a/gcc/config/rs6000/rs6000.c
+++ b/gcc/config/rs6000/rs6000.c
@@ -10904,12 +10904,18 @@ rs6000_expand_ternop_builtin (enum insn_code icode, tree exp, rtx target)
|| arg2 == error_mark_node)
return const0_rtx;
- switch (icode)
+ /* Check and prepare argument depending on the instruction code.
+
+ Note that a switch statement instead of the sequence of tests
+ would be incorrect as many of the CODE_FOR values could be
+ CODE_FOR_nothing and that would yield multiple alternatives
+ with identical values. We'd never reach here at runtime in
+ this case. */
+ if (icode == CODE_FOR_altivec_vsldoi_v4sf
+ || icode == CODE_FOR_altivec_vsldoi_v4si
+ || icode == CODE_FOR_altivec_vsldoi_v8hi
+ || icode == CODE_FOR_altivec_vsldoi_v16qi)
{
- case CODE_FOR_altivec_vsldoi_v4sf:
- case CODE_FOR_altivec_vsldoi_v4si:
- case CODE_FOR_altivec_vsldoi_v8hi:
- case CODE_FOR_altivec_vsldoi_v16qi:
/* Only allow 4-bit unsigned literals. */
STRIP_NOPS (arg2);
if (TREE_CODE (arg2) != INTEGER_CST
@@ -10918,16 +10924,16 @@ rs6000_expand_ternop_builtin (enum insn_code icode, tree exp, rtx target)
error ("argument 3 must be a 4-bit unsigned literal");
return const0_rtx;
}
- break;
-
- case CODE_FOR_vsx_xxpermdi_v2df:
- case CODE_FOR_vsx_xxpermdi_v2di:
- case CODE_FOR_vsx_xxsldwi_v16qi:
- case CODE_FOR_vsx_xxsldwi_v8hi:
- case CODE_FOR_vsx_xxsldwi_v4si:
- case CODE_FOR_vsx_xxsldwi_v4sf:
- case CODE_FOR_vsx_xxsldwi_v2di:
- case CODE_FOR_vsx_xxsldwi_v2df:
+ }
+ else if (icode == CODE_FOR_vsx_xxpermdi_v2df
+ || icode == CODE_FOR_vsx_xxpermdi_v2di
+ || icode == CODE_FOR_vsx_xxsldwi_v16qi
+ || icode == CODE_FOR_vsx_xxsldwi_v8hi
+ || icode == CODE_FOR_vsx_xxsldwi_v4si
+ || icode == CODE_FOR_vsx_xxsldwi_v4sf
+ || icode == CODE_FOR_vsx_xxsldwi_v2di
+ || icode == CODE_FOR_vsx_xxsldwi_v2df)
+ {
/* Only allow 2-bit unsigned literals. */
STRIP_NOPS (arg2);
if (TREE_CODE (arg2) != INTEGER_CST
@@ -10936,10 +10942,10 @@ rs6000_expand_ternop_builtin (enum insn_code icode, tree exp, rtx target)
error ("argument 3 must be a 2-bit unsigned literal");
return const0_rtx;
}
- break;
-
- case CODE_FOR_vsx_set_v2df:
- case CODE_FOR_vsx_set_v2di:
+ }
+ else if (icode == CODE_FOR_vsx_set_v2df
+ || icode == CODE_FOR_vsx_set_v2di)
+ {
/* Only allow 1-bit unsigned literals. */
STRIP_NOPS (arg2);
if (TREE_CODE (arg2) != INTEGER_CST
@@ -10948,10 +10954,6 @@ rs6000_expand_ternop_builtin (enum insn_code icode, tree exp, rtx target)
error ("argument 3 must be a 1-bit unsigned literal");
return const0_rtx;
}
- break;
-
- default:
- break;
}
if (target == 0