aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorZhi An Ng <zhin@google.com>2022-02-03 09:32:44 -0800
committerXNNPACK Team <xnnpack-github-robot@google.com>2022-02-03 09:33:59 -0800
commit4decc8e6162413339aa1da8979e9feae09cabc00 (patch)
tree245c5209b7c00f8c8264de4dabba6960c2fe41c8
parent8ceeebe986c3b74736b201c398db3bb330832e6d (diff)
downloadXNNPACK-4decc8e6162413339aa1da8979e9feae09cabc00.tar.gz
Implement mov (x registers) for aarch64 assembler
PiperOrigin-RevId: 426166078
-rw-r--r--src/jit/aarch64-assembler.cc4
-rw-r--r--src/xnnpack/aarch64-assembler.h1
-rw-r--r--test/aarch64-assembler.cc2
3 files changed, 7 insertions, 0 deletions
diff --git a/src/jit/aarch64-assembler.cc b/src/jit/aarch64-assembler.cc
index bc336df77..5e062ef42 100644
--- a/src/jit/aarch64-assembler.cc
+++ b/src/jit/aarch64-assembler.cc
@@ -278,6 +278,10 @@ void Assembler::ldr(XRegister xt, MemOperand xn) {
emit32(0xF9400000 | imm >> 3 << 10 | rn(xn.base) | xt.code);
}
+void Assembler::mov(XRegister xd, XRegister xn) {
+ emit32(0xAA0003E0 | rm(xn) | rd(xd));
+}
+
void Assembler::prfm(PrefetchOp prfop, MemOperand xn) {
if (xn.offset < 0 || xn.offset > kImm12Max) {
error_ = Error::kInvalidOperand;
diff --git a/src/xnnpack/aarch64-assembler.h b/src/xnnpack/aarch64-assembler.h
index e966fe478..c19585686 100644
--- a/src/xnnpack/aarch64-assembler.h
+++ b/src/xnnpack/aarch64-assembler.h
@@ -337,6 +337,7 @@ class Assembler : public AssemblerBase {
void ldp(XRegister xt1, XRegister xt2, MemOperand xn);
void ldp(XRegister xt1, XRegister xt2, MemOperand xn, int32_t imm);
void ldr(XRegister xt, MemOperand xn);
+ void mov(XRegister xd, XRegister xn);
void prfm(PrefetchOp prfop, MemOperand xn);
void ret();
void stp(XRegister xt1, XRegister xt2, MemOperand xn);
diff --git a/test/aarch64-assembler.cc b/test/aarch64-assembler.cc
index 2add642f9..156210e7c 100644
--- a/test/aarch64-assembler.cc
+++ b/test/aarch64-assembler.cc
@@ -55,6 +55,8 @@ TEST(AArch64Assembler, BaseInstructionEncoding) {
EXPECT_ERROR(Error::kInvalidOperand, a.ldr(x8, mem[sp, 32768]));
EXPECT_ERROR(Error::kInvalidOperand, a.ldr(x8, MemOperand(sp, 16, AddressingMode::kPostIndex)));
+ CHECK_ENCODING(0xAA0303E9, a.mov(x9, x3));
+
CHECK_ENCODING(0xF98000A0, a.prfm(kPLDL1KEEP, mem[x5]));
CHECK_ENCODING(0xF98020A0, a.prfm(kPLDL1KEEP, mem[x5, 64]));
EXPECT_ERROR(Error::kInvalidOperand, a.prfm(kPLDL1KEEP, mem[x5, -8]));