Commit e27051f7 by Kazu Hirata Committed by Kazu Hirata

h8300.c (single_one_operand): Correctly compute mask when mode is SImode.

	* config/h8300/h8300.c (single_one_operand): Correctly compute
	mask when mode is SImode.
	(single_zero_operand): Likewise.
	* config/h8300/h8300.md (two new anonymous insns): New.

From-SVN: r59050
parent 10bb8214
2002-11-12 Kazu Hirata <kazu@cs.umass.edu>
* config/h8300/h8300.c (single_one_operand): Correctly compute
mask when mode is SImode.
(single_zero_operand): Likewise.
* config/h8300/h8300.md (two new anonymous insns): New.
2002-11-12 Gerald Pfeifer <pfeifer@dbai.tuwien.ac.at> 2002-11-12 Gerald Pfeifer <pfeifer@dbai.tuwien.ac.at>
* doc/contrib.texi (Contributors): Use GCJ instead of gcj to refer * doc/contrib.texi (Contributors): Use GCJ instead of gcj to refer
......
...@@ -763,7 +763,9 @@ single_one_operand (operand, mode) ...@@ -763,7 +763,9 @@ single_one_operand (operand, mode)
/* We really need to do this masking because 0x80 in QImode is /* We really need to do this masking because 0x80 in QImode is
represented as -128 for example. */ represented as -128 for example. */
unsigned HOST_WIDE_INT mask = unsigned HOST_WIDE_INT mask =
((unsigned HOST_WIDE_INT) 1 << GET_MODE_BITSIZE (mode)) - 1; (GET_MODE_BITSIZE (mode) < HOST_BITS_PER_WIDE_INT)
? ((unsigned HOST_WIDE_INT) 1 << GET_MODE_BITSIZE (mode)) - 1
: ~0;
unsigned HOST_WIDE_INT value = INTVAL (operand); unsigned HOST_WIDE_INT value = INTVAL (operand);
if (exact_log2 (value & mask) >= 0) if (exact_log2 (value & mask) >= 0)
...@@ -786,7 +788,9 @@ single_zero_operand (operand, mode) ...@@ -786,7 +788,9 @@ single_zero_operand (operand, mode)
/* We really need to do this masking because 0x80 in QImode is /* We really need to do this masking because 0x80 in QImode is
represented as -128 for example. */ represented as -128 for example. */
unsigned HOST_WIDE_INT mask = unsigned HOST_WIDE_INT mask =
((unsigned HOST_WIDE_INT) 1 << GET_MODE_BITSIZE (mode)) - 1; (GET_MODE_BITSIZE (mode) < HOST_BITS_PER_WIDE_INT)
? ((unsigned HOST_WIDE_INT) 1 << GET_MODE_BITSIZE (mode)) - 1
: ~0;
unsigned HOST_WIDE_INT value = INTVAL (operand); unsigned HOST_WIDE_INT value = INTVAL (operand);
if (exact_log2 (~value & mask) >= 0) if (exact_log2 (~value & mask) >= 0)
......
...@@ -599,6 +599,43 @@ ...@@ -599,6 +599,43 @@
[(set_attr "length" "2") [(set_attr "length" "2")
(set_attr "cc" "set_zn")]) (set_attr "cc" "set_zn")])
(define_insn ""
[(set (cc0)
(and:HI (match_operand:HI 0 "register_operand" "r")
(match_operand:HI 1 "single_one_operand" "n")))]
""
"*
{
operands[1] = GEN_INT (INTVAL (operands[1]) & 0xffff);
if (INTVAL (operands[1]) > 128)
{
operands[1] = GEN_INT (INTVAL (operands[1]) >> 8);
return \"btst\\t%V1,%t0\";
}
return \"btst\\t%V1,%s0\";
}"
[(set_attr "length" "2")
(set_attr "cc" "set_zn")])
(define_insn ""
[(set (cc0)
(and:SI (match_operand:SI 0 "register_operand" "r")
(match_operand:SI 1 "single_one_operand" "n")))]
"(TARGET_H8300H || TARGET_H8300S)
&& (INTVAL (operands[1]) & 0xffff) != 0"
"*
{
operands[1] = GEN_INT (INTVAL (operands[1]) & 0xffff);
if (INTVAL (operands[1]) > 128)
{
operands[1] = GEN_INT (INTVAL (operands[1]) >> 8);
return \"btst\\t%V1,%x0\";
}
return \"btst\\t%V1,%w0\";
}"
[(set_attr "length" "2")
(set_attr "cc" "set_zn")])
(define_insn "tstqi" (define_insn "tstqi"
[(set (cc0) (match_operand:QI 0 "register_operand" "r"))] [(set (cc0) (match_operand:QI 0 "register_operand" "r"))]
"" ""
......
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