summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorWim Taymans <wtaymans@redhat.com>2014-12-09 16:58:56 +0100
committerWim Taymans <wtaymans@redhat.com>2014-12-09 18:01:37 +0100
commitbc0140faf9bccd15445f2d837b9ffd0fb479a94c (patch)
tree1aef2634643ab312015f4c4bafa8a258ad5b6f69
parent2a187f7f1bc91a5ba7dbc608f7c0a98016e45651 (diff)
neon: add support for 64 bit parameters
-rw-r--r--orc/orcrules-neon.c41
1 files changed, 36 insertions, 5 deletions
diff --git a/orc/orcrules-neon.c b/orc/orcrules-neon.c
index 83b33d3..cc47a11 100644
--- a/orc/orcrules-neon.c
+++ b/orc/orcrules-neon.c
@@ -801,9 +801,6 @@ neon_rule_loadpX (OrcCompiler *compiler, void *user, OrcInstruction *insn)
} else if (size == 4) {
orc_neon_emit_loadpl (compiler, dest->alloc, insn->src_args[0]);
} else if (size == 8) {
- if (src->size == 8) {
- ORC_COMPILER_ERROR(compiler,"64-bit parameters not implemented");
- }
orc_neon_emit_loadpq (compiler, dest->alloc, insn->src_args[0]);
} else {
ORC_PROGRAM_ERROR(compiler,"unimplemented");
@@ -1289,7 +1286,24 @@ orc_neon_emit_loadpq (OrcCompiler *compiler, int dest, int param)
update ? "!" : "");
code = 0xf4a0000d;
code |= 2<<10;
- code |= (0&7)<<5;
+ code |= (0)<<7;
+ code |= (compiler->gp_tmpreg&0xf) << 16;
+ code |= (dest&0xf) << 12;
+ code |= ((dest>>4)&0x1) << 22;
+ code |= (!update) << 1;
+ orc_arm_emit (compiler, code);
+
+ ORC_ASM_CODE(compiler," vld1.32 %s[0], [%s]%s\n",
+ orc_neon_reg_name (dest+1),
+ orc_arm_reg_name (compiler->gp_tmpreg),
+ update ? "!" : "");
+ code = 0xf4a0000d;
+ code |= 2<<10;
+ code |= (0)<<7;
+ code |= (compiler->gp_tmpreg&0xf) << 16;
+ code |= ((dest+1)&0xf) << 12;
+ code |= (((dest+1)>>4)&0x1) << 22;
+ code |= (!update) << 1;
orc_arm_emit (compiler, code);
orc_arm_emit_add_imm (compiler, compiler->gp_tmpreg,
@@ -1302,7 +1316,24 @@ orc_neon_emit_loadpq (OrcCompiler *compiler, int dest, int param)
update ? "!" : "");
code = 0xf4a0000d;
code |= 2<<10;
- code |= (1&7)<<5;
+ code |= (1)<<7;
+ code |= (compiler->gp_tmpreg&0xf) << 16;
+ code |= (dest&0xf) << 12;
+ code |= ((dest>>4)&0x1) << 22;
+ code |= (!update) << 1;
+ orc_arm_emit (compiler, code);
+
+ ORC_ASM_CODE(compiler," vld1.32 %s[1], [%s]%s\n",
+ orc_neon_reg_name (dest+1),
+ orc_arm_reg_name (compiler->gp_tmpreg),
+ update ? "!" : "");
+ code = 0xf4a0000d;
+ code |= 2<<10;
+ code |= (1)<<7;
+ code |= (compiler->gp_tmpreg&0xf) << 16;
+ code |= ((dest+1)&0xf) << 12;
+ code |= (((dest+1)>>4)&0x1) << 22;
+ code |= (!update) << 1;
orc_arm_emit (compiler, code);
}