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_;