+2020-04-07 Andre Vieira <andre.simoesdiasvieira@arm.com>
+
+ * config/arm/mve.md (mve_vec_extract*): Allow memory operands in set.
+
2020-04-07 Andre Vieira <andre.simoesdiasvieira@arm.com>
* config/arm/arm.c (arm_mve_immediate_check): Removed.
;; [vgetq_lane_u, vgetq_lane_s, vgetq_lane_f])
;;
(define_insn "mve_vec_extract<mode><V_elem_l>"
- [(set (match_operand:<V_elem> 0 "s_register_operand" "=r")
+ [(set (match_operand:<V_elem> 0 "nonimmediate_operand" "=r")
(vec_select:<V_elem>
(match_operand:MVE_VLD_ST 1 "s_register_operand" "w")
(parallel [(match_operand:SI 2 "immediate_operand" "i")])))]
[(set_attr "type" "mve_move")])
(define_insn "mve_vec_extractv2didi"
- [(set (match_operand:DI 0 "s_register_operand" "=r")
+ [(set (match_operand:DI 0 "nonimmediate_operand" "=r")
(vec_select:DI
(match_operand:V2DI 1 "s_register_operand" "w")
(parallel [(match_operand:SI 2 "immediate_operand" "i")])))]
if (elt == 0)
return "vmov\t%Q0, %R0, %e1";
else
- return "vmov\t%J0, %K0, %f1";
+ return "vmov\t%Q0, %R0, %f1";
}
[(set_attr "type" "mve_move")])
+2020-04-07 Andre Vieira <andre.simoesdiasvieira@arm.com>
+
+ * gcc.target/arm/mve/intrinsics/mve_vec_extracts_from_memory.c: New
+ test.
+
2020-04-07 Andre Vieira <andre.simoesdiasvieira@arm.com>
* gcc.target/arm/mve/intrinsics/mve_immediates_1_n.c: New test.
--- /dev/null
+/* { dg-require-effective-target arm_v8_1m_mve_fp_ok } */
+/* { dg-add-options arm_v8_1m_mve_fp } */
+/* { dg-additional-options "-O3" } */
+
+#include "arm_mve.h"
+
+uint8x16_t *vu8;
+int8x16_t *vs8;
+uint16x8_t *vu16;
+int16x8_t *vs16;
+uint32x4_t *vu32;
+int32x4_t *vs32;
+uint64x2_t *vu64;
+int64x2_t *vs64;
+float16x8_t *vf16;
+float32x4_t *vf32;
+uint8_t u8;
+uint16_t u16;
+uint32_t u32;
+uint64_t u64;
+int8_t s8;
+int16_t s16;
+int32_t s32;
+int64_t s64;
+float16_t f16;
+float32_t f32;
+
+void foo (void)
+{
+ u8 = vgetq_lane (*vu8, 1);
+ u16 = vgetq_lane (*vu16, 1);
+ u32 = vgetq_lane (*vu32, 1);
+ u64 = vgetq_lane (*vu64, 1);
+ s8 = vgetq_lane (*vs8, 1);
+ s16 = vgetq_lane (*vs16, 1);
+ s32 = vgetq_lane (*vs32, 1);
+ s64 = vgetq_lane (*vs64, 1);
+ f16 = vgetq_lane (*vf16, 1);
+ f32 = vgetq_lane (*vf32, 1);
+}