Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/GStreamer/orc.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarek Vasut <marex@denx.de>2020-06-26 13:35:57 +0300
committerMarek Vasut <marex@denx.de>2020-09-19 03:48:02 +0300
commit221a5d86dc23d30789dfb912e4a8cc7da091089f (patch)
treeeacf9b036da38b510b3829066f033538933a4e36
parent446659cecb04321835120e6af1917799083dcfa1 (diff)
aarch64: Implement signX instructions
Fill in aarch64 opcodes for signX instructions. Signed-off-by: Marek Vasut <marex@denx.de>
-rw-r--r--orc/orcrules-neon.c168
1 files changed, 120 insertions, 48 deletions
diff --git a/orc/orcrules-neon.c b/orc/orcrules-neon.c
index 085e719..8918d31 100644
--- a/orc/orcrules-neon.c
+++ b/orc/orcrules-neon.c
@@ -3325,27 +3325,51 @@ orc_neon_rule_signw (OrcCompiler *p, void *user, OrcInstruction *insn)
orc_neon_emit_loadiw (p, &tmpreg, 1);
if (p->insn_shift < 3) {
- orc_neon_emit_binary (p, "vmin.s16", 0xf2100610,
- p->vars[insn->dest_args[0]].alloc,
- p->tmpreg,
- p->vars[insn->src_args[0]].alloc);
+ if (p->is_64bit)
+ orc_neon64_emit_binary (p, "smin", 0x0e606c00,
+ p->vars[insn->dest_args[0]],
+ tmpreg,
+ p->vars[insn->src_args[0]], p->insn_shift);
+ else
+ orc_neon_emit_binary (p, "vmin.s16", 0xf2100610,
+ p->vars[insn->dest_args[0]].alloc,
+ p->tmpreg,
+ p->vars[insn->src_args[0]].alloc);
} else {
- orc_neon_emit_binary_quad (p, "vmin.s16", 0xf2100610,
- p->vars[insn->dest_args[0]].alloc,
- p->tmpreg,
- p->vars[insn->src_args[0]].alloc);
+ if (p->is_64bit)
+ orc_neon64_emit_binary (p, "smin", 0x0e606c00,
+ p->vars[insn->dest_args[0]],
+ tmpreg,
+ p->vars[insn->src_args[0]], p->insn_shift - 1);
+ else
+ orc_neon_emit_binary_quad (p, "vmin.s16", 0xf2100610,
+ p->vars[insn->dest_args[0]].alloc,
+ p->tmpreg,
+ p->vars[insn->src_args[0]].alloc);
}
orc_neon_emit_loadiw (p, &tmpreg, -1);
if (p->insn_shift < 3) {
- orc_neon_emit_binary (p, "vmax.s16", 0xf2100600,
- p->vars[insn->dest_args[0]].alloc,
- p->tmpreg,
- p->vars[insn->dest_args[0]].alloc);
+ if (p->is_64bit)
+ orc_neon64_emit_binary (p, "smax", 0x0e606400,
+ p->vars[insn->dest_args[0]],
+ tmpreg,
+ p->vars[insn->dest_args[0]], p->insn_shift);
+ else
+ orc_neon_emit_binary (p, "vmax.s16", 0xf2100600,
+ p->vars[insn->dest_args[0]].alloc,
+ p->tmpreg,
+ p->vars[insn->dest_args[0]].alloc);
} else {
- orc_neon_emit_binary_quad (p, "vmax.s16", 0xf2100600,
- p->vars[insn->dest_args[0]].alloc,
- p->tmpreg,
- p->vars[insn->dest_args[0]].alloc);
+ if (p->is_64bit)
+ orc_neon64_emit_binary (p, "smax", 0x0e606400,
+ p->vars[insn->dest_args[0]],
+ tmpreg,
+ p->vars[insn->dest_args[0]], p->insn_shift - 1);
+ else
+ orc_neon_emit_binary_quad (p, "vmax.s16", 0xf2100600,
+ p->vars[insn->dest_args[0]].alloc,
+ p->tmpreg,
+ p->vars[insn->dest_args[0]].alloc);
}
}
@@ -3358,27 +3382,51 @@ orc_neon_rule_signb (OrcCompiler *p, void *user, OrcInstruction *insn)
orc_neon_emit_loadib (p, &tmpreg, 1);
if (p->insn_shift < 4) {
- orc_neon_emit_binary (p, "vmin.s8", 0xf2000610,
- p->vars[insn->dest_args[0]].alloc,
- p->tmpreg,
- p->vars[insn->src_args[0]].alloc);
+ if (p->is_64bit)
+ orc_neon64_emit_binary (p, "smin", 0x0e206c00,
+ p->vars[insn->dest_args[0]],
+ tmpreg,
+ p->vars[insn->src_args[0]], p->insn_shift);
+ else
+ orc_neon_emit_binary (p, "vmin.s8", 0xf2000610,
+ p->vars[insn->dest_args[0]].alloc,
+ p->tmpreg,
+ p->vars[insn->src_args[0]].alloc);
} else {
- orc_neon_emit_binary_quad (p, "vmin.s8", 0xf2000610,
- p->vars[insn->dest_args[0]].alloc,
- p->tmpreg,
- p->vars[insn->src_args[0]].alloc);
+ if (p->is_64bit)
+ orc_neon64_emit_binary (p, "smin", 0x0e206c00,
+ p->vars[insn->dest_args[0]],
+ tmpreg,
+ p->vars[insn->src_args[0]], p->insn_shift - 1);
+ else
+ orc_neon_emit_binary_quad (p, "vmin.s8", 0xf2000610,
+ p->vars[insn->dest_args[0]].alloc,
+ p->tmpreg,
+ p->vars[insn->src_args[0]].alloc);
}
orc_neon_emit_loadib (p, &tmpreg, -1);
if (p->insn_shift < 4) {
- orc_neon_emit_binary (p, "vmax.s8", 0xf2000600,
- p->vars[insn->dest_args[0]].alloc,
- p->tmpreg,
- p->vars[insn->dest_args[0]].alloc);
+ if (p->is_64bit)
+ orc_neon64_emit_binary (p, "smax", 0x0e206400,
+ p->vars[insn->dest_args[0]],
+ tmpreg,
+ p->vars[insn->dest_args[0]], p->insn_shift);
+ else
+ orc_neon_emit_binary (p, "vmax.s8", 0xf2000600,
+ p->vars[insn->dest_args[0]].alloc,
+ p->tmpreg,
+ p->vars[insn->dest_args[0]].alloc);
} else {
- orc_neon_emit_binary_quad (p, "vmax.s8", 0xf2000600,
- p->vars[insn->dest_args[0]].alloc,
- p->tmpreg,
- p->vars[insn->dest_args[0]].alloc);
+ if (p->is_64bit)
+ orc_neon64_emit_binary (p, "smax", 0x0e206400,
+ p->vars[insn->dest_args[0]],
+ tmpreg,
+ p->vars[insn->dest_args[0]], p->insn_shift - 1);
+ else
+ orc_neon_emit_binary_quad (p, "vmax.s8", 0xf2000600,
+ p->vars[insn->dest_args[0]].alloc,
+ p->tmpreg,
+ p->vars[insn->dest_args[0]].alloc);
}
}
@@ -3391,27 +3439,51 @@ orc_neon_rule_signl (OrcCompiler *p, void *user, OrcInstruction *insn)
orc_neon_emit_loadil (p, &tmpreg, 1);
if (p->insn_shift < 2) {
- orc_neon_emit_binary (p, "vmin.s32", 0xf2200610,
- p->vars[insn->dest_args[0]].alloc,
- p->tmpreg,
- p->vars[insn->src_args[0]].alloc);
+ if (p->is_64bit)
+ orc_neon64_emit_binary (p, "smin", 0x0ea06c00,
+ p->vars[insn->dest_args[0]],
+ tmpreg,
+ p->vars[insn->src_args[0]], p->insn_shift);
+ else
+ orc_neon_emit_binary (p, "vmin.s32", 0xf2200610,
+ p->vars[insn->dest_args[0]].alloc,
+ p->tmpreg,
+ p->vars[insn->src_args[0]].alloc);
} else {
- orc_neon_emit_binary_quad (p, "vmin.s32", 0xf2200610,
- p->vars[insn->dest_args[0]].alloc,
- p->tmpreg,
- p->vars[insn->src_args[0]].alloc);
+ if (p->is_64bit)
+ orc_neon64_emit_binary (p, "smin", 0x0ea06c00,
+ p->vars[insn->dest_args[0]],
+ tmpreg,
+ p->vars[insn->src_args[0]], p->insn_shift - 1);
+ else
+ orc_neon_emit_binary_quad (p, "vmin.s32", 0xf2200610,
+ p->vars[insn->dest_args[0]].alloc,
+ p->tmpreg,
+ p->vars[insn->src_args[0]].alloc);
}
orc_neon_emit_loadil (p, &tmpreg, -1);
if (p->insn_shift < 2) {
- orc_neon_emit_binary (p, "vmax.s32", 0xf2200600,
- p->vars[insn->dest_args[0]].alloc,
- p->tmpreg,
- p->vars[insn->dest_args[0]].alloc);
+ if (p->is_64bit)
+ orc_neon64_emit_binary (p, "smax", 0x0ea06400,
+ p->vars[insn->dest_args[0]],
+ tmpreg,
+ p->vars[insn->dest_args[0]], p->insn_shift);
+ else
+ orc_neon_emit_binary (p, "vmax.s32", 0xf2200600,
+ p->vars[insn->dest_args[0]].alloc,
+ p->tmpreg,
+ p->vars[insn->dest_args[0]].alloc);
} else {
- orc_neon_emit_binary_quad (p, "vmax.s32", 0xf2200600,
- p->vars[insn->dest_args[0]].alloc,
- p->tmpreg,
- p->vars[insn->dest_args[0]].alloc);
+ if (p->is_64bit)
+ orc_neon64_emit_binary (p, "smax", 0x0ea06400,
+ p->vars[insn->dest_args[0]],
+ tmpreg,
+ p->vars[insn->dest_args[0]], p->insn_shift - 1);
+ else
+ orc_neon_emit_binary_quad (p, "vmax.s32", 0xf2200600,
+ p->vars[insn->dest_args[0]].alloc,
+ p->tmpreg,
+ p->vars[insn->dest_args[0]].alloc);
}
}