aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorZhi An Ng <zhin@google.com>2022-02-03 09:20:28 -0800
committerXNNPACK Team <xnnpack-github-robot@google.com>2022-02-03 09:21:41 -0800
commit8ceeebe986c3b74736b201c398db3bb330832e6d (patch)
tree6702804454164fde4862f5c6b38cc7e2e7ed920b
parent9e51ad645e438dadee87d997a4a6756be1cc7bfe (diff)
downloadXNNPACK-8ceeebe986c3b74736b201c398db3bb330832e6d.tar.gz
Implement stp (x registers) for aarch64 assembler
PiperOrigin-RevId: 426163361
-rw-r--r--src/jit/aarch64-assembler.cc10
-rw-r--r--src/xnnpack/aarch64-assembler.h1
-rw-r--r--test/aarch64-assembler.cc8
3 files changed, 19 insertions, 0 deletions
diff --git a/src/jit/aarch64-assembler.cc b/src/jit/aarch64-assembler.cc
index b2bf11ea5..bc336df77 100644
--- a/src/jit/aarch64-assembler.cc
+++ b/src/jit/aarch64-assembler.cc
@@ -291,6 +291,16 @@ void Assembler::ret() {
emit32(0xD65F0000 | rn(x30));
}
+void Assembler::stp(XRegister xt1, XRegister xt2, MemOperand xn) {
+ if (!imm7_offset_valid(xn.offset, xt1)) {
+ error_ = Error::kInvalidOperand;
+ return;
+ }
+
+ const uint32_t offset = (xn.offset >> 3) & kImm7Mask;
+ emit32(0xA9000000 | wb(xn) | offset << 15 | rt2(xt2) | rn(xn.base) | rt(xt1));
+}
+
void Assembler::sub(XRegister xd, XRegister xn, XRegister xm) {
emit32(0xCB000000 | rm(xm) | rn(xn) | rd(xd));
}
diff --git a/src/xnnpack/aarch64-assembler.h b/src/xnnpack/aarch64-assembler.h
index 084746db2..e966fe478 100644
--- a/src/xnnpack/aarch64-assembler.h
+++ b/src/xnnpack/aarch64-assembler.h
@@ -339,6 +339,7 @@ class Assembler : public AssemblerBase {
void ldr(XRegister xt, MemOperand xn);
void prfm(PrefetchOp prfop, MemOperand xn);
void ret();
+ void stp(XRegister xt1, XRegister xt2, MemOperand xn);
void sub(XRegister xd, XRegister xn, XRegister xm);
void subs(XRegister xd, XRegister xn, uint16_t imm12);
void tbnz(XRegister xd, uint8_t bit, Label& l);
diff --git a/test/aarch64-assembler.cc b/test/aarch64-assembler.cc
index cfd7444c3..2add642f9 100644
--- a/test/aarch64-assembler.cc
+++ b/test/aarch64-assembler.cc
@@ -64,6 +64,14 @@ TEST(AArch64Assembler, BaseInstructionEncoding) {
CHECK_ENCODING(0xCB020083, a.sub(x3, x4, x2));
+ CHECK_ENCODING(0xA90457F4, a.stp(x20, x21, mem[sp, 64]));
+ CHECK_ENCODING(0xA98457F4, a.stp(x20, x21, mem[sp, 64]++));
+ CHECK_ENCODING(0xA91FD7F4, a.stp(x20, x21, mem[sp, 504]));
+ CHECK_ENCODING(0xA92057F4, a.stp(x20, x21, mem[sp, -512]));
+ EXPECT_ERROR(Error::kInvalidOperand, a.stp(x20, x21, mem[sp, 3]));
+ EXPECT_ERROR(Error::kInvalidOperand, a.stp(x20, x21, mem[sp, 512]));
+ EXPECT_ERROR(Error::kInvalidOperand, a.stp(x20, x21, mem[sp, -520]));
+
CHECK_ENCODING(0xF1008040, a.subs(x0, x2, 32));
CHECK_ENCODING(0xF13FFC40, a.subs(x0, x2, 4095));
EXPECT_ERROR(Error::kInvalidOperand, a.subs(x0, x2, -32));