* [PATCH, HSA] Fix emission of clrsb{l,ll} builtins
@ 2016-02-22 14:15 Martin Liška
0 siblings, 0 replies; only message in thread
From: Martin Liška @ 2016-02-22 14:15 UTC (permalink / raw)
To: GCC Patches; +Cc: Martin Jambor
[-- Attachment #1: Type: text/plain, Size: 370 bytes --]
Hello.
Following patch correctly handles builtins mentioned in the email subject
in order to return correct value for 0 as the argument.
The patch can boostrap on x86_64-linux-gnu and survives regression tests and
is pre-approved by Martin Jambor. Moreover, I'm preparing a test-case that
will cover the situation in test-suite.
Installed as r233602.
Thanks,
Martin
[-- Attachment #2: 0001-HSA-fix-emission-of-clrsb-l-ll-builtins.patch --]
[-- Type: text/x-patch, Size: 1768 bytes --]
From 7047c51eb08f8d69c3509486fe47c0de8e2fd617 Mon Sep 17 00:00:00 2001
From: marxin <mliska@suse.cz>
Date: Fri, 19 Feb 2016 13:32:42 +0100
Subject: [PATCH 1/3] HSA: fix emission of clrsb{l,ll} builtins
gcc/ChangeLog:
2016-02-19 Martin Liska <mliska@suse.cz>
* hsa-gen.c (gen_hsa_clrsb): In case of zero value,
return bitsize - 1 as the return value.
---
gcc/hsa-gen.c | 9 ++++++---
1 file changed, 6 insertions(+), 3 deletions(-)
diff --git a/gcc/hsa-gen.c b/gcc/hsa-gen.c
index 768c2cf..28e8b6f 100644
--- a/gcc/hsa-gen.c
+++ b/gcc/hsa-gen.c
@@ -4055,7 +4055,9 @@ gen_hsa_clrsb (gcall *call, hsa_bb *hbb)
hsa_op_with_type *arg = hsa_reg_or_immed_for_gimple_op (rhs1, hbb);
BrigType16_t bittype = hsa_bittype_for_type (arg->m_type);
unsigned bitsize = tree_to_uhwi (TYPE_SIZE (TREE_TYPE (rhs1)));
- gcc_checking_assert (bitsize >= 32);
+
+ /* FIRSTBIT instruction is defined just for 32 and 64-bits wide integers. */
+ gcc_checking_assert (bitsize == 32 || bitsize == 64);
/* Set true to MOST_SIG if the most significant bit is set to one. */
hsa_op_immed *c = new hsa_op_immed (1ul << (bitsize - 1),
@@ -4098,9 +4100,10 @@ gen_hsa_clrsb (gcall *call, hsa_bb *hbb)
new hsa_op_immed (0, arg->m_type));
hbb->append_insn (cmp);
- /* Return the number of leading bits, or 31 if the input value is zero. */
+ /* Return the number of leading bits,
+ or (bitsize - 1) if the input value is zero. */
cmov = new hsa_insn_basic (4, BRIG_OPCODE_CMOV, BRIG_TYPE_B32, NULL, is_zero,
- new hsa_op_immed (31, BRIG_TYPE_U32),
+ new hsa_op_immed (bitsize - 1, BRIG_TYPE_U32),
leading_bits->get_in_type (BRIG_TYPE_B32, hbb));
hbb->append_insn (cmov);
cmov->set_output_in_type (dest, 0, hbb);
--
2.7.0
^ permalink raw reply [flat|nested] only message in thread
only message in thread, other threads:[~2016-02-22 14:15 UTC | newest]
Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2016-02-22 14:15 [PATCH, HSA] Fix emission of clrsb{l,ll} builtins Martin Liška
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).