(parallel [(match_dup 2)])))
(clobber (match_dup 4))])
(set (match_dup 0)
- (match_dup 3))])
+ (match_dup 3))]
+{
+ if (which_alternative == 0
+ && ((<MODE>mode == V16QImode
+ && INTVAL (operands[2]) == (BYTES_BIG_ENDIAN ? 7 : 8))
+ || (<MODE>mode == V8HImode
+ && INTVAL (operands[2]) == (BYTES_BIG_ENDIAN ? 3 : 4))))
+ {
+ enum machine_mode dest_mode = GET_MODE (operands[0]);
+ emit_move_insn (operands[0],
+ gen_rtx_REG (dest_mode, REGNO (operands[3])));
+ DONE;
+ }
+})
+
;; Extract from word 0, 2, 3 (BE order).
(define_insn_and_split "*vsx_extract_v4si_w023"
--- /dev/null
+/* { dg-do compile } */
+/* { dg-skip-if "" { powerpc*-*-darwin* } } */
+/* { dg-require-effective-target powerpc_p9vector_ok } */
+/* { dg-options "-mdejagnu-cpu=power9 -O2" } */
+/* { dg-require-effective-target has_arch_ppc64 } */
+
+#include <altivec.h>
+
+#ifdef __BIG_ENDIAN__
+#define DWORD0_FIRST_SHORT 3
+#define DWORD0_FIRST_CHAR 7
+#else
+#define DWORD0_FIRST_SHORT 4
+#define DWORD0_FIRST_CHAR 8
+#endif
+
+void vec_extract_short (vector short v, short* p)
+{
+ *p = vec_extract(v, DWORD0_FIRST_SHORT);
+}
+
+void vec_extract_char (vector char v, char* p)
+{
+ *p = vec_extract(v, DWORD0_FIRST_CHAR);
+}
+
+/* { dg-final { scan-assembler-times {\mstxsi[hb]x\M} 2 } } */
+/* { dg-final { scan-assembler-not {\mvextractu[hb]\M} } } */