Segher: I still have issues with the <wd>.
> > +(define_mode_attr VSX_XXBR [(V16QI "q") > > + (V8HI "h") > > + (V4SI "w") > > + (V4SF "w") > > + (V2DF "d") > > + (V2DI "d") > > + (V1TI "q")]) > > So I think this is wrong for V16QI. You can use <wd> fine, but you need > to avoid generating "xxbrb" insns; instead, do a register move? xxbrq > isn't the insn you want, as far as I see. > > > +;; Swap all bytes in each element of vector > > +(define_expand "revb_<mode>" > > + [(set (match_operand:VEC_A 0 "vsx_register_operand") > > + (bswap:VEC_A (match_operand:VEC_A 1 "vsx_register_operand")))] > > + "TARGET_P9_VECTOR" > > +{ > > + rtx sel; > > So a special case here: > > if (<MODE>mode == V16QImode) > { > emit_move_insn (operands[0], operands[1]); > DONE; > } Even if I put in the above special case, I still have issues with the <wd>. The updated code for the expand with the special case above is (define_expand "revb_<mode>" [(set (match_operand:VEC_A 0 "vsx_register_operand") (bswap:VEC_A (match_operand:VEC_A 1 "vsx_register_operand")))] "TARGET_P8_VECTOR" { rtx sel; if (TARGET_P9_VECTOR) if (<MODE>mode == V16QImode) emit_move_insn (operands[0], operands[1]); else emit_insn (gen_p9_xxbr<wd>_<mode> (operands[0], operands[1])); etc. The issue is the if (<MODE>mode == V16QImode) does not prevent the code in the else statement from getting expanded for <wd>. I agree it will prevent the generation of the instruction but the code is still expanded and compiled. I get the error message: /home/carll/GCC/gcc-revb/gcc/config/rs6000/vsx.md:4727:62: error: ‘gen_p9_xxbrb_v16qi’ was not declared in this scope emit_insn (gen_p9_xxbr<wd>_<mode> (operands[0], operands[1])); Because <wd> for mode v16qi still gets expanded to "b" not "q". There is no definition for "gen_p9_xxbrb_v16qi" since xxbrb is not vaild. Short of using a different expander for <wd> I don't see how to not get the expansion. Sorry if I am missing something obvious here. Carl Love