we will get the desired one: 1000 1111. */
void
-generate_reflecting_code_using_brev (rtx *op)
+generate_reflecting_code_using_brev (rtx *op_p)
{
- machine_mode op_mode = GET_MODE (*op);
+ rtx op = *op_p;
+ machine_mode op_mode = GET_MODE (op);
+
+ /* OP may be smaller than a word. We can use a paradoxical subreg
+ to compensate for that. It should never be larger than a word
+ for RISC-V. */
+ gcc_assert (op_mode <= word_mode);
+ if (op_mode != word_mode)
+ op = gen_lowpart (word_mode, op);
+
HOST_WIDE_INT shift_val = (BITS_PER_WORD
- GET_MODE_BITSIZE (op_mode).to_constant ());
- riscv_expand_op (BSWAP, word_mode, *op, *op, *op);
- riscv_expand_op (LSHIFTRT, word_mode, *op, *op,
+ riscv_expand_op (BSWAP, word_mode, op, op, op);
+ riscv_expand_op (LSHIFTRT, word_mode, op, op,
gen_int_mode (shift_val, word_mode));
if (TARGET_64BIT)
- emit_insn (gen_riscv_brev8_di (*op, *op));
+ emit_insn (gen_riscv_brev8_di (op, op));
else
- emit_insn (gen_riscv_brev8_si (*op, *op));
+ emit_insn (gen_riscv_brev8_si (op, op));
}