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); }