add movs{b,w,d,q}
diff --git a/gen/gen_code.cpp b/gen/gen_code.cpp
index 510bf09..6728a14 100644
--- a/gen/gen_code.cpp
+++ b/gen/gen_code.cpp
@@ -625,6 +625,9 @@
{ "cpuid", 0x0F, 0xA2 },
{ "cwd", 0x66, 0x99 },
{ "cwde", 0x98 },
+ { "movsb", 0xA4 },
+ { "movsw", 0x66, 0xA5 },
+ { "movsd", 0xA5 },
{ "lahf", 0x9F },
{ "lock", 0xF0 },
@@ -1710,6 +1713,7 @@
const GenericTbl tbl[] = {
{ "cdqe", 0x48, 0x98 },
{ "cqo", 0x48, 0x99 },
+ { "movsq", 0x48, 0xA5 },
};
putGeneric(tbl, NUM_OF_ARRAY(tbl));
diff --git a/gen/update.bat b/gen/update.bat
index 6edaadc..eabbd25 100644
--- a/gen/update.bat
+++ b/gen/update.bat
@@ -3,15 +3,19 @@
set TARGET=..\\xbyak\\xbyak_mnemonic.h
set SORT=sortline
cl gen_code.cpp %OPT%
-gen_code | %SORT% > %TARGET%
+gen_code > tmp.txt
+%SORT% tmp.txt > %TARGET%
echo #ifdef XBYAK_ENABLE_OMITTED_OPERAND>> %TARGET%
-gen_code omit | %SORT% >> %TARGET%
+gen_code omit > tmp.txt
+%SORT% tmp.txt >> %TARGET%
echo #endif>>%TARGET%
gen_code fixed >> %TARGET%
cl gen_avx512.cpp %OPT%
echo #ifndef XBYAK_DISABLE_AVX512>> %TARGET%
-gen_avx512 |%SORT% >> %TARGET%
+gen_avx512 > tmp.txt
+%SORT% tmp.txt >> %TARGET%
echo #ifdef XBYAK64>> %TARGET%
-gen_avx512 64 |%SORT% >> %TARGET%
+gen_avx512 64 > tmp.txt
+%SORT% tmp.txt >> %TARGET%
echo #endif>> %TARGET%
-echo #endif>> %TARGET%
+echo #endif>> %TARGET%
\ No newline at end of file
diff --git a/readme.md b/readme.md
index 990188f..0cd6605 100644
--- a/readme.md
+++ b/readme.md
@@ -1,5 +1,5 @@
-Xbyak 5.41 ; JIT assembler for x86(IA32), x64(AMD64, x86-64) by C++
+Xbyak 5.42 ; JIT assembler for x86(IA32), x64(AMD64, x86-64) by C++
=============
Abstract
@@ -332,6 +332,7 @@
History
-------------
+* 2017/May/13 ver 5.42 add movs{b,w,d,q}
* 2017/Jan/26 ver 5.41 add prefetchwt1 and support for scale == 0(thanks to rsdubtso)
* 2016/Dec/14 ver 5.40 add Label::getAddress() method to get the pointer specified by the label
* 2016/Dec/09 ver 5.34 fix handling of negative offsets when encoding disp8N(thanks to rsdubtso)
diff --git a/readme.txt b/readme.txt
index 1fa124e..b88cf0b 100644
--- a/readme.txt
+++ b/readme.txt
@@ -1,5 +1,5 @@
- C++用x86(IA-32), x64(AMD64, x86-64) JITアセンブラ Xbyak 5.41
+ C++用x86(IA-32), x64(AMD64, x86-64) JITアセンブラ Xbyak 5.42
-----------------------------------------------------------------------------
◎概要
@@ -343,6 +343,7 @@
-----------------------------------------------------------------------------
◎履歴
+2017/05/13 ver 5.42 movs{b,w,d,q}追加
2017/01/26 ver 5.41 prefetcwt1追加とscale == 0対応(thanks to rsdubtso)
2016/12/14 ver 5.40 Labelが示すアドレスを取得するLabel::getAddress()追加
2016/12/07 ver 5.34 disp8N時の負のオフセット処理の修正(thanks to rsdubtso)
diff --git a/xbyak/xbyak.h b/xbyak/xbyak.h
index 37e927a..71bcbab 100644
--- a/xbyak/xbyak.h
+++ b/xbyak/xbyak.h
@@ -105,7 +105,7 @@
enum {
DEFAULT_MAX_CODE_SIZE = 4096,
- VERSION = 0x5410 /* 0xABCD = A.BC(D) */
+ VERSION = 0x5420 /* 0xABCD = A.BC(D) */
};
#ifndef MIE_INTEGER_TYPE_DEFINED
diff --git a/xbyak/xbyak_mnemonic.h b/xbyak/xbyak_mnemonic.h
index 175932f..8e97439 100644
--- a/xbyak/xbyak_mnemonic.h
+++ b/xbyak/xbyak_mnemonic.h
@@ -1,4 +1,4 @@
-const char *getVersionString() const { return "5.41"; }
+const char *getVersionString() const { return "5.42"; }
void adc(const Operand& op, uint32 imm) { opRM_I(op, imm, 0x10, 2); }
void adc(const Operand& op1, const Operand& op2) { opRM_RM(op1, op2, 0x10); }
void adcx(const Reg32e& reg, const Operand& op) { opGen(reg, op, 0xF6, 0x66, isREG32_REG32orMEM, NONE, 0x38); }
@@ -465,12 +465,15 @@
void movq(const Address& addr, const Mmx& mmx) { if (mmx.isXMM()) db(0x66); opModM(addr, mmx, 0x0F, mmx.isXMM() ? 0xD6 : 0x7F); }
void movq(const Mmx& mmx, const Operand& op) { if (mmx.isXMM()) db(0xF3); opModRM(mmx, op, (mmx.getKind() == op.getKind()), op.isMEM(), 0x0F, mmx.isXMM() ? 0x7E : 0x6F); }
void movq2dq(const Xmm& xmm, const Mmx& mmx) { db(0xF3); opModR(xmm, mmx, 0x0F, 0xD6); }
+void movsb() { db(0xA4); }
+void movsd() { db(0xA5); }
void movsd(const Address& addr, const Xmm& xmm) { db(0xF2); opModM(addr, xmm, 0x0F, 0x11); }
void movsd(const Xmm& xmm, const Operand& op) { opMMX(xmm, op, 0x10, 0xF2); }
void movshdup(const Xmm& xmm, const Operand& op) { opGen(xmm, op, 0x16, 0xF3, isXMM_XMMorMEM); }
void movsldup(const Xmm& xmm, const Operand& op) { opGen(xmm, op, 0x12, 0xF3, isXMM_XMMorMEM); }
void movss(const Address& addr, const Xmm& xmm) { db(0xF3); opModM(addr, xmm, 0x0F, 0x11); }
void movss(const Xmm& xmm, const Operand& op) { opMMX(xmm, op, 0x10, 0xF3); }
+void movsw() { db(0x66); db(0xA5); }
void movsx(const Reg& reg, const Operand& op) { opMovxx(reg, op, 0xBE); }
void movupd(const Address& addr, const Xmm& xmm) { db(0x66); opModM(addr, xmm, 0x0F, 0x11); }
void movupd(const Xmm& xmm, const Operand& op) { opMMX(xmm, op, 0x10, 0x66); }
@@ -1518,6 +1521,7 @@
void jrcxz(const Label& label) { opJmp(label, T_SHORT, 0xe3, 0, 0); }
void cdqe() { db(0x48); db(0x98); }
void cqo() { db(0x48); db(0x99); }
+void movsq() { db(0x48); db(0xA5); }
void cmpxchg16b(const Address& addr) { opModM(addr, Reg64(1), 0x0F, 0xC7); }
void movq(const Reg64& reg, const Mmx& mmx) { if (mmx.isXMM()) db(0x66); opModR(mmx, reg, 0x0F, 0x7E); }
void movq(const Mmx& mmx, const Reg64& reg) { if (mmx.isXMM()) db(0x66); opModR(mmx, reg, 0x0F, 0x6E); }