]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
HSA: fix emission of clrsb{l,ll} builtins
authorMartin Liska <mliska@suse.cz>
Mon, 22 Feb 2016 14:14:51 +0000 (15:14 +0100)
committerMartin Liska <marxin@gcc.gnu.org>
Mon, 22 Feb 2016 14:14:51 +0000 (14:14 +0000)
* hsa-gen.c (gen_hsa_clrsb): In case of zero value,
return bitsize - 1 as the return value.

From-SVN: r233602

gcc/ChangeLog
gcc/hsa-gen.c

index 14e3adb4b7921074b3262cf85f6cade26113b0a1..32304003630639d086b6becb4e64054570eed1a8 100644 (file)
@@ -1,3 +1,8 @@
+2016-02-22  Martin Liska  <mliska@suse.cz>
+
+       * hsa-gen.c (gen_hsa_clrsb): In case of zero value,
+       return bitsize - 1 as the return value.
+
 2016-02-22  Oleg Endo  <olegendo@gcc.gnu.org>
 
        PR target/69806
index 768c2cf8f7853116fcd41c678f608f7c548af6cd..28e8b6f92ad600beecb35248653a0cfba8b85a7a 100644 (file)
@@ -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);