Commit 561af708 by John David Anglin Committed by John David Anglin

pa.md (extzv, extv, insv): Fix operand limit checks.

	* pa.md (extzv, extv, insv): Fix operand limit checks.  Fail if
	source/destination is not a register operand.

From-SVN: r70267
parent 9bea6f98
2003-08-08 John David Anglin <dave.anglin@nrc-cnrc.gc.ca>
* pa.md (extzv, extv, insv): Fix operand limit checks. Fail if
source/destination is not a register operand.
2003-08-08 Richard Henderson <rth@redhat.com> 2003-08-08 Richard Henderson <rth@redhat.com>
PR target/11535 PR target/11535
......
...@@ -7145,6 +7145,7 @@ ...@@ -7145,6 +7145,7 @@
[(set_attr "type" "branch") [(set_attr "type" "branch")
(set_attr "length" "4")]) (set_attr "length" "4")])
;;; Operands 2 and 3 are assumed to be CONST_INTs.
(define_expand "extzv" (define_expand "extzv"
[(set (match_operand 0 "register_operand" "") [(set (match_operand 0 "register_operand" "")
(zero_extract (match_operand 1 "register_operand" "") (zero_extract (match_operand 1 "register_operand" "")
...@@ -7153,21 +7154,26 @@ ...@@ -7153,21 +7154,26 @@
"" ""
" "
{ {
/* PA extraction insns don't support zero length bitfields. */ HOST_WIDE_INT len = INTVAL (operands[2]);
if (INTVAL (operands[2]) == 0) HOST_WIDE_INT pos = INTVAL (operands[3]);
/* PA extraction insns don't support zero length bitfields or fields
extending beyond the left or right-most bits. Also, we reject lengths
equal to a word as they are better handled by the move patterns. */
if (len <= 0 || len >= BITS_PER_WORD || pos < 0 || pos + len > BITS_PER_WORD)
FAIL;
/* From mips.md: extract_bit_field doesn't verify that our source
matches the predicate, so check it again here. */
if (!register_operand (operands[1], VOIDmode))
FAIL; FAIL;
if (TARGET_64BIT) if (TARGET_64BIT)
emit_insn (gen_extzv_64 (operands[0], operands[1], emit_insn (gen_extzv_64 (operands[0], operands[1],
operands[2], operands[3])); operands[2], operands[3]));
else else
{ emit_insn (gen_extzv_32 (operands[0], operands[1],
if (! uint5_operand (operands[2], SImode) operands[2], operands[3]));
|| ! uint5_operand (operands[3], SImode))
FAIL;
emit_insn (gen_extzv_32 (operands[0], operands[1],
operands[2], operands[3]));
}
DONE; DONE;
}") }")
...@@ -7211,6 +7217,7 @@ ...@@ -7211,6 +7217,7 @@
[(set_attr "type" "shift") [(set_attr "type" "shift")
(set_attr "length" "4")]) (set_attr "length" "4")])
;;; Operands 2 and 3 are assumed to be CONST_INTs.
(define_expand "extv" (define_expand "extv"
[(set (match_operand 0 "register_operand" "") [(set (match_operand 0 "register_operand" "")
(sign_extract (match_operand 1 "register_operand" "") (sign_extract (match_operand 1 "register_operand" "")
...@@ -7219,21 +7226,26 @@ ...@@ -7219,21 +7226,26 @@
"" ""
" "
{ {
/* PA extraction insns don't support zero length bitfields. */ HOST_WIDE_INT len = INTVAL (operands[2]);
if (INTVAL (operands[2]) == 0) HOST_WIDE_INT pos = INTVAL (operands[3]);
/* PA extraction insns don't support zero length bitfields or fields
extending beyond the left or right-most bits. Also, we reject lengths
equal to a word as they are better handled by the move patterns. */
if (len <= 0 || len >= BITS_PER_WORD || pos < 0 || pos + len > BITS_PER_WORD)
FAIL;
/* From mips.md: extract_bit_field doesn't verify that our source
matches the predicate, so check it again here. */
if (!register_operand (operands[1], VOIDmode))
FAIL; FAIL;
if (TARGET_64BIT) if (TARGET_64BIT)
emit_insn (gen_extv_64 (operands[0], operands[1], emit_insn (gen_extv_64 (operands[0], operands[1],
operands[2], operands[3])); operands[2], operands[3]));
else else
{ emit_insn (gen_extv_32 (operands[0], operands[1],
if (! uint5_operand (operands[2], SImode) operands[2], operands[3]));
|| ! uint5_operand (operands[3], SImode))
FAIL;
emit_insn (gen_extv_32 (operands[0], operands[1],
operands[2], operands[3]));
}
DONE; DONE;
}") }")
...@@ -7277,7 +7289,7 @@ ...@@ -7277,7 +7289,7 @@
[(set_attr "type" "shift") [(set_attr "type" "shift")
(set_attr "length" "4")]) (set_attr "length" "4")])
;; Only specify the mode operands 0, the rest are assumed to be word_mode. ;;; Operands 1 and 2 are assumed to be CONST_INTs.
(define_expand "insv" (define_expand "insv"
[(set (zero_extract (match_operand 0 "register_operand" "") [(set (zero_extract (match_operand 0 "register_operand" "")
(match_operand 1 "uint32_operand" "") (match_operand 1 "uint32_operand" "")
...@@ -7286,17 +7298,26 @@ ...@@ -7286,17 +7298,26 @@
"" ""
" "
{ {
HOST_WIDE_INT len = INTVAL (operands[1]);
HOST_WIDE_INT pos = INTVAL (operands[2]);
/* PA insertion insns don't support zero length bitfields or fields
extending beyond the left or right-most bits. Also, we reject lengths
equal to a word as they are better handled by the move patterns. */
if (len <= 0 || len >= BITS_PER_WORD || pos < 0 || pos + len > BITS_PER_WORD)
FAIL;
/* From mips.md: insert_bit_field doesn't verify that our destination
matches the predicate, so check it again here. */
if (!register_operand (operands[0], VOIDmode))
FAIL;
if (TARGET_64BIT) if (TARGET_64BIT)
emit_insn (gen_insv_64 (operands[0], operands[1], emit_insn (gen_insv_64 (operands[0], operands[1],
operands[2], operands[3])); operands[2], operands[3]));
else else
{ emit_insn (gen_insv_32 (operands[0], operands[1],
if (! uint5_operand (operands[2], SImode) operands[2], operands[3]));
|| ! uint5_operand (operands[3], SImode))
FAIL;
emit_insn (gen_insv_32 (operands[0], operands[1],
operands[2], operands[3]));
}
DONE; DONE;
}") }")
......
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