aarch64: Clean up mergeX/splatX instructions
authorMarek Vasut <marex@denx.de>
Thu, 25 Jun 2020 19:22:35 +0000 (21:22 +0200)
committerMarek Vasut <marex@denx.de>
Sat, 19 Sep 2020 00:48:02 +0000 (02:48 +0200)
Factor out common code from the mergeX/splatX instructions so it
is easier to add the aarch64 counterpart.

Signed-off-by: Marek Vasut <marex@denx.de>
orc/orcrules-neon.c

index 60364b7..e7e97ea 100644 (file)
@@ -2819,6 +2819,8 @@ orc_neon_rule_convhlw (OrcCompiler *p, void *user, OrcInstruction *insn)
 static void
 orc_neon_rule_mergebw (OrcCompiler *p, void *user, OrcInstruction *insn)
 {
+  OrcVariable tmpreg = { .alloc = p->tmpreg, .size = p->vars[insn->src_args[1]].size };
+
   if (p->insn_shift <= 2) {
     if (p->vars[insn->dest_args[0]].alloc != p->vars[insn->src_args[0]].alloc) {
       orc_neon_emit_mov (p, p->vars[insn->dest_args[0]],
@@ -2827,7 +2829,6 @@ orc_neon_rule_mergebw (OrcCompiler *p, void *user, OrcInstruction *insn)
 
     if (p->vars[insn->src_args[1]].last_use != p->insn_index ||
         p->vars[insn->src_args[1]].alloc == p->vars[insn->dest_args[0]].alloc) {
-      OrcVariable tmpreg = { .alloc = p->tmpreg, .size = p->vars[insn->src_args[1]].size };
       orc_neon_emit_mov (p, tmpreg, p->vars[insn->src_args[1]]);
       orc_neon_emit_unary (p, "vzip.8", 0xf3b20180,
           p->vars[insn->dest_args[0]].alloc,
@@ -2843,7 +2844,6 @@ orc_neon_rule_mergebw (OrcCompiler *p, void *user, OrcInstruction *insn)
           p->vars[insn->src_args[0]]);
     }
 
-    OrcVariable tmpreg = { .alloc = p->tmpreg, .size = p->vars[insn->src_args[1]].size };
     orc_neon_emit_mov_quad (p, tmpreg, p->vars[insn->src_args[1]]);
     orc_neon_emit_unary_quad (p, "vzip.8", 0xf3b20180,
         p->vars[insn->dest_args[0]].alloc,
@@ -2854,6 +2854,8 @@ orc_neon_rule_mergebw (OrcCompiler *p, void *user, OrcInstruction *insn)
 static void
 orc_neon_rule_mergewl (OrcCompiler *p, void *user, OrcInstruction *insn)
 {
+  OrcVariable tmpreg = { .alloc = p->tmpreg, .size = p->vars[insn->src_args[1]].size };
+
   if (p->insn_shift <= 1) {
     if (p->vars[insn->dest_args[0]].alloc != p->vars[insn->src_args[0]].alloc) {
       orc_neon_emit_mov (p, p->vars[insn->dest_args[0]],
@@ -2862,7 +2864,6 @@ orc_neon_rule_mergewl (OrcCompiler *p, void *user, OrcInstruction *insn)
 
     if (p->vars[insn->src_args[1]].last_use != p->insn_index ||
         p->vars[insn->src_args[1]].alloc == p->vars[insn->dest_args[0]].alloc) {
-      OrcVariable tmpreg = { .alloc = p->tmpreg, .size = p->vars[insn->src_args[1]].size };
       orc_neon_emit_mov (p, tmpreg, p->vars[insn->src_args[1]]);
       orc_neon_emit_unary (p, "vzip.16", 0xf3b60180,
           p->vars[insn->dest_args[0]].alloc,
@@ -2880,7 +2881,6 @@ orc_neon_rule_mergewl (OrcCompiler *p, void *user, OrcInstruction *insn)
 
     if (p->vars[insn->src_args[1]].last_use != p->insn_index ||
         p->vars[insn->src_args[1]].alloc == p->vars[insn->dest_args[0]].alloc) {
-      OrcVariable tmpreg = { .alloc = p->tmpreg, .size = p->vars[insn->src_args[1]].size };
       orc_neon_emit_mov_quad (p, tmpreg, p->vars[insn->src_args[1]]);
       orc_neon_emit_unary_quad (p, "vzip.16", 0xf3b60180,
           p->vars[insn->dest_args[0]].alloc,
@@ -2896,6 +2896,8 @@ orc_neon_rule_mergewl (OrcCompiler *p, void *user, OrcInstruction *insn)
 static void
 orc_neon_rule_mergelq (OrcCompiler *p, void *user, OrcInstruction *insn)
 {
+  OrcVariable tmpreg = { .alloc = p->tmpreg, .size = p->vars[insn->src_args[1]].size };
+
   if (p->insn_shift <= 0) {
     if (p->vars[insn->dest_args[0]].alloc != p->vars[insn->src_args[0]].alloc) {
       orc_neon_emit_mov (p, p->vars[insn->dest_args[0]],
@@ -2904,7 +2906,6 @@ orc_neon_rule_mergelq (OrcCompiler *p, void *user, OrcInstruction *insn)
 
     if (p->vars[insn->src_args[1]].last_use != p->insn_index ||
         p->vars[insn->src_args[1]].alloc == p->vars[insn->dest_args[0]].alloc) {
-      OrcVariable tmpreg = { .alloc = p->tmpreg, .size = p->vars[insn->src_args[1]].size };
       orc_neon_emit_mov (p, tmpreg, p->vars[insn->src_args[1]]);
       orc_neon_emit_unary (p, "vtrn.32", 0xf3ba0080,
           p->vars[insn->dest_args[0]].alloc,
@@ -2922,7 +2923,6 @@ orc_neon_rule_mergelq (OrcCompiler *p, void *user, OrcInstruction *insn)
 
     if (p->vars[insn->src_args[1]].last_use != p->insn_index ||
         p->vars[insn->src_args[1]].alloc == p->vars[insn->dest_args[0]].alloc) {
-      OrcVariable tmpreg = { .alloc = p->tmpreg, .size = p->vars[insn->src_args[1]].size };
       orc_neon_emit_mov_quad (p, tmpreg, p->vars[insn->src_args[1]]);
       orc_neon_emit_unary_quad (p, "vzip.32", 0xf3ba0180,
           p->vars[insn->dest_args[0]].alloc,
@@ -2938,13 +2938,14 @@ orc_neon_rule_mergelq (OrcCompiler *p, void *user, OrcInstruction *insn)
 static void
 orc_neon_rule_splatbw (OrcCompiler *p, void *user, OrcInstruction *insn)
 {
+  OrcVariable tmpreg = { .alloc = p->tmpreg, .size = p->vars[insn->dest_args[0]].size };
+
   if (p->insn_shift <= 2) {
     if (p->vars[insn->dest_args[0]].alloc != p->vars[insn->src_args[0]].alloc) {
       orc_neon_emit_mov (p, p->vars[insn->dest_args[0]],
           p->vars[insn->src_args[0]]);
     }
 
-    OrcVariable tmpreg = { .alloc = p->tmpreg, .size = p->vars[insn->dest_args[0]].size };
     orc_neon_emit_mov (p, tmpreg, p->vars[insn->dest_args[0]]);
     orc_neon_emit_unary (p, "vzip.8", 0xf3b20180,
         p->vars[insn->dest_args[0]].alloc,
@@ -2955,7 +2956,6 @@ orc_neon_rule_splatbw (OrcCompiler *p, void *user, OrcInstruction *insn)
           p->vars[insn->src_args[0]]);
     }
 
-    OrcVariable tmpreg = { .alloc = p->tmpreg, .size = p->vars[insn->dest_args[0]].size };
     orc_neon_emit_mov_quad (p, tmpreg, p->vars[insn->dest_args[0]]);
     orc_neon_emit_unary_quad (p, "vzip.8", 0xf3b20180,
         p->vars[insn->dest_args[0]].alloc,