From 42f1f46c11e024ac9fd27f431ab1d882de6240c7 Mon Sep 17 00:00:00 2001 From: MITSUNARI Shigeo Date: Fri, 21 Jun 2013 14:41:09 +0900 Subject: [PATCH] vpsllw, vpslld, vpsllq, vpsraw, vpsrad, vpsrlw, vpsrld, vpsrlq support (ymm, ymm, xmm) --- gen/gen_code.cpp | 16 ++++++++-------- readme.md | 1 + readme.txt | 3 ++- test/make_nm.cpp | 24 ++++++++++++++---------- xbyak/xbyak.h | 2 +- xbyak/xbyak_mnemonic.h | 34 +++++++++++++++++----------------- 6 files changed, 43 insertions(+), 37 deletions(-) diff --git a/gen/gen_code.cpp b/gen/gen_code.cpp index 36c4efc..2c53155 100644 --- a/gen/gen_code.cpp +++ b/gen/gen_code.cpp @@ -1134,15 +1134,15 @@ void put() { 0x09, "psignw", MM_0F38 | PP_66, true, -1, false, true }, { 0x0A, "psignd", MM_0F38 | PP_66, true, -1, false, true }, - { 0xF1, "psllw", MM_0F | PP_66, false, -1, false, true }, - { 0xF2, "pslld", MM_0F | PP_66, false, -1, false, true }, - { 0xF3, "psllq", MM_0F | PP_66, false, -1, false, true }, + { 0xF1, "psllw", MM_0F | PP_66, true, -1, false, true }, + { 0xF2, "pslld", MM_0F | PP_66, true, -1, false, true }, + { 0xF3, "psllq", MM_0F | PP_66, true, -1, false, true }, - { 0xE1, "psraw", MM_0F | PP_66, false, -1, false, true }, - { 0xE2, "psrad", MM_0F | PP_66, false, -1, false, true }, - { 0xD1, "psrlw", MM_0F | PP_66, false, -1, false, true }, - { 0xD2, "psrld", MM_0F | PP_66, false, -1, false, true }, - { 0xD3, "psrlq", MM_0F | PP_66, false, -1, false, true }, + { 0xE1, "psraw", MM_0F | PP_66, true, -1, false, true }, + { 0xE2, "psrad", MM_0F | PP_66, true, -1, false, true }, + { 0xD1, "psrlw", MM_0F | PP_66, true, -1, false, true }, + { 0xD2, "psrld", MM_0F | PP_66, true, -1, false, true }, + { 0xD3, "psrlq", MM_0F | PP_66, true, -1, false, true }, { 0xF8, "psubb", MM_0F | PP_66, true, -1, false, true }, { 0xF9, "psubw", MM_0F | PP_66, true, -1, false, true }, diff --git a/readme.md b/readme.md index 40ca01a..94235b9 100644 --- a/readme.md +++ b/readme.md @@ -235,6 +235,7 @@ http://opensource.org/licenses/BSD-3-Clause History ------------- +* 2013/Jun/21 vpsllw, vpslld, vpsllq, vpsraw, vpsrad, vpsrlw, vpsrld, vpsrlq support (ymm, ymm, xmm) * 2013/May/30 ver 4.00 support AVX2, VEX-encoded GPR-instructions * 2013/Mar/27 ver 3.80 support mov(reg, "label"); * 2013/Mar/13 ver 3.76 add cqo(), jcxz(), jecxz(), jrcxz() diff --git a/readme.txt b/readme.txt index ce34661..f3eeadd 100644 --- a/readme.txt +++ b/readme.txt @@ -1,5 +1,5 @@ - C++用x86(IA-32), x64(AMD64, x86-64) JITアセンブラ Xbyak 4.00 + C++用x86(IA-32), x64(AMD64, x86-64) JITアセンブラ Xbyak 4.01 ----------------------------------------------------------------------------- ◎概要 @@ -244,6 +244,7 @@ sample/{echo,hello}.bfは http://www.kmonos.net/alang/etc/brainfuck.php から ----------------------------------------------------------------------------- ◎履歴 +2013/06/21 ver 4.01 vpsllw, vpslld, vpsllq, vpsraw, vpsrad, vpsrlw, vpsrld, vpsrlq support (ymm, ymm, xmm) 2013/05/30 ver 4.00 AVX2, VEX-encoded GPR-instructionをサポート 2013/03/27 ver 3.80 mov(reg, "label");をサポート 2013/03/13 ver 3.76 cqo, jcxz, jecxz, jrcxz追加 diff --git a/test/make_nm.cpp b/test/make_nm.cpp index fa804ce..f0eb6bd 100644 --- a/test/make_nm.cpp +++ b/test/make_nm.cpp @@ -1607,23 +1607,27 @@ class Test { { const struct Tbl { const char *name; + bool support_Y_Y_X; } tbl[] = { - { "vpslldq" }, - { "vpsrldq" }, - { "vpsllw" }, - { "vpslld" }, - { "vpsllq" }, - { "vpsraw" }, - { "vpsrad" }, - { "vpsrlw" }, - { "vpsrld" }, - { "vpsrlq" }, + { "vpslldq", false }, + { "vpsrldq", false }, + { "vpsllw", true }, + { "vpslld", true }, + { "vpsllq", true }, + { "vpsraw", true }, + { "vpsrad", true }, + { "vpsrlw", true }, + { "vpsrld", true }, + { "vpsrlq", true }, }; for (size_t i = 0; i < NUM_OF_ARRAY(tbl); i++) { const Tbl& p = tbl[i]; put(p.name, XMM, XMM, IMM); put(p.name, YMM, YMM, IMM); put(p.name, YMM, IMM); + if (p.support_Y_Y_X) { + put(p.name, YMM, YMM, XMM); + } } } void putFMA() diff --git a/xbyak/xbyak.h b/xbyak/xbyak.h index b622981..0ee884f 100644 --- a/xbyak/xbyak.h +++ b/xbyak/xbyak.h @@ -85,7 +85,7 @@ namespace Xbyak { enum { DEFAULT_MAX_CODE_SIZE = 4096, - VERSION = 0x4000 /* 0xABCD = A.BC(D) */ + VERSION = 0x4001 /* 0xABCD = A.BC(D) */ }; #ifndef MIE_INTEGER_TYPE_DEFINED diff --git a/xbyak/xbyak_mnemonic.h b/xbyak/xbyak_mnemonic.h index bcd81b7..5aa0e7c 100644 --- a/xbyak/xbyak_mnemonic.h +++ b/xbyak/xbyak_mnemonic.h @@ -1,4 +1,4 @@ -const char *getVersionString() const { return "4.00"; } +const char *getVersionString() const { return "4.001"; } 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); } @@ -789,22 +789,22 @@ void vpsignw(const Xmm& xm1, const Xmm& xm2, const Operand& op) { opAVX_X_X_XM(x void vpsignw(const Xmm& xmm, const Operand& op) { opAVX_X_X_XM(xmm, xmm, op, MM_0F38 | PP_66, 0x09, true, -1); } void vpsignd(const Xmm& xm1, const Xmm& xm2, const Operand& op) { opAVX_X_X_XM(xm1, xm2, op, MM_0F38 | PP_66, 0x0A, true, -1); } void vpsignd(const Xmm& xmm, const Operand& op) { opAVX_X_X_XM(xmm, xmm, op, MM_0F38 | PP_66, 0x0A, true, -1); } -void vpsllw(const Xmm& xm1, const Xmm& xm2, const Operand& op) { opAVX_X_X_XM(xm1, xm2, op, MM_0F | PP_66, 0xF1, false, -1); } -void vpsllw(const Xmm& xmm, const Operand& op) { opAVX_X_X_XM(xmm, xmm, op, MM_0F | PP_66, 0xF1, false, -1); } -void vpslld(const Xmm& xm1, const Xmm& xm2, const Operand& op) { opAVX_X_X_XM(xm1, xm2, op, MM_0F | PP_66, 0xF2, false, -1); } -void vpslld(const Xmm& xmm, const Operand& op) { opAVX_X_X_XM(xmm, xmm, op, MM_0F | PP_66, 0xF2, false, -1); } -void vpsllq(const Xmm& xm1, const Xmm& xm2, const Operand& op) { opAVX_X_X_XM(xm1, xm2, op, MM_0F | PP_66, 0xF3, false, -1); } -void vpsllq(const Xmm& xmm, const Operand& op) { opAVX_X_X_XM(xmm, xmm, op, MM_0F | PP_66, 0xF3, false, -1); } -void vpsraw(const Xmm& xm1, const Xmm& xm2, const Operand& op) { opAVX_X_X_XM(xm1, xm2, op, MM_0F | PP_66, 0xE1, false, -1); } -void vpsraw(const Xmm& xmm, const Operand& op) { opAVX_X_X_XM(xmm, xmm, op, MM_0F | PP_66, 0xE1, false, -1); } -void vpsrad(const Xmm& xm1, const Xmm& xm2, const Operand& op) { opAVX_X_X_XM(xm1, xm2, op, MM_0F | PP_66, 0xE2, false, -1); } -void vpsrad(const Xmm& xmm, const Operand& op) { opAVX_X_X_XM(xmm, xmm, op, MM_0F | PP_66, 0xE2, false, -1); } -void vpsrlw(const Xmm& xm1, const Xmm& xm2, const Operand& op) { opAVX_X_X_XM(xm1, xm2, op, MM_0F | PP_66, 0xD1, false, -1); } -void vpsrlw(const Xmm& xmm, const Operand& op) { opAVX_X_X_XM(xmm, xmm, op, MM_0F | PP_66, 0xD1, false, -1); } -void vpsrld(const Xmm& xm1, const Xmm& xm2, const Operand& op) { opAVX_X_X_XM(xm1, xm2, op, MM_0F | PP_66, 0xD2, false, -1); } -void vpsrld(const Xmm& xmm, const Operand& op) { opAVX_X_X_XM(xmm, xmm, op, MM_0F | PP_66, 0xD2, false, -1); } -void vpsrlq(const Xmm& xm1, const Xmm& xm2, const Operand& op) { opAVX_X_X_XM(xm1, xm2, op, MM_0F | PP_66, 0xD3, false, -1); } -void vpsrlq(const Xmm& xmm, const Operand& op) { opAVX_X_X_XM(xmm, xmm, op, MM_0F | PP_66, 0xD3, false, -1); } +void vpsllw(const Xmm& xm1, const Xmm& xm2, const Operand& op) { opAVX_X_X_XM(xm1, xm2, op, MM_0F | PP_66, 0xF1, true, -1); } +void vpsllw(const Xmm& xmm, const Operand& op) { opAVX_X_X_XM(xmm, xmm, op, MM_0F | PP_66, 0xF1, true, -1); } +void vpslld(const Xmm& xm1, const Xmm& xm2, const Operand& op) { opAVX_X_X_XM(xm1, xm2, op, MM_0F | PP_66, 0xF2, true, -1); } +void vpslld(const Xmm& xmm, const Operand& op) { opAVX_X_X_XM(xmm, xmm, op, MM_0F | PP_66, 0xF2, true, -1); } +void vpsllq(const Xmm& xm1, const Xmm& xm2, const Operand& op) { opAVX_X_X_XM(xm1, xm2, op, MM_0F | PP_66, 0xF3, true, -1); } +void vpsllq(const Xmm& xmm, const Operand& op) { opAVX_X_X_XM(xmm, xmm, op, MM_0F | PP_66, 0xF3, true, -1); } +void vpsraw(const Xmm& xm1, const Xmm& xm2, const Operand& op) { opAVX_X_X_XM(xm1, xm2, op, MM_0F | PP_66, 0xE1, true, -1); } +void vpsraw(const Xmm& xmm, const Operand& op) { opAVX_X_X_XM(xmm, xmm, op, MM_0F | PP_66, 0xE1, true, -1); } +void vpsrad(const Xmm& xm1, const Xmm& xm2, const Operand& op) { opAVX_X_X_XM(xm1, xm2, op, MM_0F | PP_66, 0xE2, true, -1); } +void vpsrad(const Xmm& xmm, const Operand& op) { opAVX_X_X_XM(xmm, xmm, op, MM_0F | PP_66, 0xE2, true, -1); } +void vpsrlw(const Xmm& xm1, const Xmm& xm2, const Operand& op) { opAVX_X_X_XM(xm1, xm2, op, MM_0F | PP_66, 0xD1, true, -1); } +void vpsrlw(const Xmm& xmm, const Operand& op) { opAVX_X_X_XM(xmm, xmm, op, MM_0F | PP_66, 0xD1, true, -1); } +void vpsrld(const Xmm& xm1, const Xmm& xm2, const Operand& op) { opAVX_X_X_XM(xm1, xm2, op, MM_0F | PP_66, 0xD2, true, -1); } +void vpsrld(const Xmm& xmm, const Operand& op) { opAVX_X_X_XM(xmm, xmm, op, MM_0F | PP_66, 0xD2, true, -1); } +void vpsrlq(const Xmm& xm1, const Xmm& xm2, const Operand& op) { opAVX_X_X_XM(xm1, xm2, op, MM_0F | PP_66, 0xD3, true, -1); } +void vpsrlq(const Xmm& xmm, const Operand& op) { opAVX_X_X_XM(xmm, xmm, op, MM_0F | PP_66, 0xD3, true, -1); } void vpsubb(const Xmm& xm1, const Xmm& xm2, const Operand& op) { opAVX_X_X_XM(xm1, xm2, op, MM_0F | PP_66, 0xF8, true, -1); } void vpsubb(const Xmm& xmm, const Operand& op) { opAVX_X_X_XM(xmm, xmm, op, MM_0F | PP_66, 0xF8, true, -1); } void vpsubw(const Xmm& xm1, const Xmm& xm2, const Operand& op) { opAVX_X_X_XM(xm1, xm2, op, MM_0F | PP_66, 0xF9, true, -1); }