aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorAldy Hernandez <aldyh@redhat.com>2002-05-04 00:33:48 +0000
committerAldy Hernandez <aldyh@gcc.gnu.org>2002-05-04 00:33:48 +0000
commitb44140e7110c5b425e360bf9c63504d484e40f53 (patch)
tree040a4deab056957a571be4897e2266a800d29b31 /gcc
parentaaaed752284e25ca392fea2ee5ca7c9bc988fe88 (diff)
downloadgcc-b44140e7110c5b425e360bf9c63504d484e40f53.zip
gcc-b44140e7110c5b425e360bf9c63504d484e40f53.tar.gz
gcc-b44140e7110c5b425e360bf9c63504d484e40f53.tar.bz2
rs6000.c (altivec_expand_binop_builtin): Error out when we get an out of range literal.
2002-05-03 Aldy Hernandez <aldyh@redhat.com> * config/rs6000/rs6000.c (altivec_expand_binop_builtin): Error out when we get an out of range literal. (altivec_expand_ternop_builtin): Same. (altivec_expand_unop_builtin): Same. (altivec_expand_builtin): Same, for dss. (altivec_expand_builtin): Use trees instead of rtl when determining literal argument validity. From-SVN: r53135
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog10
-rw-r--r--gcc/config/rs6000/rs6000.c71
2 files changed, 75 insertions, 6 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 33cb2cc..2be52c9 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,13 @@
+2002-05-03 Aldy Hernandez <aldyh@redhat.com>
+
+ * config/rs6000/rs6000.c (altivec_expand_binop_builtin): Error out
+ when we get an out of range literal.
+ (altivec_expand_ternop_builtin): Same.
+ (altivec_expand_unop_builtin): Same.
+ (altivec_expand_builtin): Same, for dss.
+ (altivec_expand_builtin): Use trees instead of rtl when
+ determining literal argument validity.
+
2002-05-03 David S. Miller <davem@redhat.com>
Delete cycle display scheduling hook.
diff --git a/gcc/config/rs6000/rs6000.c b/gcc/config/rs6000/rs6000.c
index 6a1c5a6..2fceccf 100644
--- a/gcc/config/rs6000/rs6000.c
+++ b/gcc/config/rs6000/rs6000.c
@@ -3551,6 +3551,22 @@ altivec_expand_unop_builtin (icode, arglist, target)
if (arg0 == error_mark_node)
return NULL_RTX;
+ switch (icode)
+ {
+ /* Only allow 5-bit *signed* literals. */
+ case CODE_FOR_altivec_vspltisb:
+ case CODE_FOR_altivec_vspltish:
+ case CODE_FOR_altivec_vspltisw:
+ if (GET_CODE (op0) != CONST_INT
+ || INTVAL (op0) > 0x1f
+ || INTVAL (op0) < -0x1f)
+ {
+ error ("argument 1 must be a 5-bit signed literal");
+ return NULL_RTX;
+ }
+ break;
+ }
+
if (target == 0
|| GET_MODE (target) != tmode
|| ! (*insn_data[icode].operand[0].predicate) (target, tmode))
@@ -3621,6 +3637,25 @@ altivec_expand_binop_builtin (icode, arglist, target)
if (arg0 == error_mark_node || arg1 == error_mark_node)
return NULL_RTX;
+ switch (icode)
+ {
+ /* Only allow 5-bit unsigned literals. */
+ case CODE_FOR_altivec_vcfux:
+ case CODE_FOR_altivec_vcfsx:
+ case CODE_FOR_altivec_vctsxs:
+ case CODE_FOR_altivec_vctuxs:
+ case CODE_FOR_altivec_vspltb:
+ case CODE_FOR_altivec_vsplth:
+ case CODE_FOR_altivec_vspltw:
+ if (TREE_CODE (arg1) != INTEGER_CST
+ || TREE_INT_CST_LOW (arg1) & ~0x1f)
+ {
+ error ("argument 2 must be a 5-bit unsigned literal");
+ return NULL_RTX;
+ }
+ break;
+ }
+
if (target == 0
|| GET_MODE (target) != tmode
|| ! (*insn_data[icode].operand[0].predicate) (target, tmode))
@@ -3779,6 +3814,22 @@ altivec_expand_ternop_builtin (icode, arglist, target)
|| arg2 == error_mark_node)
return NULL_RTX;
+ switch (icode)
+ {
+ /* Only allow 4-bit unsigned literals. */
+ case CODE_FOR_altivec_vsldoi_4sf:
+ case CODE_FOR_altivec_vsldoi_4si:
+ case CODE_FOR_altivec_vsldoi_8hi:
+ case CODE_FOR_altivec_vsldoi_16qi:
+ if (TREE_CODE (arg2) != INTEGER_CST
+ || TREE_INT_CST_LOW (arg2) & ~0xf)
+ {
+ error ("argument 3 must be a 4-bit unsigned literal");
+ return NULL_RTX;
+ }
+ break;
+ }
+
if (target == 0
|| GET_MODE (target) != tmode
|| ! (*insn_data[icode].operand[0].predicate) (target, tmode))
@@ -4034,6 +4085,13 @@ altivec_expand_builtin (exp, target)
if (arg0 == error_mark_node)
return NULL_RTX;
+ if (TREE_CODE (arg0) != INTEGER_CST
+ || TREE_INT_CST_LOW (arg0) & ~0x3)
+ {
+ error ("argument to dss must be a 2-bit unsigned literal");
+ return NULL_RTX;
+ }
+
if (! (*insn_data[icode].operand[0].predicate) (op0, mode0))
op0 = copy_to_mode_reg (mode0, op0);
@@ -4062,17 +4120,18 @@ altivec_expand_builtin (exp, target)
|| arg2 == error_mark_node)
return NULL_RTX;
+ if (TREE_CODE (arg2) != INTEGER_CST
+ || TREE_INT_CST_LOW (arg2) & ~0x3)
+ {
+ error ("argument to `%s' must be a 2-bit unsigned literal", d->name);
+ return NULL_RTX;
+ }
+
if (! (*insn_data[d->icode].operand[0].predicate) (op0, mode0))
op0 = copy_to_mode_reg (mode0, op0);
if (! (*insn_data[d->icode].operand[1].predicate) (op1, mode1))
op1 = copy_to_mode_reg (mode1, op1);
- if (GET_CODE (op2) != CONST_INT || INTVAL (op2) > 3)
- {
- error ("argument 3 of `%s' must be a 2-bit literal", d->name);
- return NULL_RTX;
- }
-
pat = GEN_FCN (d->icode) (op0, op1, op2);
if (pat != 0)
emit_insn (pat);