add tests of bad addressing
diff --git a/test/jmp.cpp b/test/jmp.cpp
index 904ab8c..2616def 100644
--- a/test/jmp.cpp
+++ b/test/jmp.cpp
@@ -411,9 +411,10 @@
}
L(L2);
xor_(ecx, ecx);
+ mov(edx, 1);
mov(eax, ptr[L1+ecx]);
for (int i = 1; i < N; i++) {
- add(eax, ptr[L1+ecx+i*4]);
+ add(eax, ptr[L1+ecx+i*4 + edx*4-4]);
}
ret();
}
@@ -474,6 +475,19 @@
code2.test();
}
+CYBOZU_TEST_AUTO(badAddress)
+{
+ using namespace Xbyak;
+ struct Code : CodeGenerator {
+ Code()
+ {
+ Label L1, L2;
+ CYBOZU_TEST_EXCEPTION(L1 + L2, Error);
+ }
+ };
+ Code code;
+}
+
#endif
uint8_t bufL[4096 * 32];
@@ -1286,6 +1300,10 @@
// error
CYBOZU_TEST_EXCEPTION(rip + label1 + label2, Xbyak::Error);
+ CYBOZU_TEST_EXCEPTION(rip + rax, Xbyak::Error);
+ CYBOZU_TEST_EXCEPTION(rax + rip, Xbyak::Error);
+ CYBOZU_TEST_EXCEPTION(rax + rbx + rcx, Xbyak::Error);
+ CYBOZU_TEST_EXCEPTION(rip + rip, Xbyak::Error);
}
} code(a, b);
int ret = code.getCode<int (*)()>()();
diff --git a/xbyak/xbyak.h b/xbyak/xbyak.h
index 7e23aee..f42171f 100644
--- a/xbyak/xbyak.h
+++ b/xbyak/xbyak.h
@@ -915,28 +915,6 @@
const Label* label_;
bool isAddr_;
explicit XBYAK_CONSTEXPR RegRip(int64_t disp = 0, const Label* label = 0, bool isAddr = false) : disp_(disp), label_(label), isAddr_(isAddr) {}
-#if 0
- friend const RegRip operator+(const RegRip& r, int disp) {
- return RegRip(r.disp_ + disp, r.label_, r.isAddr_);
- }
- friend const RegRip operator-(const RegRip& r, int disp) {
- return RegRip(r.disp_ - disp, r.label_, r.isAddr_);
- }
- friend const RegRip operator+(const RegRip& r, int64_t disp) {
- return RegRip(r.disp_ + disp, r.label_, r.isAddr_);
- }
- friend const RegRip operator-(const RegRip& r, int64_t disp) {
- return RegRip(r.disp_ - disp, r.label_, r.isAddr_);
- }
- friend const RegRip operator+(const RegRip& r, const Label& label) {
- if (r.label_ || r.isAddr_) XBYAK_THROW_RET(ERR_BAD_ADDRESSING, RegRip());
- return RegRip(r.disp_, &label);
- }
- friend const RegRip operator+(const RegRip& r, const void *addr) {
- if (r.label_ || r.isAddr_) XBYAK_THROW_RET(ERR_BAD_ADDRESSING, RegRip());
- return RegRip(r.disp_ + (int64_t)addr, 0, true);
- }
-#endif
};
#endif
@@ -1105,6 +1083,7 @@
if (a.index_.getBit() && b.index_.getBit()) XBYAK_THROW_RET(ERR_BAD_ADDRESSING, RegExp())
if (a.label_ && b.label_) XBYAK_THROW_RET(ERR_BAD_ADDRESSING, RegExp())
if (b.rip_) XBYAK_THROW_RET(ERR_BAD_ADDRESSING, RegExp())
+ if (a.rip_ && !b.isOnlyDisp()) XBYAK_THROW_RET(ERR_BAD_ADDRESSING, RegExp())
if (a.setLabel_ && b.setLabel_) XBYAK_THROW_RET(ERR_BAD_ADDRESSING, RegExp())
RegExp ret = a;
if (ret.label_ == 0) ret.label_ = b.label_;