diff options
author | Aldy Hernandez <aldyh@redhat.com> | 2002-05-04 00:33:48 +0000 |
---|---|---|
committer | Aldy Hernandez <aldyh@gcc.gnu.org> | 2002-05-04 00:33:48 +0000 |
commit | b44140e7110c5b425e360bf9c63504d484e40f53 (patch) | |
tree | 040a4deab056957a571be4897e2266a800d29b31 | |
parent | aaaed752284e25ca392fea2ee5ca7c9bc988fe88 (diff) | |
download | gcc-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
-rw-r--r-- | gcc/ChangeLog | 10 | ||||
-rw-r--r-- | gcc/config/rs6000/rs6000.c | 71 |
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); |