fix size property of rip addressing / support movsxd
diff --git a/readme.md b/readme.md
index c762dcb..791c444 100644
--- a/readme.md
+++ b/readme.md
@@ -1,5 +1,5 @@
-Xbyak 3.04 ; JIT assembler for x86(IA32), x64(AMD64, x86-64) by C++
+Xbyak 3.05 ; JIT assembler for x86(IA32), x64(AMD64, x86-64) by C++
=============
Abstract
@@ -202,6 +202,7 @@
History
-------------
+* 2011/Nov/09 ver 3.05 fix bit property of rip addresing / support movsxd
* 2011/Aug/15 ver 3.04 fix dealing with imm8 such as add(dword [ebp-8], 0xda); (thanks to lolcat)
* 2011/Jun/16 ver 3.03 fix __GNUC_PREREQ macro for Mac gcc(thanks to t_teruya)
* 2011/Apr/28 ver 3.02 do not use xgetbv on Mac gcc
@@ -251,5 +252,5 @@
MITSUNARI Shigeo(herumi at nifty dot com)
---
-$Revision: 1.14 $
-$Date: 2011/08/15 01:29:40 $
+$Revision: 1.15 $
+$Date: 2011/11/09 02:50:21 $
diff --git a/readme.txt b/readme.txt
index f434342..923983e 100644
--- a/readme.txt
+++ b/readme.txt
@@ -1,5 +1,5 @@
- C++用x86(IA-32), x64(AMD64, x86-64) JITアセンブラ Xbyak version 3.04
+ C++用x86(IA-32), x64(AMD64, x86-64) JITアセンブラ Xbyak version 3.05
-----------------------------------------------------------------------------
◎概要
@@ -214,6 +214,7 @@
-----------------------------------------------------------------------------
◎履歴
+2011/11/09 ver 3.05 rip相対の64bitサイズ以外の扱いのバグ修正 / movsxdサポート
2011/08/15 ver 3.04 add(dword [ebp-8], 0xda);などにおけるimm8の扱いのバグ修正(thanks to lolcat)
2011/06/16 ver 3.03 Macのgcc上での__GNUC_PREREQがミスってたのを修正(thanks to t_teruya)
2011/04/28 ver 3.02 Macのgcc上ではxgetbvをdisable
diff --git a/test/make_nm.cpp b/test/make_nm.cpp
index ede5f7c..cfb402d 100644
--- a/test/make_nm.cpp
+++ b/test/make_nm.cpp
@@ -937,6 +937,9 @@
put(p, REG32, REG16|REG8|MEM8|MEM16);
put(p, REG16, REG8|MEM8);
}
+#ifdef XBYAK64
+ put("movsxd", REG64, REG32|MEM32);
+#endif
put("cmpxchg8b", MEM);
#ifdef XBYAK64
put("cmpxchg16b", MEM);
@@ -1782,6 +1785,22 @@
}
}
}
+ void putRip()
+ {
+ const char tbl[][2][64] = {
+ { "mov(byte [rip - 10], 3);dump();", "mov byte [rip - 10], 3" },
+ { "mov(word [rip - 10], 3);dump();", "mov word [rip - 10], 3" },
+ { "mov(dword[rip - 10], 3);dump();", "mov dword [rip - 10], 3" },
+ { "mov(qword [rip - 10], 3);dump();", "mov qword [rip - 10], 3" },
+ { "mov(ptr [rip - 10], al);dump();", "mov byte [rip - 10], al" },
+ { "mov(ptr [rip - 10], ax);dump();", "mov word [rip - 10], ax" },
+ { "mov(ptr [rip - 10], eax);dump();", "mov dword [rip - 10], eax" },
+ { "mov(ptr [rip - 10], rax);dump();", "mov qword [rip - 10], rax" },
+ };
+ for (size_t i = 0; i < NUM_OF_ARRAY(tbl); i++) {
+ puts(tbl[i][isXbyak_ ? 0 : 1]);
+ }
+ }
public:
Test(bool isXbyak)
: isXbyak_(isXbyak)
@@ -1878,6 +1897,9 @@
separateFunc();
putSSE4_2();
putMov64();
+#ifdef XBYAK64
+ putRip();
+#endif
#endif
#endif
}
diff --git a/xbyak/xbyak.h b/xbyak/xbyak.h
index a4e5556..49c0d40 100644
--- a/xbyak/xbyak.h
+++ b/xbyak/xbyak.h
@@ -5,12 +5,15 @@
@file xbyak.h
@brief Xbyak ; JIT assembler for x86(IA32)/x64 by C++
@author herumi
- @version $Revision: 1.252 $
+ @version $Revision: 1.256 $
@url http://homepage1.nifty.com/herumi/soft/xbyak.html
- @date $Date: 2011/08/15 00:59:49 $
+ @date $Date: 2011/11/09 05:06:37 $
@note modified new BSD license
http://www.opensource.org/licenses/bsd-license.php
*/
+#if not +0
+ #error "use -fno-operator-names"
+#endif
#include <stdio.h> // for debug print
#include <assert.h>
@@ -51,7 +54,7 @@
enum {
DEFAULT_MAX_CODE_SIZE = 4096,
- VERSION = 0x3040, /* 0xABCD = A.BC(D) */
+ VERSION = 0x3050, /* 0xABCD = A.BC(D) */
};
#ifndef MIE_INTEGER_TYPE_DEFINED
@@ -572,7 +575,7 @@
}
Address operator[](const RegRip& addr) const
{
- Address frame(64, true, addr.disp_, false);
+ Address frame(bit_, true, addr.disp_, false);
frame.db(B00000101);
frame.dd(addr.disp_);
return frame;
@@ -1032,6 +1035,7 @@
}
void opMovxx(const Reg& reg, const Operand& op, uint8 code)
{
+ if (op.isBit(32)) throw ERR_BAD_COMBINATION;
int w = op.isBit(16);
bool cond = reg.isREG() && (reg.getBit() > op.getBit());
opModRM(reg, op, cond && op.isREG(), cond && op.isMEM(), 0x0F, code | w);
@@ -1340,6 +1344,11 @@
if (!op.isREG(64) && !op.isMEM()) throw ERR_BAD_COMBINATION;
opGen(Reg64(xmm.getIdx()), op, 0x22, 0x66, 0, imm, B00111010); // force to 64bit
}
+ void movsxd(const Reg64& reg, const Operand& op)
+ {
+ if (!op.isBit(32)) throw ERR_BAD_COMBINATION;
+ opModRM(reg, op, op.isREG(), op.isMEM(), 0x63);
+ }
#endif
// MMX2 : pextrw : reg, mmx/xmm, imm
// SSE4 : pextrw, pextrb, pextrd, extractps : reg/mem, mmx/xmm, imm
diff --git a/xbyak/xbyak_mnemonic.h b/xbyak/xbyak_mnemonic.h
index cacdef3..971948a 100644
--- a/xbyak/xbyak_mnemonic.h
+++ b/xbyak/xbyak_mnemonic.h
@@ -1,4 +1,4 @@
-const char *getVersionString() const { return "3.04"; }
+const char *getVersionString() const { return "3.05"; }
void packssdw(const Mmx& mmx, const Operand& op) { opMMX(mmx, op, 0x6B); }
void packsswb(const Mmx& mmx, const Operand& op) { opMMX(mmx, op, 0x63); }
void packuswb(const Mmx& mmx, const Operand& op) { opMMX(mmx, op, 0x67); }