From cf59e2b80ef162d7064503da12e1f9575675c16b Mon Sep 17 00:00:00 2001 From: kazu Date: Tue, 12 Nov 2002 14:01:33 +0000 Subject: [PATCH] * 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. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@59050 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/ChangeLog | 7 +++++++ gcc/config/h8300/h8300.c | 8 ++++++-- gcc/config/h8300/h8300.md | 37 +++++++++++++++++++++++++++++++++++++ 3 files changed, 50 insertions(+), 2 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 400f34f..f39d76b 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2002-11-12 Kazu Hirata + + * 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 * doc/contrib.texi (Contributors): Use GCJ instead of gcj to refer diff --git a/gcc/config/h8300/h8300.c b/gcc/config/h8300/h8300.c index 43a0c88..56a06a0 100644 --- a/gcc/config/h8300/h8300.c +++ b/gcc/config/h8300/h8300.c @@ -763,7 +763,9 @@ single_one_operand (operand, mode) /* We really need to do this masking because 0x80 in QImode is represented as -128 for example. */ 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); if (exact_log2 (value & mask) >= 0) @@ -786,7 +788,9 @@ single_zero_operand (operand, mode) /* We really need to do this masking because 0x80 in QImode is represented as -128 for example. */ 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); if (exact_log2 (~value & mask) >= 0) diff --git a/gcc/config/h8300/h8300.md b/gcc/config/h8300/h8300.md index f0b9068..129ff63 100644 --- a/gcc/config/h8300/h8300.md +++ b/gcc/config/h8300/h8300.md @@ -599,6 +599,43 @@ [(set_attr "length" "2") (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" [(set (cc0) (match_operand:QI 0 "register_operand" "r"))] "" -- 2.7.4