aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorZhi An Ng <zhin@google.com>2022-02-03 16:19:49 -0800
committerXNNPACK Team <xnnpack-github-robot@google.com>2022-02-03 16:20:42 -0800
commitf6728515147b5534d5530ab1b05343b1e1a84553 (patch)
tree9eb5e76ccfc1d30bdc326595dcbbe78f6076db95
parentc92034d9a9bd8cacc7da9c74fa93886f5caca5eb (diff)
downloadXNNPACK-f6728515147b5534d5530ab1b05343b1e1a84553.tar.gz
Implement str (s register, post index) for aarch64 assembler
PiperOrigin-RevId: 426264040
-rw-r--r--src/jit/aarch64-assembler.cc4
-rw-r--r--src/xnnpack/aarch64-assembler.h1
-rw-r--r--test/aarch64-assembler.cc6
3 files changed, 11 insertions, 0 deletions
diff --git a/src/jit/aarch64-assembler.cc b/src/jit/aarch64-assembler.cc
index 5b4acf163..71c9eb070 100644
--- a/src/jit/aarch64-assembler.cc
+++ b/src/jit/aarch64-assembler.cc
@@ -564,6 +564,10 @@ void Assembler::str(SRegister st, MemOperand xn) {
emit32(0xBD000000 | imm >> 2 << 10 | rn(xn.base) | rt(st));
}
+void Assembler::str(SRegister st, MemOperand xn, int32_t imm) {
+ return str(/*size=*/2, /*opc=*/0, xn, imm, st.code);
+}
+
void Assembler::bind(Label& l) {
if (l.bound) {
error_ = Error::kLabelAlreadyBound;
diff --git a/src/xnnpack/aarch64-assembler.h b/src/xnnpack/aarch64-assembler.h
index 5408065ff..4f8412039 100644
--- a/src/xnnpack/aarch64-assembler.h
+++ b/src/xnnpack/aarch64-assembler.h
@@ -373,6 +373,7 @@ class Assembler : public AssemblerBase {
void str(DRegister dt, MemOperand xn, int32_t imm);
void str(QRegister qt, MemOperand xn, int32_t imm);
void str(SRegister st, MemOperand xn);
+ void str(SRegister st, MemOperand xn, int32_t imm);
// Binds Label l to the current location in the code buffer.
void bind(Label& l);
diff --git a/test/aarch64-assembler.cc b/test/aarch64-assembler.cc
index bfd153600..1065fbde0 100644
--- a/test/aarch64-assembler.cc
+++ b/test/aarch64-assembler.cc
@@ -217,6 +217,12 @@ TEST(AArch64Assembler, SIMDInstructionEncoding) {
EXPECT_ERROR(Error::kInvalidOperand, a.str(s16, mem[x6, -4]));
EXPECT_ERROR(Error::kInvalidOperand, a.str(s16, mem[x6, 16384]));
+ CHECK_ENCODING(0xBC0044D0, a.str(s16, mem[x6], 4));
+ CHECK_ENCODING(0xBC0FF4D0, a.str(s16, mem[x6], 255));
+ CHECK_ENCODING(0xBC1004D0, a.str(s16, mem[x6], -256));
+ EXPECT_ERROR(Error::kInvalidOperand, a.str(s16, mem[x6], 256));
+ EXPECT_ERROR(Error::kInvalidOperand, a.str(s16, mem[x6], -257));
+
ASSERT_EQ(xnn_status_success, xnn_release_code_memory(&b));
}