test 32-bit address on 64-bit os
diff --git a/test/jmp.cpp b/test/jmp.cpp
index 2616def..0c10a98 100644
--- a/test/jmp.cpp
+++ b/test/jmp.cpp
@@ -1341,25 +1341,61 @@
 	CYBOZU_TEST_EQUAL(ret, ret1234() + ret9999());
 }
 
-#if 0
+#ifdef _WIN32
+#include <windows.h>
+// get address in 32bit
+void *get32bitAddress(uint32_t size)
+{
+	size_t expectedAddress = 0x10000000;
+	return VirtualAlloc((void*)expectedAddress, size, MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE);
+}
+
+void free32bitAddress(void *p, uint32_t)
+{
+	if (p == 0) return;
+	VirtualFree(p, 0, MEM_RELEASE);
+}
+
+#else
+#include <sys/mman.h>
+void *get32bitAddress(uint32_t size)
+{
+	return mmap(NULL, size, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS|MAP_32BIT, -1, 0);
+}
+
+void free32bitAddress(void *p, uint32_t size)
+{
+	munmap(p, size);
+}
+#endif
+
 CYBOZU_TEST_AUTO(rip_addr)
 {
 	/*
 		we can't assume |&x - &code| < 2GiB anymore
 	*/
-	static int x = 5;
-	struct Code : Xbyak::CodeGenerator {
-		Code()
-		{
-			mov(eax, 123);
-			mov(ptr[rip + &x], eax);
-			ret();
-		}
-	} code;
-	code.getCode<void (*)()>()();
-	CYBOZU_TEST_EQUAL(x, 123);
+	const uint32_t size = 4096;
+	uint8_t *buf = (uint8_t*)get32bitAddress(size * 2);
+	printf("buf=%p\n", buf);
+	CYBOZU_TEST_ASSERT(buf);
+	CYBOZU_TEST_ASSERT(size_t(buf) < 0x100000000);
+	int *px = (int*)buf;
+	{
+		struct Code : Xbyak::CodeGenerator {
+			Code(uint8_t *p, int *data)
+				: Xbyak::CodeGenerator(size, p)
+			{
+				mov(eax, 123);
+				mov(ptr[rip + data], eax);
+				ret();
+			}
+		} code(buf + size, (int*)buf);
+		code.setProtectModeRE();
+		code.getCode<void (*)()>()();
+		CYBOZU_TEST_EQUAL(*px, 123);
+	}
+	free32bitAddress(buf, size * 2);
 }
-#endif
 
 #ifndef __APPLE__
 CYBOZU_TEST_AUTO(rip_addr_with_fixed_buf)