+(define_insn "vec_load_lanesoi_lane<mode>"

Best to prepend "aarch64_" the pattern name, IMHO, else it looks like a standard pattern name(eg. vec_load_lanes<m><n>) at first glance.

Otherwise, LGTM(but I can't approve it). Thanks for this patch.

Thanks,
Tejas.

+  [(set (match_operand:OI 0 "register_operand" "=w")
+       (unspec:OI [(match_operand:<V_TWO_ELEM> 1 "aarch64_simd_struct_operand" 
"Utv")
+                   (match_operand:OI 2 "register_operand" "0")
+                   (match_operand:SI 3 "immediate_operand" "i")
+                   (unspec:VQ [(const_int 0)] UNSPEC_VSTRUCTDUMMY) ]
+                  UNSPEC_LD2_LANE))]
+  "TARGET_SIMD"
+  "ld2\\t{%S0.<Vetype> - %T0.<Vetype>}[%3], %1"
+  [(set_attr "type" "neon_load2_one_lane")]
+)
+
  (define_insn "vec_store_lanesoi<mode>"
    [(set (match_operand:OI 0 "aarch64_simd_struct_operand" "=Utv")
        (unspec:OI [(match_operand:OI 1 "register_operand" "w")
@@ -4022,6 +4034,18 @@
    [(set_attr "type" "neon_load3_3reg<q>")]
  )

+(define_insn "vec_load_lanesci_lane<mode>"
+  [(set (match_operand:CI 0 "register_operand" "=w")
+       (unspec:CI [(match_operand:<V_THREE_ELEM> 1 "aarch64_simd_struct_operand" 
"Utv")
+                   (match_operand:CI 2 "register_operand" "0")
+                   (match_operand:SI 3 "immediate_operand" "i")
+                   (unspec:VQ [(const_int 0)] UNSPEC_VSTRUCTDUMMY)]
+                  UNSPEC_LD3_LANE))]
+  "TARGET_SIMD"
+  "ld3\\t{%S0.<Vetype> - %U0.<Vetype>}[%3], %1"
+  [(set_attr "type" "neon_load3_one_lane")]
+)
+
  (define_insn "vec_store_lanesci<mode>"
    [(set (match_operand:CI 0 "aarch64_simd_struct_operand" "=Utv")
        (unspec:CI [(match_operand:CI 1 "register_operand" "w")
@@ -4053,6 +4077,18 @@
    [(set_attr "type" "neon_load4_4reg<q>")]
  )

+(define_insn "vec_load_lanesxi_lane<mode>"
+  [(set (match_operand:XI 0 "register_operand" "=w")
+       (unspec:XI [(match_operand:<V_FOUR_ELEM> 1 "aarch64_simd_struct_operand" 
"Utv")
+                   (match_operand:XI 2 "register_operand" "0")
+                   (match_operand:SI 3 "immediate_operand" "i")
+                   (unspec:VQ [(const_int 0)] UNSPEC_VSTRUCTDUMMY)]
+                  UNSPEC_LD4_LANE))]
+  "TARGET_SIMD"
+  "ld4\\t{%S0.<Vetype> - %V0.<Vetype>}[%3], %1"
+  [(set_attr "type" "neon_load4_one_lane")]
+)
+
  (define_insn "vec_store_lanesxi<mode>"
    [(set (match_operand:XI 0 "aarch64_simd_struct_operand" "=Utv")
        (unspec:XI [(match_operand:XI 1 "register_operand" "w")
@@ -4366,6 +4402,65 @@
    DONE;
  })

+(define_expand "aarch64_ld2_lane<mode>"
+  [(match_operand:OI 0 "register_operand" "=w")
+       (match_operand:DI 1 "register_operand" "w")
+       (match_operand:OI 2 "register_operand" "0")
+       (match_operand:SI 3 "immediate_operand" "i")
+       (unspec:VQ [(const_int 0)] UNSPEC_VSTRUCTDUMMY)]
+  "TARGET_SIMD"
+{
+  enum machine_mode mode = <V_TWO_ELEM>mode;
+  rtx mem = gen_rtx_MEM (mode, operands[1]);
+
+  aarch64_simd_lane_bounds (operands[3], 0, GET_MODE_NUNITS (<VCONQ>mode));
+  emit_insn (gen_vec_load_lanesoi_lane<mode> (operands[0],
+                                              mem,
+                                              operands[2],
+                                              operands[3]));
+  DONE;
+})
+
+(define_expand "aarch64_ld3_lane<mode>"
+  [(match_operand:CI 0 "register_operand" "=w")
+       (match_operand:DI 1 "register_operand" "w")
+       (match_operand:CI 2 "register_operand" "0")
+       (match_operand:SI 3 "immediate_operand" "i")
+       (unspec:VQ [(const_int 0)] UNSPEC_VSTRUCTDUMMY)]
+  "TARGET_SIMD"
+{
+  enum machine_mode mode = <V_THREE_ELEM>mode;
+  rtx mem = gen_rtx_MEM (mode, operands[1]);
+
+  aarch64_simd_lane_bounds (operands[3], 0, GET_MODE_NUNITS (<VCONQ>mode));
+  emit_insn (gen_vec_load_lanesci_lane<mode> (operands[0],
+                                              mem,
+                                              operands[2],
+                                              operands[3]));
+  DONE;
+})
+
+(define_expand "aarch64_ld4_lane<mode>"
+  [(match_operand:XI 0 "register_operand" "=w")
+       (match_operand:DI 1 "register_operand" "w")
+       (match_operand:XI 2 "register_operand" "0")
+       (match_operand:SI 3 "immediate_operand" "i")
+       (unspec:VQ [(const_int 0)] UNSPEC_VSTRUCTDUMMY)]
+  "TARGET_SIMD"
+{
+  enum machine_mode mode = <V_FOUR_ELEM>mode;
+  rtx mem = gen_rtx_MEM (mode, operands[1]);
+
+  aarch64_simd_lane_bounds (operands[3], 0, GET_MODE_NUNITS (<VCONQ>mode));
+  emit_insn (gen_vec_load_lanesxi_lane<mode> (operands[0],
+                                              mem,
+                                              operands[2],
+                                              operands[3]));
+  DONE;
+})
+
+
+
  ;; Expanders for builtins to extract vector registers from large
  ;; opaque integer modes.

diff --git a/gcc/config/aarch64/aarch64.md b/gcc/config/aarch64/aarch64.md
index 74b554e..6b5f51f 100644
--- a/gcc/config/aarch64/aarch64.md
+++ b/gcc/config/aarch64/aarch64.md
@@ -92,6 +92,9 @@
      UNSPEC_LD2
      UNSPEC_LD3
      UNSPEC_LD4
+    UNSPEC_LD2_LANE
+    UNSPEC_LD3_LANE
+    UNSPEC_LD4_LANE
      UNSPEC_MB
      UNSPEC_NOP
      UNSPEC_PRLG_STK



Reply via email to