Squashed 'externals/xbyak/' changes from 73ac5866..0140eeff
0140eeff Merge branch 'dev' 1efe14b2 change the original behavior of SetError 83c89c7a rename and fix indent 8be7ca93 Merge branch 'sbogusev-master' into dev 070b4c09 make l_err() inline with block scope static TLS l_error 9a4e6579 v5.97 d0ced1bc XBYAK_ONLY_CLASS_CPU is for only util::Cpu bb967ae7 replace uint32 with uint32_t etc. c306b8e5 update to v5.95 605e4224 use noexcept if C++11 or later 7a17c2c8 remove warning 5dfa4462 use constexpr if c++14 or later 18c9caaa Merge branch 'densamoilov-fix-mov-interface' into dev 3966ba9d fix mov interface be492be1 change the behavior of push((byte|word), imm) to cast imm to int8_t/int16_t d9696b54 Merge pull request #102 from igorsafo/master ea73267f Cpu: make getNumCores constant ff0b10e9 Merge pull request #101 from densamoilov/use-thread_local-when-supported 0c4eafc3 use thread_local for XBYAK_TLS when supported c1aea35e CodeGenerator::reset() calls ClearError() b4df97b1 Merge branch 'cursey-no-winsock2-header' 6a47bb0e v5.94 9a1749e6 define WIN32_LEAN_AND_MEAN for including winsock2.h after xbyak.h 42dddb74 Remove #include <winsock2.h> 615b85fa update doc 9cd796a9 rename XBYAK_NOEXCEPTION to XBYAK_NO_EXCEPTION 7cdf227f use static to avoid multiple instance 38a28dec test_nm.bat supports noexcept 0fdffc6b XBYAK_NOEXCEPTION for -fno-exceptions eda6e2a3 v5.92 5c26c8bb mov(rax, imm64) on 32-bit env with XBYAK64 6208e3ae throw exception if not supported amx sibmem 2 c6737d14 mov amx insts from avx512 34ea5c16 throw exception if not supported amx sibmem 6f93fe35 fix test of sizeof(Operand) 5b89c3b2 remove T_TMM 5ce32858 gen_amx.cpp is merged into gen_avx512.cpp fe4f965f remove my alias for tmm registers 92f904d8 bit_ contains 8192 98b51da9 extend mnemonics with Intel(R) AMX ISA 8d1b4c9e add generation of Intel(R) AMX ISA mnemonics 8ded45d1 add support of Intel(R) AMX ISA b23c4b02 v5.912 ffe32a60 Merge branch 'rsdubtso-master' e7b7fd2f use MAP_JIT on macOS regardless of Xcode version 82b70e66 v5.911 ; XBYAK_USE_MMAP_ALLOCATOR is defined 2f6d9e34 fix test for mac a7d10a1e add link to GitHub Sponsor 96076265 accept k0 mask register (it means no mask) 7e3167e4 kmov{b,w,d,q} throws for unsupported reg f487d7b7 Merge pull request #91 from marcelotrevisani/patch-1 dc9e6a79 Possibility to specify a different PREFIX 5fc69fc8 remove warning of test e69e0b42 fix typo of type of Zmi 34f797e8 perf does not recognize too short function name 6cc0f4df Consider max defined as a macro on Windows 5722393d fix for zeroed-out 0xb leaf 6a4459a8 Merge branch 'tyfkda-feature/fix-segfault-in-calc' 47922ed9 Fix segmentation fault in calc sample 8f696e93 add test_avx512 to bat 00114d79 add .travis.yml a29fa27b refactor test 508b543c fix error of vfpclasspd 0d54f1b1 fix for windows 4da8fd4e add setDefaultJmpNEAR da7f7317 revert to the behavior before v5.84 if -fno-operator-names is defined 7dac9f61 update to v5.85 fe639332 enable MAP_JIT only if mojave or later 4443d791 specify MAP_JIT mmap flag on macOS 20ee4c2d update doc ca0e8395 [changed] XBYAK_NO_OP_NAMES is defined f32836da remove exit(1) a1e9adf2 v5.82 08b8b1ba Support AMD Zen New Instructions. 2501ba9a remove *.user and *.vcproj 5c2ea988 Merge branch 'jrmwng-feature/upgrade-to-vs2017/jrmwng' 35847f7a Merge branch 'feature/upgrade-to-vs2017/jrmwng' of https://github.com/jrmwng/xbyak into jrmwng-feature/upgrade-to-vs2017/jrmwng ef267775 address "warning LNK4075: ignoring '/EDITANDCONTINUE' due to '/SAFESEH' specification" 4a6c59bb address a conflict of sharing intermediate directory by different projects 9577cbf3 inherit "some output locations" from parent or project defaults 6c5f7186 upgrade projects from VS2018 to VS2017 4ca0434b v5.81 72b4e95d add lds/lss/les/lfs/lgs cc8f037c fix ; move ERR_INTERNAL to the end 9e9ec1c3 add repe, repne, repne, prez eea0edc3 add some fpu mnemonics 06235fa6 add loop/loope/loopne 7fc0c2bb add enter/leave 9fa2ef3c add in_, out_ df208648 add lods{b,w,d,q}, outs{b,w,d} 4672d2cb add int3, int_, into 431977cb add pushfq, popfq 81c4749f syscall, sysenter, sysexit, sysret 1f1b53c4 add clflushopt, fldenv, fnstw b765db33 Profiler uses append mode 44dc3546 add Profiler class 42949334 update version to v5.802 91cb919b Merge branch 'vpirogov-master' a6452f82 fixed avx512_bf16 detection f41da5aa tweak ; vcvtneps2bf16 calls opCvt2 b12460ba [sample] fix typo of quantize.cpp b22f5881 add set_opt.bat for test on Windows f402faad add vp2intersectd/vp2intersectq 4cfd5208 add avx512_bf16 4033564c fix vcmppd/vcmpps for ptr_b git-subtree-dir: externals/xbyak git-subtree-split: 0140eeff1fffcf5069dea3abb57095695320971c
This commit is contained in:
parent
76768f9083
commit
8042dc93e8
48 changed files with 3852 additions and 3816 deletions
12
.travis.yml
Normal file
12
.travis.yml
Normal file
|
@ -0,0 +1,12 @@
|
||||||
|
sudo: true
|
||||||
|
dist: bionic
|
||||||
|
language: cpp
|
||||||
|
compiler:
|
||||||
|
- gcc
|
||||||
|
- clang
|
||||||
|
addons:
|
||||||
|
apt:
|
||||||
|
packages:
|
||||||
|
- nasm yasm g++-multilib tcsh
|
||||||
|
script:
|
||||||
|
- make test
|
2
Makefile
2
Makefile
|
@ -1,4 +1,4 @@
|
||||||
PREFIX=/usr/local
|
PREFIX?=/usr/local
|
||||||
INSTALL_DIR=$(PREFIX)/include/xbyak
|
INSTALL_DIR=$(PREFIX)/include/xbyak
|
||||||
|
|
||||||
all:
|
all:
|
||||||
|
|
|
@ -23,7 +23,7 @@ void putOpmask(bool only64bit)
|
||||||
{
|
{
|
||||||
const struct Tbl {
|
const struct Tbl {
|
||||||
const char *name;
|
const char *name;
|
||||||
uint8 code;
|
uint8_t code;
|
||||||
} tbl[] = {
|
} tbl[] = {
|
||||||
{ "kadd", 0x4A },
|
{ "kadd", 0x4A },
|
||||||
{ "kand", 0x41 },
|
{ "kand", 0x41 },
|
||||||
|
@ -46,7 +46,7 @@ void putOpmask(bool only64bit)
|
||||||
{
|
{
|
||||||
const struct Tbl {
|
const struct Tbl {
|
||||||
const char *name;
|
const char *name;
|
||||||
uint8 code;
|
uint8_t code;
|
||||||
} tbl[] = {
|
} tbl[] = {
|
||||||
{ "knot", 0x44 },
|
{ "knot", 0x44 },
|
||||||
{ "kortest", 0x98 },
|
{ "kortest", 0x98 },
|
||||||
|
@ -63,23 +63,23 @@ void putOpmask(bool only64bit)
|
||||||
{
|
{
|
||||||
const struct Tbl {
|
const struct Tbl {
|
||||||
const char *name;
|
const char *name;
|
||||||
uint8 code;
|
uint8_t code;
|
||||||
} tbl[] = {
|
} tbl[] = {
|
||||||
{ "kshiftl", 0x32 },
|
{ "kshiftl", 0x32 },
|
||||||
{ "kshiftr", 0x30 },
|
{ "kshiftr", 0x30 },
|
||||||
};
|
};
|
||||||
for (size_t i = 0; i < NUM_OF_ARRAY(tbl); i++) {
|
for (size_t i = 0; i < NUM_OF_ARRAY(tbl); i++) {
|
||||||
const Tbl& p = tbl[i];
|
const Tbl& p = tbl[i];
|
||||||
printf("void %sw(const Opmask& r1, const Opmask& r2, uint8 imm) { opVex(r1, 0, r2, T_66 | T_0F3A | T_W1, 0x%02X, imm); }\n", p.name, p.code);
|
printf("void %sw(const Opmask& r1, const Opmask& r2, uint8_t imm) { opVex(r1, 0, r2, T_66 | T_0F3A | T_W1, 0x%02X, imm); }\n", p.name, p.code);
|
||||||
printf("void %sq(const Opmask& r1, const Opmask& r2, uint8 imm) { opVex(r1, 0, r2, T_66 | T_0F3A | T_W1, 0x%02X, imm); }\n", p.name, p.code + 1);
|
printf("void %sq(const Opmask& r1, const Opmask& r2, uint8_t imm) { opVex(r1, 0, r2, T_66 | T_0F3A | T_W1, 0x%02X, imm); }\n", p.name, p.code + 1);
|
||||||
printf("void %sb(const Opmask& r1, const Opmask& r2, uint8 imm) { opVex(r1, 0, r2, T_66 | T_0F3A | T_W0, 0x%02X, imm); }\n", p.name, p.code);
|
printf("void %sb(const Opmask& r1, const Opmask& r2, uint8_t imm) { opVex(r1, 0, r2, T_66 | T_0F3A | T_W0, 0x%02X, imm); }\n", p.name, p.code);
|
||||||
printf("void %sd(const Opmask& r1, const Opmask& r2, uint8 imm) { opVex(r1, 0, r2, T_66 | T_0F3A | T_W0, 0x%02X, imm); }\n", p.name, p.code + 1);
|
printf("void %sd(const Opmask& r1, const Opmask& r2, uint8_t imm) { opVex(r1, 0, r2, T_66 | T_0F3A | T_W0, 0x%02X, imm); }\n", p.name, p.code + 1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
puts("void kmovw(const Opmask& k, const Operand& op) { opVex(k, 0, op, T_L0 | T_0F | T_W0, 0x90); }");
|
puts("void kmovw(const Opmask& k, const Operand& op) { if (!op.isMEM() && !op.isOPMASK()) XBYAK_THROW(ERR_BAD_COMBINATION) opVex(k, 0, op, T_L0 | T_0F | T_W0, 0x90); }");
|
||||||
puts("void kmovq(const Opmask& k, const Operand& op) { opVex(k, 0, op, T_L0 | T_0F | T_W1, 0x90); }");
|
puts("void kmovq(const Opmask& k, const Operand& op) { if (!op.isMEM() && !op.isOPMASK()) XBYAK_THROW(ERR_BAD_COMBINATION) opVex(k, 0, op, T_L0 | T_0F | T_W1, 0x90); }");
|
||||||
puts("void kmovb(const Opmask& k, const Operand& op) { opVex(k, 0, op, T_L0 | T_0F | T_66 | T_W0, 0x90); }");
|
puts("void kmovb(const Opmask& k, const Operand& op) { if (!op.isMEM() && !op.isOPMASK()) XBYAK_THROW(ERR_BAD_COMBINATION) opVex(k, 0, op, T_L0 | T_0F | T_66 | T_W0, 0x90); }");
|
||||||
puts("void kmovd(const Opmask& k, const Operand& op) { opVex(k, 0, op, T_L0 | T_0F | T_66 | T_W1, 0x90); }");
|
puts("void kmovd(const Opmask& k, const Operand& op) { if (!op.isMEM() && !op.isOPMASK()) XBYAK_THROW(ERR_BAD_COMBINATION) opVex(k, 0, op, T_L0 | T_0F | T_66 | T_W1, 0x90); }");
|
||||||
|
|
||||||
puts("void kmovw(const Address& addr, const Opmask& k) { opVex(k, 0, addr, T_L0 | T_0F | T_W0, 0x91); }");
|
puts("void kmovw(const Address& addr, const Opmask& k) { opVex(k, 0, addr, T_L0 | T_0F | T_W0, 0x91); }");
|
||||||
puts("void kmovq(const Address& addr, const Opmask& k) { opVex(k, 0, addr, T_L0 | T_0F | T_W1, 0x91); }");
|
puts("void kmovq(const Address& addr, const Opmask& k) { opVex(k, 0, addr, T_L0 | T_0F | T_W1, 0x91); }");
|
||||||
|
@ -98,13 +98,13 @@ void putOpmask(bool only64bit)
|
||||||
void putVcmp()
|
void putVcmp()
|
||||||
{
|
{
|
||||||
const struct Tbl {
|
const struct Tbl {
|
||||||
uint8 code;
|
uint8_t code;
|
||||||
const char *name;
|
const char *name;
|
||||||
int type;
|
int type;
|
||||||
bool hasIMM;
|
bool hasIMM;
|
||||||
} tbl[] = {
|
} tbl[] = {
|
||||||
{ 0xC2, "vcmppd", T_0F | T_MUST_EVEX | T_EW1 | T_SAE_Z | T_YMM | T_66, true },
|
{ 0xC2, "vcmppd", T_0F | T_MUST_EVEX | T_EW1 | T_SAE_Z | T_YMM | T_66 | T_B64, true },
|
||||||
{ 0xC2, "vcmpps", T_0F | T_MUST_EVEX | T_EW0 | T_SAE_Z | T_YMM, true },
|
{ 0xC2, "vcmpps", T_0F | T_MUST_EVEX | T_EW0 | T_SAE_Z | T_YMM | T_B32, true },
|
||||||
{ 0xC2, "vcmpsd", T_0F | T_MUST_EVEX | T_EW1 | T_SAE_Z | T_F2 | T_N8, true },
|
{ 0xC2, "vcmpsd", T_0F | T_MUST_EVEX | T_EW1 | T_SAE_Z | T_F2 | T_N8, true },
|
||||||
{ 0xC2, "vcmpss", T_0F | T_MUST_EVEX | T_EW0 | T_SAE_Z | T_F3 | T_N4, true },
|
{ 0xC2, "vcmpss", T_0F | T_MUST_EVEX | T_EW0 | T_SAE_Z | T_F3 | T_N4, true },
|
||||||
|
|
||||||
|
@ -142,7 +142,7 @@ void putVcmp()
|
||||||
const Tbl *p = &tbl[i];
|
const Tbl *p = &tbl[i];
|
||||||
std::string type = type2String(p->type);
|
std::string type = type2String(p->type);
|
||||||
printf("void %s(const Opmask& k, const Xmm& x, const Operand& op%s) { opAVX_K_X_XM(k, x, op, %s, 0x%02X%s); }\n"
|
printf("void %s(const Opmask& k, const Xmm& x, const Operand& op%s) { opAVX_K_X_XM(k, x, op, %s, 0x%02X%s); }\n"
|
||||||
, p->name, p->hasIMM ? ", uint8 imm" : "", type.c_str(), p->code, p->hasIMM ? ", imm" : "");
|
, p->name, p->hasIMM ? ", uint8_t imm" : "", type.c_str(), p->code, p->hasIMM ? ", imm" : "");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -150,7 +150,7 @@ void putVcmp()
|
||||||
void putX_XM()
|
void putX_XM()
|
||||||
{
|
{
|
||||||
const struct Tbl {
|
const struct Tbl {
|
||||||
uint8 code;
|
uint8_t code;
|
||||||
const char *name;
|
const char *name;
|
||||||
int type;
|
int type;
|
||||||
} tbl[] = {
|
} tbl[] = {
|
||||||
|
@ -198,7 +198,7 @@ void putX_XM()
|
||||||
void putM_X()
|
void putM_X()
|
||||||
{
|
{
|
||||||
const struct Tbl {
|
const struct Tbl {
|
||||||
uint8 code;
|
uint8_t code;
|
||||||
const char *name;
|
const char *name;
|
||||||
int type;
|
int type;
|
||||||
} tbl[] = {
|
} tbl[] = {
|
||||||
|
@ -219,7 +219,7 @@ void putM_X()
|
||||||
void putXM_X()
|
void putXM_X()
|
||||||
{
|
{
|
||||||
const struct Tbl {
|
const struct Tbl {
|
||||||
uint8 code;
|
uint8_t code;
|
||||||
const char *name;
|
const char *name;
|
||||||
int type;
|
int type;
|
||||||
} tbl[] = {
|
} tbl[] = {
|
||||||
|
@ -242,7 +242,7 @@ void putXM_X()
|
||||||
void putX_X_XM_IMM()
|
void putX_X_XM_IMM()
|
||||||
{
|
{
|
||||||
const struct Tbl {
|
const struct Tbl {
|
||||||
uint8 code;
|
uint8_t code;
|
||||||
const char *name;
|
const char *name;
|
||||||
int type;
|
int type;
|
||||||
bool hasIMM;
|
bool hasIMM;
|
||||||
|
@ -368,12 +368,15 @@ void putX_X_XM_IMM()
|
||||||
|
|
||||||
{ 0x52, "vpdpwssd", T_66 | T_0F38 | T_YMM | T_MUST_EVEX | T_EW0 | T_SAE_Z | T_B32, false },
|
{ 0x52, "vpdpwssd", T_66 | T_0F38 | T_YMM | T_MUST_EVEX | T_EW0 | T_SAE_Z | T_B32, false },
|
||||||
{ 0x53, "vpdpwssds", T_66 | T_0F38 | T_YMM | T_MUST_EVEX | T_EW0 | T_SAE_Z | T_B32, false },
|
{ 0x53, "vpdpwssds", T_66 | T_0F38 | T_YMM | T_MUST_EVEX | T_EW0 | T_SAE_Z | T_B32, false },
|
||||||
|
|
||||||
|
{ 0x72, "vcvtne2ps2bf16", T_F2 | T_0F38 | T_YMM | T_MUST_EVEX | T_EW0 | T_SAE_Z | T_B32, false },
|
||||||
|
{ 0x52, "vdpbf16ps", T_F3 | T_0F38 | T_YMM | T_MUST_EVEX | T_EW0 | T_SAE_Z | T_B32, false },
|
||||||
};
|
};
|
||||||
for (size_t i = 0; i < NUM_OF_ARRAY(tbl); i++) {
|
for (size_t i = 0; i < NUM_OF_ARRAY(tbl); i++) {
|
||||||
const Tbl *p = &tbl[i];
|
const Tbl *p = &tbl[i];
|
||||||
std::string type = type2String(p->type);
|
std::string type = type2String(p->type);
|
||||||
printf("void %s(const Xmm& x1, const Xmm& x2, const Operand& op%s) { opAVX_X_X_XM(x1, x2, op, %s, 0x%02X%s); }\n"
|
printf("void %s(const Xmm& x1, const Xmm& x2, const Operand& op%s) { opAVX_X_X_XM(x1, x2, op, %s, 0x%02X%s); }\n"
|
||||||
, p->name, p->hasIMM ? ", uint8 imm" : "", type.c_str(), p->code, p->hasIMM ? ", imm" : "");
|
, p->name, p->hasIMM ? ", uint8_t imm" : "", type.c_str(), p->code, p->hasIMM ? ", imm" : "");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -381,7 +384,7 @@ void putShift()
|
||||||
{
|
{
|
||||||
const struct Tbl {
|
const struct Tbl {
|
||||||
const char *name;
|
const char *name;
|
||||||
uint8 code;
|
uint8_t code;
|
||||||
int idx;
|
int idx;
|
||||||
int type;
|
int type;
|
||||||
} tbl[] = {
|
} tbl[] = {
|
||||||
|
@ -394,7 +397,7 @@ void putShift()
|
||||||
for (size_t i = 0; i < NUM_OF_ARRAY(tbl); i++) {
|
for (size_t i = 0; i < NUM_OF_ARRAY(tbl); i++) {
|
||||||
const Tbl& p = tbl[i];
|
const Tbl& p = tbl[i];
|
||||||
std::string type = type2String(p.type);
|
std::string type = type2String(p.type);
|
||||||
printf("void %s(const Xmm& x, const Operand& op, uint8 imm) { opAVX_X_X_XM(Xmm(x.getKind(), %d), x, op, %s, 0x%02X, imm); }\n", p.name, p.idx, type.c_str(), p.code);
|
printf("void %s(const Xmm& x, const Operand& op, uint8_t imm) { opAVX_X_X_XM(Xmm(x.getKind(), %d), x, op, %s, 0x%02X, imm); }\n", p.name, p.idx, type.c_str(), p.code);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -403,7 +406,7 @@ void putExtractInsert()
|
||||||
{
|
{
|
||||||
const struct Tbl {
|
const struct Tbl {
|
||||||
const char *name;
|
const char *name;
|
||||||
uint8 code;
|
uint8_t code;
|
||||||
int type;
|
int type;
|
||||||
bool isZMM;
|
bool isZMM;
|
||||||
} tbl[] = {
|
} tbl[] = {
|
||||||
|
@ -421,13 +424,13 @@ void putExtractInsert()
|
||||||
const Tbl& p = tbl[i];
|
const Tbl& p = tbl[i];
|
||||||
std::string type = type2String(p.type);
|
std::string type = type2String(p.type);
|
||||||
const char *kind = p.isZMM ? "Operand::MEM | Operand::YMM" : "Operand::MEM | Operand::XMM";
|
const char *kind = p.isZMM ? "Operand::MEM | Operand::YMM" : "Operand::MEM | Operand::XMM";
|
||||||
printf("void %s(const Operand& op, const %s& r, uint8 imm) { if (!op.is(%s)) throw Error(ERR_BAD_COMBINATION); opVex(r, 0, op, %s, 0x%2X, imm); }\n", p.name, p.isZMM ? "Zmm" : "Ymm", kind, type.c_str(), p.code);
|
printf("void %s(const Operand& op, const %s& r, uint8_t imm) { if (!op.is(%s)) XBYAK_THROW(ERR_BAD_COMBINATION) opVex(r, 0, op, %s, 0x%2X, imm); }\n", p.name, p.isZMM ? "Zmm" : "Ymm", kind, type.c_str(), p.code);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
{
|
{
|
||||||
const struct Tbl {
|
const struct Tbl {
|
||||||
const char *name;
|
const char *name;
|
||||||
uint8 code;
|
uint8_t code;
|
||||||
int type;
|
int type;
|
||||||
bool isZMM;
|
bool isZMM;
|
||||||
} tbl[] = {
|
} tbl[] = {
|
||||||
|
@ -446,8 +449,8 @@ void putExtractInsert()
|
||||||
std::string type = type2String(p.type);
|
std::string type = type2String(p.type);
|
||||||
const char *x = p.isZMM ? "Zmm" : "Ymm";
|
const char *x = p.isZMM ? "Zmm" : "Ymm";
|
||||||
const char *cond = p.isZMM ? "op.is(Operand::MEM | Operand::YMM)" : "(r1.getKind() == r2.getKind() && op.is(Operand::MEM | Operand::XMM))";
|
const char *cond = p.isZMM ? "op.is(Operand::MEM | Operand::YMM)" : "(r1.getKind() == r2.getKind() && op.is(Operand::MEM | Operand::XMM))";
|
||||||
printf("void %s(const %s& r1, const %s& r2, const Operand& op, uint8 imm) {"
|
printf("void %s(const %s& r1, const %s& r2, const Operand& op, uint8_t imm) {"
|
||||||
"if (!%s) throw Error(ERR_BAD_COMBINATION); "
|
"if (!%s) XBYAK_THROW(ERR_BAD_COMBINATION) "
|
||||||
"opVex(r1, &r2, op, %s, 0x%2X, imm); }\n", p.name, x, x, cond, type.c_str(), p.code);
|
"opVex(r1, &r2, op, %s, 0x%2X, imm); }\n", p.name, x, x, cond, type.c_str(), p.code);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -457,7 +460,7 @@ void putBroadcast(bool only64bit)
|
||||||
{
|
{
|
||||||
{
|
{
|
||||||
const struct Tbl {
|
const struct Tbl {
|
||||||
uint8 code;
|
uint8_t code;
|
||||||
const char *name;
|
const char *name;
|
||||||
int type;
|
int type;
|
||||||
int reg;
|
int reg;
|
||||||
|
@ -519,7 +522,7 @@ void putGather()
|
||||||
const struct Tbl {
|
const struct Tbl {
|
||||||
const char *name;
|
const char *name;
|
||||||
int type;
|
int type;
|
||||||
uint8 code;
|
uint8_t code;
|
||||||
int mode;
|
int mode;
|
||||||
} tbl[] = {
|
} tbl[] = {
|
||||||
{ "vpgatherdd", T_66 | T_0F38 | T_YMM | T_MUST_EVEX | T_EW0 | T_N4, 0x90, xx_yy_zz },
|
{ "vpgatherdd", T_66 | T_0F38 | T_YMM | T_MUST_EVEX | T_EW0 | T_N4, 0x90, xx_yy_zz },
|
||||||
|
@ -542,7 +545,7 @@ void putScatter()
|
||||||
const struct Tbl {
|
const struct Tbl {
|
||||||
const char *name;
|
const char *name;
|
||||||
int type;
|
int type;
|
||||||
uint8 code;
|
uint8_t code;
|
||||||
int mode; // reverse of gather
|
int mode; // reverse of gather
|
||||||
} tbl[] = {
|
} tbl[] = {
|
||||||
{ "vpscatterdd", T_66 | T_0F38 | T_YMM | T_MUST_EVEX | T_EW0 | T_N4 | T_M_K, 0xA0, xx_yy_zz },
|
{ "vpscatterdd", T_66 | T_0F38 | T_YMM | T_MUST_EVEX | T_EW0 | T_N4 | T_M_K, 0xA0, xx_yy_zz },
|
||||||
|
@ -564,10 +567,10 @@ void putScatter()
|
||||||
|
|
||||||
void putShuff()
|
void putShuff()
|
||||||
{
|
{
|
||||||
puts("void vshuff32x4(const Ymm& y1, const Ymm& y2, const Operand& op, uint8 imm) { opAVX_X_X_XM(y1, y2, op, T_66 | T_0F3A | T_YMM | T_MUST_EVEX | T_EW0 | T_B32, 0x23, imm); }");
|
puts("void vshuff32x4(const Ymm& y1, const Ymm& y2, const Operand& op, uint8_t imm) { opAVX_X_X_XM(y1, y2, op, T_66 | T_0F3A | T_YMM | T_MUST_EVEX | T_EW0 | T_B32, 0x23, imm); }");
|
||||||
puts("void vshuff64x2(const Ymm& y1, const Ymm& y2, const Operand& op, uint8 imm) { opAVX_X_X_XM(y1, y2, op, T_66 | T_0F3A | T_YMM | T_MUST_EVEX | T_EW1 | T_B64, 0x23, imm); }");
|
puts("void vshuff64x2(const Ymm& y1, const Ymm& y2, const Operand& op, uint8_t imm) { opAVX_X_X_XM(y1, y2, op, T_66 | T_0F3A | T_YMM | T_MUST_EVEX | T_EW1 | T_B64, 0x23, imm); }");
|
||||||
puts("void vshufi32x4(const Ymm& y1, const Ymm& y2, const Operand& op, uint8 imm) { opAVX_X_X_XM(y1, y2, op, T_66 | T_0F3A | T_YMM | T_MUST_EVEX | T_EW0 | T_B32, 0x43, imm); }");
|
puts("void vshufi32x4(const Ymm& y1, const Ymm& y2, const Operand& op, uint8_t imm) { opAVX_X_X_XM(y1, y2, op, T_66 | T_0F3A | T_YMM | T_MUST_EVEX | T_EW0 | T_B32, 0x43, imm); }");
|
||||||
puts("void vshufi64x2(const Ymm& y1, const Ymm& y2, const Operand& op, uint8 imm) { opAVX_X_X_XM(y1, y2, op, T_66 | T_0F3A | T_YMM | T_MUST_EVEX | T_EW1 | T_B64, 0x43, imm); }");
|
puts("void vshufi64x2(const Ymm& y1, const Ymm& y2, const Operand& op, uint8_t imm) { opAVX_X_X_XM(y1, y2, op, T_66 | T_0F3A | T_YMM | T_MUST_EVEX | T_EW1 | T_B64, 0x43, imm); }");
|
||||||
}
|
}
|
||||||
|
|
||||||
void putMov()
|
void putMov()
|
||||||
|
@ -624,7 +627,7 @@ void putMov()
|
||||||
void putX_XM_IMM()
|
void putX_XM_IMM()
|
||||||
{
|
{
|
||||||
const struct Tbl {
|
const struct Tbl {
|
||||||
uint8 code;
|
uint8_t code;
|
||||||
const char *name;
|
const char *name;
|
||||||
int type;
|
int type;
|
||||||
bool hasIMM;
|
bool hasIMM;
|
||||||
|
@ -661,7 +664,7 @@ void putX_XM_IMM()
|
||||||
const Tbl *p = &tbl[i];
|
const Tbl *p = &tbl[i];
|
||||||
std::string type = type2String(p->type);
|
std::string type = type2String(p->type);
|
||||||
printf("void %s(const Xmm& x, const Operand& op%s) { opAVX_X_XM_IMM(x, op, %s, 0x%02X%s); }\n"
|
printf("void %s(const Xmm& x, const Operand& op%s) { opAVX_X_XM_IMM(x, op, %s, 0x%02X%s); }\n"
|
||||||
, p->name, p->hasIMM ? ", uint8 imm" : "", type.c_str(), p->code, p->hasIMM ? ", imm" : "");
|
, p->name, p->hasIMM ? ", uint8_t imm" : "", type.c_str(), p->code, p->hasIMM ? ", imm" : "");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -674,7 +677,7 @@ void putMisc()
|
||||||
const char *name;
|
const char *name;
|
||||||
int zm;
|
int zm;
|
||||||
int type;
|
int type;
|
||||||
uint8 code;
|
uint8_t code;
|
||||||
bool isZmm;
|
bool isZmm;
|
||||||
} tbl[] = {
|
} tbl[] = {
|
||||||
{ "vgatherpf0dps", 1, T_EW0 | T_N4, 0xC6, true },
|
{ "vgatherpf0dps", 1, T_EW0 | T_N4, 0xC6, true },
|
||||||
|
@ -705,12 +708,16 @@ void putMisc()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
puts("void vfpclasspd(const Opmask& k, const Operand& op, uint8 imm) { if (!op.isBit(128|256|512)) throw Error(ERR_BAD_MEM_SIZE); opVex(k.changeBit(op.getBit()), 0, op, T_66 | T_0F3A | T_MUST_EVEX | T_YMM | T_EW1 | T_B64, 0x66, imm); }");
|
puts("void vfpclasspd(const Opmask& k, const Operand& op, uint8_t imm) { if (!op.isBit(128|256|512)) XBYAK_THROW(ERR_BAD_MEM_SIZE) opVex(k.changeBit(op.getBit()), 0, op, T_66 | T_0F3A | T_MUST_EVEX | T_YMM | T_EW1 | T_B64, 0x66, imm); }");
|
||||||
puts("void vfpclassps(const Opmask& k, const Operand& op, uint8 imm) { if (!op.isBit(128|256|512)) throw Error(ERR_BAD_MEM_SIZE); opVex(k.changeBit(op.getBit()), 0, op, T_66 | T_0F3A | T_MUST_EVEX | T_YMM | T_EW0 | T_B32, 0x66, imm); }");
|
puts("void vfpclassps(const Opmask& k, const Operand& op, uint8_t imm) { if (!op.isBit(128|256|512)) XBYAK_THROW(ERR_BAD_MEM_SIZE) opVex(k.changeBit(op.getBit()), 0, op, T_66 | T_0F3A | T_MUST_EVEX | T_YMM | T_EW0 | T_B32, 0x66, imm); }");
|
||||||
puts("void vfpclasssd(const Opmask& k, const Operand& op, uint8 imm) { if (!op.isXMEM()) throw Error(ERR_BAD_MEM_SIZE); opVex(k, 0, op, T_66 | T_0F3A | T_MUST_EVEX | T_EW1 | T_N8, 0x67, imm); }");
|
puts("void vfpclasssd(const Opmask& k, const Operand& op, uint8_t imm) { if (!op.isXMEM()) XBYAK_THROW(ERR_BAD_MEM_SIZE) opVex(k, 0, op, T_66 | T_0F3A | T_MUST_EVEX | T_EW1 | T_N8, 0x67, imm); }");
|
||||||
puts("void vfpclassss(const Opmask& k, const Operand& op, uint8 imm) { if (!op.isXMEM()) throw Error(ERR_BAD_MEM_SIZE); opVex(k, 0, op, T_66 | T_0F3A | T_MUST_EVEX | T_EW0 | T_N4, 0x67, imm); }");
|
puts("void vfpclassss(const Opmask& k, const Operand& op, uint8_t imm) { if (!op.isXMEM()) XBYAK_THROW(ERR_BAD_MEM_SIZE) opVex(k, 0, op, T_66 | T_0F3A | T_MUST_EVEX | T_EW0 | T_N4, 0x67, imm); }");
|
||||||
|
|
||||||
puts("void vpshufbitqmb(const Opmask& k, const Xmm& x, const Operand& op) { opVex(k, &x, op, T_66 | T_0F38 | T_EW0 | T_YMM | T_MUST_EVEX, 0x8F); }");
|
puts("void vpshufbitqmb(const Opmask& k, const Xmm& x, const Operand& op) { opVex(k, &x, op, T_66 | T_0F38 | T_EW0 | T_YMM | T_MUST_EVEX, 0x8F); }");
|
||||||
|
puts("void vcvtneps2bf16(const Xmm& x, const Operand& op) { opCvt2(x, op, T_F3 | T_0F38 | T_EW0 | T_YMM | T_SAE_Z | T_MUST_EVEX | T_B32, 0x72); }");
|
||||||
|
|
||||||
|
puts("void vp2intersectd(const Opmask& k, const Xmm& x, const Operand& op) { if (k.getOpmaskIdx() != 0) XBYAK_THROW(ERR_OPMASK_IS_ALREADY_SET) opAVX_K_X_XM(k, x, op, T_F2 | T_0F38 | T_YMM | T_EVEX | T_EW0 | T_B32, 0x68); }");
|
||||||
|
puts("void vp2intersectq(const Opmask& k, const Xmm& x, const Operand& op) { if (k.getOpmaskIdx() != 0) XBYAK_THROW(ERR_OPMASK_IS_ALREADY_SET) opAVX_K_X_XM(k, x, op, T_F2 | T_0F38 | T_YMM | T_EVEX | T_EW1 | T_B64, 0x68); }");
|
||||||
}
|
}
|
||||||
|
|
||||||
void putV4FMA()
|
void putV4FMA()
|
||||||
|
@ -728,7 +735,9 @@ int main(int argc, char *[])
|
||||||
bool only64bit = argc == 2;
|
bool only64bit = argc == 2;
|
||||||
putOpmask(only64bit);
|
putOpmask(only64bit);
|
||||||
putBroadcast(only64bit);
|
putBroadcast(only64bit);
|
||||||
if (only64bit) return 0;
|
if (only64bit) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
putVcmp();
|
putVcmp();
|
||||||
putX_XM();
|
putX_XM();
|
||||||
putM_X();
|
putM_X();
|
||||||
|
|
380
gen/gen_code.cpp
380
gen/gen_code.cpp
|
@ -23,9 +23,9 @@ void put_jREGz(const char *reg, bool prefix)
|
||||||
|
|
||||||
struct GenericTbl {
|
struct GenericTbl {
|
||||||
const char *name;
|
const char *name;
|
||||||
uint8 code1;
|
uint8_t code1;
|
||||||
uint8 code2;
|
uint8_t code2;
|
||||||
uint8 code3;
|
uint8_t code3;
|
||||||
};
|
};
|
||||||
|
|
||||||
void putGeneric(const GenericTbl *p, size_t n)
|
void putGeneric(const GenericTbl *p, size_t n)
|
||||||
|
@ -44,7 +44,7 @@ void putX_X_XM(bool omitOnly)
|
||||||
// (x, x, x/m[, imm]) or (y, y, y/m[, imm])
|
// (x, x, x/m[, imm]) or (y, y, y/m[, imm])
|
||||||
{
|
{
|
||||||
const struct Tbl {
|
const struct Tbl {
|
||||||
uint8 code;
|
uint8_t code;
|
||||||
const char *name;
|
const char *name;
|
||||||
int type;
|
int type;
|
||||||
bool hasIMM;
|
bool hasIMM;
|
||||||
|
@ -212,25 +212,37 @@ void putX_X_XM(bool omitOnly)
|
||||||
std::string type = type2String(p->type);
|
std::string type = type2String(p->type);
|
||||||
if (omitOnly) {
|
if (omitOnly) {
|
||||||
if (p->enableOmit) {
|
if (p->enableOmit) {
|
||||||
printf("void v%s(const Xmm& x, const Operand& op%s) { v%s(x, x, op%s); }\n", p->name, p->hasIMM ? ", uint8 imm" : "", p->name, p->hasIMM ? ", imm" : "");
|
printf("void v%s(const Xmm& x, const Operand& op%s) { v%s(x, x, op%s); }\n", p->name, p->hasIMM ? ", uint8_t imm" : "", p->name, p->hasIMM ? ", imm" : "");
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if (p->mode & 1) {
|
if (p->mode & 1) {
|
||||||
if (p->hasIMM) {
|
if (p->hasIMM) {
|
||||||
printf("void %s(const Xmm& xmm, const Operand& op, int imm) { opGen(xmm, op, 0x%02X, 0x66, isXMM_XMMorMEM, static_cast<uint8>(imm), 0x3A); }\n", p->name, p->code);
|
printf("void %s(const Xmm& xmm, const Operand& op, int imm) { opGen(xmm, op, 0x%02X, 0x66, isXMM_XMMorMEM, static_cast<uint8_t>(imm), 0x3A); }\n", p->name, p->code);
|
||||||
} else {
|
} else {
|
||||||
printf("void %s(const Xmm& xmm, const Operand& op) { opGen(xmm, op, 0x%02X, 0x66, isXMM_XMMorMEM, NONE, 0x38); }\n", p->name, p->code);
|
printf("void %s(const Xmm& xmm, const Operand& op) { opGen(xmm, op, 0x%02X, 0x66, isXMM_XMMorMEM, NONE, 0x38); }\n", p->name, p->code);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (p->mode & 2) {
|
if (p->mode & 2) {
|
||||||
printf("void v%s(const Xmm& x1, const Xmm& x2, const Operand& op%s) { opAVX_X_X_XM(x1, x2, op, %s, 0x%02X%s); }\n"
|
printf("void v%s(const Xmm& x1, const Xmm& x2, const Operand& op%s) { opAVX_X_X_XM(x1, x2, op, %s, 0x%02X%s); }\n"
|
||||||
, p->name, p->hasIMM ? ", uint8 imm" : "", type.c_str(), p->code, p->hasIMM ? ", imm" : "");
|
, p->name, p->hasIMM ? ", uint8_t imm" : "", type.c_str(), p->code, p->hasIMM ? ", imm" : "");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void putMemOp(const char *name, uint8_t prefix, uint8_t ext, uint8_t code1, int code2, int bit = 32)
|
||||||
|
{
|
||||||
|
printf("void %s(const Address& addr) { ", name);
|
||||||
|
if (prefix) printf("db(0x%02X); ", prefix);
|
||||||
|
printf("opModM(addr, Reg%d(%d), 0x%02X, 0x%02X); }\n", bit, ext, code1, code2);
|
||||||
|
}
|
||||||
|
|
||||||
|
void putLoadSeg(const char *name, uint8_t code1, int code2 = NONE)
|
||||||
|
{
|
||||||
|
printf("void %s(const Reg& reg, const Address& addr) { opLoadSeg(addr, reg, 0x%02X, 0x%02X); }\n", name, code1, code2);
|
||||||
|
}
|
||||||
|
|
||||||
void put()
|
void put()
|
||||||
{
|
{
|
||||||
const int NO = CodeGenerator::NONE;
|
const int NO = CodeGenerator::NONE;
|
||||||
|
@ -250,7 +262,7 @@ void put()
|
||||||
const int Q = 1 << 3;
|
const int Q = 1 << 3;
|
||||||
{
|
{
|
||||||
const struct Tbl {
|
const struct Tbl {
|
||||||
uint8 code;
|
uint8_t code;
|
||||||
const char *name;
|
const char *name;
|
||||||
} tbl[] = {
|
} tbl[] = {
|
||||||
// MMX
|
// MMX
|
||||||
|
@ -300,7 +312,7 @@ void put()
|
||||||
|
|
||||||
{
|
{
|
||||||
const struct Tbl {
|
const struct Tbl {
|
||||||
uint8 code;
|
uint8_t code;
|
||||||
int mode;
|
int mode;
|
||||||
const char *name;
|
const char *name;
|
||||||
} tbl[] = {
|
} tbl[] = {
|
||||||
|
@ -334,7 +346,7 @@ void put()
|
||||||
|
|
||||||
{
|
{
|
||||||
const struct Tbl {
|
const struct Tbl {
|
||||||
uint8 code;
|
uint8_t code;
|
||||||
int ext;
|
int ext;
|
||||||
int mode;
|
int mode;
|
||||||
const char *name;
|
const char *name;
|
||||||
|
@ -364,8 +376,8 @@ void put()
|
||||||
|
|
||||||
{
|
{
|
||||||
const struct Tbl {
|
const struct Tbl {
|
||||||
uint8 code;
|
uint8_t code;
|
||||||
uint8 pref;
|
uint8_t pref;
|
||||||
const char *name;
|
const char *name;
|
||||||
} tbl[] = {
|
} tbl[] = {
|
||||||
{ 0x70, 0, "pshufw" },
|
{ 0x70, 0, "pshufw" },
|
||||||
|
@ -375,13 +387,13 @@ void put()
|
||||||
};
|
};
|
||||||
for (size_t i = 0; i < NUM_OF_ARRAY(tbl); i++) {
|
for (size_t i = 0; i < NUM_OF_ARRAY(tbl); i++) {
|
||||||
const Tbl *p = &tbl[i];
|
const Tbl *p = &tbl[i];
|
||||||
printf("void %s(const Mmx& mmx, const Operand& op, uint8 imm8) { opMMX(mmx, op, 0x%02X, 0x%02X, imm8); }\n", p->name, p->code, p->pref);
|
printf("void %s(const Mmx& mmx, const Operand& op, uint8_t imm8) { opMMX(mmx, op, 0x%02X, 0x%02X, imm8); }\n", p->name, p->code, p->pref);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
{
|
{
|
||||||
const struct MmxTbl6 {
|
const struct MmxTbl6 {
|
||||||
uint8 code; // for (reg, reg/[mem])
|
uint8_t code; // for (reg, reg/[mem])
|
||||||
uint8 code2; // for ([mem], reg)
|
uint8_t code2; // for ([mem], reg)
|
||||||
int pref;
|
int pref;
|
||||||
const char *name;
|
const char *name;
|
||||||
} mmxTbl6[] = {
|
} mmxTbl6[] = {
|
||||||
|
@ -420,7 +432,7 @@ void put()
|
||||||
{ 0xF2, "sd" },
|
{ 0xF2, "sd" },
|
||||||
};
|
};
|
||||||
const struct Tbl {
|
const struct Tbl {
|
||||||
uint8 code;
|
uint8_t code;
|
||||||
int mode;
|
int mode;
|
||||||
const char *name;
|
const char *name;
|
||||||
bool hasImm;
|
bool hasImm;
|
||||||
|
@ -449,8 +461,8 @@ void put()
|
||||||
for (size_t j = 0; j < NUM_OF_ARRAY(sufTbl); j++) {
|
for (size_t j = 0; j < NUM_OF_ARRAY(sufTbl); j++) {
|
||||||
if (!(p->mode & (1 << j))) continue;
|
if (!(p->mode & (1 << j))) continue;
|
||||||
if (p->hasImm) {
|
if (p->hasImm) {
|
||||||
// don't change uint8 to int because NO is not in byte
|
// don't change uint8_t to int because NO is not in byte
|
||||||
printf("void %s%s(const Xmm& xmm, const Operand& op, uint8 imm8) { opGen(xmm, op, 0x%2X, 0x%02X, isXMM_XMMorMEM, imm8); }\n", p->name, sufTbl[j].name, p->code, sufTbl[j].code);
|
printf("void %s%s(const Xmm& xmm, const Operand& op, uint8_t imm8) { opGen(xmm, op, 0x%2X, 0x%02X, isXMM_XMMorMEM, imm8); }\n", p->name, sufTbl[j].name, p->code, sufTbl[j].code);
|
||||||
} else {
|
} else {
|
||||||
printf("void %s%s(const Xmm& xmm, const Operand& op) { opGen(xmm, op, 0x%2X, 0x%02X, isXMM_XMMorMEM); }\n", p->name, sufTbl[j].name, p->code, sufTbl[j].code);
|
printf("void %s%s(const Xmm& xmm, const Operand& op) { opGen(xmm, op, 0x%2X, 0x%02X, isXMM_XMMorMEM); }\n", p->name, sufTbl[j].name, p->code, sufTbl[j].code);
|
||||||
}
|
}
|
||||||
|
@ -460,8 +472,8 @@ void put()
|
||||||
{
|
{
|
||||||
// (XMM, XMM)
|
// (XMM, XMM)
|
||||||
const struct Tbl {
|
const struct Tbl {
|
||||||
uint8 code;
|
uint8_t code;
|
||||||
uint8 pref;
|
uint8_t pref;
|
||||||
const char *name;
|
const char *name;
|
||||||
} tbl[] = {
|
} tbl[] = {
|
||||||
{ 0xF7, 0x66, "maskmovdqu" },
|
{ 0xF7, 0x66, "maskmovdqu" },
|
||||||
|
@ -478,7 +490,7 @@ void put()
|
||||||
{
|
{
|
||||||
// (XMM, XMM|MEM)
|
// (XMM, XMM|MEM)
|
||||||
const struct Tbl {
|
const struct Tbl {
|
||||||
uint8 code;
|
uint8_t code;
|
||||||
int pref;
|
int pref;
|
||||||
const char *name;
|
const char *name;
|
||||||
} tbl[] = {
|
} tbl[] = {
|
||||||
|
@ -510,7 +522,7 @@ void put()
|
||||||
{
|
{
|
||||||
// special type
|
// special type
|
||||||
const struct Tbl {
|
const struct Tbl {
|
||||||
uint8 code;
|
uint8_t code;
|
||||||
int pref;
|
int pref;
|
||||||
const char *name;
|
const char *name;
|
||||||
const char *cond;
|
const char *cond;
|
||||||
|
@ -554,7 +566,7 @@ void put()
|
||||||
}
|
}
|
||||||
{
|
{
|
||||||
const struct Tbl {
|
const struct Tbl {
|
||||||
uint8 code;
|
uint8_t code;
|
||||||
int pref;
|
int pref;
|
||||||
const char *name;
|
const char *name;
|
||||||
} tbl[] = {
|
} tbl[] = {
|
||||||
|
@ -571,7 +583,7 @@ void put()
|
||||||
{
|
{
|
||||||
// cmov
|
// cmov
|
||||||
const struct Tbl {
|
const struct Tbl {
|
||||||
uint8 ext;
|
uint8_t ext;
|
||||||
const char *name;
|
const char *name;
|
||||||
} tbl[] = {
|
} tbl[] = {
|
||||||
{ 0, "o" },
|
{ 0, "o" },
|
||||||
|
@ -616,6 +628,22 @@ void put()
|
||||||
printf("void set%s(const Operand& op) { opR_ModM(op, 8, 0, 0x0F, 0x90 | %d); }%s\n", p->name, p->ext, msg);
|
printf("void set%s(const Operand& op) { opR_ModM(op, 8, 0, 0x0F, 0x90 | %d); }%s\n", p->name, p->ext, msg);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
{
|
||||||
|
const struct Tbl {
|
||||||
|
const char *name;
|
||||||
|
uint8_t code;
|
||||||
|
} tbl[] = {
|
||||||
|
{ "loop", 0xE2 },
|
||||||
|
{ "loope", 0xE1 },
|
||||||
|
{ "loopne", 0xE0 },
|
||||||
|
};
|
||||||
|
for (size_t i = 0; i < NUM_OF_ARRAY(tbl); i++) {
|
||||||
|
const Tbl *p = &tbl[i];
|
||||||
|
printf("void %s(std::string label) { opJmp(label, T_SHORT, 0x%02X, 0, 0); }\n", p->name, p->code);
|
||||||
|
printf("void %s(const Label& label) { opJmp(label, T_SHORT, 0x%02X, 0, 0); }\n", p->name, p->code);
|
||||||
|
printf("void %s(const char *label) { %s(std::string(label)); }\n", p->name, p->name);
|
||||||
|
}
|
||||||
|
}
|
||||||
////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////
|
||||||
{
|
{
|
||||||
const GenericTbl tbl[] = {
|
const GenericTbl tbl[] = {
|
||||||
|
@ -633,16 +661,28 @@ void put()
|
||||||
{ "cmpsb", 0xA6 },
|
{ "cmpsb", 0xA6 },
|
||||||
{ "cmpsw", 0x66, 0xA7 },
|
{ "cmpsw", 0x66, 0xA7 },
|
||||||
{ "cmpsd", 0xA7 },
|
{ "cmpsd", 0xA7 },
|
||||||
|
{ "int3", 0xCC },
|
||||||
{ "scasb", 0xAE },
|
{ "scasb", 0xAE },
|
||||||
{ "scasw", 0x66, 0xAF },
|
{ "scasw", 0x66, 0xAF },
|
||||||
{ "scasd", 0xAF },
|
{ "scasd", 0xAF },
|
||||||
{ "movsb", 0xA4 },
|
{ "movsb", 0xA4 },
|
||||||
|
{ "leave", 0xC9 },
|
||||||
|
{ "lodsb", 0xAC },
|
||||||
|
{ "lodsw", 0x66, 0xAD },
|
||||||
|
{ "lodsd", 0xAD },
|
||||||
{ "movsw", 0x66, 0xA5 },
|
{ "movsw", 0x66, 0xA5 },
|
||||||
{ "movsd", 0xA5 },
|
{ "movsd", 0xA5 },
|
||||||
|
{ "outsb", 0x6E },
|
||||||
|
{ "outsw", 0x66, 0x6F },
|
||||||
|
{ "outsd", 0x6F },
|
||||||
{ "stosb", 0xAA },
|
{ "stosb", 0xAA },
|
||||||
{ "stosw", 0x66, 0xAB },
|
{ "stosw", 0x66, 0xAB },
|
||||||
{ "stosd", 0xAB },
|
{ "stosd", 0xAB },
|
||||||
{ "rep", 0xF3 },
|
{ "rep", 0xF3 },
|
||||||
|
{ "repe", 0xF3 },
|
||||||
|
{ "repz", 0xF3 },
|
||||||
|
{ "repne", 0xF2 },
|
||||||
|
{ "repnz", 0xF2 },
|
||||||
|
|
||||||
{ "lahf", 0x9F },
|
{ "lahf", 0x9F },
|
||||||
{ "lock", 0xF0 },
|
{ "lock", 0xF0 },
|
||||||
|
@ -651,6 +691,8 @@ void put()
|
||||||
{ "stc", 0xF9 },
|
{ "stc", 0xF9 },
|
||||||
{ "std", 0xFD },
|
{ "std", 0xFD },
|
||||||
{ "sti", 0xFB },
|
{ "sti", 0xFB },
|
||||||
|
{ "sysenter", 0x0F, 0x34 },
|
||||||
|
{ "sysexit", 0x0F, 0x35 },
|
||||||
|
|
||||||
{ "emms", 0x0F, 0x77 },
|
{ "emms", 0x0F, 0x77 },
|
||||||
{ "pause", 0xF3, 0x90 },
|
{ "pause", 0xF3, 0x90 },
|
||||||
|
@ -684,7 +726,8 @@ void put()
|
||||||
{ "fabs", 0xD9, 0xE1 },
|
{ "fabs", 0xD9, 0xE1 },
|
||||||
{ "faddp", 0xDE, 0xC1 },
|
{ "faddp", 0xDE, 0xC1 },
|
||||||
{ "fchs", 0xD9, 0xE0 },
|
{ "fchs", 0xD9, 0xE0 },
|
||||||
|
{ "fclex", 0x9B, 0xDB, 0xE2 },
|
||||||
|
{ "fnclex", 0xDB, 0xE2 },
|
||||||
{ "fcom", 0xD8, 0xD1 },
|
{ "fcom", 0xD8, 0xD1 },
|
||||||
{ "fcomp", 0xD8, 0xD9 },
|
{ "fcomp", 0xD8, 0xD9 },
|
||||||
{ "fcompp", 0xDE, 0xD9 },
|
{ "fcompp", 0xDE, 0xD9 },
|
||||||
|
@ -724,13 +767,23 @@ void put()
|
||||||
{ "fxtract", 0xD9, 0xF4 },
|
{ "fxtract", 0xD9, 0xF4 },
|
||||||
{ "fyl2x", 0xD9, 0xF1 },
|
{ "fyl2x", 0xD9, 0xF1 },
|
||||||
{ "fyl2xp1", 0xD9, 0xF9 },
|
{ "fyl2xp1", 0xD9, 0xF9 },
|
||||||
|
|
||||||
|
// AMD Zen
|
||||||
|
{ "monitorx", 0x0F, 0x01, 0xFA },
|
||||||
|
{ "mwaitx", 0x0F, 0x01, 0xFB },
|
||||||
|
{ "clzero", 0x0F, 0x01, 0xFC },
|
||||||
};
|
};
|
||||||
putGeneric(tbl, NUM_OF_ARRAY(tbl));
|
putGeneric(tbl, NUM_OF_ARRAY(tbl));
|
||||||
|
puts("void enter(uint16_t x, uint8_t y) { db(0xC8); dw(x); db(y); }");
|
||||||
|
puts("void int_(uint8_t x) { db(0xCD); db(x); }");
|
||||||
|
putLoadSeg("lss", 0x0F, 0xB2);
|
||||||
|
putLoadSeg("lfs", 0x0F, 0xB4);
|
||||||
|
putLoadSeg("lgs", 0x0F, 0xB5);
|
||||||
}
|
}
|
||||||
{
|
{
|
||||||
const struct Tbl {
|
const struct Tbl {
|
||||||
uint8 code; // (reg, reg)
|
uint8_t code; // (reg, reg)
|
||||||
uint8 ext; // (reg, imm)
|
uint8_t ext; // (reg, imm)
|
||||||
const char *name;
|
const char *name;
|
||||||
} tbl[] = {
|
} tbl[] = {
|
||||||
{ 0x10, 2, "adc" },
|
{ 0x10, 2, "adc" },
|
||||||
|
@ -745,14 +798,14 @@ void put()
|
||||||
for (size_t i = 0; i < NUM_OF_ARRAY(tbl); i++) {
|
for (size_t i = 0; i < NUM_OF_ARRAY(tbl); i++) {
|
||||||
const Tbl *p = &tbl[i];
|
const Tbl *p = &tbl[i];
|
||||||
printf("void %s(const Operand& op1, const Operand& op2) { opRM_RM(op1, op2, 0x%02X); }\n", p->name, p->code);
|
printf("void %s(const Operand& op1, const Operand& op2) { opRM_RM(op1, op2, 0x%02X); }\n", p->name, p->code);
|
||||||
printf("void %s(const Operand& op, uint32 imm) { opRM_I(op, imm, 0x%02X, %d); }\n", p->name, p->code, p->ext);
|
printf("void %s(const Operand& op, uint32_t imm) { opRM_I(op, imm, 0x%02X, %d); }\n", p->name, p->code, p->ext);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
const struct Tbl {
|
const struct Tbl {
|
||||||
uint8 code;
|
uint8_t code;
|
||||||
uint8 ext;
|
uint8_t ext;
|
||||||
const char *name;
|
const char *name;
|
||||||
} tbl[] = {
|
} tbl[] = {
|
||||||
{ 0x48, 1, "dec" },
|
{ 0x48, 1, "dec" },
|
||||||
|
@ -765,8 +818,8 @@ void put()
|
||||||
}
|
}
|
||||||
{
|
{
|
||||||
const struct Tbl {
|
const struct Tbl {
|
||||||
uint8 code;
|
uint8_t code;
|
||||||
uint8 ext;
|
uint8_t ext;
|
||||||
const char *name;
|
const char *name;
|
||||||
} tbl[] = {
|
} tbl[] = {
|
||||||
{ 0xa3, 4, "bt" },
|
{ 0xa3, 4, "bt" },
|
||||||
|
@ -777,13 +830,13 @@ void put()
|
||||||
for (size_t i = 0; i < NUM_OF_ARRAY(tbl); i++) {
|
for (size_t i = 0; i < NUM_OF_ARRAY(tbl); i++) {
|
||||||
const Tbl *p = &tbl[i];
|
const Tbl *p = &tbl[i];
|
||||||
printf("void %s(const Operand& op, const Reg& reg) { opModRM(reg, op, op.isREG(16|32|64) && op.getBit() == reg.getBit(), op.isMEM(), 0x0f, 0x%02X); }\n", p->name, p->code);
|
printf("void %s(const Operand& op, const Reg& reg) { opModRM(reg, op, op.isREG(16|32|64) && op.getBit() == reg.getBit(), op.isMEM(), 0x0f, 0x%02X); }\n", p->name, p->code);
|
||||||
printf("void %s(const Operand& op, uint8 imm) { opR_ModM(op, 16|32|64, %d, 0x0f, 0xba, NONE, false, 1); db(imm); }\n", p->name, p->ext);
|
printf("void %s(const Operand& op, uint8_t imm) { opR_ModM(op, 16|32|64, %d, 0x0f, 0xba, NONE, false, 1); db(imm); }\n", p->name, p->ext);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
{
|
{
|
||||||
const struct Tbl {
|
const struct Tbl {
|
||||||
uint8 code;
|
uint8_t code;
|
||||||
uint8 ext;
|
uint8_t ext;
|
||||||
const char *name;
|
const char *name;
|
||||||
} tbl[] = {
|
} tbl[] = {
|
||||||
{ 0xF6, 6, "div" },
|
{ 0xF6, 6, "div" },
|
||||||
|
@ -802,7 +855,7 @@ void put()
|
||||||
{
|
{
|
||||||
const struct Tbl {
|
const struct Tbl {
|
||||||
const char *name;
|
const char *name;
|
||||||
uint8 ext;
|
uint8_t ext;
|
||||||
} tbl[] = {
|
} tbl[] = {
|
||||||
{ "rcl", 2 },
|
{ "rcl", 2 },
|
||||||
{ "rcr", 3 },
|
{ "rcr", 3 },
|
||||||
|
@ -823,21 +876,21 @@ void put()
|
||||||
{
|
{
|
||||||
const struct Tbl {
|
const struct Tbl {
|
||||||
const char *name;
|
const char *name;
|
||||||
uint8 code;
|
uint8_t code;
|
||||||
} tbl[] = {
|
} tbl[] = {
|
||||||
{ "shld", 0xA4 },
|
{ "shld", 0xA4 },
|
||||||
{ "shrd", 0xAC },
|
{ "shrd", 0xAC },
|
||||||
};
|
};
|
||||||
for (size_t i = 0; i < NUM_OF_ARRAY(tbl); i++) {
|
for (size_t i = 0; i < NUM_OF_ARRAY(tbl); i++) {
|
||||||
const Tbl *p = &tbl[i];
|
const Tbl *p = &tbl[i];
|
||||||
printf("void %s(const Operand& op, const Reg& reg, uint8 imm) { opShxd(op, reg, imm, 0x%02X); }\n", p->name, p->code);
|
printf("void %s(const Operand& op, const Reg& reg, uint8_t imm) { opShxd(op, reg, imm, 0x%02X); }\n", p->name, p->code);
|
||||||
printf("void %s(const Operand& op, const Reg& reg, const Reg8& _cl) { opShxd(op, reg, 0, 0x%02X, &_cl); }\n", p->name, p->code);
|
printf("void %s(const Operand& op, const Reg& reg, const Reg8& _cl) { opShxd(op, reg, 0, 0x%02X, &_cl); }\n", p->name, p->code);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
{
|
{
|
||||||
const struct Tbl {
|
const struct Tbl {
|
||||||
const char *name;
|
const char *name;
|
||||||
uint8 code;
|
uint8_t code;
|
||||||
} tbl[] = {
|
} tbl[] = {
|
||||||
{ "bsf", 0xBC },
|
{ "bsf", 0xBC },
|
||||||
{ "bsr", 0xBD },
|
{ "bsr", 0xBD },
|
||||||
|
@ -850,7 +903,7 @@ void put()
|
||||||
{
|
{
|
||||||
const struct Tbl {
|
const struct Tbl {
|
||||||
const char *name;
|
const char *name;
|
||||||
uint8 code;
|
uint8_t code;
|
||||||
} tbl[] = {
|
} tbl[] = {
|
||||||
{ "popcnt", 0xB8 },
|
{ "popcnt", 0xB8 },
|
||||||
{ "tzcnt", 0xBC },
|
{ "tzcnt", 0xBC },
|
||||||
|
@ -864,7 +917,7 @@ void put()
|
||||||
// SSSE3
|
// SSSE3
|
||||||
{
|
{
|
||||||
const struct Tbl {
|
const struct Tbl {
|
||||||
uint8 code;
|
uint8_t code;
|
||||||
const char *name;
|
const char *name;
|
||||||
} tbl[] = {
|
} tbl[] = {
|
||||||
{ 0x00, "pshufb" },
|
{ 0x00, "pshufb" },
|
||||||
|
@ -887,12 +940,12 @@ void put()
|
||||||
const Tbl *p = &tbl[i];
|
const Tbl *p = &tbl[i];
|
||||||
printf("void %s(const Mmx& mmx, const Operand& op) { opMMX(mmx, op, 0x%02X, 0x66, NONE, 0x38); }\n", p->name, p->code);
|
printf("void %s(const Mmx& mmx, const Operand& op) { opMMX(mmx, op, 0x%02X, 0x66, NONE, 0x38); }\n", p->name, p->code);
|
||||||
}
|
}
|
||||||
printf("void palignr(const Mmx& mmx, const Operand& op, int imm) { opMMX(mmx, op, 0x0f, 0x66, static_cast<uint8>(imm), 0x3a); }\n");
|
printf("void palignr(const Mmx& mmx, const Operand& op, int imm) { opMMX(mmx, op, 0x0f, 0x66, static_cast<uint8_t>(imm), 0x3a); }\n");
|
||||||
}
|
}
|
||||||
{
|
{
|
||||||
const struct Tbl {
|
const struct Tbl {
|
||||||
const char *name;
|
const char *name;
|
||||||
uint8 code;
|
uint8_t code;
|
||||||
} tbl[] = {
|
} tbl[] = {
|
||||||
{ "pclmullqlqdq", 0 },
|
{ "pclmullqlqdq", 0 },
|
||||||
{ "pclmulhqlqdq", 1 },
|
{ "pclmulhqlqdq", 1 },
|
||||||
|
@ -906,26 +959,41 @@ void put()
|
||||||
}
|
}
|
||||||
{
|
{
|
||||||
const struct Tbl {
|
const struct Tbl {
|
||||||
uint8 code1;
|
uint8_t code1;
|
||||||
int code2;
|
int code2;
|
||||||
uint8 ext;
|
uint8_t ext;
|
||||||
const char *name;
|
const char *name;
|
||||||
|
uint8_t prefix;
|
||||||
} tbl[] = {
|
} tbl[] = {
|
||||||
{ 0x0F, 0xAE, 2, "ldmxcsr" },
|
{ 0x0F, 0xAE, 2, "ldmxcsr", 0 },
|
||||||
{ 0x0F, 0xAE, 3, "stmxcsr" },
|
{ 0x0F, 0xAE, 3, "stmxcsr", 0 },
|
||||||
{ 0x0F, 0xAE, 7, "clflush" }, // 0x80 is bug of nasm ?
|
{ 0x0F, 0xAE, 7, "clflush", 0 },
|
||||||
{ 0xD9, NONE, 5, "fldcw" },
|
{ 0x0F, 0xAE, 7, "clflushopt", 0x66 },
|
||||||
// { 0x9B, 0xD9, 7, "fstcw" }, // not correct order for fstcw [eax] on 64bit OS
|
{ 0xDF, NONE, 4, "fbld", 0 },
|
||||||
|
{ 0xDF, NONE, 6, "fbstp", 0 },
|
||||||
|
{ 0xD9, NONE, 5, "fldcw", 0 },
|
||||||
|
{ 0xD9, NONE, 4, "fldenv", 0 },
|
||||||
|
{ 0xDD, NONE, 4, "frstor", 0 },
|
||||||
|
{ 0xDD, NONE, 6, "fsave", 0x9B },
|
||||||
|
{ 0xDD, NONE, 6, "fnsave", 0 },
|
||||||
|
{ 0xD9, NONE, 7, "fstcw", 0x9B },
|
||||||
|
{ 0xD9, NONE, 7, "fnstcw", 0 },
|
||||||
|
{ 0xD9, NONE, 6, "fstenv", 0x9B },
|
||||||
|
{ 0xD9, NONE, 6, "fnstenv", 0 },
|
||||||
|
{ 0xDD, NONE, 7, "fstsw", 0x9B },
|
||||||
|
{ 0xDD, NONE, 7, "fnstsw", 0 },
|
||||||
|
{ 0x0F, 0xAE, 1, "fxrstor", 0 },
|
||||||
};
|
};
|
||||||
for (size_t i = 0; i < NUM_OF_ARRAY(tbl); i++) {
|
for (size_t i = 0; i < NUM_OF_ARRAY(tbl); i++) {
|
||||||
const Tbl *p = &tbl[i];
|
const Tbl *p = &tbl[i];
|
||||||
printf("void %s(const Address& addr) { opModM(addr, Reg32(%d), 0x%02X, 0x%02X); }\n", p->name, p->ext, p->code1, p->code2);
|
putMemOp(p->name, p->prefix, p->ext, p->code1, p->code2);
|
||||||
}
|
}
|
||||||
printf("void fstcw(const Address& addr) { db(0x9B); opModM(addr, Reg32(7), 0xD9, NONE); }\n");
|
puts("void fstsw(const Reg16& r) { if (r.getIdx() != Operand::AX) XBYAK_THROW(ERR_BAD_PARAMETER) db(0x9B); db(0xDF); db(0xE0); }");
|
||||||
|
puts("void fnstsw(const Reg16& r) { if (r.getIdx() != Operand::AX) XBYAK_THROW(ERR_BAD_PARAMETER) db(0xDF); db(0xE0); }");
|
||||||
}
|
}
|
||||||
{
|
{
|
||||||
const struct Tbl {
|
const struct Tbl {
|
||||||
uint8 code;
|
uint8_t code;
|
||||||
const char *name;
|
const char *name;
|
||||||
} tbl[] = {
|
} tbl[] = {
|
||||||
{ 0x2B, "movntpd" },
|
{ 0x2B, "movntpd" },
|
||||||
|
@ -939,7 +1007,7 @@ void put()
|
||||||
}
|
}
|
||||||
{
|
{
|
||||||
const struct Tbl {
|
const struct Tbl {
|
||||||
uint8 code;
|
uint8_t code;
|
||||||
const char *name;
|
const char *name;
|
||||||
} tbl[] = {
|
} tbl[] = {
|
||||||
{ 0xBE, "movsx" },
|
{ 0xBE, "movsx" },
|
||||||
|
@ -950,6 +1018,12 @@ void put()
|
||||||
printf("void %s(const Reg& reg, const Operand& op) { opMovxx(reg, op, 0x%02X); }\n", p->name, p->code);
|
printf("void %s(const Reg& reg, const Operand& op) { opMovxx(reg, op, 0x%02X); }\n", p->name, p->code);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
{ // in/out
|
||||||
|
puts("void in_(const Reg& a, uint8_t v) { opInOut(a, 0xE4, v); }");
|
||||||
|
puts("void in_(const Reg& a, const Reg& d) { opInOut(a, d, 0xEC); }");
|
||||||
|
puts("void out_(uint8_t v, const Reg& a) { opInOut(a, 0xE6, v); }");
|
||||||
|
puts("void out_(const Reg& d, const Reg& a) { opInOut(a, d, 0xEE); }");
|
||||||
|
}
|
||||||
// mpx
|
// mpx
|
||||||
{
|
{
|
||||||
puts("void bndcl(const BoundsReg& bnd, const Operand& op) { db(0xF3); opR_ModM(op, i32e, bnd.getIdx(), 0x0F, 0x1A, NONE, !op.isMEM()); }");
|
puts("void bndcl(const BoundsReg& bnd, const Operand& op) { db(0xF3); opR_ModM(op, i32e, bnd.getIdx(), 0x0F, 0x1A, NONE, !op.isMEM()); }");
|
||||||
|
@ -963,7 +1037,7 @@ void put()
|
||||||
}
|
}
|
||||||
// misc
|
// misc
|
||||||
{
|
{
|
||||||
puts("void lea(const Reg& reg, const Address& addr) { if (!reg.isBit(16 | i32e)) throw Error(ERR_BAD_SIZE_OF_REGISTER); opModM(addr, reg, 0x8D); }");
|
puts("void lea(const Reg& reg, const Address& addr) { if (!reg.isBit(16 | i32e)) XBYAK_THROW(ERR_BAD_SIZE_OF_REGISTER) opModM(addr, reg, 0x8D); }");
|
||||||
puts("void bswap(const Reg32e& reg) { opModR(Reg32(1), reg, 0x0F); }");
|
puts("void bswap(const Reg32e& reg) { opModR(Reg32(1), reg, 0x0F); }");
|
||||||
puts("void ret(int imm = 0) { if (imm) { db(0xC2); dw(imm); } else { db(0xC3); } }");
|
puts("void ret(int imm = 0) { if (imm) { db(0xC2); dw(imm); } else { db(0xC3); } }");
|
||||||
|
|
||||||
|
@ -975,24 +1049,24 @@ void put()
|
||||||
puts("void adox(const Reg32e& reg, const Operand& op) { opGen(reg, op, 0xF6, 0xF3, isREG32_REG32orMEM, NONE, 0x38); }");
|
puts("void adox(const Reg32e& reg, const Operand& op) { opGen(reg, op, 0xF6, 0xF3, isREG32_REG32orMEM, NONE, 0x38); }");
|
||||||
puts("void cmpxchg8b(const Address& addr) { opModM(addr, Reg32(1), 0x0F, 0xC7); }");
|
puts("void cmpxchg8b(const Address& addr) { opModM(addr, Reg32(1), 0x0F, 0xC7); }");
|
||||||
|
|
||||||
puts("void pextrw(const Operand& op, const Mmx& xmm, uint8 imm) { opExt(op, xmm, 0x15, imm, true); }");
|
puts("void pextrw(const Operand& op, const Mmx& xmm, uint8_t imm) { opExt(op, xmm, 0x15, imm, true); }");
|
||||||
puts("void pextrb(const Operand& op, const Xmm& xmm, uint8 imm) { opExt(op, xmm, 0x14, imm); }");
|
puts("void pextrb(const Operand& op, const Xmm& xmm, uint8_t imm) { opExt(op, xmm, 0x14, imm); }");
|
||||||
puts("void pextrd(const Operand& op, const Xmm& xmm, uint8 imm) { opExt(op, xmm, 0x16, imm); }");
|
puts("void pextrd(const Operand& op, const Xmm& xmm, uint8_t imm) { opExt(op, xmm, 0x16, imm); }");
|
||||||
puts("void extractps(const Operand& op, const Xmm& xmm, uint8 imm) { opExt(op, xmm, 0x17, imm); }");
|
puts("void extractps(const Operand& op, const Xmm& xmm, uint8_t imm) { opExt(op, xmm, 0x17, imm); }");
|
||||||
puts("void pinsrw(const Mmx& mmx, const Operand& op, int imm) { if (!op.isREG(32) && !op.isMEM()) throw Error(ERR_BAD_COMBINATION); opGen(mmx, op, 0xC4, mmx.isXMM() ? 0x66 : NONE, 0, imm); }");
|
puts("void pinsrw(const Mmx& mmx, const Operand& op, int imm) { if (!op.isREG(32) && !op.isMEM()) XBYAK_THROW(ERR_BAD_COMBINATION) opGen(mmx, op, 0xC4, mmx.isXMM() ? 0x66 : NONE, 0, imm); }");
|
||||||
puts("void insertps(const Xmm& xmm, const Operand& op, uint8 imm) { opGen(xmm, op, 0x21, 0x66, isXMM_XMMorMEM, imm, 0x3A); }");
|
puts("void insertps(const Xmm& xmm, const Operand& op, uint8_t imm) { opGen(xmm, op, 0x21, 0x66, isXMM_XMMorMEM, imm, 0x3A); }");
|
||||||
puts("void pinsrb(const Xmm& xmm, const Operand& op, uint8 imm) { opGen(xmm, op, 0x20, 0x66, isXMM_REG32orMEM, imm, 0x3A); }");
|
puts("void pinsrb(const Xmm& xmm, const Operand& op, uint8_t imm) { opGen(xmm, op, 0x20, 0x66, isXMM_REG32orMEM, imm, 0x3A); }");
|
||||||
puts("void pinsrd(const Xmm& xmm, const Operand& op, uint8 imm) { opGen(xmm, op, 0x22, 0x66, isXMM_REG32orMEM, imm, 0x3A); }");
|
puts("void pinsrd(const Xmm& xmm, const Operand& op, uint8_t imm) { opGen(xmm, op, 0x22, 0x66, isXMM_REG32orMEM, imm, 0x3A); }");
|
||||||
|
|
||||||
puts("void pmovmskb(const Reg32e& reg, const Mmx& mmx) { if (mmx.isXMM()) db(0x66); opModR(reg, mmx, 0x0F, 0xD7); }");
|
puts("void pmovmskb(const Reg32e& reg, const Mmx& mmx) { if (mmx.isXMM()) db(0x66); opModR(reg, mmx, 0x0F, 0xD7); }");
|
||||||
puts("void maskmovq(const Mmx& reg1, const Mmx& reg2) { if (!reg1.isMMX() || !reg2.isMMX()) throw Error(ERR_BAD_COMBINATION); opModR(reg1, reg2, 0x0F, 0xF7); }");
|
puts("void maskmovq(const Mmx& reg1, const Mmx& reg2) { if (!reg1.isMMX() || !reg2.isMMX()) XBYAK_THROW(ERR_BAD_COMBINATION) opModR(reg1, reg2, 0x0F, 0xF7); }");
|
||||||
puts("void movmskps(const Reg32e& reg, const Xmm& xmm) { opModR(reg, xmm, 0x0F, 0x50); }");
|
puts("void movmskps(const Reg32e& reg, const Xmm& xmm) { opModR(reg, xmm, 0x0F, 0x50); }");
|
||||||
puts("void movmskpd(const Reg32e& reg, const Xmm& xmm) { db(0x66); movmskps(reg, xmm); }");
|
puts("void movmskpd(const Reg32e& reg, const Xmm& xmm) { db(0x66); movmskps(reg, xmm); }");
|
||||||
puts("void movntps(const Address& addr, const Xmm& xmm) { opModM(addr, Mmx(xmm.getIdx()), 0x0F, 0x2B); }");
|
puts("void movntps(const Address& addr, const Xmm& xmm) { opModM(addr, Mmx(xmm.getIdx()), 0x0F, 0x2B); }");
|
||||||
puts("void movntdqa(const Xmm& xmm, const Address& addr) { db(0x66); opModM(addr, xmm, 0x0F, 0x38, 0x2A); }");
|
puts("void movntdqa(const Xmm& xmm, const Address& addr) { db(0x66); opModM(addr, xmm, 0x0F, 0x38, 0x2A); }");
|
||||||
puts("void lddqu(const Xmm& xmm, const Address& addr) { db(0xF2); opModM(addr, xmm, 0x0F, 0xF0); }");
|
puts("void lddqu(const Xmm& xmm, const Address& addr) { db(0xF2); opModM(addr, xmm, 0x0F, 0xF0); }");
|
||||||
puts("void movnti(const Address& addr, const Reg32e& reg) { opModM(addr, reg, 0x0F, 0xC3); }");
|
puts("void movnti(const Address& addr, const Reg32e& reg) { opModM(addr, reg, 0x0F, 0xC3); }");
|
||||||
puts("void movntq(const Address& addr, const Mmx& mmx) { if (!mmx.isMMX()) throw Error(ERR_BAD_COMBINATION); opModM(addr, mmx, 0x0F, 0xE7); }");
|
puts("void movntq(const Address& addr, const Mmx& mmx) { if (!mmx.isMMX()) XBYAK_THROW(ERR_BAD_COMBINATION) opModM(addr, mmx, 0x0F, 0xE7); }");
|
||||||
|
|
||||||
puts("void movd(const Address& addr, const Mmx& mmx) { if (mmx.isXMM()) db(0x66); opModM(addr, mmx, 0x0F, 0x7E); }");
|
puts("void movd(const Address& addr, const Mmx& mmx) { if (mmx.isXMM()) db(0x66); opModM(addr, mmx, 0x0F, 0x7E); }");
|
||||||
puts("void movd(const Reg32& reg, const Mmx& mmx) { if (mmx.isXMM()) db(0x66); opModR(mmx, reg, 0x0F, 0x7E); }");
|
puts("void movd(const Reg32& reg, const Mmx& mmx) { if (mmx.isXMM()) db(0x66); opModR(mmx, reg, 0x0F, 0x7E); }");
|
||||||
|
@ -1002,18 +1076,18 @@ void put()
|
||||||
puts("void movdq2q(const Mmx& mmx, const Xmm& xmm) { db(0xF2); opModR(mmx, xmm, 0x0F, 0xD6); }");
|
puts("void movdq2q(const Mmx& mmx, const Xmm& xmm) { db(0xF2); opModR(mmx, xmm, 0x0F, 0xD6); }");
|
||||||
puts("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); }");
|
puts("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); }");
|
||||||
puts("void movq(const Address& addr, const Mmx& mmx) { if (mmx.isXMM()) db(0x66); opModM(addr, mmx, 0x0F, mmx.isXMM() ? 0xD6 : 0x7F); }");
|
puts("void movq(const Address& addr, const Mmx& mmx) { if (mmx.isXMM()) db(0x66); opModM(addr, mmx, 0x0F, mmx.isXMM() ? 0xD6 : 0x7F); }");
|
||||||
puts("void rdrand(const Reg& r) { if (r.isBit(8)) throw Error(ERR_BAD_SIZE_OF_REGISTER); opModR(Reg(6, Operand::REG, r.getBit()), r, 0x0F, 0xC7); }");
|
puts("void rdrand(const Reg& r) { if (r.isBit(8)) XBYAK_THROW(ERR_BAD_SIZE_OF_REGISTER) opModR(Reg(6, Operand::REG, r.getBit()), r, 0x0F, 0xC7); }");
|
||||||
puts("void rdseed(const Reg& r) { if (r.isBit(8)) throw Error(ERR_BAD_SIZE_OF_REGISTER); opModR(Reg(7, Operand::REG, r.getBit()), r, 0x0F, 0xC7); }");
|
puts("void rdseed(const Reg& r) { if (r.isBit(8)) XBYAK_THROW(ERR_BAD_SIZE_OF_REGISTER) opModR(Reg(7, Operand::REG, r.getBit()), r, 0x0F, 0xC7); }");
|
||||||
puts("void crc32(const Reg32e& reg, const Operand& op) { if (reg.isBit(32) && op.isBit(16)) db(0x66); db(0xF2); opModRM(reg, op, op.isREG(), op.isMEM(), 0x0F, 0x38, 0xF0 | (op.isBit(8) ? 0 : 1)); }");
|
puts("void crc32(const Reg32e& reg, const Operand& op) { if (reg.isBit(32) && op.isBit(16)) db(0x66); db(0xF2); opModRM(reg, op, op.isREG(), op.isMEM(), 0x0F, 0x38, 0xF0 | (op.isBit(8) ? 0 : 1)); }");
|
||||||
}
|
}
|
||||||
{
|
{
|
||||||
const struct Tbl {
|
const struct Tbl {
|
||||||
uint8 m16;
|
uint8_t m16;
|
||||||
uint8 m32;
|
uint8_t m32;
|
||||||
uint8 m64;
|
uint8_t m64;
|
||||||
uint8 ext;
|
uint8_t ext;
|
||||||
const char *name;
|
const char *name;
|
||||||
uint8 m64ext;
|
uint8_t m64ext;
|
||||||
} tbl[] = {
|
} tbl[] = {
|
||||||
{ 0x00, 0xD8, 0xDC, 0, "fadd" },
|
{ 0x00, 0xD8, 0xDC, 0, "fadd" },
|
||||||
{ 0xDE, 0xDA, 0x00, 0, "fiadd" },
|
{ 0xDE, 0xDA, 0x00, 0, "fiadd" },
|
||||||
|
@ -1046,8 +1120,8 @@ void put()
|
||||||
}
|
}
|
||||||
{
|
{
|
||||||
const struct Tbl {
|
const struct Tbl {
|
||||||
uint32 code1;
|
uint32_t code1;
|
||||||
uint32 code2;
|
uint32_t code2;
|
||||||
const char *name;
|
const char *name;
|
||||||
} tbl[] = {
|
} tbl[] = {
|
||||||
{ 0xD8C0, 0xDCC0, "fadd" },
|
{ 0xD8C0, 0xDCC0, "fadd" },
|
||||||
|
@ -1091,8 +1165,8 @@ void put()
|
||||||
}
|
}
|
||||||
{
|
{
|
||||||
const struct Tbl {
|
const struct Tbl {
|
||||||
uint8 code1;
|
uint8_t code1;
|
||||||
uint8 code2;
|
uint8_t code2;
|
||||||
const char *name;
|
const char *name;
|
||||||
} tbl[] = {
|
} tbl[] = {
|
||||||
{ 0xD8, 0xD0, "fcom" },
|
{ 0xD8, 0xD0, "fcom" },
|
||||||
|
@ -1113,7 +1187,7 @@ void put()
|
||||||
// AVX
|
// AVX
|
||||||
{ // pd, ps, sd, ss
|
{ // pd, ps, sd, ss
|
||||||
const struct Tbl {
|
const struct Tbl {
|
||||||
uint8 code;
|
uint8_t code;
|
||||||
const char *name;
|
const char *name;
|
||||||
bool only_pd_ps;
|
bool only_pd_ps;
|
||||||
} tbl[] = {
|
} tbl[] = {
|
||||||
|
@ -1142,7 +1216,7 @@ void put()
|
||||||
// (x, x/m[, imm]) or (y, y/m[, imm])
|
// (x, x/m[, imm]) or (y, y/m[, imm])
|
||||||
{
|
{
|
||||||
const struct Tbl {
|
const struct Tbl {
|
||||||
uint8 code;
|
uint8_t code;
|
||||||
const char *name;
|
const char *name;
|
||||||
int type;
|
int type;
|
||||||
bool hasIMM;
|
bool hasIMM;
|
||||||
|
@ -1223,7 +1297,7 @@ void put()
|
||||||
const Tbl *p = &tbl[i];
|
const Tbl *p = &tbl[i];
|
||||||
std::string type = type2String(p->type);
|
std::string type = type2String(p->type);
|
||||||
if (p->mode & 1) {
|
if (p->mode & 1) {
|
||||||
const char *immS1 = p->hasIMM ? ", uint8 imm" : "";
|
const char *immS1 = p->hasIMM ? ", uint8_t imm" : "";
|
||||||
const char *immS2 = p->hasIMM ? ", imm" : ", NONE";
|
const char *immS2 = p->hasIMM ? ", imm" : ", NONE";
|
||||||
const char *pref = p->type & T_66 ? "0x66" : p->type & T_F2 ? "0xF2" : p->type & T_F3 ? "0xF3" : "NONE";
|
const char *pref = p->type & T_66 ? "0x66" : p->type & T_F2 ? "0xF2" : p->type & T_F3 ? "0xF3" : "NONE";
|
||||||
const char *suf = p->type & T_0F38 ? "0x38" : p->type & T_0F3A ? "0x3A" : "NONE";
|
const char *suf = p->type & T_0F38 ? "0x38" : p->type & T_0F3A ? "0x3A" : "NONE";
|
||||||
|
@ -1231,14 +1305,14 @@ void put()
|
||||||
}
|
}
|
||||||
if (p->mode & 2) {
|
if (p->mode & 2) {
|
||||||
printf("void v%s(const Xmm& xm, const Operand& op%s) { opAVX_X_XM_IMM(xm, op, %s, 0x%02X%s); }\n"
|
printf("void v%s(const Xmm& xm, const Operand& op%s) { opAVX_X_XM_IMM(xm, op, %s, 0x%02X%s); }\n"
|
||||||
, p->name, p->hasIMM ? ", uint8 imm" : "", type.c_str(), p->code, p->hasIMM ? ", imm" : "");
|
, p->name, p->hasIMM ? ", uint8_t imm" : "", type.c_str(), p->code, p->hasIMM ? ", imm" : "");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// (m, x), (m, y)
|
// (m, x), (m, y)
|
||||||
{
|
{
|
||||||
const struct Tbl {
|
const struct Tbl {
|
||||||
uint8 code;
|
uint8_t code;
|
||||||
const char *name;
|
const char *name;
|
||||||
int type;
|
int type;
|
||||||
} tbl[] = {
|
} tbl[] = {
|
||||||
|
@ -1259,7 +1333,7 @@ void put()
|
||||||
// (x, x/m), (y, y/m), (x, x, x/m), (y, y, y/m)
|
// (x, x/m), (y, y/m), (x, x, x/m), (y, y, y/m)
|
||||||
{
|
{
|
||||||
const struct Tbl {
|
const struct Tbl {
|
||||||
uint8 code;
|
uint8_t code;
|
||||||
const char *name;
|
const char *name;
|
||||||
int type;
|
int type;
|
||||||
int mode; // 1 : sse, 2 : avx, 3 : sse + avx
|
int mode; // 1 : sse, 2 : avx, 3 : sse + avx
|
||||||
|
@ -1280,7 +1354,7 @@ void put()
|
||||||
const Tbl *p = &tbl[i];
|
const Tbl *p = &tbl[i];
|
||||||
std::string type = type2String(p->type);
|
std::string type = type2String(p->type);
|
||||||
if (p->mode & 1) {
|
if (p->mode & 1) {
|
||||||
uint8 pref = p->type & T_66 ? 0x66 : p->type & T_F2 ? 0xF2 : p->type & T_F3 ? 0xF3 : 0;
|
uint8_t pref = p->type & T_66 ? 0x66 : p->type & T_F2 ? 0xF2 : p->type & T_F3 ? 0xF3 : 0;
|
||||||
printf("void %s(const Xmm& xmm, const Operand& op) { opGen(xmm, op, 0x%02X, 0x%02X, isXMM_XMMorMEM%s); }\n", p->name, p->code, pref, p->type & T_0F38 ? ", NONE, 0x38" : "");
|
printf("void %s(const Xmm& xmm, const Operand& op) { opGen(xmm, op, 0x%02X, 0x%02X, isXMM_XMMorMEM%s); }\n", p->name, p->code, pref, p->type & T_0F38 ? ", NONE, 0x38" : "");
|
||||||
}
|
}
|
||||||
if (p->mode & 2) {
|
if (p->mode & 2) {
|
||||||
|
@ -1308,7 +1382,7 @@ void put()
|
||||||
// vpermd, vpermps
|
// vpermd, vpermps
|
||||||
{
|
{
|
||||||
const struct Tbl {
|
const struct Tbl {
|
||||||
uint8 code;
|
uint8_t code;
|
||||||
const char *name;
|
const char *name;
|
||||||
int type;
|
int type;
|
||||||
} tbl[] = {
|
} tbl[] = {
|
||||||
|
@ -1326,7 +1400,7 @@ void put()
|
||||||
// vpermq, vpermpd
|
// vpermq, vpermpd
|
||||||
{
|
{
|
||||||
const struct Tbl {
|
const struct Tbl {
|
||||||
uint8 code;
|
uint8_t code;
|
||||||
const char *name;
|
const char *name;
|
||||||
int type;
|
int type;
|
||||||
} tbl[] = {
|
} tbl[] = {
|
||||||
|
@ -1336,7 +1410,7 @@ void put()
|
||||||
for (size_t i = 0; i < NUM_OF_ARRAY(tbl); i++) {
|
for (size_t i = 0; i < NUM_OF_ARRAY(tbl); i++) {
|
||||||
const Tbl& p = tbl[i];
|
const Tbl& p = tbl[i];
|
||||||
std::string type = type2String(p.type);
|
std::string type = type2String(p.type);
|
||||||
printf("void %s(const Ymm& y, const Operand& op, uint8 imm) { opAVX_X_XM_IMM(y, op, %s, 0x%02X, imm); }\n", p.name, type.c_str(), p.code);
|
printf("void %s(const Ymm& y, const Operand& op, uint8_t imm) { opAVX_X_XM_IMM(y, op, %s, 0x%02X, imm); }\n", p.name, type.c_str(), p.code);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// vcmpeqps
|
// vcmpeqps
|
||||||
|
@ -1363,7 +1437,7 @@ void put()
|
||||||
const struct Tbl {
|
const struct Tbl {
|
||||||
bool isH;
|
bool isH;
|
||||||
bool isPd;
|
bool isPd;
|
||||||
uint8 code;
|
uint8_t code;
|
||||||
} tbl[] = {
|
} tbl[] = {
|
||||||
{ true, true, 0x16 },
|
{ true, true, 0x16 },
|
||||||
{ true, false, 0x16 },
|
{ true, false, 0x16 },
|
||||||
|
@ -1375,7 +1449,7 @@ void put()
|
||||||
char c = p.isH ? 'h' : 'l';
|
char c = p.isH ? 'h' : 'l';
|
||||||
const char *suf = p.isPd ? "pd" : "ps";
|
const char *suf = p.isPd ? "pd" : "ps";
|
||||||
const char *type = p.isPd ? "T_0F | T_66 | T_EVEX | T_EW1 | T_N8" : "T_0F | T_EVEX | T_EW0 | T_N8";
|
const char *type = p.isPd ? "T_0F | T_66 | T_EVEX | T_EW1 | T_N8" : "T_0F | T_EVEX | T_EW0 | T_N8";
|
||||||
printf("void vmov%c%s(const Xmm& x, const Operand& op1, const Operand& op2 = Operand()) { if (!op2.isNone() && !op2.isMEM()) throw Error(ERR_BAD_COMBINATION); opAVX_X_X_XM(x, op1, op2, %s, 0x%02X); }\n"
|
printf("void vmov%c%s(const Xmm& x, const Operand& op1, const Operand& op2 = Operand()) { if (!op2.isNone() && !op2.isMEM()) XBYAK_THROW(ERR_BAD_COMBINATION) opAVX_X_X_XM(x, op1, op2, %s, 0x%02X); }\n"
|
||||||
, c, suf, type, p.code);
|
, c, suf, type, p.code);
|
||||||
printf("void vmov%c%s(const Address& addr, const Xmm& x) { opAVX_X_X_XM(x, xm0, addr, %s, 0x%02X); }\n"
|
printf("void vmov%c%s(const Address& addr, const Xmm& x) { opAVX_X_X_XM(x, xm0, addr, %s, 0x%02X); }\n"
|
||||||
, c, suf, type, p.code + 1);
|
, c, suf, type, p.code + 1);
|
||||||
|
@ -1384,7 +1458,7 @@ void put()
|
||||||
// FMA
|
// FMA
|
||||||
{
|
{
|
||||||
const struct Tbl {
|
const struct Tbl {
|
||||||
uint8 code;
|
uint8_t code;
|
||||||
const char *name;
|
const char *name;
|
||||||
bool supportYMM;
|
bool supportYMM;
|
||||||
} tbl[] = {
|
} tbl[] = {
|
||||||
|
@ -1408,7 +1482,7 @@ void put()
|
||||||
for (int k = 0; k < 3; k++) {
|
for (int k = 0; k < 3; k++) {
|
||||||
const struct Ord {
|
const struct Ord {
|
||||||
const char *str;
|
const char *str;
|
||||||
uint8 code;
|
uint8_t code;
|
||||||
} ord[] = {
|
} ord[] = {
|
||||||
{ "132", 0x90 },
|
{ "132", 0x90 },
|
||||||
{ "213", 0xA0 },
|
{ "213", 0xA0 },
|
||||||
|
@ -1438,10 +1512,10 @@ void put()
|
||||||
{
|
{
|
||||||
printf("void vbroadcastf128(const Ymm& y, const Address& addr) { opAVX_X_XM_IMM(y, addr, T_0F38 | T_66 | T_W0 | T_YMM, 0x1A); }\n");
|
printf("void vbroadcastf128(const Ymm& y, const Address& addr) { opAVX_X_XM_IMM(y, addr, T_0F38 | T_66 | T_W0 | T_YMM, 0x1A); }\n");
|
||||||
printf("void vbroadcasti128(const Ymm& y, const Address& addr) { opAVX_X_XM_IMM(y, addr, T_0F38 | T_66 | T_W0 | T_YMM, 0x5A); }\n");
|
printf("void vbroadcasti128(const Ymm& y, const Address& addr) { opAVX_X_XM_IMM(y, addr, T_0F38 | T_66 | T_W0 | T_YMM, 0x5A); }\n");
|
||||||
printf("void vbroadcastsd(const Ymm& y, const Operand& op) { if (!op.isMEM() && !(y.isYMM() && op.isXMM()) && !(y.isZMM() && op.isXMM())) throw Error(ERR_BAD_COMBINATION); opAVX_X_XM_IMM(y, op, T_0F38 | T_66 | T_W0 | T_YMM | T_EVEX | T_EW1 | T_N8, 0x19); }\n");
|
printf("void vbroadcastsd(const Ymm& y, const Operand& op) { if (!op.isMEM() && !(y.isYMM() && op.isXMM()) && !(y.isZMM() && op.isXMM())) XBYAK_THROW(ERR_BAD_COMBINATION) opAVX_X_XM_IMM(y, op, T_0F38 | T_66 | T_W0 | T_YMM | T_EVEX | T_EW1 | T_N8, 0x19); }\n");
|
||||||
const struct Tbl {
|
const struct Tbl {
|
||||||
const char *name;
|
const char *name;
|
||||||
uint8 code;
|
uint8_t code;
|
||||||
int type;
|
int type;
|
||||||
bool ew1;
|
bool ew1;
|
||||||
} tbl[] = {
|
} tbl[] = {
|
||||||
|
@ -1454,40 +1528,40 @@ void put()
|
||||||
for (size_t i = 0; i < NUM_OF_ARRAY(tbl); i++) {
|
for (size_t i = 0; i < NUM_OF_ARRAY(tbl); i++) {
|
||||||
const Tbl& p = tbl[i];
|
const Tbl& p = tbl[i];
|
||||||
std::string type = type2String(p.type);
|
std::string type = type2String(p.type);
|
||||||
printf("void %s(const Xmm& x, const Operand& op) { if (!(op.isXMM() || op.isMEM())) throw Error(ERR_BAD_COMBINATION); opAVX_X_XM_IMM(x, op, %s, 0x%02X); }\n", p.name, type.c_str(), p.code);
|
printf("void %s(const Xmm& x, const Operand& op) { if (!(op.isXMM() || op.isMEM())) XBYAK_THROW(ERR_BAD_COMBINATION) opAVX_X_XM_IMM(x, op, %s, 0x%02X); }\n", p.name, type.c_str(), p.code);
|
||||||
}
|
}
|
||||||
|
|
||||||
puts("void vextractf128(const Operand& op, const Ymm& y, uint8 imm) { if (!(op.isXMEM() && y.isYMM())) throw Error(ERR_BAD_COMBINATION); opVex(y, 0, op, T_0F3A | T_66 | T_W0 | T_YMM, 0x19, imm); }");
|
puts("void vextractf128(const Operand& op, const Ymm& y, uint8_t imm) { if (!(op.isXMEM() && y.isYMM())) XBYAK_THROW(ERR_BAD_COMBINATION) opVex(y, 0, op, T_0F3A | T_66 | T_W0 | T_YMM, 0x19, imm); }");
|
||||||
puts("void vextracti128(const Operand& op, const Ymm& y, uint8 imm) { if (!(op.isXMEM() && y.isYMM())) throw Error(ERR_BAD_COMBINATION); opVex(y, 0, op, T_0F3A | T_66 | T_W0 | T_YMM, 0x39, imm); }");
|
puts("void vextracti128(const Operand& op, const Ymm& y, uint8_t imm) { if (!(op.isXMEM() && y.isYMM())) XBYAK_THROW(ERR_BAD_COMBINATION) opVex(y, 0, op, T_0F3A | T_66 | T_W0 | T_YMM, 0x39, imm); }");
|
||||||
puts("void vextractps(const Operand& op, const Xmm& x, uint8 imm) { if (!((op.isREG(32) || op.isMEM()) && x.isXMM())) throw Error(ERR_BAD_COMBINATION); opVex(x, 0, op, T_0F3A | T_66 | T_W0 | T_EVEX | T_N4, 0x17, imm); }");
|
puts("void vextractps(const Operand& op, const Xmm& x, uint8_t imm) { if (!((op.isREG(32) || op.isMEM()) && x.isXMM())) XBYAK_THROW(ERR_BAD_COMBINATION) opVex(x, 0, op, T_0F3A | T_66 | T_W0 | T_EVEX | T_N4, 0x17, imm); }");
|
||||||
puts("void vinsertf128(const Ymm& y1, const Ymm& y2, const Operand& op, uint8 imm) { if (!(y1.isYMM() && y2.isYMM() && op.isXMEM())) throw Error(ERR_BAD_COMBINATION); opVex(y1, &y2, op, T_0F3A | T_66 | T_W0 | T_YMM, 0x18, imm); }");
|
puts("void vinsertf128(const Ymm& y1, const Ymm& y2, const Operand& op, uint8_t imm) { if (!(y1.isYMM() && y2.isYMM() && op.isXMEM())) XBYAK_THROW(ERR_BAD_COMBINATION) opVex(y1, &y2, op, T_0F3A | T_66 | T_W0 | T_YMM, 0x18, imm); }");
|
||||||
puts("void vinserti128(const Ymm& y1, const Ymm& y2, const Operand& op, uint8 imm) { if (!(y1.isYMM() && y2.isYMM() && op.isXMEM())) throw Error(ERR_BAD_COMBINATION); opVex(y1, &y2, op, T_0F3A | T_66 | T_W0 | T_YMM, 0x38, imm); }");
|
puts("void vinserti128(const Ymm& y1, const Ymm& y2, const Operand& op, uint8_t imm) { if (!(y1.isYMM() && y2.isYMM() && op.isXMEM())) XBYAK_THROW(ERR_BAD_COMBINATION) opVex(y1, &y2, op, T_0F3A | T_66 | T_W0 | T_YMM, 0x38, imm); }");
|
||||||
puts("void vperm2f128(const Ymm& y1, const Ymm& y2, const Operand& op, uint8 imm) { if (!(y1.isYMM() && y2.isYMM() && op.isYMEM())) throw Error(ERR_BAD_COMBINATION); opVex(y1, &y2, op, T_0F3A | T_66 | T_W0 | T_YMM, 0x06, imm); }");
|
puts("void vperm2f128(const Ymm& y1, const Ymm& y2, const Operand& op, uint8_t imm) { if (!(y1.isYMM() && y2.isYMM() && op.isYMEM())) XBYAK_THROW(ERR_BAD_COMBINATION) opVex(y1, &y2, op, T_0F3A | T_66 | T_W0 | T_YMM, 0x06, imm); }");
|
||||||
puts("void vperm2i128(const Ymm& y1, const Ymm& y2, const Operand& op, uint8 imm) { if (!(y1.isYMM() && y2.isYMM() && op.isYMEM())) throw Error(ERR_BAD_COMBINATION); opVex(y1, &y2, op, T_0F3A | T_66 | T_W0 | T_YMM, 0x46, imm); }");
|
puts("void vperm2i128(const Ymm& y1, const Ymm& y2, const Operand& op, uint8_t imm) { if (!(y1.isYMM() && y2.isYMM() && op.isYMEM())) XBYAK_THROW(ERR_BAD_COMBINATION) opVex(y1, &y2, op, T_0F3A | T_66 | T_W0 | T_YMM, 0x46, imm); }");
|
||||||
|
|
||||||
puts("void vlddqu(const Xmm& x, const Address& addr) { opAVX_X_X_XM(x, cvtIdx0(x), addr, T_0F | T_F2 | T_W0 | T_YMM, 0xF0); }");
|
puts("void vlddqu(const Xmm& x, const Address& addr) { opAVX_X_X_XM(x, cvtIdx0(x), addr, T_0F | T_F2 | T_W0 | T_YMM, 0xF0); }");
|
||||||
puts("void vldmxcsr(const Address& addr) { opAVX_X_X_XM(xm2, xm0, addr, T_0F, 0xAE); }");
|
puts("void vldmxcsr(const Address& addr) { opAVX_X_X_XM(xm2, xm0, addr, T_0F, 0xAE); }");
|
||||||
puts("void vstmxcsr(const Address& addr) { opAVX_X_X_XM(xm3, xm0, addr, T_0F, 0xAE); }");
|
puts("void vstmxcsr(const Address& addr) { opAVX_X_X_XM(xm3, xm0, addr, T_0F, 0xAE); }");
|
||||||
puts("void vmaskmovdqu(const Xmm& x1, const Xmm& x2) { opAVX_X_X_XM(x1, xm0, x2, T_0F | T_66, 0xF7); }");
|
puts("void vmaskmovdqu(const Xmm& x1, const Xmm& x2) { opAVX_X_X_XM(x1, xm0, x2, T_0F | T_66, 0xF7); }");
|
||||||
|
|
||||||
puts("void vpextrb(const Operand& op, const Xmm& x, uint8 imm) { if (!((op.isREG(8|16|i32e) || op.isMEM()) && x.isXMM())) throw Error(ERR_BAD_COMBINATION); opVex(x, 0, op, T_0F3A | T_66 | T_EVEX | T_N1, 0x14, imm); }");
|
puts("void vpextrb(const Operand& op, const Xmm& x, uint8_t imm) { if (!((op.isREG(8|16|i32e) || op.isMEM()) && x.isXMM())) XBYAK_THROW(ERR_BAD_COMBINATION) opVex(x, 0, op, T_0F3A | T_66 | T_EVEX | T_N1, 0x14, imm); }");
|
||||||
puts("void vpextrw(const Operand& op, const Xmm& x, uint8 imm) { if (!((op.isREG(16|i32e) || op.isMEM()) && x.isXMM())) throw Error(ERR_BAD_COMBINATION); if (op.isREG() && x.getIdx() < 16) { opAVX_X_X_XM(Xmm(op.getIdx()), xm0, x, T_0F | T_66, 0xC5, imm); } else { opVex(x, 0, op, T_0F3A | T_66 | T_EVEX | T_N2, 0x15, imm); } }");
|
puts("void vpextrw(const Operand& op, const Xmm& x, uint8_t imm) { if (!((op.isREG(16|i32e) || op.isMEM()) && x.isXMM())) XBYAK_THROW(ERR_BAD_COMBINATION) if (op.isREG() && x.getIdx() < 16) { opAVX_X_X_XM(Xmm(op.getIdx()), xm0, x, T_0F | T_66, 0xC5, imm); } else { opVex(x, 0, op, T_0F3A | T_66 | T_EVEX | T_N2, 0x15, imm); } }");
|
||||||
puts("void vpextrd(const Operand& op, const Xmm& x, uint8 imm) { if (!((op.isREG(32) || op.isMEM()) && x.isXMM())) throw Error(ERR_BAD_COMBINATION); opVex(x, 0, op, T_0F3A | T_66 | T_W0 | T_EVEX | T_EW0 | T_N4, 0x16, imm); }");
|
puts("void vpextrd(const Operand& op, const Xmm& x, uint8_t imm) { if (!((op.isREG(32) || op.isMEM()) && x.isXMM())) XBYAK_THROW(ERR_BAD_COMBINATION) opVex(x, 0, op, T_0F3A | T_66 | T_W0 | T_EVEX | T_EW0 | T_N4, 0x16, imm); }");
|
||||||
puts("void vpextrq(const Operand& op, const Xmm& x, uint8 imm) { if (!((op.isREG(64) || op.isMEM()) && x.isXMM())) throw Error(ERR_BAD_COMBINATION); opVex(x, 0, op, T_0F3A | T_66 | T_W1 | T_EVEX | T_EW1 | T_N8, 0x16, imm); }");
|
puts("void vpextrq(const Operand& op, const Xmm& x, uint8_t imm) { if (!((op.isREG(64) || op.isMEM()) && x.isXMM())) XBYAK_THROW(ERR_BAD_COMBINATION) opVex(x, 0, op, T_0F3A | T_66 | T_W1 | T_EVEX | T_EW1 | T_N8, 0x16, imm); }");
|
||||||
|
|
||||||
puts("void vpinsrb(const Xmm& x1, const Xmm& x2, const Operand& op, uint8 imm) { if (!(x1.isXMM() && x2.isXMM() && (op.isREG(32) || op.isMEM()))) throw Error(ERR_BAD_COMBINATION); opVex(x1, &x2, op, T_0F3A | T_66 | T_EVEX | T_N1, 0x20, imm); }");
|
puts("void vpinsrb(const Xmm& x1, const Xmm& x2, const Operand& op, uint8_t imm) { if (!(x1.isXMM() && x2.isXMM() && (op.isREG(32) || op.isMEM()))) XBYAK_THROW(ERR_BAD_COMBINATION) opVex(x1, &x2, op, T_0F3A | T_66 | T_EVEX | T_N1, 0x20, imm); }");
|
||||||
puts("void vpinsrw(const Xmm& x1, const Xmm& x2, const Operand& op, uint8 imm) { if (!(x1.isXMM() && x2.isXMM() && (op.isREG(32) || op.isMEM()))) throw Error(ERR_BAD_COMBINATION); opVex(x1, &x2, op, T_0F | T_66 | T_EVEX | T_N2, 0xC4, imm); }");
|
puts("void vpinsrw(const Xmm& x1, const Xmm& x2, const Operand& op, uint8_t imm) { if (!(x1.isXMM() && x2.isXMM() && (op.isREG(32) || op.isMEM()))) XBYAK_THROW(ERR_BAD_COMBINATION) opVex(x1, &x2, op, T_0F | T_66 | T_EVEX | T_N2, 0xC4, imm); }");
|
||||||
puts("void vpinsrd(const Xmm& x1, const Xmm& x2, const Operand& op, uint8 imm) { if (!(x1.isXMM() && x2.isXMM() && (op.isREG(32) || op.isMEM()))) throw Error(ERR_BAD_COMBINATION); opVex(x1, &x2, op, T_0F3A | T_66 | T_W0 | T_EVEX | T_EW0 | T_N4, 0x22, imm); }");
|
puts("void vpinsrd(const Xmm& x1, const Xmm& x2, const Operand& op, uint8_t imm) { if (!(x1.isXMM() && x2.isXMM() && (op.isREG(32) || op.isMEM()))) XBYAK_THROW(ERR_BAD_COMBINATION) opVex(x1, &x2, op, T_0F3A | T_66 | T_W0 | T_EVEX | T_EW0 | T_N4, 0x22, imm); }");
|
||||||
puts("void vpinsrq(const Xmm& x1, const Xmm& x2, const Operand& op, uint8 imm) { if (!(x1.isXMM() && x2.isXMM() && (op.isREG(64) || op.isMEM()))) throw Error(ERR_BAD_COMBINATION); opVex(x1, &x2, op, T_0F3A | T_66 | T_W1 | T_EVEX | T_EW1 | T_N8, 0x22, imm); }");
|
puts("void vpinsrq(const Xmm& x1, const Xmm& x2, const Operand& op, uint8_t imm) { if (!(x1.isXMM() && x2.isXMM() && (op.isREG(64) || op.isMEM()))) XBYAK_THROW(ERR_BAD_COMBINATION) opVex(x1, &x2, op, T_0F3A | T_66 | T_W1 | T_EVEX | T_EW1 | T_N8, 0x22, imm); }");
|
||||||
|
|
||||||
puts("void vpmovmskb(const Reg32e& r, const Xmm& x) { if (!x.is(Operand::XMM | Operand::YMM)) throw Error(ERR_BAD_COMBINATION); opVex(x.isYMM() ? Ymm(r.getIdx()) : Xmm(r.getIdx()), 0, x, T_0F | T_66 | T_YMM, 0xD7); }");
|
puts("void vpmovmskb(const Reg32e& r, const Xmm& x) { if (!x.is(Operand::XMM | Operand::YMM)) XBYAK_THROW(ERR_BAD_COMBINATION) opVex(x.isYMM() ? Ymm(r.getIdx()) : Xmm(r.getIdx()), 0, x, T_0F | T_66 | T_YMM, 0xD7); }");
|
||||||
|
|
||||||
}
|
}
|
||||||
// (x, x, imm), (x, imm)
|
// (x, x, imm), (x, imm)
|
||||||
{
|
{
|
||||||
const struct Tbl {
|
const struct Tbl {
|
||||||
const char *name;
|
const char *name;
|
||||||
uint8 code;
|
uint8_t code;
|
||||||
int idx;
|
int idx;
|
||||||
int type;
|
int type;
|
||||||
} tbl[] = {
|
} tbl[] = {
|
||||||
|
@ -1505,14 +1579,14 @@ void put()
|
||||||
for (size_t i = 0; i < NUM_OF_ARRAY(tbl); i++) {
|
for (size_t i = 0; i < NUM_OF_ARRAY(tbl); i++) {
|
||||||
const Tbl& p = tbl[i];
|
const Tbl& p = tbl[i];
|
||||||
std::string type = type2String(p.type);
|
std::string type = type2String(p.type);
|
||||||
printf("void v%s(const Xmm& x, const Operand& op, uint8 imm) { opAVX_X_X_XM(Xmm(x.getKind(), %d), x, op, %s, 0x%02X, imm); }\n", p.name, p.idx, type.c_str(), p.code);
|
printf("void v%s(const Xmm& x, const Operand& op, uint8_t imm) { opAVX_X_X_XM(Xmm(x.getKind(), %d), x, op, %s, 0x%02X, imm); }\n", p.name, p.idx, type.c_str(), p.code);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// 4-op
|
// 4-op
|
||||||
{
|
{
|
||||||
const struct Tbl {
|
const struct Tbl {
|
||||||
const char *name;
|
const char *name;
|
||||||
uint8 code;
|
uint8_t code;
|
||||||
} tbl[] = {
|
} tbl[] = {
|
||||||
{ "vblendvpd", 0x4B },
|
{ "vblendvpd", 0x4B },
|
||||||
{ "vblendvps", 0x4A },
|
{ "vblendvps", 0x4A },
|
||||||
|
@ -1525,18 +1599,18 @@ void put()
|
||||||
}
|
}
|
||||||
// mov
|
// mov
|
||||||
{
|
{
|
||||||
printf("void vmovd(const Xmm& x, const Operand& op) { if (!op.isREG(32) && !op.isMEM()) throw Error(ERR_BAD_COMBINATION); opAVX_X_X_XM(x, xm0, op, T_0F | T_66 | T_W0 | T_EVEX | T_N4, 0x6E); }\n");
|
printf("void vmovd(const Xmm& x, const Operand& op) { if (!op.isREG(32) && !op.isMEM()) XBYAK_THROW(ERR_BAD_COMBINATION) opAVX_X_X_XM(x, xm0, op, T_0F | T_66 | T_W0 | T_EVEX | T_N4, 0x6E); }\n");
|
||||||
printf("void vmovd(const Operand& op, const Xmm& x) { if (!op.isREG(32) && !op.isMEM()) throw Error(ERR_BAD_COMBINATION); opAVX_X_X_XM(x, xm0, op, T_0F | T_66 | T_W0 | T_EVEX | T_N4, 0x7E); }\n");
|
printf("void vmovd(const Operand& op, const Xmm& x) { if (!op.isREG(32) && !op.isMEM()) XBYAK_THROW(ERR_BAD_COMBINATION) opAVX_X_X_XM(x, xm0, op, T_0F | T_66 | T_W0 | T_EVEX | T_N4, 0x7E); }\n");
|
||||||
|
|
||||||
printf("void vmovq(const Xmm& x, const Address& addr) { int type, code; if (x.getIdx() < 16) { type = T_0F | T_F3; code = 0x7E; } else { type = T_0F | T_66 | T_EVEX | T_EW1 | T_N8; code = 0x6E; } opAVX_X_X_XM(x, xm0, addr, type, code); }\n");
|
printf("void vmovq(const Xmm& x, const Address& addr) { int type, code; if (x.getIdx() < 16) { type = T_0F | T_F3; code = 0x7E; } else { type = T_0F | T_66 | T_EVEX | T_EW1 | T_N8; code = 0x6E; } opAVX_X_X_XM(x, xm0, addr, type, code); }\n");
|
||||||
printf("void vmovq(const Address& addr, const Xmm& x) { opAVX_X_X_XM(x, xm0, addr, T_0F | T_66 | T_EVEX | T_EW1 | T_N8, x.getIdx() < 16 ? 0xD6 : 0x7E); }\n");
|
printf("void vmovq(const Address& addr, const Xmm& x) { opAVX_X_X_XM(x, xm0, addr, T_0F | T_66 | T_EVEX | T_EW1 | T_N8, x.getIdx() < 16 ? 0xD6 : 0x7E); }\n");
|
||||||
printf("void vmovq(const Xmm& x1, const Xmm& x2) { opAVX_X_X_XM(x1, xm0, x2, T_0F | T_F3 | T_EVEX | T_EW1 | T_N8, 0x7E); }\n");
|
printf("void vmovq(const Xmm& x1, const Xmm& x2) { opAVX_X_X_XM(x1, xm0, x2, T_0F | T_F3 | T_EVEX | T_EW1 | T_N8, 0x7E); }\n");
|
||||||
|
|
||||||
printf("void vmovhlps(const Xmm& x1, const Xmm& x2, const Operand& op = Operand()) { if (!op.isNone() && !op.isXMM()) throw Error(ERR_BAD_COMBINATION); opAVX_X_X_XM(x1, x2, op, T_0F | T_EVEX | T_EW0, 0x12); }\n");
|
printf("void vmovhlps(const Xmm& x1, const Xmm& x2, const Operand& op = Operand()) { if (!op.isNone() && !op.isXMM()) XBYAK_THROW(ERR_BAD_COMBINATION) opAVX_X_X_XM(x1, x2, op, T_0F | T_EVEX | T_EW0, 0x12); }\n");
|
||||||
printf("void vmovlhps(const Xmm& x1, const Xmm& x2, const Operand& op = Operand()) { if (!op.isNone() && !op.isXMM()) throw Error(ERR_BAD_COMBINATION); opAVX_X_X_XM(x1, x2, op, T_0F | T_EVEX | T_EW0, 0x16); }\n");
|
printf("void vmovlhps(const Xmm& x1, const Xmm& x2, const Operand& op = Operand()) { if (!op.isNone() && !op.isXMM()) XBYAK_THROW(ERR_BAD_COMBINATION) opAVX_X_X_XM(x1, x2, op, T_0F | T_EVEX | T_EW0, 0x16); }\n");
|
||||||
|
|
||||||
printf("void vmovmskpd(const Reg& r, const Xmm& x) { if (!r.isBit(i32e)) throw Error(ERR_BAD_COMBINATION); opAVX_X_X_XM(x.isXMM() ? Xmm(r.getIdx()) : Ymm(r.getIdx()), cvtIdx0(x), x, T_0F | T_66 | T_W0 | T_YMM, 0x50); }\n");
|
printf("void vmovmskpd(const Reg& r, const Xmm& x) { if (!r.isBit(i32e)) XBYAK_THROW(ERR_BAD_COMBINATION) opAVX_X_X_XM(x.isXMM() ? Xmm(r.getIdx()) : Ymm(r.getIdx()), cvtIdx0(x), x, T_0F | T_66 | T_W0 | T_YMM, 0x50); }\n");
|
||||||
printf("void vmovmskps(const Reg& r, const Xmm& x) { if (!r.isBit(i32e)) throw Error(ERR_BAD_COMBINATION); opAVX_X_X_XM(x.isXMM() ? Xmm(r.getIdx()) : Ymm(r.getIdx()), cvtIdx0(x), x, T_0F | T_W0 | T_YMM, 0x50); }\n");
|
printf("void vmovmskps(const Reg& r, const Xmm& x) { if (!r.isBit(i32e)) XBYAK_THROW(ERR_BAD_COMBINATION) opAVX_X_X_XM(x.isXMM() ? Xmm(r.getIdx()) : Ymm(r.getIdx()), cvtIdx0(x), x, T_0F | T_W0 | T_YMM, 0x50); }\n");
|
||||||
|
|
||||||
puts("void vmovntdq(const Address& addr, const Xmm& x) { opVex(x, 0, addr, T_0F | T_66 | T_YMM | T_EVEX | T_EW0, 0xE7); }");
|
puts("void vmovntdq(const Address& addr, const Xmm& x) { opVex(x, 0, addr, T_0F | T_66 | T_YMM | T_EVEX | T_EW0, 0xE7); }");
|
||||||
puts("void vmovntpd(const Address& addr, const Xmm& x) { opVex(x, 0, addr, T_0F | T_66 | T_YMM | T_EVEX | T_EW1, 0x2B); }");
|
puts("void vmovntpd(const Address& addr, const Xmm& x) { opVex(x, 0, addr, T_0F | T_66 | T_YMM | T_EVEX | T_EW1, 0x2B); }");
|
||||||
|
@ -1549,7 +1623,7 @@ void put()
|
||||||
int type = T_0F | T_EVEX;
|
int type = T_0F | T_EVEX;
|
||||||
type |= i == 0 ? (T_F2 | T_EW1 | T_N8) : (T_F3 | T_EW0 | T_N4);
|
type |= i == 0 ? (T_F2 | T_EW1 | T_N8) : (T_F3 | T_EW0 | T_N4);
|
||||||
std::string s = type2String(type);
|
std::string s = type2String(type);
|
||||||
printf("void vmovs%c(const Xmm& x1, const Xmm& x2, const Operand& op = Operand()) { if (!op.isNone() && !op.isXMM()) throw Error(ERR_BAD_COMBINATION); opAVX_X_X_XM(x1, x2, op, %s, 0x10); }\n", c1, s.c_str());
|
printf("void vmovs%c(const Xmm& x1, const Xmm& x2, const Operand& op = Operand()) { if (!op.isNone() && !op.isXMM()) XBYAK_THROW(ERR_BAD_COMBINATION) opAVX_X_X_XM(x1, x2, op, %s, 0x10); }\n", c1, s.c_str());
|
||||||
printf("void vmovs%c(const Xmm& x, const Address& addr) { opAVX_X_X_XM(x, xm0, addr, %s, 0x10); }\n", c1, s.c_str());
|
printf("void vmovs%c(const Xmm& x, const Address& addr) { opAVX_X_X_XM(x, xm0, addr, %s, 0x10); }\n", c1, s.c_str());
|
||||||
printf("void vmovs%c(const Address& addr, const Xmm& x) { opAVX_X_X_XM(x, xm0, addr, %s | T_M_K, 0x11); }\n", c1, s.c_str());
|
printf("void vmovs%c(const Address& addr, const Xmm& x) { opAVX_X_X_XM(x, xm0, addr, %s | T_M_K, 0x11); }\n", c1, s.c_str());
|
||||||
}
|
}
|
||||||
|
@ -1574,7 +1648,7 @@ void put()
|
||||||
puts("void vcvttpd2dq(const Xmm& x, const Operand& op) { opCvt2(x, op, T_66 | T_0F | T_YMM | T_EVEX |T_EW1 | T_B64 | T_ER_Z, 0xE6); }");
|
puts("void vcvttpd2dq(const Xmm& x, const Operand& op) { opCvt2(x, op, T_66 | T_0F | T_YMM | T_EVEX |T_EW1 | T_B64 | T_ER_Z, 0xE6); }");
|
||||||
|
|
||||||
puts("void vcvtph2ps(const Xmm& x, const Operand& op) { checkCvt1(x, op); opVex(x, 0, op, T_0F38 | T_66 | T_W0 | T_EVEX | T_EW0 | T_N8 | T_N_VL | T_SAE_Y, 0x13); }");
|
puts("void vcvtph2ps(const Xmm& x, const Operand& op) { checkCvt1(x, op); opVex(x, 0, op, T_0F38 | T_66 | T_W0 | T_EVEX | T_EW0 | T_N8 | T_N_VL | T_SAE_Y, 0x13); }");
|
||||||
puts("void vcvtps2ph(const Operand& op, const Xmm& x, uint8 imm) { checkCvt1(x, op); opVex(x, 0, op, T_0F3A | T_66 | T_W0 | T_EVEX | T_EW0 | T_N8 | T_N_VL | T_SAE_Y, 0x1D, imm); }");
|
puts("void vcvtps2ph(const Operand& op, const Xmm& x, uint8_t imm) { checkCvt1(x, op); opVex(x, 0, op, T_0F3A | T_66 | T_W0 | T_EVEX | T_EW0 | T_N8 | T_N_VL | T_SAE_Y, 0x1D, imm); }");
|
||||||
|
|
||||||
}
|
}
|
||||||
// haswell gpr(reg, reg, r/m)
|
// haswell gpr(reg, reg, r/m)
|
||||||
|
@ -1582,7 +1656,7 @@ void put()
|
||||||
const struct Tbl {
|
const struct Tbl {
|
||||||
const char *name;
|
const char *name;
|
||||||
int type;
|
int type;
|
||||||
uint8 code;
|
uint8_t code;
|
||||||
} tbl[] = {
|
} tbl[] = {
|
||||||
{ "andn", T_0F38, 0xF2 },
|
{ "andn", T_0F38, 0xF2 },
|
||||||
{ "mulx", T_F2 | T_0F38, 0xF6 },
|
{ "mulx", T_F2 | T_0F38, 0xF6 },
|
||||||
|
@ -1599,7 +1673,7 @@ void put()
|
||||||
const struct Tbl {
|
const struct Tbl {
|
||||||
const char *name;
|
const char *name;
|
||||||
int type;
|
int type;
|
||||||
uint8 code;
|
uint8_t code;
|
||||||
} tbl[] = {
|
} tbl[] = {
|
||||||
{ "bextr", T_0F38, 0xF7 },
|
{ "bextr", T_0F38, 0xF7 },
|
||||||
{ "bzhi", T_0F38, 0xF5 },
|
{ "bzhi", T_0F38, 0xF5 },
|
||||||
|
@ -1611,15 +1685,15 @@ void put()
|
||||||
const Tbl& p = tbl[i];
|
const Tbl& p = tbl[i];
|
||||||
printf("void %s(const Reg32e& r1, const Operand& op, const Reg32e& r2) { opGpr(r1, op, r2, %s, 0x%x, false); }\n", p.name, type2String(p.type).c_str(), p.code);
|
printf("void %s(const Reg32e& r1, const Operand& op, const Reg32e& r2) { opGpr(r1, op, r2, %s, 0x%x, false); }\n", p.name, type2String(p.type).c_str(), p.code);
|
||||||
}
|
}
|
||||||
puts("void rorx(const Reg32e& r, const Operand& op, uint8 imm) { opGpr(r, op, Reg32e(0, r.getBit()), T_0F3A | T_F2, 0xF0, false, imm); }");
|
puts("void rorx(const Reg32e& r, const Operand& op, uint8_t imm) { opGpr(r, op, Reg32e(0, r.getBit()), T_0F3A | T_F2, 0xF0, false, imm); }");
|
||||||
}
|
}
|
||||||
// gpr(reg, r/m)
|
// gpr(reg, r/m)
|
||||||
{
|
{
|
||||||
const struct Tbl {
|
const struct Tbl {
|
||||||
const char *name;
|
const char *name;
|
||||||
int type;
|
int type;
|
||||||
uint8 code;
|
uint8_t code;
|
||||||
uint8 idx;
|
uint8_t idx;
|
||||||
} tbl[] = {
|
} tbl[] = {
|
||||||
{ "blsi", T_0F38, 0xF3, 3 },
|
{ "blsi", T_0F38, 0xF3, 3 },
|
||||||
{ "blsmsk", T_0F38, 0xF3, 2 },
|
{ "blsmsk", T_0F38, 0xF3, 2 },
|
||||||
|
@ -1637,7 +1711,7 @@ void put()
|
||||||
const int x_vy_x = 2;
|
const int x_vy_x = 2;
|
||||||
const struct Tbl {
|
const struct Tbl {
|
||||||
const char *name;
|
const char *name;
|
||||||
uint8 code;
|
uint8_t code;
|
||||||
int w;
|
int w;
|
||||||
int mode;
|
int mode;
|
||||||
} tbl[] = {
|
} tbl[] = {
|
||||||
|
@ -1669,6 +1743,7 @@ void put32()
|
||||||
{ "aas", 0x3F },
|
{ "aas", 0x3F },
|
||||||
{ "daa", 0x27 },
|
{ "daa", 0x27 },
|
||||||
{ "das", 0x2F },
|
{ "das", 0x2F },
|
||||||
|
{ "into", 0xCE },
|
||||||
{ "popad", 0x61 },
|
{ "popad", 0x61 },
|
||||||
{ "popfd", 0x9D },
|
{ "popfd", 0x9D },
|
||||||
{ "pusha", 0x60 },
|
{ "pusha", 0x60 },
|
||||||
|
@ -1677,6 +1752,8 @@ void put32()
|
||||||
{ "popa", 0x61 },
|
{ "popa", 0x61 },
|
||||||
};
|
};
|
||||||
putGeneric(tbl, NUM_OF_ARRAY(tbl));
|
putGeneric(tbl, NUM_OF_ARRAY(tbl));
|
||||||
|
putLoadSeg("lds", 0xC5, NONE);
|
||||||
|
putLoadSeg("les", 0xC4, NONE);
|
||||||
}
|
}
|
||||||
|
|
||||||
void put64()
|
void put64()
|
||||||
|
@ -1688,18 +1765,24 @@ void put64()
|
||||||
{ "cdqe", 0x48, 0x98 },
|
{ "cdqe", 0x48, 0x98 },
|
||||||
{ "cqo", 0x48, 0x99 },
|
{ "cqo", 0x48, 0x99 },
|
||||||
{ "cmpsq", 0x48, 0xA7 },
|
{ "cmpsq", 0x48, 0xA7 },
|
||||||
|
{ "popfq", 0x9D },
|
||||||
|
{ "pushfq", 0x9C },
|
||||||
|
{ "lodsq", 0x48, 0xAD },
|
||||||
{ "movsq", 0x48, 0xA5 },
|
{ "movsq", 0x48, 0xA5 },
|
||||||
{ "scasq", 0x48, 0xAF },
|
{ "scasq", 0x48, 0xAF },
|
||||||
{ "stosq", 0x48, 0xAB },
|
{ "stosq", 0x48, 0xAB },
|
||||||
|
{ "syscall", 0x0F, 0x05 },
|
||||||
|
{ "sysret", 0x0F, 0x07 },
|
||||||
};
|
};
|
||||||
putGeneric(tbl, NUM_OF_ARRAY(tbl));
|
putGeneric(tbl, NUM_OF_ARRAY(tbl));
|
||||||
|
|
||||||
puts("void cmpxchg16b(const Address& addr) { opModM(addr, Reg64(1), 0x0F, 0xC7); }");
|
putMemOp("cmpxchg16b", 0, 1, 0x0F, 0xC7, 64);
|
||||||
|
putMemOp("fxrstor64", 0, 1, 0x0F, 0xAE, 64);
|
||||||
puts("void movq(const Reg64& reg, const Mmx& mmx) { if (mmx.isXMM()) db(0x66); opModR(mmx, reg, 0x0F, 0x7E); }");
|
puts("void movq(const Reg64& reg, const Mmx& mmx) { if (mmx.isXMM()) db(0x66); opModR(mmx, reg, 0x0F, 0x7E); }");
|
||||||
puts("void movq(const Mmx& mmx, const Reg64& reg) { if (mmx.isXMM()) db(0x66); opModR(mmx, reg, 0x0F, 0x6E); }");
|
puts("void movq(const Mmx& mmx, const Reg64& reg) { if (mmx.isXMM()) db(0x66); opModR(mmx, reg, 0x0F, 0x6E); }");
|
||||||
puts("void movsxd(const Reg64& reg, const Operand& op) { if (!op.isBit(32)) throw Error(ERR_BAD_COMBINATION); opModRM(reg, op, op.isREG(), op.isMEM(), 0x63); }");
|
puts("void movsxd(const Reg64& reg, const Operand& op) { if (!op.isBit(32)) XBYAK_THROW(ERR_BAD_COMBINATION) opModRM(reg, op, op.isREG(), op.isMEM(), 0x63); }");
|
||||||
puts("void pextrq(const Operand& op, const Xmm& xmm, uint8 imm) { if (!op.isREG(64) && !op.isMEM()) throw Error(ERR_BAD_COMBINATION); opGen(Reg64(xmm.getIdx()), op, 0x16, 0x66, 0, imm, 0x3A); }");
|
puts("void pextrq(const Operand& op, const Xmm& xmm, uint8_t imm) { if (!op.isREG(64) && !op.isMEM()) XBYAK_THROW(ERR_BAD_COMBINATION) opGen(Reg64(xmm.getIdx()), op, 0x16, 0x66, 0, imm, 0x3A); }");
|
||||||
puts("void pinsrq(const Xmm& xmm, const Operand& op, uint8 imm) { if (!op.isREG(64) && !op.isMEM()) throw Error(ERR_BAD_COMBINATION); opGen(Reg64(xmm.getIdx()), op, 0x22, 0x66, 0, imm, 0x3A); }");
|
puts("void pinsrq(const Xmm& xmm, const Operand& op, uint8_t imm) { if (!op.isREG(64) && !op.isMEM()) XBYAK_THROW(ERR_BAD_COMBINATION) opGen(Reg64(xmm.getIdx()), op, 0x22, 0x66, 0, imm, 0x3A); }");
|
||||||
|
|
||||||
puts("void vcvtss2si(const Reg64& r, const Operand& op) { opAVX_X_X_XM(Xmm(r.getIdx()), xm0, op, T_0F | T_F3 | T_W1 | T_EVEX | T_EW1 | T_ER_X | T_N8, 0x2D); }");
|
puts("void vcvtss2si(const Reg64& r, const Operand& op) { opAVX_X_X_XM(Xmm(r.getIdx()), xm0, op, T_0F | T_F3 | T_W1 | T_EVEX | T_EW1 | T_ER_X | T_N8, 0x2D); }");
|
||||||
puts("void vcvttss2si(const Reg64& r, const Operand& op) { opAVX_X_X_XM(Xmm(r.getIdx()), xm0, op, T_0F | T_F3 | T_W1 | T_EVEX | T_EW1 | T_SAE_X | T_N8, 0x2C); }");
|
puts("void vcvttss2si(const Reg64& r, const Operand& op) { opAVX_X_X_XM(Xmm(r.getIdx()), xm0, op, T_0F | T_F3 | T_W1 | T_EVEX | T_EW1 | T_SAE_X | T_N8, 0x2C); }");
|
||||||
|
@ -1710,10 +1793,35 @@ void put64()
|
||||||
puts("void vmovq(const Reg64& r, const Xmm& x) { opAVX_X_X_XM(x, xm0, Xmm(r.getIdx()), T_66 | T_0F | T_W1 | T_EVEX | T_EW1, 0x7E); }");
|
puts("void vmovq(const Reg64& r, const Xmm& x) { opAVX_X_X_XM(x, xm0, Xmm(r.getIdx()), T_66 | T_0F | T_W1 | T_EVEX | T_EW1, 0x7E); }");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void putAMX_TILE()
|
||||||
|
{
|
||||||
|
puts("void ldtilecfg(const Address& addr) { opVex(tmm0, &tmm0, addr, T_0F38 | T_W0, 0x49); }");
|
||||||
|
puts("void sttilecfg(const Address& addr) { opVex(tmm0, &tmm0, addr, T_66 | T_0F38 | T_W0, 0x49); }");
|
||||||
|
puts("void tileloadd(const Tmm& tm, const Address& addr) { opAMX(tm, addr, T_F2 | T_0F38 | T_W0, 0x4b); }");
|
||||||
|
puts("void tileloaddt1(const Tmm& tm, const Address& addr) { opAMX(tm, addr, T_66 | T_0F38 | T_W0, 0x4b); }");
|
||||||
|
puts("void tilerelease() { db(0xc4); db(0xe2); db(0x78); db(0x49); db(0xc0); }");
|
||||||
|
puts("void tilestored(const Address& addr, const Tmm& tm) { opVex(tm, &tmm0, addr, T_F3 | T_0F38 | T_W0, 0x4b); }");
|
||||||
|
puts("void tilezero(const Tmm& Tmm) { opVex(Tmm, &tmm0, tmm0, T_F2 | T_0F38 | T_W0, 0x49); }");
|
||||||
|
}
|
||||||
|
void putAMX_INT8()
|
||||||
|
{
|
||||||
|
puts("void tdpbssd(const Tmm& x1, const Tmm& x2, const Tmm& x3) { opVex(x1, &x3, x2, T_F2 | T_0F38 | T_W0, 0x5e); }");
|
||||||
|
puts("void tdpbsud(const Tmm& x1, const Tmm& x2, const Tmm& x3) { opVex(x1, &x3, x2, T_F3 | T_0F38 | T_W0, 0x5e); }");
|
||||||
|
puts("void tdpbusd(const Tmm& x1, const Tmm& x2, const Tmm& x3) { opVex(x1, &x3, x2, T_66 | T_0F38 | T_W0, 0x5e); }");
|
||||||
|
puts("void tdpbuud(const Tmm& x1, const Tmm& x2, const Tmm& x3) { opVex(x1, &x3, x2, T_0F38 | T_W0, 0x5e); }");
|
||||||
|
}
|
||||||
|
void putAMX_BF16()
|
||||||
|
{
|
||||||
|
puts("void tdpbf16ps(const Tmm& x1, const Tmm& x2, const Tmm& x3) { opVex(x1, &x3, x2, T_F3 | T_0F38 | T_W0, 0x5c); }");
|
||||||
|
}
|
||||||
|
|
||||||
void putFixed()
|
void putFixed()
|
||||||
{
|
{
|
||||||
puts("#ifdef XBYAK64");
|
puts("#ifdef XBYAK64");
|
||||||
put64();
|
put64();
|
||||||
|
putAMX_TILE();
|
||||||
|
putAMX_INT8();
|
||||||
|
putAMX_BF16();
|
||||||
puts("#else");
|
puts("#else");
|
||||||
put32();
|
put32();
|
||||||
puts("#endif");
|
puts("#endif");
|
||||||
|
@ -1724,7 +1832,7 @@ void putFixed()
|
||||||
for (size_t i = 0; i < NUM_OF_ARRAY(tbl); i++) {
|
for (size_t i = 0; i < NUM_OF_ARRAY(tbl); i++) {
|
||||||
const char *name = tbl[i];
|
const char *name = tbl[i];
|
||||||
printf("void %s(const Operand& op1, const Operand& op2) { %s_(op1, op2); }\n", name, name);
|
printf("void %s(const Operand& op1, const Operand& op2) { %s_(op1, op2); }\n", name, name);
|
||||||
printf("void %s(const Operand& op, uint32 imm) { %s_(op, imm); }\n", name, name);
|
printf("void %s(const Operand& op, uint32_t imm) { %s_(op, imm); }\n", name, name);
|
||||||
}
|
}
|
||||||
puts("void not(const Operand& op) { not_(op); }");
|
puts("void not(const Operand& op) { not_(op); }");
|
||||||
puts("#endif");
|
puts("#endif");
|
||||||
|
@ -1732,10 +1840,10 @@ void putFixed()
|
||||||
|
|
||||||
void putOmit()
|
void putOmit()
|
||||||
{
|
{
|
||||||
puts("void vpinsrb(const Xmm& x, const Operand& op, uint8 imm) { vpinsrb(x, x, op, imm); }");
|
puts("void vpinsrb(const Xmm& x, const Operand& op, uint8_t imm) { vpinsrb(x, x, op, imm); }");
|
||||||
puts("void vpinsrd(const Xmm& x, const Operand& op, uint8 imm) { vpinsrd(x, x, op, imm); }");
|
puts("void vpinsrd(const Xmm& x, const Operand& op, uint8_t imm) { vpinsrd(x, x, op, imm); }");
|
||||||
puts("void vpinsrq(const Xmm& x, const Operand& op, uint8 imm) { vpinsrq(x, x, op, imm); }");
|
puts("void vpinsrq(const Xmm& x, const Operand& op, uint8_t imm) { vpinsrq(x, x, op, imm); }");
|
||||||
puts("void vpinsrw(const Xmm& x, const Operand& op, uint8 imm) { vpinsrw(x, x, op, imm); }");
|
puts("void vpinsrw(const Xmm& x, const Operand& op, uint8_t imm) { vpinsrw(x, x, op, imm); }");
|
||||||
|
|
||||||
puts("void vcvtsi2sd(const Xmm& x, const Operand& op) { vcvtsi2sd(x, x, op); }");
|
puts("void vcvtsi2sd(const Xmm& x, const Operand& op) { vcvtsi2sd(x, x, op); }");
|
||||||
puts("void vcvtsi2ss(const Xmm& x, const Operand& op) { vcvtsi2ss(x, x, op); }");
|
puts("void vcvtsi2ss(const Xmm& x, const Operand& op) { vcvtsi2ss(x, x, op); }");
|
||||||
|
@ -1769,7 +1877,7 @@ void putOmit()
|
||||||
};
|
};
|
||||||
for (size_t i = 0; i < NUM_OF_ARRAY(tbl); i++) {
|
for (size_t i = 0; i < NUM_OF_ARRAY(tbl); i++) {
|
||||||
const char *name = tbl[i];
|
const char *name = tbl[i];
|
||||||
printf("void v%s(const Xmm& x, uint8 imm) { v%s(x, x, imm); }\n", name, name);
|
printf("void v%s(const Xmm& x, uint8_t imm) { v%s(x, x, imm); }\n", name, name);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
{
|
{
|
||||||
|
|
101
readme.md
101
readme.md
|
@ -1,22 +1,25 @@
|
||||||
|
[![Build Status](https://travis-ci.org/herumi/xbyak.png)](https://travis-ci.org/herumi/xbyak)
|
||||||
|
|
||||||
# Xbyak 5.78 ; JIT assembler for x86(IA32), x64(AMD64, x86-64) by C++
|
# Xbyak 5.97 ; JIT assembler for x86(IA32), x64(AMD64, x86-64) by C++
|
||||||
|
|
||||||
## Abstract
|
## Abstract
|
||||||
|
|
||||||
This is a header file which enables dynamically to assemble x86(IA32), x64(AMD64, x86-64) mnemonic.
|
Xbyak is a C++ header library that enables dynamically to assemble x86(IA32), x64(AMD64, x86-64) mnemonic.
|
||||||
|
|
||||||
## Feature
|
## Feature
|
||||||
* header file only
|
* header file only
|
||||||
* Intel/MASM like syntax
|
* Intel/MASM like syntax
|
||||||
* fully support AVX-512
|
* fully support AVX-512
|
||||||
|
|
||||||
**Note**: Xbyak uses and(), or(), xor(), not() functions, so `-fno-operator-names` option is necessary for gcc/clang.
|
**Note**:
|
||||||
|
Use `and_()`, `or_()`, ... instead of `and()`, `or()`.
|
||||||
|
If you want to use them, then specify `-fno-operator-names` option to gcc/clang.
|
||||||
|
|
||||||
Or define `XBYAK_NO_OP_NAMES` before including `xbyak.h` and use and_(), or_(), xor_(), not_() instead of them.
|
### News
|
||||||
|
- (break backward compatibility) `push(byte, imm)` (resp. `push(word, imm)`) forces to cast `imm` to 8(resp. 16) bit.
|
||||||
and_(), or_(), xor_(), not_() are always available.
|
- (Windows) `#include <winsock2.h>` has been removed from xbyak.h, so add it explicitly if you need it.
|
||||||
|
- support exception-less mode see. [Exception-less mode](#exception-less-mode)
|
||||||
`XBYAK_NO_OP_NAMES` will be defined in the feature version.
|
- `XBYAK_USE_MMAP_ALLOCATOR` will be defined on Linux/macOS unless `XBYAK_DONT_USE_MMAP_ALLOCATOR` is defined.
|
||||||
|
|
||||||
### Supported OS
|
### Supported OS
|
||||||
|
|
||||||
|
@ -47,7 +50,6 @@ These files are copied into `/usr/local/include/xbyak`.
|
||||||
|
|
||||||
Inherit `Xbyak::CodeGenerator` class and make the class method.
|
Inherit `Xbyak::CodeGenerator` class and make the class method.
|
||||||
```
|
```
|
||||||
#define XBYAK_NO_OP_NAMES
|
|
||||||
#include <xbyak/xbyak.h>
|
#include <xbyak/xbyak.h>
|
||||||
|
|
||||||
struct Code : Xbyak::CodeGenerator {
|
struct Code : Xbyak::CodeGenerator {
|
||||||
|
@ -58,6 +60,15 @@ struct Code : Xbyak::CodeGenerator {
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
```
|
```
|
||||||
|
Or you can pass the instance of CodeGenerator without inheriting.
|
||||||
|
```
|
||||||
|
void genCode(Xbyak::CodeGenerator& code, int x) {
|
||||||
|
using namespace Xbyak::util;
|
||||||
|
code.mov(eax, x);
|
||||||
|
code.ret();
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
Make an instance of the class and get the function
|
Make an instance of the class and get the function
|
||||||
pointer by calling `getCode()` and call it.
|
pointer by calling `getCode()` and call it.
|
||||||
```
|
```
|
||||||
|
@ -146,6 +157,8 @@ vfpclassps k5{k3}, [rax+64]{1to4}, 5 --> vfpclassps(k5|k3, yword_b [rax+64],
|
||||||
```
|
```
|
||||||
### Remark
|
### Remark
|
||||||
* `k1`, ..., `k7` are opmask registers.
|
* `k1`, ..., `k7` are opmask registers.
|
||||||
|
- `k0` is dealt as no mask.
|
||||||
|
- e.g. `vmovaps(zmm0|k0, ptr[rax]);` and `vmovaps(zmm0|T_z, ptr[rax]);` are same to `vmovaps(zmm0, ptr[rax]);`.
|
||||||
* use `| T_z`, `| T_sae`, `| T_rn_sae`, `| T_rd_sae`, `| T_ru_sae`, `| T_rz_sae` instead of `,{z}`, `,{sae}`, `,{rn-sae}`, `,{rd-sae}`, `,{ru-sae}`, `,{rz-sae}` respectively.
|
* use `| T_z`, `| T_sae`, `| T_rn_sae`, `| T_rd_sae`, `| T_ru_sae`, `| T_rz_sae` instead of `,{z}`, `,{sae}`, `,{rn-sae}`, `,{rd-sae}`, `,{ru-sae}`, `,{rz-sae}` respectively.
|
||||||
* `k4 | k3` is different from `k3 | k4`.
|
* `k4 | k3` is different from `k3 | k4`.
|
||||||
* use `ptr_b` for broadcast `{1toX}`. X is automatically determined.
|
* use `ptr_b` for broadcast `{1toX}`. X is automatically determined.
|
||||||
|
@ -212,6 +225,32 @@ void func1()
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
|
### short and long jump
|
||||||
|
Xbyak deals with jump mnemonics of an undefined label as short jump if no type is specified.
|
||||||
|
So if the size between jmp and label is larger than 127 byte, then xbyak will cause an error.
|
||||||
|
|
||||||
|
```
|
||||||
|
jmp("short-jmp"); // short jmp
|
||||||
|
// small code
|
||||||
|
L("short-jmp");
|
||||||
|
|
||||||
|
jmp("long-jmp");
|
||||||
|
// long code
|
||||||
|
L("long-jmp"); // throw exception
|
||||||
|
```
|
||||||
|
Then specify T_NEAR for jmp.
|
||||||
|
```
|
||||||
|
jmp("long-jmp", T_NEAR); // long jmp
|
||||||
|
// long code
|
||||||
|
L("long-jmp");
|
||||||
|
```
|
||||||
|
Or call `setDefaultJmpNEAR(true);` once, then the default type is set to T_NEAR.
|
||||||
|
```
|
||||||
|
jmp("long-jmp"); // long jmp
|
||||||
|
// long code
|
||||||
|
L("long-jmp");
|
||||||
|
```
|
||||||
|
|
||||||
### Label class
|
### Label class
|
||||||
|
|
||||||
`L()` and `jxx()` support Label class.
|
`L()` and `jxx()` support Label class.
|
||||||
|
@ -369,15 +408,22 @@ c.setProtectModeRE();
|
||||||
Call `readyRE()` instead of `ready()` when using `AutoGrow` mode.
|
Call `readyRE()` instead of `ready()` when using `AutoGrow` mode.
|
||||||
See [protect-re.cpp](sample/protect-re.cpp).
|
See [protect-re.cpp](sample/protect-re.cpp).
|
||||||
|
|
||||||
|
## Exception-less mode
|
||||||
|
If `XBYAK_NO_EXCEPTION` is defined, then gcc/clang can compile xbyak with `-fno-exceptions`.
|
||||||
|
In stead of throwing an exception, `Xbyak::GetError()` returns non-zero value (e.g. `ERR_BAD_ADDRESSING`) if there is something wrong.
|
||||||
|
The status will not be changed automatically, then you should reset it by `Xbyak::ClearError()`.
|
||||||
|
`CodeGenerator::reset()` calls `ClearError()`.
|
||||||
|
|
||||||
## Macro
|
## Macro
|
||||||
|
|
||||||
* **XBYAK32** is defined on 32bit.
|
* **XBYAK32** is defined on 32bit.
|
||||||
* **XBYAK64** is defined on 64bit.
|
* **XBYAK64** is defined on 64bit.
|
||||||
* **XBYAK64_WIN** is defined on 64bit Windows(VC)
|
* **XBYAK64_WIN** is defined on 64bit Windows(VC).
|
||||||
* **XBYAK64_GCC** is defined on 64bit gcc, cygwin
|
* **XBYAK64_GCC** is defined on 64bit gcc, cygwin.
|
||||||
* define **XBYAK_NO_OP_NAMES** on gcc without `-fno-operator-names`
|
* define **XBYAK_USE_OP_NAMES** on gcc with `-fno-operator-names` if you want to use `and()`, ....
|
||||||
* define **XBYAK_ENABLE_OMITTED_OPERAND** if you use omitted destination such as `vaddps(xmm2, xmm3);`(deprecated in the future)
|
* define **XBYAK_ENABLE_OMITTED_OPERAND** if you use omitted destination such as `vaddps(xmm2, xmm3);`(deprecated in the future).
|
||||||
* define **XBYAK_UNDEF_JNL** if Bessel function jnl is defined as macro
|
* define **XBYAK_UNDEF_JNL** if Bessel function jnl is defined as macro.
|
||||||
|
* define **XBYAK_NO_EXCEPTION** for a compiler option `-fno-exceptions`.
|
||||||
|
|
||||||
## Sample
|
## Sample
|
||||||
|
|
||||||
|
@ -392,6 +438,31 @@ modified new BSD License
|
||||||
http://opensource.org/licenses/BSD-3-Clause
|
http://opensource.org/licenses/BSD-3-Clause
|
||||||
|
|
||||||
## History
|
## History
|
||||||
|
* 2020/Sep/08 ver 5.97 replace uint32 with uint32_t etc.
|
||||||
|
* 2020/Aug/28 ver 5.95 some constructors of register classes support constexpr if C++14 or later
|
||||||
|
* 2020/Aug/04 ver 5.941 `CodeGenerator::reset()` calls `ClearError()`.
|
||||||
|
* 2020/Jul/28 ver 5.94 remove #include <winsock2.h> (only windows)
|
||||||
|
* 2020/Jul/21 ver 5.93 support exception-less mode
|
||||||
|
* 2020/Jun/30 ver 5.92 support Intel AMX instruction set (Thanks to nshustrov)
|
||||||
|
* 2020/Jun/22 ver 5.913 fix mov(r64, imm64) on 32-bit env with XBYAK64
|
||||||
|
* 2020/Jun/19 ver 5.912 define MAP_JIT on macOS regardless of Xcode version (Thanks to rsdubtso)
|
||||||
|
* 2020/May/10 ver 5.911 XBYAK_USE_MMAP_ALLOCATOR is defined unless XBYAK_DONT_USE_MMAP_ALLOCATOR is defined.
|
||||||
|
* 2020/Apr/20 ver 5.91 accept mask register k0 (it means no mask)
|
||||||
|
* 2020/Apr/09 ver 5.90 kmov{b,d,w,q} throws exception for an unsupported register
|
||||||
|
* 2020/Feb/26 ver 5.891 fix typo of type
|
||||||
|
* 2020/Jan/03 ver 5.89 fix error of vfpclasspd
|
||||||
|
* 2019/Dec/20 ver 5.88 fix compile error on Windows
|
||||||
|
* 2019/Dec/19 ver 5.87 add setDefaultJmpNEAR(), which deals with `jmp` of an undefined label as T_NEAR if no type is specified.
|
||||||
|
* 2019/Dec/13 ver 5.86 [changed] revert to the behavior before v5.84 if -fno-operator-names is defined (and() is available)
|
||||||
|
* 2019/Dec/07 ver 5.85 append MAP_JIT flag to mmap for macOS mojave or later
|
||||||
|
* 2019/Nov/29 ver 5.84 [changed] XBYAK_NO_OP_NAMES is defined unless XBYAK_USE_OP_NAMES is defined
|
||||||
|
* 2019/Oct/12 ver 5.83 exit(1) was removed
|
||||||
|
* 2019/Sep/23 ver 5.82 support monitorx, mwaitx, clzero (thanks to @MagurosanTeam)
|
||||||
|
* 2019/Sep/14 ver 5.81 support some generic mnemonics.
|
||||||
|
* 2019/Aug/01 ver 5.802 fix detection of AVX512_BF16 (thanks to vpirogov)
|
||||||
|
* 2019/May/27 support vp2intersectd, vp2intersectq (not tested)
|
||||||
|
* 2019/May/26 ver 5.80 support vcvtne2ps2bf16, vcvtneps2bf16, vdpbf16ps
|
||||||
|
* 2019/Apr/27 ver 5.79 vcmppd/vcmpps supports ptr_b(thanks to jkopinsky)
|
||||||
* 2019/Apr/15 ver 5.78 rewrite Reg::changeBit() (thanks to MerryMage)
|
* 2019/Apr/15 ver 5.78 rewrite Reg::changeBit() (thanks to MerryMage)
|
||||||
* 2019/Mar/06 ver 5.77 fix number of cores that share LLC cache by densamoilov
|
* 2019/Mar/06 ver 5.77 fix number of cores that share LLC cache by densamoilov
|
||||||
* 2019/Jan/17 ver 5.76 add Cpu::getNumCores() by shelleygoel
|
* 2019/Jan/17 ver 5.76 add Cpu::getNumCores() by shelleygoel
|
||||||
|
@ -530,3 +601,5 @@ http://opensource.org/licenses/BSD-3-Clause
|
||||||
## Author
|
## Author
|
||||||
MITSUNARI Shigeo(herumi@nifty.com)
|
MITSUNARI Shigeo(herumi@nifty.com)
|
||||||
|
|
||||||
|
## Sponsors welcome
|
||||||
|
[GitHub Sponsor](https://github.com/sponsors/herumi)
|
||||||
|
|
45
readme.txt
45
readme.txt
|
@ -1,5 +1,5 @@
|
||||||
|
|
||||||
C++用x86(IA-32), x64(AMD64, x86-64) JITアセンブラ Xbyak 5.78
|
C++用x86(IA-32), x64(AMD64, x86-64) JITアセンブラ Xbyak 5.97
|
||||||
|
|
||||||
-----------------------------------------------------------------------------
|
-----------------------------------------------------------------------------
|
||||||
◎概要
|
◎概要
|
||||||
|
@ -22,21 +22,21 @@
|
||||||
Intel Mac
|
Intel Mac
|
||||||
などで動作確認をしています。
|
などで動作確認をしています。
|
||||||
|
|
||||||
※ Xbyakはデフォルトでand(), or(), xor(), not()関数を使います。
|
※ and, orなどの代わりにand_, or_を使用してください。
|
||||||
gccではそれらを演算子として解釈してしまうため、-fno-operator-namesオプションを追加してコンパイルしてください。
|
and, orなどを使いたい場合は-fno-operator-namesをgcc/clangに指定してください。
|
||||||
あるいはXBYAK_NO_OP_NAMESを定義してand_(), or_(), xor_(), not_()を使ってください。
|
|
||||||
and_(), or_(), xor_(), not_()はXBYAK_NO_OP_NAMESされていないときでも使えます。
|
|
||||||
|
|
||||||
-----------------------------------------------------------------------------
|
-----------------------------------------------------------------------------
|
||||||
◎準備
|
◎準備
|
||||||
xbyak.h
|
xbyak.h
|
||||||
xbyak_bin2hex.h
|
xbyak_bin2hex.h
|
||||||
xbyak_mnemonic.h
|
|
||||||
これらを同一のパスに入れてインクルードパスに追加してください。
|
これらを同一のパスに入れてインクルードパスに追加してください。
|
||||||
|
|
||||||
Linuxではmake installで/usr/local/include/xbyakにコピーされます。
|
Linuxではmake installで/usr/local/include/xbyakにコピーされます。
|
||||||
-----------------------------------------------------------------------------
|
-----------------------------------------------------------------------------
|
||||||
◎下位互換性の破れ
|
◎下位互換性の破れ
|
||||||
|
* push byte, immまたはpush word, immが下位8bit, 16bitにキャストした値を使うように変更。
|
||||||
|
* (Windows) `<winsock2.h>`をincludeしなくなったので必要なら明示的にincludeしてください。
|
||||||
|
* XBYAK_USE_MMAP_ALLOCATORがデフォルトで有効になりました。従来の方式にする場合はXBYAK_DONT_USE_MMAP_ALLOCATORを定義してください。
|
||||||
* Xbyak::Errorの型をenumからclassに変更
|
* Xbyak::Errorの型をenumからclassに変更
|
||||||
** 従来のenumの値をとるにはintにキャストしてください。
|
** 従来のenumの値をとるにはintにキャストしてください。
|
||||||
* (古い)Reg32eクラスを(新しい)Reg32eとRegExpに分ける。
|
* (古い)Reg32eクラスを(新しい)Reg32eとRegExpに分ける。
|
||||||
|
@ -46,6 +46,13 @@ Linuxではmake installで/usr/local/include/xbyakにコピーされます。
|
||||||
-----------------------------------------------------------------------------
|
-----------------------------------------------------------------------------
|
||||||
◎新機能
|
◎新機能
|
||||||
|
|
||||||
|
例外なしモード追加
|
||||||
|
XBYAK_NO_EXCEPTIONを定義してコンパイルするとgcc/clangで-fno-exceptionsオプションでコンパイルできます。
|
||||||
|
エラーは例外の代わりに`Xbyak::GetError()`で通達されます。
|
||||||
|
この値が0でなければ何か問題が発生しています。
|
||||||
|
この値は自動的に変更されないので`Xbyak::ClearError()`でリセットしてください。
|
||||||
|
`CodeGenerator::reset()`は`ClearError()`を呼びます。
|
||||||
|
|
||||||
MmapAllocator追加
|
MmapAllocator追加
|
||||||
これはUnix系OSでのみの仕様です。XBYAK_USE_MMAP_ALLOCATORを使うと利用できます。
|
これはUnix系OSでのみの仕様です。XBYAK_USE_MMAP_ALLOCATORを使うと利用できます。
|
||||||
デフォルトのAllocatorはメモリ確保時にposix_memalignを使います。
|
デフォルトのAllocatorはメモリ確保時にposix_memalignを使います。
|
||||||
|
@ -54,7 +61,6 @@ map countの最大値は/proc/sys/vm/max_map_countに書かれています。
|
||||||
デフォルトでは3万個ほどのXbyak::CodeGeneratorインスタンスを生成するとエラーになります。
|
デフォルトでは3万個ほどのXbyak::CodeGeneratorインスタンスを生成するとエラーになります。
|
||||||
test/mprotect_test.cppで確認できます。
|
test/mprotect_test.cppで確認できます。
|
||||||
これを避けるためにはmmapを使うMmapAllocatorを使ってください。
|
これを避けるためにはmmapを使うMmapAllocatorを使ってください。
|
||||||
将来この挙動がデフォルトになるかもしれません。
|
|
||||||
|
|
||||||
|
|
||||||
AutoGrowモード追加
|
AutoGrowモード追加
|
||||||
|
@ -373,6 +379,31 @@ sample/{echo,hello}.bfは http://www.kmonos.net/alang/etc/brainfuck.php から
|
||||||
-----------------------------------------------------------------------------
|
-----------------------------------------------------------------------------
|
||||||
◎履歴
|
◎履歴
|
||||||
|
|
||||||
|
2020/09/08 ver 5.97 uint32などをuint32_tに置換
|
||||||
|
2020/08/28 ver 5.95 レジスタクラスのコンストラクタがconstexprに対応(C++14以降)
|
||||||
|
2020/08/04 ver 5.941 `CodeGenerator::reset()`が`ClearError()`を呼ぶように変更
|
||||||
|
2020/07/28 ver 5.94 #include <winsock2.h>の削除 (only windows)
|
||||||
|
2020/07/21 ver 5.93 例外なしモード追加
|
||||||
|
2020/06/30 ver 5.92 Intel AMX命令サポート (Thanks to nshustrov)
|
||||||
|
2020/06/19 ver 5.913 32ビット環境でXBYAK64を定義したときのmov(r64, imm64)を修正
|
||||||
|
2020/06/19 ver 5.912 macOSの古いXcodeでもMAP_JITを有効にする(Thanks to rsdubtso)
|
||||||
|
2020/05/10 ver 5.911 Linux/macOSでXBYAK_USE_MMAP_ALLOCATORがデフォルト有効になる
|
||||||
|
2020/04/20 ver 5.91 マスクレジスタk0を受け入れる(マスクをしない)
|
||||||
|
2020/04/09 ver 5.90 kmov{b,w,d,q}がサポートされないレジスタを受けると例外を投げる
|
||||||
|
2020/02/26 ver 5.891 zm0のtype修正
|
||||||
|
2020/01/03 ver 5.89 vfpclasspdの処理エラー修正
|
||||||
|
2019/12/20 ver 5.88 Windowsでのコンパイルエラー修正
|
||||||
|
2019/12/19 ver 5.87 未定義ラベルへのjmp命令のデフォルト挙動をT_NEARにするsetDefaultJmpNEAR()を追加
|
||||||
|
2019/12/13 ver 5.86 [変更] -fno-operator-namesが指定されたときは5.84以前の挙動に戻す
|
||||||
|
2019/12/07 ver 5.85 mmapにMAP_JITフラグを追加(macOS mojave以上)
|
||||||
|
2019/11/29 ver 5.84 [変更] XBYAK_USE_OP_NAMESが定義されていない限りXBYAK_NO_OP_NAMESが定義されるように変更
|
||||||
|
2019/10/12 ver 5.83 exit(1)の除去
|
||||||
|
2019/09/23 ver 5.82 monitorx, mwaitx, clzero対応 (thanks to MagurosanTeam)
|
||||||
|
2019/09/14 ver 5.81 いくつかの一般命令をサポート
|
||||||
|
2019/08/01 ver 5.802 AVX512_BF16判定修正 (thanks to vpirogov)
|
||||||
|
2019/05/27 support vp2intersectd, vp2intersectq (not tested)
|
||||||
|
2019/05/26 ver 5.80 support vcvtne2ps2bf16, vcvtneps2bf16, vdpbf16ps
|
||||||
|
2019/04/27 ver 5.79 vcmppd/vcmppsのptr_b対応忘れ(thanks to jkopinsky)
|
||||||
2019/04/15 ver 5.78 Reg::changeBit()のリファクタリング(thanks to MerryMage)
|
2019/04/15 ver 5.78 Reg::changeBit()のリファクタリング(thanks to MerryMage)
|
||||||
2019/03/06 ver 5.77 LLCキャッシュを共有数CPU数の修整(by densamoilov)
|
2019/03/06 ver 5.77 LLCキャッシュを共有数CPU数の修整(by densamoilov)
|
||||||
2019/01/17 ver 5.76 Cpu::getNumCores()追加(by shelleygoel)
|
2019/01/17 ver 5.76 Cpu::getNumCores()追加(by shelleygoel)
|
||||||
|
|
|
@ -1,10 +1,12 @@
|
||||||
TARGET = test quantize bf toyvm test_util memfunc static_buf jmp_table
|
|
||||||
XBYAK_INC=../xbyak/xbyak.h
|
XBYAK_INC=../xbyak/xbyak.h
|
||||||
|
|
||||||
BOOST_EXIST=$(shell echo "\#include <boost/spirit/core.hpp>" | (gcc -E - 2>/dev/null) | grep "boost/spirit/core.hpp" >/dev/null && echo "1")
|
BOOST_EXIST=$(shell echo "\#include <boost/spirit/core.hpp>" | (gcc -E - 2>/dev/null) | grep "boost/spirit/core.hpp" >/dev/null && echo "1")
|
||||||
UNAME_M=$(shell uname -m)
|
UNAME_M=$(shell uname -m)
|
||||||
|
|
||||||
|
ONLY_64BIT=0
|
||||||
ifeq ($(shell uname -s),Darwin)
|
ifeq ($(shell uname -s),Darwin)
|
||||||
|
ONLY_64BIT=1
|
||||||
|
OS=mac
|
||||||
ifeq ($(UNAME_M),x86_64)
|
ifeq ($(UNAME_M),x86_64)
|
||||||
BIT=64
|
BIT=64
|
||||||
endif
|
endif
|
||||||
|
@ -27,19 +29,27 @@ else
|
||||||
endif
|
endif
|
||||||
|
|
||||||
ifeq ($(BIT),64)
|
ifeq ($(BIT),64)
|
||||||
TARGET += test64 bf64 memfunc64 test_util64 static_buf64 jmp_table64
|
TARGET += test64 bf64 memfunc64 test_util64 jmp_table64
|
||||||
ifeq ($(BOOST_EXIST),1)
|
ifeq ($(BOOST_EXIST),1)
|
||||||
TARGET += calc64 #calc2_64
|
TARGET += calc64 #calc2_64
|
||||||
endif
|
endif
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
ifneq ($(OS),mac)
|
||||||
|
TARGET += static_buf64
|
||||||
|
endif
|
||||||
|
|
||||||
|
|
||||||
|
ifneq ($(ONLY_64BIT),1)
|
||||||
|
TARGET += test quantize bf toyvm test_util memfunc static_buf jmp_table
|
||||||
ifeq ($(BOOST_EXIST),1)
|
ifeq ($(BOOST_EXIST),1)
|
||||||
TARGET += calc #calc2
|
TARGET += calc #calc2
|
||||||
endif
|
endif
|
||||||
|
endif
|
||||||
|
|
||||||
all: $(TARGET)
|
all: $(TARGET)
|
||||||
|
|
||||||
CFLAGS_WARN=-Wall -Wextra -Wformat=2 -Wcast-qual -Wcast-align -Wwrite-strings -Wfloat-equal -Wpointer-arith -pedantic
|
CFLAGS_WARN=-Wall -Wextra -Wformat=2 -Wcast-qual -Wcast-align -Wwrite-strings -Wfloat-equal -Wpointer-arith #-pedantic
|
||||||
|
|
||||||
CFLAGS=-g -O2 -fomit-frame-pointer -Wall -I../ $(CFLAGS_WARN)
|
CFLAGS=-g -O2 -fomit-frame-pointer -Wall -I../ $(CFLAGS_WARN)
|
||||||
|
|
||||||
|
@ -85,9 +95,13 @@ jmp_table:
|
||||||
$(CXX) $(CFLAGS) jmp_table.cpp -o $@ -m32
|
$(CXX) $(CFLAGS) jmp_table.cpp -o $@ -m32
|
||||||
jmp_table64:
|
jmp_table64:
|
||||||
$(CXX) $(CFLAGS) jmp_table.cpp -o $@ -m64
|
$(CXX) $(CFLAGS) jmp_table.cpp -o $@ -m64
|
||||||
|
profiler: profiler.cpp ../xbyak/xbyak_util.h
|
||||||
|
$(CXX) $(CFLAGS) profiler.cpp -o $@
|
||||||
|
profiler-vtune: profiler.cpp ../xbyak/xbyak_util.h
|
||||||
|
$(CXX) $(CFLAGS) profiler.cpp -o $@ -DXBYAK_USE_VTUNE -I /opt/intel/vtune_amplifier/include/ -L /opt/intel/vtune_amplifier/lib64 -ljitprofiling -ldl
|
||||||
|
|
||||||
clean:
|
clean:
|
||||||
rm -rf *.o $(TARGET) *.exe
|
rm -rf *.o $(TARGET) *.exe profiler profiler-vtune
|
||||||
|
|
||||||
test : test0.cpp $(XBYAK_INC)
|
test : test0.cpp $(XBYAK_INC)
|
||||||
test64: test0.cpp $(XBYAK_INC)
|
test64: test0.cpp $(XBYAK_INC)
|
||||||
|
|
|
@ -148,7 +148,7 @@ public:
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
void dump(const Xbyak::uint8 *code, size_t size)
|
void dump(const uint8_t *code, size_t size)
|
||||||
{
|
{
|
||||||
puts("#include <stdio.h>\nstatic int stack[128 * 1024];");
|
puts("#include <stdio.h>\nstatic int stack[128 * 1024];");
|
||||||
#ifdef _MSC_VER
|
#ifdef _MSC_VER
|
||||||
|
|
427
sample/bf.vcproj
427
sample/bf.vcproj
|
@ -1,427 +0,0 @@
|
||||||
<?xml version="1.0" encoding="shift_jis"?>
|
|
||||||
<VisualStudioProject
|
|
||||||
ProjectType="Visual C++"
|
|
||||||
Version="9.00"
|
|
||||||
Name="bf"
|
|
||||||
ProjectGUID="{654BD79B-59D3-4B10-BBAA-158BAB272828}"
|
|
||||||
TargetFrameworkVersion="0"
|
|
||||||
>
|
|
||||||
<Platforms>
|
|
||||||
<Platform
|
|
||||||
Name="Win32"
|
|
||||||
/>
|
|
||||||
<Platform
|
|
||||||
Name="x64"
|
|
||||||
/>
|
|
||||||
</Platforms>
|
|
||||||
<ToolFiles>
|
|
||||||
</ToolFiles>
|
|
||||||
<Configurations>
|
|
||||||
<Configuration
|
|
||||||
Name="Release|Win32"
|
|
||||||
OutputDirectory=".\Release"
|
|
||||||
IntermediateDirectory=".\Release"
|
|
||||||
ConfigurationType="1"
|
|
||||||
InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC60.vsprops"
|
|
||||||
UseOfMFC="0"
|
|
||||||
ATLMinimizesCRunTimeLibraryUsage="false"
|
|
||||||
CharacterSet="2"
|
|
||||||
>
|
|
||||||
<Tool
|
|
||||||
Name="VCPreBuildEventTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCCustomBuildTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCXMLDataGeneratorTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCWebServiceProxyGeneratorTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCMIDLTool"
|
|
||||||
TypeLibraryName=".\Release/bf.tlb"
|
|
||||||
HeaderFileName=""
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCCLCompilerTool"
|
|
||||||
Optimization="2"
|
|
||||||
InlineFunctionExpansion="1"
|
|
||||||
AdditionalIncludeDirectories="../"
|
|
||||||
PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE"
|
|
||||||
StringPooling="true"
|
|
||||||
RuntimeLibrary="0"
|
|
||||||
EnableFunctionLevelLinking="true"
|
|
||||||
PrecompiledHeaderFile=".\Release/bf.pch"
|
|
||||||
AssemblerListingLocation=".\Release/"
|
|
||||||
ObjectFile=".\Release/"
|
|
||||||
ProgramDataBaseFileName=".\Release/"
|
|
||||||
WarningLevel="4"
|
|
||||||
SuppressStartupBanner="true"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCManagedResourceCompilerTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCResourceCompilerTool"
|
|
||||||
PreprocessorDefinitions="NDEBUG"
|
|
||||||
Culture="1041"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPreLinkEventTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCLinkerTool"
|
|
||||||
OutputFile=".\Release/bf.exe"
|
|
||||||
LinkIncremental="1"
|
|
||||||
SuppressStartupBanner="true"
|
|
||||||
ProgramDatabaseFile=".\Release/bf.pdb"
|
|
||||||
SubSystem="1"
|
|
||||||
RandomizedBaseAddress="1"
|
|
||||||
DataExecutionPrevention="0"
|
|
||||||
TargetMachine="1"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCALinkTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCManifestTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCXDCMakeTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCBscMakeTool"
|
|
||||||
SuppressStartupBanner="true"
|
|
||||||
OutputFile=".\Release/bf.bsc"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCFxCopTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCAppVerifierTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPostBuildEventTool"
|
|
||||||
/>
|
|
||||||
</Configuration>
|
|
||||||
<Configuration
|
|
||||||
Name="Debug|Win32"
|
|
||||||
OutputDirectory=".\Debug"
|
|
||||||
IntermediateDirectory=".\Debug"
|
|
||||||
ConfigurationType="1"
|
|
||||||
InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC60.vsprops"
|
|
||||||
UseOfMFC="0"
|
|
||||||
ATLMinimizesCRunTimeLibraryUsage="false"
|
|
||||||
CharacterSet="2"
|
|
||||||
>
|
|
||||||
<Tool
|
|
||||||
Name="VCPreBuildEventTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCCustomBuildTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCXMLDataGeneratorTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCWebServiceProxyGeneratorTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCMIDLTool"
|
|
||||||
TypeLibraryName=".\Debug/bf.tlb"
|
|
||||||
HeaderFileName=""
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCCLCompilerTool"
|
|
||||||
Optimization="0"
|
|
||||||
AdditionalIncludeDirectories="../"
|
|
||||||
PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE"
|
|
||||||
MinimalRebuild="true"
|
|
||||||
BasicRuntimeChecks="3"
|
|
||||||
RuntimeLibrary="1"
|
|
||||||
PrecompiledHeaderFile=".\Debug/bf.pch"
|
|
||||||
AssemblerListingLocation=".\Debug/"
|
|
||||||
ObjectFile=".\Debug/"
|
|
||||||
ProgramDataBaseFileName=".\Debug/"
|
|
||||||
WarningLevel="4"
|
|
||||||
SuppressStartupBanner="true"
|
|
||||||
DebugInformationFormat="4"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCManagedResourceCompilerTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCResourceCompilerTool"
|
|
||||||
PreprocessorDefinitions="_DEBUG"
|
|
||||||
Culture="1041"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPreLinkEventTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCLinkerTool"
|
|
||||||
OutputFile=".\Debug/bf.exe"
|
|
||||||
LinkIncremental="2"
|
|
||||||
SuppressStartupBanner="true"
|
|
||||||
GenerateDebugInformation="true"
|
|
||||||
ProgramDatabaseFile=".\Debug/bf.pdb"
|
|
||||||
SubSystem="1"
|
|
||||||
RandomizedBaseAddress="1"
|
|
||||||
DataExecutionPrevention="0"
|
|
||||||
TargetMachine="1"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCALinkTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCManifestTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCXDCMakeTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCBscMakeTool"
|
|
||||||
SuppressStartupBanner="true"
|
|
||||||
OutputFile=".\Debug/bf.bsc"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCFxCopTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCAppVerifierTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPostBuildEventTool"
|
|
||||||
/>
|
|
||||||
</Configuration>
|
|
||||||
<Configuration
|
|
||||||
Name="Release|x64"
|
|
||||||
OutputDirectory="$(PlatformName)\$(ConfigurationName)"
|
|
||||||
IntermediateDirectory="$(PlatformName)\$(ConfigurationName)"
|
|
||||||
ConfigurationType="1"
|
|
||||||
InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC60.vsprops"
|
|
||||||
UseOfMFC="0"
|
|
||||||
ATLMinimizesCRunTimeLibraryUsage="false"
|
|
||||||
CharacterSet="2"
|
|
||||||
>
|
|
||||||
<Tool
|
|
||||||
Name="VCPreBuildEventTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCCustomBuildTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCXMLDataGeneratorTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCWebServiceProxyGeneratorTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCMIDLTool"
|
|
||||||
TargetEnvironment="3"
|
|
||||||
TypeLibraryName=".\Release/bf.tlb"
|
|
||||||
HeaderFileName=""
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCCLCompilerTool"
|
|
||||||
Optimization="2"
|
|
||||||
InlineFunctionExpansion="1"
|
|
||||||
AdditionalIncludeDirectories="../"
|
|
||||||
PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE"
|
|
||||||
StringPooling="true"
|
|
||||||
RuntimeLibrary="0"
|
|
||||||
EnableFunctionLevelLinking="true"
|
|
||||||
PrecompiledHeaderFile=".\Release/bf.pch"
|
|
||||||
AssemblerListingLocation=".\Release/"
|
|
||||||
ObjectFile=".\Release/"
|
|
||||||
ProgramDataBaseFileName=".\Release/"
|
|
||||||
WarningLevel="4"
|
|
||||||
SuppressStartupBanner="true"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCManagedResourceCompilerTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCResourceCompilerTool"
|
|
||||||
PreprocessorDefinitions="NDEBUG"
|
|
||||||
Culture="1041"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPreLinkEventTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCLinkerTool"
|
|
||||||
OutputFile=".\Release/bf.exe"
|
|
||||||
LinkIncremental="1"
|
|
||||||
SuppressStartupBanner="true"
|
|
||||||
ProgramDatabaseFile=".\Release/bf.pdb"
|
|
||||||
SubSystem="1"
|
|
||||||
RandomizedBaseAddress="1"
|
|
||||||
DataExecutionPrevention="0"
|
|
||||||
TargetMachine="17"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCALinkTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCManifestTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCXDCMakeTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCBscMakeTool"
|
|
||||||
SuppressStartupBanner="true"
|
|
||||||
OutputFile=".\Release/bf.bsc"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCFxCopTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCAppVerifierTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPostBuildEventTool"
|
|
||||||
/>
|
|
||||||
</Configuration>
|
|
||||||
<Configuration
|
|
||||||
Name="Debug|x64"
|
|
||||||
OutputDirectory="$(PlatformName)\$(ConfigurationName)"
|
|
||||||
IntermediateDirectory="$(PlatformName)\$(ConfigurationName)"
|
|
||||||
ConfigurationType="1"
|
|
||||||
InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC60.vsprops"
|
|
||||||
UseOfMFC="0"
|
|
||||||
ATLMinimizesCRunTimeLibraryUsage="false"
|
|
||||||
CharacterSet="2"
|
|
||||||
>
|
|
||||||
<Tool
|
|
||||||
Name="VCPreBuildEventTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCCustomBuildTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCXMLDataGeneratorTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCWebServiceProxyGeneratorTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCMIDLTool"
|
|
||||||
TargetEnvironment="3"
|
|
||||||
TypeLibraryName=".\Debug/bf.tlb"
|
|
||||||
HeaderFileName=""
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCCLCompilerTool"
|
|
||||||
Optimization="0"
|
|
||||||
AdditionalIncludeDirectories="../"
|
|
||||||
PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE"
|
|
||||||
MinimalRebuild="true"
|
|
||||||
BasicRuntimeChecks="3"
|
|
||||||
RuntimeLibrary="1"
|
|
||||||
PrecompiledHeaderFile=".\Debug/bf.pch"
|
|
||||||
AssemblerListingLocation=".\Debug/"
|
|
||||||
ObjectFile=".\Debug/"
|
|
||||||
ProgramDataBaseFileName=".\Debug/"
|
|
||||||
WarningLevel="4"
|
|
||||||
SuppressStartupBanner="true"
|
|
||||||
DebugInformationFormat="3"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCManagedResourceCompilerTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCResourceCompilerTool"
|
|
||||||
PreprocessorDefinitions="_DEBUG"
|
|
||||||
Culture="1041"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPreLinkEventTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCLinkerTool"
|
|
||||||
OutputFile=".\Debug/bf.exe"
|
|
||||||
LinkIncremental="2"
|
|
||||||
SuppressStartupBanner="true"
|
|
||||||
GenerateDebugInformation="true"
|
|
||||||
ProgramDatabaseFile=".\Debug/bf.pdb"
|
|
||||||
SubSystem="1"
|
|
||||||
RandomizedBaseAddress="1"
|
|
||||||
DataExecutionPrevention="0"
|
|
||||||
TargetMachine="17"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCALinkTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCManifestTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCXDCMakeTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCBscMakeTool"
|
|
||||||
SuppressStartupBanner="true"
|
|
||||||
OutputFile=".\Debug/bf.bsc"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCFxCopTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCAppVerifierTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPostBuildEventTool"
|
|
||||||
/>
|
|
||||||
</Configuration>
|
|
||||||
</Configurations>
|
|
||||||
<References>
|
|
||||||
</References>
|
|
||||||
<Files>
|
|
||||||
<File
|
|
||||||
RelativePath="bf.cpp"
|
|
||||||
>
|
|
||||||
<FileConfiguration
|
|
||||||
Name="Release|Win32"
|
|
||||||
>
|
|
||||||
<Tool
|
|
||||||
Name="VCCLCompilerTool"
|
|
||||||
AdditionalIncludeDirectories=""
|
|
||||||
PreprocessorDefinitions=""
|
|
||||||
/>
|
|
||||||
</FileConfiguration>
|
|
||||||
<FileConfiguration
|
|
||||||
Name="Debug|Win32"
|
|
||||||
>
|
|
||||||
<Tool
|
|
||||||
Name="VCCLCompilerTool"
|
|
||||||
AdditionalIncludeDirectories=""
|
|
||||||
PreprocessorDefinitions=""
|
|
||||||
/>
|
|
||||||
</FileConfiguration>
|
|
||||||
<FileConfiguration
|
|
||||||
Name="Release|x64"
|
|
||||||
>
|
|
||||||
<Tool
|
|
||||||
Name="VCCLCompilerTool"
|
|
||||||
AdditionalIncludeDirectories=""
|
|
||||||
PreprocessorDefinitions=""
|
|
||||||
/>
|
|
||||||
</FileConfiguration>
|
|
||||||
<FileConfiguration
|
|
||||||
Name="Debug|x64"
|
|
||||||
>
|
|
||||||
<Tool
|
|
||||||
Name="VCCLCompilerTool"
|
|
||||||
AdditionalIncludeDirectories=""
|
|
||||||
PreprocessorDefinitions=""
|
|
||||||
/>
|
|
||||||
</FileConfiguration>
|
|
||||||
</File>
|
|
||||||
</Files>
|
|
||||||
<Globals>
|
|
||||||
</Globals>
|
|
||||||
</VisualStudioProject>
|
|
228
sample/bf.vcxproj
Normal file
228
sample/bf.vcxproj
Normal file
|
@ -0,0 +1,228 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<Project DefaultTargets="Build" ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||||
|
<ItemGroup Label="ProjectConfigurations">
|
||||||
|
<ProjectConfiguration Include="Debug|Win32">
|
||||||
|
<Configuration>Debug</Configuration>
|
||||||
|
<Platform>Win32</Platform>
|
||||||
|
</ProjectConfiguration>
|
||||||
|
<ProjectConfiguration Include="Debug|x64">
|
||||||
|
<Configuration>Debug</Configuration>
|
||||||
|
<Platform>x64</Platform>
|
||||||
|
</ProjectConfiguration>
|
||||||
|
<ProjectConfiguration Include="Release|Win32">
|
||||||
|
<Configuration>Release</Configuration>
|
||||||
|
<Platform>Win32</Platform>
|
||||||
|
</ProjectConfiguration>
|
||||||
|
<ProjectConfiguration Include="Release|x64">
|
||||||
|
<Configuration>Release</Configuration>
|
||||||
|
<Platform>x64</Platform>
|
||||||
|
</ProjectConfiguration>
|
||||||
|
</ItemGroup>
|
||||||
|
<PropertyGroup Label="Globals">
|
||||||
|
<ProjectGuid>{654BD79B-59D3-4B10-BBAA-158BAB272828}</ProjectGuid>
|
||||||
|
<WindowsTargetPlatformVersion>10.0.17763.0</WindowsTargetPlatformVersion>
|
||||||
|
</PropertyGroup>
|
||||||
|
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
|
||||||
|
<ConfigurationType>Application</ConfigurationType>
|
||||||
|
<PlatformToolset>v141</PlatformToolset>
|
||||||
|
<UseOfMfc>false</UseOfMfc>
|
||||||
|
<CharacterSet>MultiByte</CharacterSet>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
|
||||||
|
<ConfigurationType>Application</ConfigurationType>
|
||||||
|
<PlatformToolset>v141</PlatformToolset>
|
||||||
|
<UseOfMfc>false</UseOfMfc>
|
||||||
|
<CharacterSet>MultiByte</CharacterSet>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
|
||||||
|
<ConfigurationType>Application</ConfigurationType>
|
||||||
|
<PlatformToolset>v141</PlatformToolset>
|
||||||
|
<UseOfMfc>false</UseOfMfc>
|
||||||
|
<CharacterSet>MultiByte</CharacterSet>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
|
||||||
|
<ConfigurationType>Application</ConfigurationType>
|
||||||
|
<PlatformToolset>v141</PlatformToolset>
|
||||||
|
<UseOfMfc>false</UseOfMfc>
|
||||||
|
<CharacterSet>MultiByte</CharacterSet>
|
||||||
|
</PropertyGroup>
|
||||||
|
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
|
||||||
|
<ImportGroup Label="ExtensionSettings">
|
||||||
|
</ImportGroup>
|
||||||
|
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="PropertySheets">
|
||||||
|
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||||
|
<Import Project="$(VCTargetsPath)Microsoft.CPP.UpgradeFromVC60.props" />
|
||||||
|
</ImportGroup>
|
||||||
|
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="PropertySheets">
|
||||||
|
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||||
|
<Import Project="$(VCTargetsPath)Microsoft.CPP.UpgradeFromVC60.props" />
|
||||||
|
</ImportGroup>
|
||||||
|
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets">
|
||||||
|
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||||
|
<Import Project="$(VCTargetsPath)Microsoft.CPP.UpgradeFromVC60.props" />
|
||||||
|
</ImportGroup>
|
||||||
|
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets">
|
||||||
|
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||||
|
<Import Project="$(VCTargetsPath)Microsoft.CPP.UpgradeFromVC60.props" />
|
||||||
|
</ImportGroup>
|
||||||
|
<PropertyGroup Label="UserMacros" />
|
||||||
|
<PropertyGroup>
|
||||||
|
<_ProjectFileVersion>15.0.27924.0</_ProjectFileVersion>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
||||||
|
<LinkIncremental>false</LinkIncremental>
|
||||||
|
<IntDir>$(ProjectName)\$(Configuration)\</IntDir>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
||||||
|
<LinkIncremental>true</LinkIncremental>
|
||||||
|
<IntDir>$(ProjectName)\$(Configuration)\</IntDir>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
|
||||||
|
<LinkIncremental>false</LinkIncremental>
|
||||||
|
<IntDir>$(ProjectName)\$(Platform)\$(Configuration)\</IntDir>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
|
||||||
|
<LinkIncremental>true</LinkIncremental>
|
||||||
|
<IntDir>$(ProjectName)\$(Platform)\$(Configuration)\</IntDir>
|
||||||
|
</PropertyGroup>
|
||||||
|
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
||||||
|
<Midl>
|
||||||
|
<TypeLibraryName>.\Release/bf.tlb</TypeLibraryName>
|
||||||
|
<HeaderFileName />
|
||||||
|
</Midl>
|
||||||
|
<ClCompile>
|
||||||
|
<Optimization>MaxSpeed</Optimization>
|
||||||
|
<InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion>
|
||||||
|
<AdditionalIncludeDirectories>../;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||||
|
<PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
|
<StringPooling>true</StringPooling>
|
||||||
|
<RuntimeLibrary>MultiThreaded</RuntimeLibrary>
|
||||||
|
<FunctionLevelLinking>true</FunctionLevelLinking>
|
||||||
|
<PrecompiledHeaderOutputFile>.\Release/bf.pch</PrecompiledHeaderOutputFile>
|
||||||
|
<WarningLevel>Level4</WarningLevel>
|
||||||
|
<SuppressStartupBanner>true</SuppressStartupBanner>
|
||||||
|
</ClCompile>
|
||||||
|
<ResourceCompile>
|
||||||
|
<PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
|
<Culture>0x0411</Culture>
|
||||||
|
</ResourceCompile>
|
||||||
|
<Link>
|
||||||
|
<SuppressStartupBanner>true</SuppressStartupBanner>
|
||||||
|
<SubSystem>Console</SubSystem>
|
||||||
|
<RandomizedBaseAddress>false</RandomizedBaseAddress>
|
||||||
|
<DataExecutionPrevention />
|
||||||
|
<TargetMachine>MachineX86</TargetMachine>
|
||||||
|
</Link>
|
||||||
|
<Bscmake>
|
||||||
|
<SuppressStartupBanner>true</SuppressStartupBanner>
|
||||||
|
</Bscmake>
|
||||||
|
</ItemDefinitionGroup>
|
||||||
|
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
||||||
|
<Midl>
|
||||||
|
<TypeLibraryName>.\Debug/bf.tlb</TypeLibraryName>
|
||||||
|
<HeaderFileName />
|
||||||
|
</Midl>
|
||||||
|
<ClCompile>
|
||||||
|
<Optimization>Disabled</Optimization>
|
||||||
|
<AdditionalIncludeDirectories>../;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||||
|
<PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
|
<MinimalRebuild>true</MinimalRebuild>
|
||||||
|
<BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
|
||||||
|
<RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
|
||||||
|
<PrecompiledHeaderOutputFile>.\Debug/bf.pch</PrecompiledHeaderOutputFile>
|
||||||
|
<WarningLevel>Level4</WarningLevel>
|
||||||
|
<SuppressStartupBanner>true</SuppressStartupBanner>
|
||||||
|
</ClCompile>
|
||||||
|
<ResourceCompile>
|
||||||
|
<PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
|
<Culture>0x0411</Culture>
|
||||||
|
</ResourceCompile>
|
||||||
|
<Link>
|
||||||
|
<SuppressStartupBanner>true</SuppressStartupBanner>
|
||||||
|
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||||
|
<ProgramDatabaseFile>.\Debug/bf.pdb</ProgramDatabaseFile>
|
||||||
|
<SubSystem>Console</SubSystem>
|
||||||
|
<RandomizedBaseAddress>false</RandomizedBaseAddress>
|
||||||
|
<DataExecutionPrevention />
|
||||||
|
<TargetMachine>MachineX86</TargetMachine>
|
||||||
|
</Link>
|
||||||
|
<Bscmake>
|
||||||
|
<SuppressStartupBanner>true</SuppressStartupBanner>
|
||||||
|
</Bscmake>
|
||||||
|
</ItemDefinitionGroup>
|
||||||
|
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
|
||||||
|
<Midl>
|
||||||
|
<TargetEnvironment>X64</TargetEnvironment>
|
||||||
|
<TypeLibraryName>.\Release/bf.tlb</TypeLibraryName>
|
||||||
|
<HeaderFileName />
|
||||||
|
</Midl>
|
||||||
|
<ClCompile>
|
||||||
|
<Optimization>MaxSpeed</Optimization>
|
||||||
|
<InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion>
|
||||||
|
<AdditionalIncludeDirectories>../;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||||
|
<PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
|
<StringPooling>true</StringPooling>
|
||||||
|
<RuntimeLibrary>MultiThreaded</RuntimeLibrary>
|
||||||
|
<FunctionLevelLinking>true</FunctionLevelLinking>
|
||||||
|
<PrecompiledHeaderOutputFile>.\Release/bf.pch</PrecompiledHeaderOutputFile>
|
||||||
|
<WarningLevel>Level4</WarningLevel>
|
||||||
|
<SuppressStartupBanner>true</SuppressStartupBanner>
|
||||||
|
</ClCompile>
|
||||||
|
<ResourceCompile>
|
||||||
|
<PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
|
<Culture>0x0411</Culture>
|
||||||
|
</ResourceCompile>
|
||||||
|
<Link>
|
||||||
|
<SuppressStartupBanner>true</SuppressStartupBanner>
|
||||||
|
<SubSystem>Console</SubSystem>
|
||||||
|
<RandomizedBaseAddress>false</RandomizedBaseAddress>
|
||||||
|
<DataExecutionPrevention />
|
||||||
|
<TargetMachine>MachineX64</TargetMachine>
|
||||||
|
</Link>
|
||||||
|
<Bscmake>
|
||||||
|
<SuppressStartupBanner>true</SuppressStartupBanner>
|
||||||
|
</Bscmake>
|
||||||
|
</ItemDefinitionGroup>
|
||||||
|
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
|
||||||
|
<Midl>
|
||||||
|
<TargetEnvironment>X64</TargetEnvironment>
|
||||||
|
<TypeLibraryName>.\Debug/bf.tlb</TypeLibraryName>
|
||||||
|
<HeaderFileName />
|
||||||
|
</Midl>
|
||||||
|
<ClCompile>
|
||||||
|
<Optimization>Disabled</Optimization>
|
||||||
|
<AdditionalIncludeDirectories>../;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||||
|
<PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
|
<MinimalRebuild>true</MinimalRebuild>
|
||||||
|
<BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
|
||||||
|
<RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
|
||||||
|
<PrecompiledHeaderOutputFile>.\Debug/bf.pch</PrecompiledHeaderOutputFile>
|
||||||
|
<WarningLevel>Level4</WarningLevel>
|
||||||
|
<SuppressStartupBanner>true</SuppressStartupBanner>
|
||||||
|
<DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
|
||||||
|
</ClCompile>
|
||||||
|
<ResourceCompile>
|
||||||
|
<PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
|
<Culture>0x0411</Culture>
|
||||||
|
</ResourceCompile>
|
||||||
|
<Link>
|
||||||
|
<SuppressStartupBanner>true</SuppressStartupBanner>
|
||||||
|
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||||
|
<ProgramDatabaseFile>.\Debug/bf.pdb</ProgramDatabaseFile>
|
||||||
|
<SubSystem>Console</SubSystem>
|
||||||
|
<RandomizedBaseAddress>false</RandomizedBaseAddress>
|
||||||
|
<DataExecutionPrevention />
|
||||||
|
<TargetMachine>MachineX64</TargetMachine>
|
||||||
|
</Link>
|
||||||
|
<Bscmake>
|
||||||
|
<SuppressStartupBanner>true</SuppressStartupBanner>
|
||||||
|
</Bscmake>
|
||||||
|
</ItemDefinitionGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<ClCompile Include="bf.cpp" />
|
||||||
|
</ItemGroup>
|
||||||
|
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
|
||||||
|
<ImportGroup Label="ExtensionTargets">
|
||||||
|
</ImportGroup>
|
||||||
|
</Project>
|
|
@ -155,9 +155,9 @@ struct Grammar : public boost::spirit::classic::grammar<Grammar> {
|
||||||
|
|
||||||
void put(const std::vector<double>& x)
|
void put(const std::vector<double>& x)
|
||||||
{
|
{
|
||||||
printf("%f", x[0]);
|
for (size_t i = 0, n = x.size(); i < n; i++) {
|
||||||
for (size_t i = 1, n = x.size(); i < n; i++) {
|
if (i > 0) printf(", ");
|
||||||
printf(", %f", x[i]);
|
printf("%f", x[i]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,423 +0,0 @@
|
||||||
<?xml version="1.0" encoding="shift_jis"?>
|
|
||||||
<VisualStudioProject
|
|
||||||
ProjectType="Visual C++"
|
|
||||||
Version="9.00"
|
|
||||||
Name="calc"
|
|
||||||
ProjectGUID="{5FDDFAA6-B947-491D-A17E-BBD863846579}"
|
|
||||||
TargetFrameworkVersion="0"
|
|
||||||
>
|
|
||||||
<Platforms>
|
|
||||||
<Platform
|
|
||||||
Name="Win32"
|
|
||||||
/>
|
|
||||||
<Platform
|
|
||||||
Name="x64"
|
|
||||||
/>
|
|
||||||
</Platforms>
|
|
||||||
<ToolFiles>
|
|
||||||
</ToolFiles>
|
|
||||||
<Configurations>
|
|
||||||
<Configuration
|
|
||||||
Name="Release|Win32"
|
|
||||||
OutputDirectory=".\Release"
|
|
||||||
IntermediateDirectory=".\Release"
|
|
||||||
ConfigurationType="1"
|
|
||||||
InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC60.vsprops"
|
|
||||||
UseOfMFC="0"
|
|
||||||
ATLMinimizesCRunTimeLibraryUsage="false"
|
|
||||||
CharacterSet="2"
|
|
||||||
>
|
|
||||||
<Tool
|
|
||||||
Name="VCPreBuildEventTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCCustomBuildTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCXMLDataGeneratorTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCWebServiceProxyGeneratorTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCMIDLTool"
|
|
||||||
TypeLibraryName=".\Release/calc.tlb"
|
|
||||||
HeaderFileName=""
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCCLCompilerTool"
|
|
||||||
Optimization="2"
|
|
||||||
InlineFunctionExpansion="1"
|
|
||||||
AdditionalIncludeDirectories="../"
|
|
||||||
PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE"
|
|
||||||
StringPooling="true"
|
|
||||||
RuntimeLibrary="0"
|
|
||||||
EnableFunctionLevelLinking="true"
|
|
||||||
PrecompiledHeaderFile=".\Release/calc.pch"
|
|
||||||
AssemblerListingLocation=".\Release/"
|
|
||||||
ObjectFile=".\Release/"
|
|
||||||
ProgramDataBaseFileName=".\Release/"
|
|
||||||
WarningLevel="4"
|
|
||||||
SuppressStartupBanner="true"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCManagedResourceCompilerTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCResourceCompilerTool"
|
|
||||||
PreprocessorDefinitions="NDEBUG"
|
|
||||||
Culture="1041"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPreLinkEventTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCLinkerTool"
|
|
||||||
OutputFile=".\Release/calc.exe"
|
|
||||||
LinkIncremental="1"
|
|
||||||
SuppressStartupBanner="true"
|
|
||||||
ProgramDatabaseFile=".\Release/calc.pdb"
|
|
||||||
SubSystem="1"
|
|
||||||
RandomizedBaseAddress="1"
|
|
||||||
DataExecutionPrevention="0"
|
|
||||||
TargetMachine="1"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCALinkTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCManifestTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCXDCMakeTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCBscMakeTool"
|
|
||||||
SuppressStartupBanner="true"
|
|
||||||
OutputFile=".\Release/calc.bsc"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCFxCopTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCAppVerifierTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPostBuildEventTool"
|
|
||||||
/>
|
|
||||||
</Configuration>
|
|
||||||
<Configuration
|
|
||||||
Name="Debug|Win32"
|
|
||||||
OutputDirectory=".\Debug"
|
|
||||||
IntermediateDirectory=".\Debug"
|
|
||||||
ConfigurationType="1"
|
|
||||||
InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC60.vsprops"
|
|
||||||
UseOfMFC="0"
|
|
||||||
ATLMinimizesCRunTimeLibraryUsage="false"
|
|
||||||
CharacterSet="2"
|
|
||||||
>
|
|
||||||
<Tool
|
|
||||||
Name="VCPreBuildEventTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCCustomBuildTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCXMLDataGeneratorTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCWebServiceProxyGeneratorTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCMIDLTool"
|
|
||||||
TypeLibraryName=".\Debug/calc.tlb"
|
|
||||||
HeaderFileName=""
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCCLCompilerTool"
|
|
||||||
Optimization="0"
|
|
||||||
AdditionalIncludeDirectories="../"
|
|
||||||
PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE"
|
|
||||||
MinimalRebuild="true"
|
|
||||||
BasicRuntimeChecks="3"
|
|
||||||
RuntimeLibrary="1"
|
|
||||||
PrecompiledHeaderFile=".\Debug/calc.pch"
|
|
||||||
AssemblerListingLocation=".\Debug/"
|
|
||||||
ObjectFile=".\Debug/"
|
|
||||||
ProgramDataBaseFileName=".\Debug/"
|
|
||||||
WarningLevel="4"
|
|
||||||
SuppressStartupBanner="true"
|
|
||||||
DebugInformationFormat="4"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCManagedResourceCompilerTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCResourceCompilerTool"
|
|
||||||
PreprocessorDefinitions="_DEBUG"
|
|
||||||
Culture="1041"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPreLinkEventTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCLinkerTool"
|
|
||||||
OutputFile=".\Debug/calc.exe"
|
|
||||||
LinkIncremental="2"
|
|
||||||
SuppressStartupBanner="true"
|
|
||||||
GenerateDebugInformation="true"
|
|
||||||
ProgramDatabaseFile=".\Debug/calc.pdb"
|
|
||||||
SubSystem="1"
|
|
||||||
RandomizedBaseAddress="1"
|
|
||||||
DataExecutionPrevention="0"
|
|
||||||
TargetMachine="1"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCALinkTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCManifestTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCXDCMakeTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCBscMakeTool"
|
|
||||||
SuppressStartupBanner="true"
|
|
||||||
OutputFile=".\Debug/calc.bsc"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCFxCopTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCAppVerifierTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPostBuildEventTool"
|
|
||||||
/>
|
|
||||||
</Configuration>
|
|
||||||
<Configuration
|
|
||||||
Name="Release|x64"
|
|
||||||
OutputDirectory="$(PlatformName)\$(ConfigurationName)"
|
|
||||||
IntermediateDirectory="$(PlatformName)\$(ConfigurationName)"
|
|
||||||
ConfigurationType="1"
|
|
||||||
InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC60.vsprops"
|
|
||||||
UseOfMFC="0"
|
|
||||||
ATLMinimizesCRunTimeLibraryUsage="false"
|
|
||||||
CharacterSet="2"
|
|
||||||
>
|
|
||||||
<Tool
|
|
||||||
Name="VCPreBuildEventTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCCustomBuildTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCXMLDataGeneratorTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCWebServiceProxyGeneratorTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCMIDLTool"
|
|
||||||
TargetEnvironment="3"
|
|
||||||
TypeLibraryName=".\Release/calc.tlb"
|
|
||||||
HeaderFileName=""
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCCLCompilerTool"
|
|
||||||
Optimization="2"
|
|
||||||
InlineFunctionExpansion="1"
|
|
||||||
AdditionalIncludeDirectories="../"
|
|
||||||
PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE"
|
|
||||||
StringPooling="true"
|
|
||||||
RuntimeLibrary="0"
|
|
||||||
EnableFunctionLevelLinking="true"
|
|
||||||
PrecompiledHeaderFile=".\Release/calc.pch"
|
|
||||||
AssemblerListingLocation=".\Release/"
|
|
||||||
ObjectFile=".\Release/"
|
|
||||||
ProgramDataBaseFileName=".\Release/"
|
|
||||||
WarningLevel="4"
|
|
||||||
SuppressStartupBanner="true"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCManagedResourceCompilerTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCResourceCompilerTool"
|
|
||||||
PreprocessorDefinitions="NDEBUG"
|
|
||||||
Culture="1041"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPreLinkEventTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCLinkerTool"
|
|
||||||
OutputFile=".\Release/calc.exe"
|
|
||||||
LinkIncremental="1"
|
|
||||||
SuppressStartupBanner="true"
|
|
||||||
ProgramDatabaseFile=".\Release/calc.pdb"
|
|
||||||
SubSystem="1"
|
|
||||||
RandomizedBaseAddress="1"
|
|
||||||
DataExecutionPrevention="0"
|
|
||||||
TargetMachine="17"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCALinkTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCManifestTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCXDCMakeTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCBscMakeTool"
|
|
||||||
SuppressStartupBanner="true"
|
|
||||||
OutputFile=".\Release/calc.bsc"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCFxCopTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCAppVerifierTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPostBuildEventTool"
|
|
||||||
/>
|
|
||||||
</Configuration>
|
|
||||||
<Configuration
|
|
||||||
Name="Debug|x64"
|
|
||||||
OutputDirectory="$(PlatformName)\$(ConfigurationName)"
|
|
||||||
IntermediateDirectory="$(PlatformName)\$(ConfigurationName)"
|
|
||||||
ConfigurationType="1"
|
|
||||||
InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC60.vsprops"
|
|
||||||
UseOfMFC="0"
|
|
||||||
ATLMinimizesCRunTimeLibraryUsage="false"
|
|
||||||
CharacterSet="2"
|
|
||||||
>
|
|
||||||
<Tool
|
|
||||||
Name="VCPreBuildEventTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCCustomBuildTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCXMLDataGeneratorTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCWebServiceProxyGeneratorTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCMIDLTool"
|
|
||||||
TargetEnvironment="3"
|
|
||||||
TypeLibraryName=".\Debug/calc.tlb"
|
|
||||||
HeaderFileName=""
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCCLCompilerTool"
|
|
||||||
Optimization="0"
|
|
||||||
AdditionalIncludeDirectories="../"
|
|
||||||
PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE"
|
|
||||||
MinimalRebuild="true"
|
|
||||||
BasicRuntimeChecks="3"
|
|
||||||
RuntimeLibrary="1"
|
|
||||||
PrecompiledHeaderFile=".\Debug/calc.pch"
|
|
||||||
AssemblerListingLocation=".\Debug/"
|
|
||||||
ObjectFile=".\Debug/"
|
|
||||||
ProgramDataBaseFileName=".\Debug/"
|
|
||||||
WarningLevel="4"
|
|
||||||
SuppressStartupBanner="true"
|
|
||||||
DebugInformationFormat="3"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCManagedResourceCompilerTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCResourceCompilerTool"
|
|
||||||
PreprocessorDefinitions="_DEBUG"
|
|
||||||
Culture="1041"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPreLinkEventTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCLinkerTool"
|
|
||||||
OutputFile=".\Debug/calc.exe"
|
|
||||||
LinkIncremental="2"
|
|
||||||
SuppressStartupBanner="true"
|
|
||||||
GenerateDebugInformation="true"
|
|
||||||
ProgramDatabaseFile=".\Debug/calc.pdb"
|
|
||||||
SubSystem="1"
|
|
||||||
RandomizedBaseAddress="1"
|
|
||||||
DataExecutionPrevention="0"
|
|
||||||
TargetMachine="17"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCALinkTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCManifestTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCXDCMakeTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCBscMakeTool"
|
|
||||||
SuppressStartupBanner="true"
|
|
||||||
OutputFile=".\Debug/calc.bsc"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCFxCopTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCAppVerifierTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPostBuildEventTool"
|
|
||||||
/>
|
|
||||||
</Configuration>
|
|
||||||
</Configurations>
|
|
||||||
<References>
|
|
||||||
</References>
|
|
||||||
<Files>
|
|
||||||
<File
|
|
||||||
RelativePath="calc.cpp"
|
|
||||||
>
|
|
||||||
<FileConfiguration
|
|
||||||
Name="Release|Win32"
|
|
||||||
>
|
|
||||||
<Tool
|
|
||||||
Name="VCCLCompilerTool"
|
|
||||||
PreprocessorDefinitions=""
|
|
||||||
/>
|
|
||||||
</FileConfiguration>
|
|
||||||
<FileConfiguration
|
|
||||||
Name="Debug|Win32"
|
|
||||||
>
|
|
||||||
<Tool
|
|
||||||
Name="VCCLCompilerTool"
|
|
||||||
PreprocessorDefinitions=""
|
|
||||||
/>
|
|
||||||
</FileConfiguration>
|
|
||||||
<FileConfiguration
|
|
||||||
Name="Release|x64"
|
|
||||||
>
|
|
||||||
<Tool
|
|
||||||
Name="VCCLCompilerTool"
|
|
||||||
PreprocessorDefinitions=""
|
|
||||||
/>
|
|
||||||
</FileConfiguration>
|
|
||||||
<FileConfiguration
|
|
||||||
Name="Debug|x64"
|
|
||||||
>
|
|
||||||
<Tool
|
|
||||||
Name="VCCLCompilerTool"
|
|
||||||
PreprocessorDefinitions=""
|
|
||||||
/>
|
|
||||||
</FileConfiguration>
|
|
||||||
</File>
|
|
||||||
</Files>
|
|
||||||
<Globals>
|
|
||||||
</Globals>
|
|
||||||
</VisualStudioProject>
|
|
228
sample/calc.vcxproj
Normal file
228
sample/calc.vcxproj
Normal file
|
@ -0,0 +1,228 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<Project DefaultTargets="Build" ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||||
|
<ItemGroup Label="ProjectConfigurations">
|
||||||
|
<ProjectConfiguration Include="Debug|Win32">
|
||||||
|
<Configuration>Debug</Configuration>
|
||||||
|
<Platform>Win32</Platform>
|
||||||
|
</ProjectConfiguration>
|
||||||
|
<ProjectConfiguration Include="Debug|x64">
|
||||||
|
<Configuration>Debug</Configuration>
|
||||||
|
<Platform>x64</Platform>
|
||||||
|
</ProjectConfiguration>
|
||||||
|
<ProjectConfiguration Include="Release|Win32">
|
||||||
|
<Configuration>Release</Configuration>
|
||||||
|
<Platform>Win32</Platform>
|
||||||
|
</ProjectConfiguration>
|
||||||
|
<ProjectConfiguration Include="Release|x64">
|
||||||
|
<Configuration>Release</Configuration>
|
||||||
|
<Platform>x64</Platform>
|
||||||
|
</ProjectConfiguration>
|
||||||
|
</ItemGroup>
|
||||||
|
<PropertyGroup Label="Globals">
|
||||||
|
<ProjectGuid>{5FDDFAA6-B947-491D-A17E-BBD863846579}</ProjectGuid>
|
||||||
|
<WindowsTargetPlatformVersion>10.0.17763.0</WindowsTargetPlatformVersion>
|
||||||
|
</PropertyGroup>
|
||||||
|
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
|
||||||
|
<ConfigurationType>Application</ConfigurationType>
|
||||||
|
<PlatformToolset>v141</PlatformToolset>
|
||||||
|
<UseOfMfc>false</UseOfMfc>
|
||||||
|
<CharacterSet>MultiByte</CharacterSet>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
|
||||||
|
<ConfigurationType>Application</ConfigurationType>
|
||||||
|
<PlatformToolset>v141</PlatformToolset>
|
||||||
|
<UseOfMfc>false</UseOfMfc>
|
||||||
|
<CharacterSet>MultiByte</CharacterSet>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
|
||||||
|
<ConfigurationType>Application</ConfigurationType>
|
||||||
|
<PlatformToolset>v141</PlatformToolset>
|
||||||
|
<UseOfMfc>false</UseOfMfc>
|
||||||
|
<CharacterSet>MultiByte</CharacterSet>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
|
||||||
|
<ConfigurationType>Application</ConfigurationType>
|
||||||
|
<PlatformToolset>v141</PlatformToolset>
|
||||||
|
<UseOfMfc>false</UseOfMfc>
|
||||||
|
<CharacterSet>MultiByte</CharacterSet>
|
||||||
|
</PropertyGroup>
|
||||||
|
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
|
||||||
|
<ImportGroup Label="ExtensionSettings">
|
||||||
|
</ImportGroup>
|
||||||
|
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="PropertySheets">
|
||||||
|
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||||
|
<Import Project="$(VCTargetsPath)Microsoft.CPP.UpgradeFromVC60.props" />
|
||||||
|
</ImportGroup>
|
||||||
|
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="PropertySheets">
|
||||||
|
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||||
|
<Import Project="$(VCTargetsPath)Microsoft.CPP.UpgradeFromVC60.props" />
|
||||||
|
</ImportGroup>
|
||||||
|
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets">
|
||||||
|
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||||
|
<Import Project="$(VCTargetsPath)Microsoft.CPP.UpgradeFromVC60.props" />
|
||||||
|
</ImportGroup>
|
||||||
|
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets">
|
||||||
|
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||||
|
<Import Project="$(VCTargetsPath)Microsoft.CPP.UpgradeFromVC60.props" />
|
||||||
|
</ImportGroup>
|
||||||
|
<PropertyGroup Label="UserMacros" />
|
||||||
|
<PropertyGroup>
|
||||||
|
<_ProjectFileVersion>15.0.27924.0</_ProjectFileVersion>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
||||||
|
<LinkIncremental>false</LinkIncremental>
|
||||||
|
<IntDir>$(ProjectName)\$(Configuration)\</IntDir>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
||||||
|
<LinkIncremental>true</LinkIncremental>
|
||||||
|
<IntDir>$(ProjectName)\$(Configuration)\</IntDir>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
|
||||||
|
<LinkIncremental>false</LinkIncremental>
|
||||||
|
<IntDir>$(ProjectName)\$(Platform)\$(Configuration)\</IntDir>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
|
||||||
|
<LinkIncremental>true</LinkIncremental>
|
||||||
|
<IntDir>$(ProjectName)\$(Platform)\$(Configuration)\</IntDir>
|
||||||
|
</PropertyGroup>
|
||||||
|
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
||||||
|
<Midl>
|
||||||
|
<TypeLibraryName>.\Release/calc.tlb</TypeLibraryName>
|
||||||
|
<HeaderFileName />
|
||||||
|
</Midl>
|
||||||
|
<ClCompile>
|
||||||
|
<Optimization>MaxSpeed</Optimization>
|
||||||
|
<InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion>
|
||||||
|
<AdditionalIncludeDirectories>../;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||||
|
<PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
|
<StringPooling>true</StringPooling>
|
||||||
|
<RuntimeLibrary>MultiThreaded</RuntimeLibrary>
|
||||||
|
<FunctionLevelLinking>true</FunctionLevelLinking>
|
||||||
|
<PrecompiledHeaderOutputFile>.\Release/calc.pch</PrecompiledHeaderOutputFile>
|
||||||
|
<WarningLevel>Level4</WarningLevel>
|
||||||
|
<SuppressStartupBanner>true</SuppressStartupBanner>
|
||||||
|
</ClCompile>
|
||||||
|
<ResourceCompile>
|
||||||
|
<PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
|
<Culture>0x0411</Culture>
|
||||||
|
</ResourceCompile>
|
||||||
|
<Link>
|
||||||
|
<SuppressStartupBanner>true</SuppressStartupBanner>
|
||||||
|
<SubSystem>Console</SubSystem>
|
||||||
|
<RandomizedBaseAddress>false</RandomizedBaseAddress>
|
||||||
|
<DataExecutionPrevention />
|
||||||
|
<TargetMachine>MachineX86</TargetMachine>
|
||||||
|
</Link>
|
||||||
|
<Bscmake>
|
||||||
|
<SuppressStartupBanner>true</SuppressStartupBanner>
|
||||||
|
</Bscmake>
|
||||||
|
</ItemDefinitionGroup>
|
||||||
|
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
||||||
|
<Midl>
|
||||||
|
<TypeLibraryName>.\Debug/calc.tlb</TypeLibraryName>
|
||||||
|
<HeaderFileName />
|
||||||
|
</Midl>
|
||||||
|
<ClCompile>
|
||||||
|
<Optimization>Disabled</Optimization>
|
||||||
|
<AdditionalIncludeDirectories>../;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||||
|
<PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
|
<MinimalRebuild>true</MinimalRebuild>
|
||||||
|
<BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
|
||||||
|
<RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
|
||||||
|
<PrecompiledHeaderOutputFile>.\Debug/calc.pch</PrecompiledHeaderOutputFile>
|
||||||
|
<WarningLevel>Level4</WarningLevel>
|
||||||
|
<SuppressStartupBanner>true</SuppressStartupBanner>
|
||||||
|
</ClCompile>
|
||||||
|
<ResourceCompile>
|
||||||
|
<PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
|
<Culture>0x0411</Culture>
|
||||||
|
</ResourceCompile>
|
||||||
|
<Link>
|
||||||
|
<SuppressStartupBanner>true</SuppressStartupBanner>
|
||||||
|
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||||
|
<ProgramDatabaseFile>.\Debug/calc.pdb</ProgramDatabaseFile>
|
||||||
|
<SubSystem>Console</SubSystem>
|
||||||
|
<RandomizedBaseAddress>false</RandomizedBaseAddress>
|
||||||
|
<DataExecutionPrevention />
|
||||||
|
<TargetMachine>MachineX86</TargetMachine>
|
||||||
|
</Link>
|
||||||
|
<Bscmake>
|
||||||
|
<SuppressStartupBanner>true</SuppressStartupBanner>
|
||||||
|
</Bscmake>
|
||||||
|
</ItemDefinitionGroup>
|
||||||
|
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
|
||||||
|
<Midl>
|
||||||
|
<TargetEnvironment>X64</TargetEnvironment>
|
||||||
|
<TypeLibraryName>.\Release/calc.tlb</TypeLibraryName>
|
||||||
|
<HeaderFileName />
|
||||||
|
</Midl>
|
||||||
|
<ClCompile>
|
||||||
|
<Optimization>MaxSpeed</Optimization>
|
||||||
|
<InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion>
|
||||||
|
<AdditionalIncludeDirectories>../;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||||
|
<PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
|
<StringPooling>true</StringPooling>
|
||||||
|
<RuntimeLibrary>MultiThreaded</RuntimeLibrary>
|
||||||
|
<FunctionLevelLinking>true</FunctionLevelLinking>
|
||||||
|
<PrecompiledHeaderOutputFile>.\Release/calc.pch</PrecompiledHeaderOutputFile>
|
||||||
|
<WarningLevel>Level4</WarningLevel>
|
||||||
|
<SuppressStartupBanner>true</SuppressStartupBanner>
|
||||||
|
</ClCompile>
|
||||||
|
<ResourceCompile>
|
||||||
|
<PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
|
<Culture>0x0411</Culture>
|
||||||
|
</ResourceCompile>
|
||||||
|
<Link>
|
||||||
|
<SuppressStartupBanner>true</SuppressStartupBanner>
|
||||||
|
<SubSystem>Console</SubSystem>
|
||||||
|
<RandomizedBaseAddress>false</RandomizedBaseAddress>
|
||||||
|
<DataExecutionPrevention />
|
||||||
|
<TargetMachine>MachineX64</TargetMachine>
|
||||||
|
</Link>
|
||||||
|
<Bscmake>
|
||||||
|
<SuppressStartupBanner>true</SuppressStartupBanner>
|
||||||
|
</Bscmake>
|
||||||
|
</ItemDefinitionGroup>
|
||||||
|
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
|
||||||
|
<Midl>
|
||||||
|
<TargetEnvironment>X64</TargetEnvironment>
|
||||||
|
<TypeLibraryName>.\Debug/calc.tlb</TypeLibraryName>
|
||||||
|
<HeaderFileName />
|
||||||
|
</Midl>
|
||||||
|
<ClCompile>
|
||||||
|
<Optimization>Disabled</Optimization>
|
||||||
|
<AdditionalIncludeDirectories>../;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||||
|
<PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
|
<MinimalRebuild>true</MinimalRebuild>
|
||||||
|
<BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
|
||||||
|
<RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
|
||||||
|
<PrecompiledHeaderOutputFile>.\Debug/calc.pch</PrecompiledHeaderOutputFile>
|
||||||
|
<WarningLevel>Level4</WarningLevel>
|
||||||
|
<SuppressStartupBanner>true</SuppressStartupBanner>
|
||||||
|
<DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
|
||||||
|
</ClCompile>
|
||||||
|
<ResourceCompile>
|
||||||
|
<PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
|
<Culture>0x0411</Culture>
|
||||||
|
</ResourceCompile>
|
||||||
|
<Link>
|
||||||
|
<SuppressStartupBanner>true</SuppressStartupBanner>
|
||||||
|
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||||
|
<ProgramDatabaseFile>.\Debug/calc.pdb</ProgramDatabaseFile>
|
||||||
|
<SubSystem>Console</SubSystem>
|
||||||
|
<RandomizedBaseAddress>false</RandomizedBaseAddress>
|
||||||
|
<DataExecutionPrevention />
|
||||||
|
<TargetMachine>MachineX64</TargetMachine>
|
||||||
|
</Link>
|
||||||
|
<Bscmake>
|
||||||
|
<SuppressStartupBanner>true</SuppressStartupBanner>
|
||||||
|
</Bscmake>
|
||||||
|
</ItemDefinitionGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<ClCompile Include="calc.cpp" />
|
||||||
|
</ItemGroup>
|
||||||
|
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
|
||||||
|
<ImportGroup Label="ExtensionTargets">
|
||||||
|
</ImportGroup>
|
||||||
|
</Project>
|
|
@ -102,7 +102,7 @@ private:
|
||||||
MAX_CONST_NUM = 32
|
MAX_CONST_NUM = 32
|
||||||
};
|
};
|
||||||
MIE_ALIGN(16) double constTbl_[MAX_CONST_NUM];
|
MIE_ALIGN(16) double constTbl_[MAX_CONST_NUM];
|
||||||
Xbyak::uint64 negConst_;
|
Xbyak::uint64_t negConst_;
|
||||||
size_t constTblPos_;
|
size_t constTblPos_;
|
||||||
#ifdef XBYAK32
|
#ifdef XBYAK32
|
||||||
const Xbyak::Reg32& varTbl_;
|
const Xbyak::Reg32& varTbl_;
|
||||||
|
@ -118,7 +118,7 @@ public:
|
||||||
64bit: x [rcx](win), xmm0(gcc), return xmm0
|
64bit: x [rcx](win), xmm0(gcc), return xmm0
|
||||||
*/
|
*/
|
||||||
Jit()
|
Jit()
|
||||||
: negConst_(Xbyak::uint64(1) << 63)
|
: negConst_(Xbyak::uint64_t(1) << 63)
|
||||||
, constTblPos_(0)
|
, constTblPos_(0)
|
||||||
#ifdef XBYAK32
|
#ifdef XBYAK32
|
||||||
, varTbl_(eax)
|
, varTbl_(eax)
|
||||||
|
|
90
sample/profiler.cpp
Normal file
90
sample/profiler.cpp
Normal file
|
@ -0,0 +1,90 @@
|
||||||
|
/*
|
||||||
|
How to profile JIT-code with perf or VTune
|
||||||
|
sudo perf record ./profiler 1
|
||||||
|
amplxe-cl -collect hotspots -result-dir r001hs -quiet ./profiler-vtune 2
|
||||||
|
*/
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <math.h>
|
||||||
|
#include <xbyak/xbyak_util.h>
|
||||||
|
|
||||||
|
const int N = 3000000;
|
||||||
|
struct Code : public Xbyak::CodeGenerator {
|
||||||
|
Code()
|
||||||
|
{
|
||||||
|
mov(eax, N);
|
||||||
|
Xbyak::Label lp = L();
|
||||||
|
for (int i = 0; i < 10; i++) {
|
||||||
|
sub(eax, 1);
|
||||||
|
}
|
||||||
|
jg(lp);
|
||||||
|
mov(eax, 1);
|
||||||
|
ret();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
struct Code2 : public Xbyak::CodeGenerator {
|
||||||
|
Code2()
|
||||||
|
{
|
||||||
|
mov(eax, N);
|
||||||
|
Xbyak::Label lp = L();
|
||||||
|
for (int i = 0; i < 10; i++) {
|
||||||
|
xorps(xm0, xm0);
|
||||||
|
}
|
||||||
|
sub(eax, 1);
|
||||||
|
jg(lp);
|
||||||
|
mov(eax, 1);
|
||||||
|
ret();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
double s1(int n)
|
||||||
|
{
|
||||||
|
double r = 0;
|
||||||
|
for (int i = 0; i < n; i++) {
|
||||||
|
r += 1.0 / (i + 1);
|
||||||
|
}
|
||||||
|
return r;
|
||||||
|
}
|
||||||
|
|
||||||
|
double s2(int n)
|
||||||
|
{
|
||||||
|
double r = 0;
|
||||||
|
for (int i = 0; i < n; i++) {
|
||||||
|
r += 1.0 / (i * i + 1) + 2.0 / (i + 3);
|
||||||
|
}
|
||||||
|
return r;
|
||||||
|
}
|
||||||
|
|
||||||
|
int main(int argc, char *argv[])
|
||||||
|
{
|
||||||
|
int mode = argc == 1 ? 0 : atoi(argv[1]);
|
||||||
|
Code c;
|
||||||
|
Code2 c2;
|
||||||
|
int (*f)() = (int (*)())c.getCode();
|
||||||
|
int (*g)() = (int (*)())c2.getCode();
|
||||||
|
|
||||||
|
printf("f:%p, %d\n", (const void*)f, (int)c.getSize());
|
||||||
|
printf("g:%p, %d\n", (const void*)g, (int)c2.getSize());
|
||||||
|
Xbyak::util::Profiler prof;
|
||||||
|
printf("mode=%d\n", mode);
|
||||||
|
prof.init(mode);
|
||||||
|
prof.set("f", (const void*)f, c.getSize());
|
||||||
|
prof.set("g", (const void*)g, c2.getSize());
|
||||||
|
|
||||||
|
double sum = 0;
|
||||||
|
for (int i = 0; i < 20000; i++) {
|
||||||
|
sum += s1(i);
|
||||||
|
sum += s2(i);
|
||||||
|
}
|
||||||
|
printf("sum=%f\n", sum);
|
||||||
|
for (int i = 0; i < 2000; i++) {
|
||||||
|
sum += f();
|
||||||
|
}
|
||||||
|
printf("f=%f\n", sum);
|
||||||
|
for (int i = 0; i < 2000; i++) {
|
||||||
|
sum += g();
|
||||||
|
}
|
||||||
|
printf("g=%f\n", sum);
|
||||||
|
puts("end");
|
||||||
|
}
|
|
@ -5,12 +5,12 @@
|
||||||
This program generates a quantization routine by using fast division algorithm in run-time.
|
This program generates a quantization routine by using fast division algorithm in run-time.
|
||||||
|
|
||||||
time(sec)
|
time(sec)
|
||||||
quality 1(low) 10 50 100(high)
|
quality 1(high) 10 50 100(low)
|
||||||
VC2005 8.0 8.0 8.0 8.0
|
VC2005 8.0 8.0 8.0 8.0
|
||||||
Xbyak 1.6 0.8 0.5 0.5
|
Xbyak 1.6 0.8 0.5 0.5
|
||||||
|
|
||||||
|
|
||||||
; generated code at q = 100
|
; generated code at q = 1
|
||||||
push esi
|
push esi
|
||||||
push edi
|
push edi
|
||||||
mov edi,dword ptr [esp+0Ch]
|
mov edi,dword ptr [esp+0Ch]
|
||||||
|
@ -48,9 +48,6 @@
|
||||||
#pragma warning(disable : 4996) // scanf
|
#pragma warning(disable : 4996) // scanf
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
typedef Xbyak::uint64 uint64;
|
|
||||||
typedef Xbyak::uint32 uint32;
|
|
||||||
|
|
||||||
const int N = 64;
|
const int N = 64;
|
||||||
|
|
||||||
class Quantize : public Xbyak::CodeGenerator {
|
class Quantize : public Xbyak::CodeGenerator {
|
||||||
|
@ -66,7 +63,7 @@ public:
|
||||||
output : eax = [esi+offset] / dividend
|
output : eax = [esi+offset] / dividend
|
||||||
destroy : edx
|
destroy : edx
|
||||||
*/
|
*/
|
||||||
void udiv(uint32 dividend, int offset)
|
void udiv(uint32_t dividend, int offset)
|
||||||
{
|
{
|
||||||
mov(eax, ptr[esi + offset]);
|
mov(eax, ptr[esi + offset]);
|
||||||
|
|
||||||
|
@ -83,11 +80,11 @@ public:
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
uint64 mLow, mHigh;
|
uint64_t mLow, mHigh;
|
||||||
int len = ilog2(odd) + 1;
|
int len = ilog2(odd) + 1;
|
||||||
{
|
{
|
||||||
uint64 roundUp = uint64(1) << (32 + len);
|
uint64_t roundUp = uint64_t(1) << (32 + len);
|
||||||
uint64 k = roundUp / (0xFFFFFFFFL - (0xFFFFFFFFL % odd));
|
uint64_t k = roundUp / (0xFFFFFFFFL - (0xFFFFFFFFL % odd));
|
||||||
mLow = roundUp / odd;
|
mLow = roundUp / odd;
|
||||||
mHigh = (roundUp + k) / odd;
|
mHigh = (roundUp + k) / odd;
|
||||||
}
|
}
|
||||||
|
@ -96,12 +93,12 @@ public:
|
||||||
mLow >>= 1; mHigh >>= 1; len--;
|
mLow >>= 1; mHigh >>= 1; len--;
|
||||||
}
|
}
|
||||||
|
|
||||||
uint64 m; int a;
|
uint64_t m; int a;
|
||||||
if ((mHigh >> 32) == 0) {
|
if ((mHigh >> 32) == 0) {
|
||||||
m = mHigh; a = 0;
|
m = mHigh; a = 0;
|
||||||
} else {
|
} else {
|
||||||
len = ilog2(odd);
|
len = ilog2(odd);
|
||||||
uint64 roundDown = uint64(1) << (32 + len);
|
uint64_t roundDown = uint64_t(1) << (32 + len);
|
||||||
mLow = roundDown / odd;
|
mLow = roundDown / odd;
|
||||||
int r = (int)(roundDown % odd);
|
int r = (int)(roundDown % odd);
|
||||||
m = (r <= (odd >> 1)) ? mLow : mLow + 1;
|
m = (r <= (odd >> 1)) ? mLow : mLow + 1;
|
||||||
|
@ -124,9 +121,9 @@ public:
|
||||||
mov(eax, edx);
|
mov(eax, edx);
|
||||||
}
|
}
|
||||||
/*
|
/*
|
||||||
quantize(uint32 dest[64], const uint32 src[64]);
|
quantize(uint32_t dest[64], const uint32_t src[64]);
|
||||||
*/
|
*/
|
||||||
Quantize(const uint32 qTbl[64])
|
Quantize(const uint32_t qTbl[64])
|
||||||
{
|
{
|
||||||
push(esi);
|
push(esi);
|
||||||
push(edi);
|
push(edi);
|
||||||
|
@ -143,7 +140,7 @@ public:
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
void quantize(uint32 dest[64], const uint32 src[64], const uint32 qTbl[64])
|
void quantize(uint32_t dest[64], const uint32_t src[64], const uint32_t qTbl[64])
|
||||||
{
|
{
|
||||||
for (int i = 0; i < N; i++) {
|
for (int i = 0; i < N; i++) {
|
||||||
dest[i] = src[i] / qTbl[i];
|
dest[i] = src[i] / qTbl[i];
|
||||||
|
@ -170,7 +167,7 @@ int main(int argc, char *argv[])
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
printf("q=%d\n", q);
|
printf("q=%d\n", q);
|
||||||
uint32 qTbl[] = {
|
uint32_t qTbl[] = {
|
||||||
16, 11, 10, 16, 24, 40, 51, 61,
|
16, 11, 10, 16, 24, 40, 51, 61,
|
||||||
12, 12, 14, 19, 26, 58, 60, 55,
|
12, 12, 14, 19, 26, 58, 60, 55,
|
||||||
14, 13, 16, 24, 40, 57, 69, 56,
|
14, 13, 16, 24, 40, 57, 69, 56,
|
||||||
|
@ -187,16 +184,16 @@ int main(int argc, char *argv[])
|
||||||
}
|
}
|
||||||
|
|
||||||
try {
|
try {
|
||||||
uint32 src[N];
|
uint32_t src[N];
|
||||||
uint32 dest[N];
|
uint32_t dest[N];
|
||||||
uint32 dest2[N];
|
uint32_t dest2[N];
|
||||||
for (int i = 0; i < N; i++) {
|
for (int i = 0; i < N; i++) {
|
||||||
src[i] = rand() % 2048;
|
src[i] = rand() % 2048;
|
||||||
}
|
}
|
||||||
|
|
||||||
Quantize jit(qTbl);
|
Quantize jit(qTbl);
|
||||||
//printf("jit size=%d, ptr=%p\n", jit.getSize(), jit.getCode());
|
//printf("jit size=%d, ptr=%p\n", jit.getSize(), jit.getCode());
|
||||||
void (*quantize2)(uint32*, const uint32*, const uint32 *) = jit.getCode<void (*)(uint32*, const uint32*, const uint32 *)>();
|
void (*quantize2)(uint32_t*, const uint32_t*, const uint32_t *) = jit.getCode<void (*)(uint32_t*, const uint32_t*, const uint32_t *)>();
|
||||||
|
|
||||||
quantize(dest, src, qTbl);
|
quantize(dest, src, qTbl);
|
||||||
quantize2(dest2, src, qTbl);
|
quantize2(dest2, src, qTbl);
|
||||||
|
|
|
@ -1,427 +0,0 @@
|
||||||
<?xml version="1.0" encoding="shift_jis"?>
|
|
||||||
<VisualStudioProject
|
|
||||||
ProjectType="Visual C++"
|
|
||||||
Version="9.00"
|
|
||||||
Name="quantize"
|
|
||||||
ProjectGUID="{D06753BF-E1F3-4578-9B18-08673327F77C}"
|
|
||||||
TargetFrameworkVersion="0"
|
|
||||||
>
|
|
||||||
<Platforms>
|
|
||||||
<Platform
|
|
||||||
Name="Win32"
|
|
||||||
/>
|
|
||||||
<Platform
|
|
||||||
Name="x64"
|
|
||||||
/>
|
|
||||||
</Platforms>
|
|
||||||
<ToolFiles>
|
|
||||||
</ToolFiles>
|
|
||||||
<Configurations>
|
|
||||||
<Configuration
|
|
||||||
Name="Debug|Win32"
|
|
||||||
OutputDirectory=".\Debug"
|
|
||||||
IntermediateDirectory=".\Debug"
|
|
||||||
ConfigurationType="1"
|
|
||||||
InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC60.vsprops"
|
|
||||||
UseOfMFC="0"
|
|
||||||
ATLMinimizesCRunTimeLibraryUsage="false"
|
|
||||||
CharacterSet="2"
|
|
||||||
>
|
|
||||||
<Tool
|
|
||||||
Name="VCPreBuildEventTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCCustomBuildTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCXMLDataGeneratorTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCWebServiceProxyGeneratorTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCMIDLTool"
|
|
||||||
TypeLibraryName=".\Debug/quantize.tlb"
|
|
||||||
HeaderFileName=""
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCCLCompilerTool"
|
|
||||||
Optimization="0"
|
|
||||||
AdditionalIncludeDirectories="../"
|
|
||||||
PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE"
|
|
||||||
MinimalRebuild="true"
|
|
||||||
BasicRuntimeChecks="3"
|
|
||||||
RuntimeLibrary="1"
|
|
||||||
PrecompiledHeaderFile=".\Debug/quantize.pch"
|
|
||||||
AssemblerListingLocation=".\Debug/"
|
|
||||||
ObjectFile=".\Debug/"
|
|
||||||
ProgramDataBaseFileName=".\Debug/"
|
|
||||||
WarningLevel="4"
|
|
||||||
SuppressStartupBanner="true"
|
|
||||||
DebugInformationFormat="4"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCManagedResourceCompilerTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCResourceCompilerTool"
|
|
||||||
PreprocessorDefinitions="_DEBUG"
|
|
||||||
Culture="1041"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPreLinkEventTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCLinkerTool"
|
|
||||||
OutputFile=".\Debug/quantize.exe"
|
|
||||||
LinkIncremental="2"
|
|
||||||
SuppressStartupBanner="true"
|
|
||||||
GenerateDebugInformation="true"
|
|
||||||
ProgramDatabaseFile=".\Debug/quantize.pdb"
|
|
||||||
SubSystem="1"
|
|
||||||
RandomizedBaseAddress="1"
|
|
||||||
DataExecutionPrevention="0"
|
|
||||||
TargetMachine="1"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCALinkTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCManifestTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCXDCMakeTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCBscMakeTool"
|
|
||||||
SuppressStartupBanner="true"
|
|
||||||
OutputFile=".\Debug/quantize.bsc"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCFxCopTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCAppVerifierTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPostBuildEventTool"
|
|
||||||
/>
|
|
||||||
</Configuration>
|
|
||||||
<Configuration
|
|
||||||
Name="Release|Win32"
|
|
||||||
OutputDirectory=".\Release"
|
|
||||||
IntermediateDirectory=".\Release"
|
|
||||||
ConfigurationType="1"
|
|
||||||
InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC60.vsprops"
|
|
||||||
UseOfMFC="0"
|
|
||||||
ATLMinimizesCRunTimeLibraryUsage="false"
|
|
||||||
CharacterSet="2"
|
|
||||||
>
|
|
||||||
<Tool
|
|
||||||
Name="VCPreBuildEventTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCCustomBuildTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCXMLDataGeneratorTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCWebServiceProxyGeneratorTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCMIDLTool"
|
|
||||||
TypeLibraryName=".\Release/quantize.tlb"
|
|
||||||
HeaderFileName=""
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCCLCompilerTool"
|
|
||||||
Optimization="2"
|
|
||||||
InlineFunctionExpansion="1"
|
|
||||||
AdditionalIncludeDirectories="../"
|
|
||||||
PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE"
|
|
||||||
StringPooling="true"
|
|
||||||
RuntimeLibrary="0"
|
|
||||||
EnableFunctionLevelLinking="true"
|
|
||||||
PrecompiledHeaderFile=".\Release/quantize.pch"
|
|
||||||
AssemblerListingLocation=".\Release/"
|
|
||||||
ObjectFile=".\Release/"
|
|
||||||
ProgramDataBaseFileName=".\Release/"
|
|
||||||
WarningLevel="4"
|
|
||||||
SuppressStartupBanner="true"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCManagedResourceCompilerTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCResourceCompilerTool"
|
|
||||||
PreprocessorDefinitions="NDEBUG"
|
|
||||||
Culture="1041"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPreLinkEventTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCLinkerTool"
|
|
||||||
OutputFile=".\Release/quantize.exe"
|
|
||||||
LinkIncremental="1"
|
|
||||||
SuppressStartupBanner="true"
|
|
||||||
ProgramDatabaseFile=".\Release/quantize.pdb"
|
|
||||||
SubSystem="1"
|
|
||||||
RandomizedBaseAddress="1"
|
|
||||||
DataExecutionPrevention="0"
|
|
||||||
TargetMachine="1"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCALinkTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCManifestTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCXDCMakeTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCBscMakeTool"
|
|
||||||
SuppressStartupBanner="true"
|
|
||||||
OutputFile=".\Release/quantize.bsc"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCFxCopTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCAppVerifierTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPostBuildEventTool"
|
|
||||||
/>
|
|
||||||
</Configuration>
|
|
||||||
<Configuration
|
|
||||||
Name="Debug|x64"
|
|
||||||
OutputDirectory="$(PlatformName)\$(ConfigurationName)"
|
|
||||||
IntermediateDirectory="$(PlatformName)\$(ConfigurationName)"
|
|
||||||
ConfigurationType="1"
|
|
||||||
InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC60.vsprops"
|
|
||||||
UseOfMFC="0"
|
|
||||||
ATLMinimizesCRunTimeLibraryUsage="false"
|
|
||||||
CharacterSet="2"
|
|
||||||
>
|
|
||||||
<Tool
|
|
||||||
Name="VCPreBuildEventTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCCustomBuildTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCXMLDataGeneratorTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCWebServiceProxyGeneratorTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCMIDLTool"
|
|
||||||
TargetEnvironment="3"
|
|
||||||
TypeLibraryName=".\Debug/quantize.tlb"
|
|
||||||
HeaderFileName=""
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCCLCompilerTool"
|
|
||||||
Optimization="0"
|
|
||||||
AdditionalIncludeDirectories="../"
|
|
||||||
PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE"
|
|
||||||
MinimalRebuild="true"
|
|
||||||
BasicRuntimeChecks="3"
|
|
||||||
RuntimeLibrary="1"
|
|
||||||
PrecompiledHeaderFile=".\Debug/quantize.pch"
|
|
||||||
AssemblerListingLocation=".\Debug/"
|
|
||||||
ObjectFile=".\Debug/"
|
|
||||||
ProgramDataBaseFileName=".\Debug/"
|
|
||||||
WarningLevel="4"
|
|
||||||
SuppressStartupBanner="true"
|
|
||||||
DebugInformationFormat="3"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCManagedResourceCompilerTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCResourceCompilerTool"
|
|
||||||
PreprocessorDefinitions="_DEBUG"
|
|
||||||
Culture="1041"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPreLinkEventTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCLinkerTool"
|
|
||||||
OutputFile=".\Debug/quantize.exe"
|
|
||||||
LinkIncremental="2"
|
|
||||||
SuppressStartupBanner="true"
|
|
||||||
GenerateDebugInformation="true"
|
|
||||||
ProgramDatabaseFile=".\Debug/quantize.pdb"
|
|
||||||
SubSystem="1"
|
|
||||||
RandomizedBaseAddress="1"
|
|
||||||
DataExecutionPrevention="0"
|
|
||||||
TargetMachine="17"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCALinkTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCManifestTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCXDCMakeTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCBscMakeTool"
|
|
||||||
SuppressStartupBanner="true"
|
|
||||||
OutputFile=".\Debug/quantize.bsc"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCFxCopTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCAppVerifierTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPostBuildEventTool"
|
|
||||||
/>
|
|
||||||
</Configuration>
|
|
||||||
<Configuration
|
|
||||||
Name="Release|x64"
|
|
||||||
OutputDirectory="$(PlatformName)\$(ConfigurationName)"
|
|
||||||
IntermediateDirectory="$(PlatformName)\$(ConfigurationName)"
|
|
||||||
ConfigurationType="1"
|
|
||||||
InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC60.vsprops"
|
|
||||||
UseOfMFC="0"
|
|
||||||
ATLMinimizesCRunTimeLibraryUsage="false"
|
|
||||||
CharacterSet="2"
|
|
||||||
>
|
|
||||||
<Tool
|
|
||||||
Name="VCPreBuildEventTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCCustomBuildTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCXMLDataGeneratorTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCWebServiceProxyGeneratorTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCMIDLTool"
|
|
||||||
TargetEnvironment="3"
|
|
||||||
TypeLibraryName=".\Release/quantize.tlb"
|
|
||||||
HeaderFileName=""
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCCLCompilerTool"
|
|
||||||
Optimization="2"
|
|
||||||
InlineFunctionExpansion="1"
|
|
||||||
AdditionalIncludeDirectories="../"
|
|
||||||
PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE"
|
|
||||||
StringPooling="true"
|
|
||||||
RuntimeLibrary="0"
|
|
||||||
EnableFunctionLevelLinking="true"
|
|
||||||
PrecompiledHeaderFile=".\Release/quantize.pch"
|
|
||||||
AssemblerListingLocation=".\Release/"
|
|
||||||
ObjectFile=".\Release/"
|
|
||||||
ProgramDataBaseFileName=".\Release/"
|
|
||||||
WarningLevel="4"
|
|
||||||
SuppressStartupBanner="true"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCManagedResourceCompilerTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCResourceCompilerTool"
|
|
||||||
PreprocessorDefinitions="NDEBUG"
|
|
||||||
Culture="1041"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPreLinkEventTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCLinkerTool"
|
|
||||||
OutputFile=".\Release/quantize.exe"
|
|
||||||
LinkIncremental="1"
|
|
||||||
SuppressStartupBanner="true"
|
|
||||||
ProgramDatabaseFile=".\Release/quantize.pdb"
|
|
||||||
SubSystem="1"
|
|
||||||
RandomizedBaseAddress="1"
|
|
||||||
DataExecutionPrevention="0"
|
|
||||||
TargetMachine="17"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCALinkTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCManifestTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCXDCMakeTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCBscMakeTool"
|
|
||||||
SuppressStartupBanner="true"
|
|
||||||
OutputFile=".\Release/quantize.bsc"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCFxCopTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCAppVerifierTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPostBuildEventTool"
|
|
||||||
/>
|
|
||||||
</Configuration>
|
|
||||||
</Configurations>
|
|
||||||
<References>
|
|
||||||
</References>
|
|
||||||
<Files>
|
|
||||||
<File
|
|
||||||
RelativePath="quantize.cpp"
|
|
||||||
>
|
|
||||||
<FileConfiguration
|
|
||||||
Name="Debug|Win32"
|
|
||||||
>
|
|
||||||
<Tool
|
|
||||||
Name="VCCLCompilerTool"
|
|
||||||
AdditionalIncludeDirectories=""
|
|
||||||
PreprocessorDefinitions=""
|
|
||||||
/>
|
|
||||||
</FileConfiguration>
|
|
||||||
<FileConfiguration
|
|
||||||
Name="Release|Win32"
|
|
||||||
>
|
|
||||||
<Tool
|
|
||||||
Name="VCCLCompilerTool"
|
|
||||||
AdditionalIncludeDirectories=""
|
|
||||||
PreprocessorDefinitions=""
|
|
||||||
/>
|
|
||||||
</FileConfiguration>
|
|
||||||
<FileConfiguration
|
|
||||||
Name="Debug|x64"
|
|
||||||
>
|
|
||||||
<Tool
|
|
||||||
Name="VCCLCompilerTool"
|
|
||||||
AdditionalIncludeDirectories=""
|
|
||||||
PreprocessorDefinitions=""
|
|
||||||
/>
|
|
||||||
</FileConfiguration>
|
|
||||||
<FileConfiguration
|
|
||||||
Name="Release|x64"
|
|
||||||
>
|
|
||||||
<Tool
|
|
||||||
Name="VCCLCompilerTool"
|
|
||||||
AdditionalIncludeDirectories=""
|
|
||||||
PreprocessorDefinitions=""
|
|
||||||
/>
|
|
||||||
</FileConfiguration>
|
|
||||||
</File>
|
|
||||||
</Files>
|
|
||||||
<Globals>
|
|
||||||
</Globals>
|
|
||||||
</VisualStudioProject>
|
|
228
sample/quantize.vcxproj
Normal file
228
sample/quantize.vcxproj
Normal file
|
@ -0,0 +1,228 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<Project DefaultTargets="Build" ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||||
|
<ItemGroup Label="ProjectConfigurations">
|
||||||
|
<ProjectConfiguration Include="Debug|Win32">
|
||||||
|
<Configuration>Debug</Configuration>
|
||||||
|
<Platform>Win32</Platform>
|
||||||
|
</ProjectConfiguration>
|
||||||
|
<ProjectConfiguration Include="Debug|x64">
|
||||||
|
<Configuration>Debug</Configuration>
|
||||||
|
<Platform>x64</Platform>
|
||||||
|
</ProjectConfiguration>
|
||||||
|
<ProjectConfiguration Include="Release|Win32">
|
||||||
|
<Configuration>Release</Configuration>
|
||||||
|
<Platform>Win32</Platform>
|
||||||
|
</ProjectConfiguration>
|
||||||
|
<ProjectConfiguration Include="Release|x64">
|
||||||
|
<Configuration>Release</Configuration>
|
||||||
|
<Platform>x64</Platform>
|
||||||
|
</ProjectConfiguration>
|
||||||
|
</ItemGroup>
|
||||||
|
<PropertyGroup Label="Globals">
|
||||||
|
<ProjectGuid>{D06753BF-E1F3-4578-9B18-08673327F77C}</ProjectGuid>
|
||||||
|
<WindowsTargetPlatformVersion>10.0.17763.0</WindowsTargetPlatformVersion>
|
||||||
|
</PropertyGroup>
|
||||||
|
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
|
||||||
|
<ConfigurationType>Application</ConfigurationType>
|
||||||
|
<PlatformToolset>v141</PlatformToolset>
|
||||||
|
<UseOfMfc>false</UseOfMfc>
|
||||||
|
<CharacterSet>MultiByte</CharacterSet>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
|
||||||
|
<ConfigurationType>Application</ConfigurationType>
|
||||||
|
<PlatformToolset>v141</PlatformToolset>
|
||||||
|
<UseOfMfc>false</UseOfMfc>
|
||||||
|
<CharacterSet>MultiByte</CharacterSet>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
|
||||||
|
<ConfigurationType>Application</ConfigurationType>
|
||||||
|
<PlatformToolset>v141</PlatformToolset>
|
||||||
|
<UseOfMfc>false</UseOfMfc>
|
||||||
|
<CharacterSet>MultiByte</CharacterSet>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
|
||||||
|
<ConfigurationType>Application</ConfigurationType>
|
||||||
|
<PlatformToolset>v141</PlatformToolset>
|
||||||
|
<UseOfMfc>false</UseOfMfc>
|
||||||
|
<CharacterSet>MultiByte</CharacterSet>
|
||||||
|
</PropertyGroup>
|
||||||
|
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
|
||||||
|
<ImportGroup Label="ExtensionSettings">
|
||||||
|
</ImportGroup>
|
||||||
|
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="PropertySheets">
|
||||||
|
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||||
|
<Import Project="$(VCTargetsPath)Microsoft.CPP.UpgradeFromVC60.props" />
|
||||||
|
</ImportGroup>
|
||||||
|
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="PropertySheets">
|
||||||
|
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||||
|
<Import Project="$(VCTargetsPath)Microsoft.CPP.UpgradeFromVC60.props" />
|
||||||
|
</ImportGroup>
|
||||||
|
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets">
|
||||||
|
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||||
|
<Import Project="$(VCTargetsPath)Microsoft.CPP.UpgradeFromVC60.props" />
|
||||||
|
</ImportGroup>
|
||||||
|
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets">
|
||||||
|
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||||
|
<Import Project="$(VCTargetsPath)Microsoft.CPP.UpgradeFromVC60.props" />
|
||||||
|
</ImportGroup>
|
||||||
|
<PropertyGroup Label="UserMacros" />
|
||||||
|
<PropertyGroup>
|
||||||
|
<_ProjectFileVersion>15.0.27924.0</_ProjectFileVersion>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
||||||
|
<LinkIncremental>true</LinkIncremental>
|
||||||
|
<IntDir>$(ProjectName)\$(Configuration)\</IntDir>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
||||||
|
<LinkIncremental>false</LinkIncremental>
|
||||||
|
<IntDir>$(ProjectName)\$(Configuration)\</IntDir>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
|
||||||
|
<LinkIncremental>true</LinkIncremental>
|
||||||
|
<IntDir>$(ProjectName)\$(Platform)\$(Configuration)\</IntDir>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
|
||||||
|
<LinkIncremental>false</LinkIncremental>
|
||||||
|
<IntDir>$(ProjectName)\$(Platform)\$(Configuration)\</IntDir>
|
||||||
|
</PropertyGroup>
|
||||||
|
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
||||||
|
<Midl>
|
||||||
|
<TypeLibraryName>.\Debug/quantize.tlb</TypeLibraryName>
|
||||||
|
<HeaderFileName />
|
||||||
|
</Midl>
|
||||||
|
<ClCompile>
|
||||||
|
<Optimization>Disabled</Optimization>
|
||||||
|
<AdditionalIncludeDirectories>../;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||||
|
<PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
|
<MinimalRebuild>true</MinimalRebuild>
|
||||||
|
<BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
|
||||||
|
<RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
|
||||||
|
<PrecompiledHeaderOutputFile>.\Debug/quantize.pch</PrecompiledHeaderOutputFile>
|
||||||
|
<WarningLevel>Level4</WarningLevel>
|
||||||
|
<SuppressStartupBanner>true</SuppressStartupBanner>
|
||||||
|
</ClCompile>
|
||||||
|
<ResourceCompile>
|
||||||
|
<PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
|
<Culture>0x0411</Culture>
|
||||||
|
</ResourceCompile>
|
||||||
|
<Link>
|
||||||
|
<SuppressStartupBanner>true</SuppressStartupBanner>
|
||||||
|
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||||
|
<ProgramDatabaseFile>.\Debug/quantize.pdb</ProgramDatabaseFile>
|
||||||
|
<SubSystem>Console</SubSystem>
|
||||||
|
<RandomizedBaseAddress>false</RandomizedBaseAddress>
|
||||||
|
<DataExecutionPrevention />
|
||||||
|
<TargetMachine>MachineX86</TargetMachine>
|
||||||
|
</Link>
|
||||||
|
<Bscmake>
|
||||||
|
<SuppressStartupBanner>true</SuppressStartupBanner>
|
||||||
|
</Bscmake>
|
||||||
|
</ItemDefinitionGroup>
|
||||||
|
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
||||||
|
<Midl>
|
||||||
|
<TypeLibraryName>.\Release/quantize.tlb</TypeLibraryName>
|
||||||
|
<HeaderFileName />
|
||||||
|
</Midl>
|
||||||
|
<ClCompile>
|
||||||
|
<Optimization>MaxSpeed</Optimization>
|
||||||
|
<InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion>
|
||||||
|
<AdditionalIncludeDirectories>../;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||||
|
<PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
|
<StringPooling>true</StringPooling>
|
||||||
|
<RuntimeLibrary>MultiThreaded</RuntimeLibrary>
|
||||||
|
<FunctionLevelLinking>true</FunctionLevelLinking>
|
||||||
|
<PrecompiledHeaderOutputFile>.\Release/quantize.pch</PrecompiledHeaderOutputFile>
|
||||||
|
<WarningLevel>Level4</WarningLevel>
|
||||||
|
<SuppressStartupBanner>true</SuppressStartupBanner>
|
||||||
|
</ClCompile>
|
||||||
|
<ResourceCompile>
|
||||||
|
<PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
|
<Culture>0x0411</Culture>
|
||||||
|
</ResourceCompile>
|
||||||
|
<Link>
|
||||||
|
<SuppressStartupBanner>true</SuppressStartupBanner>
|
||||||
|
<SubSystem>Console</SubSystem>
|
||||||
|
<RandomizedBaseAddress>false</RandomizedBaseAddress>
|
||||||
|
<DataExecutionPrevention />
|
||||||
|
<TargetMachine>MachineX86</TargetMachine>
|
||||||
|
</Link>
|
||||||
|
<Bscmake>
|
||||||
|
<SuppressStartupBanner>true</SuppressStartupBanner>
|
||||||
|
</Bscmake>
|
||||||
|
</ItemDefinitionGroup>
|
||||||
|
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
|
||||||
|
<Midl>
|
||||||
|
<TargetEnvironment>X64</TargetEnvironment>
|
||||||
|
<TypeLibraryName>.\Debug/quantize.tlb</TypeLibraryName>
|
||||||
|
<HeaderFileName />
|
||||||
|
</Midl>
|
||||||
|
<ClCompile>
|
||||||
|
<Optimization>Disabled</Optimization>
|
||||||
|
<AdditionalIncludeDirectories>../;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||||
|
<PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
|
<MinimalRebuild>true</MinimalRebuild>
|
||||||
|
<BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
|
||||||
|
<RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
|
||||||
|
<PrecompiledHeaderOutputFile>.\Debug/quantize.pch</PrecompiledHeaderOutputFile>
|
||||||
|
<WarningLevel>Level4</WarningLevel>
|
||||||
|
<SuppressStartupBanner>true</SuppressStartupBanner>
|
||||||
|
<DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
|
||||||
|
</ClCompile>
|
||||||
|
<ResourceCompile>
|
||||||
|
<PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
|
<Culture>0x0411</Culture>
|
||||||
|
</ResourceCompile>
|
||||||
|
<Link>
|
||||||
|
<SuppressStartupBanner>true</SuppressStartupBanner>
|
||||||
|
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||||
|
<ProgramDatabaseFile>.\Debug/quantize.pdb</ProgramDatabaseFile>
|
||||||
|
<SubSystem>Console</SubSystem>
|
||||||
|
<RandomizedBaseAddress>false</RandomizedBaseAddress>
|
||||||
|
<DataExecutionPrevention />
|
||||||
|
<TargetMachine>MachineX64</TargetMachine>
|
||||||
|
</Link>
|
||||||
|
<Bscmake>
|
||||||
|
<SuppressStartupBanner>true</SuppressStartupBanner>
|
||||||
|
</Bscmake>
|
||||||
|
</ItemDefinitionGroup>
|
||||||
|
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
|
||||||
|
<Midl>
|
||||||
|
<TargetEnvironment>X64</TargetEnvironment>
|
||||||
|
<TypeLibraryName>.\Release/quantize.tlb</TypeLibraryName>
|
||||||
|
<HeaderFileName />
|
||||||
|
</Midl>
|
||||||
|
<ClCompile>
|
||||||
|
<Optimization>MaxSpeed</Optimization>
|
||||||
|
<InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion>
|
||||||
|
<AdditionalIncludeDirectories>../;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||||
|
<PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
|
<StringPooling>true</StringPooling>
|
||||||
|
<RuntimeLibrary>MultiThreaded</RuntimeLibrary>
|
||||||
|
<FunctionLevelLinking>true</FunctionLevelLinking>
|
||||||
|
<PrecompiledHeaderOutputFile>.\Release/quantize.pch</PrecompiledHeaderOutputFile>
|
||||||
|
<WarningLevel>Level4</WarningLevel>
|
||||||
|
<SuppressStartupBanner>true</SuppressStartupBanner>
|
||||||
|
</ClCompile>
|
||||||
|
<ResourceCompile>
|
||||||
|
<PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
|
<Culture>0x0411</Culture>
|
||||||
|
</ResourceCompile>
|
||||||
|
<Link>
|
||||||
|
<SuppressStartupBanner>true</SuppressStartupBanner>
|
||||||
|
<SubSystem>Console</SubSystem>
|
||||||
|
<RandomizedBaseAddress>false</RandomizedBaseAddress>
|
||||||
|
<DataExecutionPrevention />
|
||||||
|
<TargetMachine>MachineX64</TargetMachine>
|
||||||
|
</Link>
|
||||||
|
<Bscmake>
|
||||||
|
<SuppressStartupBanner>true</SuppressStartupBanner>
|
||||||
|
</Bscmake>
|
||||||
|
</ItemDefinitionGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<ClCompile Include="quantize.cpp" />
|
||||||
|
</ItemGroup>
|
||||||
|
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
|
||||||
|
<ImportGroup Label="ExtensionTargets">
|
||||||
|
</ImportGroup>
|
||||||
|
</Project>
|
|
@ -163,15 +163,15 @@ int main()
|
||||||
// use memory allocated by user
|
// use memory allocated by user
|
||||||
using namespace Xbyak;
|
using namespace Xbyak;
|
||||||
const size_t codeSize = 4096;
|
const size_t codeSize = 4096;
|
||||||
uint8 buf[codeSize + 16];
|
uint8_t buf[codeSize + 16];
|
||||||
uint8 *p = CodeArray::getAlignedAddress(buf);
|
uint8_t *p = CodeArray::getAlignedAddress(buf);
|
||||||
Sample s(p, codeSize);
|
Sample s(p, codeSize);
|
||||||
if (!CodeArray::protect(p, codeSize, CodeArray::PROTECT_RWE)) {
|
if (!CodeArray::protect(p, codeSize, CodeArray::PROTECT_RWE)) {
|
||||||
fprintf(stderr, "can't protect\n");
|
fprintf(stderr, "can't protect\n");
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
int (*func)(int) = s.getCode<int (*)(int)>();
|
int (*func)(int) = s.getCode<int (*)(int)>();
|
||||||
const uint8 *funcp = reinterpret_cast<const uint8*>(func);
|
const uint8_t *funcp = reinterpret_cast<const uint8_t*>(func);
|
||||||
if (funcp != p) {
|
if (funcp != p) {
|
||||||
fprintf(stderr, "internal error %p %p\n", p, funcp);
|
fprintf(stderr, "internal error %p %p\n", p, funcp);
|
||||||
return 1;
|
return 1;
|
||||||
|
|
|
@ -1,427 +0,0 @@
|
||||||
<?xml version="1.0" encoding="shift_jis"?>
|
|
||||||
<VisualStudioProject
|
|
||||||
ProjectType="Visual C++"
|
|
||||||
Version="9.00"
|
|
||||||
Name="test0"
|
|
||||||
ProjectGUID="{1CDE4D2A-BE3A-4B9B-B28F-524A23084A8E}"
|
|
||||||
TargetFrameworkVersion="0"
|
|
||||||
>
|
|
||||||
<Platforms>
|
|
||||||
<Platform
|
|
||||||
Name="Win32"
|
|
||||||
/>
|
|
||||||
<Platform
|
|
||||||
Name="x64"
|
|
||||||
/>
|
|
||||||
</Platforms>
|
|
||||||
<ToolFiles>
|
|
||||||
</ToolFiles>
|
|
||||||
<Configurations>
|
|
||||||
<Configuration
|
|
||||||
Name="Debug|Win32"
|
|
||||||
OutputDirectory=".\Debug"
|
|
||||||
IntermediateDirectory=".\Debug"
|
|
||||||
ConfigurationType="1"
|
|
||||||
InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC60.vsprops"
|
|
||||||
UseOfMFC="0"
|
|
||||||
ATLMinimizesCRunTimeLibraryUsage="false"
|
|
||||||
CharacterSet="2"
|
|
||||||
>
|
|
||||||
<Tool
|
|
||||||
Name="VCPreBuildEventTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCCustomBuildTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCXMLDataGeneratorTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCWebServiceProxyGeneratorTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCMIDLTool"
|
|
||||||
TypeLibraryName=".\Debug/test0.tlb"
|
|
||||||
HeaderFileName=""
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCCLCompilerTool"
|
|
||||||
Optimization="0"
|
|
||||||
AdditionalIncludeDirectories="../"
|
|
||||||
PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE"
|
|
||||||
MinimalRebuild="true"
|
|
||||||
BasicRuntimeChecks="3"
|
|
||||||
RuntimeLibrary="1"
|
|
||||||
PrecompiledHeaderFile=".\Debug/test0.pch"
|
|
||||||
AssemblerListingLocation=".\Debug/"
|
|
||||||
ObjectFile=".\Debug/"
|
|
||||||
ProgramDataBaseFileName=".\Debug/"
|
|
||||||
WarningLevel="4"
|
|
||||||
SuppressStartupBanner="true"
|
|
||||||
DebugInformationFormat="4"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCManagedResourceCompilerTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCResourceCompilerTool"
|
|
||||||
PreprocessorDefinitions="_DEBUG"
|
|
||||||
Culture="1041"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPreLinkEventTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCLinkerTool"
|
|
||||||
OutputFile=".\Debug/test0.exe"
|
|
||||||
LinkIncremental="2"
|
|
||||||
SuppressStartupBanner="true"
|
|
||||||
GenerateDebugInformation="true"
|
|
||||||
ProgramDatabaseFile=".\Debug/test0.pdb"
|
|
||||||
SubSystem="1"
|
|
||||||
RandomizedBaseAddress="1"
|
|
||||||
DataExecutionPrevention="0"
|
|
||||||
TargetMachine="1"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCALinkTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCManifestTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCXDCMakeTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCBscMakeTool"
|
|
||||||
SuppressStartupBanner="true"
|
|
||||||
OutputFile=".\Debug/test0.bsc"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCFxCopTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCAppVerifierTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPostBuildEventTool"
|
|
||||||
/>
|
|
||||||
</Configuration>
|
|
||||||
<Configuration
|
|
||||||
Name="Release|Win32"
|
|
||||||
OutputDirectory=".\Release"
|
|
||||||
IntermediateDirectory=".\Release"
|
|
||||||
ConfigurationType="1"
|
|
||||||
InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC60.vsprops"
|
|
||||||
UseOfMFC="0"
|
|
||||||
ATLMinimizesCRunTimeLibraryUsage="false"
|
|
||||||
CharacterSet="2"
|
|
||||||
>
|
|
||||||
<Tool
|
|
||||||
Name="VCPreBuildEventTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCCustomBuildTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCXMLDataGeneratorTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCWebServiceProxyGeneratorTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCMIDLTool"
|
|
||||||
TypeLibraryName=".\Release/test0.tlb"
|
|
||||||
HeaderFileName=""
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCCLCompilerTool"
|
|
||||||
Optimization="2"
|
|
||||||
InlineFunctionExpansion="1"
|
|
||||||
AdditionalIncludeDirectories="../"
|
|
||||||
PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE"
|
|
||||||
StringPooling="true"
|
|
||||||
RuntimeLibrary="0"
|
|
||||||
EnableFunctionLevelLinking="true"
|
|
||||||
PrecompiledHeaderFile=".\Release/test0.pch"
|
|
||||||
AssemblerListingLocation=".\Release/"
|
|
||||||
ObjectFile=".\Release/"
|
|
||||||
ProgramDataBaseFileName=".\Release/"
|
|
||||||
WarningLevel="4"
|
|
||||||
SuppressStartupBanner="true"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCManagedResourceCompilerTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCResourceCompilerTool"
|
|
||||||
PreprocessorDefinitions="NDEBUG"
|
|
||||||
Culture="1041"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPreLinkEventTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCLinkerTool"
|
|
||||||
OutputFile=".\Release/test0.exe"
|
|
||||||
LinkIncremental="1"
|
|
||||||
SuppressStartupBanner="true"
|
|
||||||
ProgramDatabaseFile=".\Release/test0.pdb"
|
|
||||||
SubSystem="1"
|
|
||||||
RandomizedBaseAddress="1"
|
|
||||||
DataExecutionPrevention="0"
|
|
||||||
TargetMachine="1"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCALinkTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCManifestTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCXDCMakeTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCBscMakeTool"
|
|
||||||
SuppressStartupBanner="true"
|
|
||||||
OutputFile=".\Release/test0.bsc"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCFxCopTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCAppVerifierTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPostBuildEventTool"
|
|
||||||
/>
|
|
||||||
</Configuration>
|
|
||||||
<Configuration
|
|
||||||
Name="Debug|x64"
|
|
||||||
OutputDirectory="$(PlatformName)\$(ConfigurationName)"
|
|
||||||
IntermediateDirectory="$(PlatformName)\$(ConfigurationName)"
|
|
||||||
ConfigurationType="1"
|
|
||||||
InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC60.vsprops"
|
|
||||||
UseOfMFC="0"
|
|
||||||
ATLMinimizesCRunTimeLibraryUsage="false"
|
|
||||||
CharacterSet="2"
|
|
||||||
>
|
|
||||||
<Tool
|
|
||||||
Name="VCPreBuildEventTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCCustomBuildTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCXMLDataGeneratorTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCWebServiceProxyGeneratorTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCMIDLTool"
|
|
||||||
TargetEnvironment="3"
|
|
||||||
TypeLibraryName=".\Debug/test0.tlb"
|
|
||||||
HeaderFileName=""
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCCLCompilerTool"
|
|
||||||
Optimization="0"
|
|
||||||
AdditionalIncludeDirectories="../"
|
|
||||||
PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE"
|
|
||||||
MinimalRebuild="true"
|
|
||||||
BasicRuntimeChecks="3"
|
|
||||||
RuntimeLibrary="1"
|
|
||||||
PrecompiledHeaderFile=".\Debug/test0.pch"
|
|
||||||
AssemblerListingLocation=".\Debug/"
|
|
||||||
ObjectFile=".\Debug/"
|
|
||||||
ProgramDataBaseFileName=".\Debug/"
|
|
||||||
WarningLevel="4"
|
|
||||||
SuppressStartupBanner="true"
|
|
||||||
DebugInformationFormat="3"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCManagedResourceCompilerTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCResourceCompilerTool"
|
|
||||||
PreprocessorDefinitions="_DEBUG"
|
|
||||||
Culture="1041"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPreLinkEventTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCLinkerTool"
|
|
||||||
OutputFile=".\Debug/test0.exe"
|
|
||||||
LinkIncremental="2"
|
|
||||||
SuppressStartupBanner="true"
|
|
||||||
GenerateDebugInformation="true"
|
|
||||||
ProgramDatabaseFile=".\Debug/test0.pdb"
|
|
||||||
SubSystem="1"
|
|
||||||
RandomizedBaseAddress="1"
|
|
||||||
DataExecutionPrevention="0"
|
|
||||||
TargetMachine="17"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCALinkTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCManifestTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCXDCMakeTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCBscMakeTool"
|
|
||||||
SuppressStartupBanner="true"
|
|
||||||
OutputFile=".\Debug/test0.bsc"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCFxCopTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCAppVerifierTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPostBuildEventTool"
|
|
||||||
/>
|
|
||||||
</Configuration>
|
|
||||||
<Configuration
|
|
||||||
Name="Release|x64"
|
|
||||||
OutputDirectory="$(PlatformName)\$(ConfigurationName)"
|
|
||||||
IntermediateDirectory="$(PlatformName)\$(ConfigurationName)"
|
|
||||||
ConfigurationType="1"
|
|
||||||
InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC60.vsprops"
|
|
||||||
UseOfMFC="0"
|
|
||||||
ATLMinimizesCRunTimeLibraryUsage="false"
|
|
||||||
CharacterSet="2"
|
|
||||||
>
|
|
||||||
<Tool
|
|
||||||
Name="VCPreBuildEventTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCCustomBuildTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCXMLDataGeneratorTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCWebServiceProxyGeneratorTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCMIDLTool"
|
|
||||||
TargetEnvironment="3"
|
|
||||||
TypeLibraryName=".\Release/test0.tlb"
|
|
||||||
HeaderFileName=""
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCCLCompilerTool"
|
|
||||||
Optimization="2"
|
|
||||||
InlineFunctionExpansion="1"
|
|
||||||
AdditionalIncludeDirectories="../"
|
|
||||||
PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE"
|
|
||||||
StringPooling="true"
|
|
||||||
RuntimeLibrary="0"
|
|
||||||
EnableFunctionLevelLinking="true"
|
|
||||||
PrecompiledHeaderFile=".\Release/test0.pch"
|
|
||||||
AssemblerListingLocation=".\Release/"
|
|
||||||
ObjectFile=".\Release/"
|
|
||||||
ProgramDataBaseFileName=".\Release/"
|
|
||||||
WarningLevel="4"
|
|
||||||
SuppressStartupBanner="true"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCManagedResourceCompilerTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCResourceCompilerTool"
|
|
||||||
PreprocessorDefinitions="NDEBUG"
|
|
||||||
Culture="1041"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPreLinkEventTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCLinkerTool"
|
|
||||||
OutputFile=".\Release/test0.exe"
|
|
||||||
LinkIncremental="1"
|
|
||||||
SuppressStartupBanner="true"
|
|
||||||
ProgramDatabaseFile=".\Release/test0.pdb"
|
|
||||||
SubSystem="1"
|
|
||||||
RandomizedBaseAddress="1"
|
|
||||||
DataExecutionPrevention="0"
|
|
||||||
TargetMachine="17"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCALinkTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCManifestTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCXDCMakeTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCBscMakeTool"
|
|
||||||
SuppressStartupBanner="true"
|
|
||||||
OutputFile=".\Release/test0.bsc"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCFxCopTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCAppVerifierTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPostBuildEventTool"
|
|
||||||
/>
|
|
||||||
</Configuration>
|
|
||||||
</Configurations>
|
|
||||||
<References>
|
|
||||||
</References>
|
|
||||||
<Files>
|
|
||||||
<File
|
|
||||||
RelativePath="test0.cpp"
|
|
||||||
>
|
|
||||||
<FileConfiguration
|
|
||||||
Name="Debug|Win32"
|
|
||||||
>
|
|
||||||
<Tool
|
|
||||||
Name="VCCLCompilerTool"
|
|
||||||
AdditionalIncludeDirectories=""
|
|
||||||
PreprocessorDefinitions=""
|
|
||||||
/>
|
|
||||||
</FileConfiguration>
|
|
||||||
<FileConfiguration
|
|
||||||
Name="Release|Win32"
|
|
||||||
>
|
|
||||||
<Tool
|
|
||||||
Name="VCCLCompilerTool"
|
|
||||||
AdditionalIncludeDirectories=""
|
|
||||||
PreprocessorDefinitions=""
|
|
||||||
/>
|
|
||||||
</FileConfiguration>
|
|
||||||
<FileConfiguration
|
|
||||||
Name="Debug|x64"
|
|
||||||
>
|
|
||||||
<Tool
|
|
||||||
Name="VCCLCompilerTool"
|
|
||||||
AdditionalIncludeDirectories=""
|
|
||||||
PreprocessorDefinitions=""
|
|
||||||
/>
|
|
||||||
</FileConfiguration>
|
|
||||||
<FileConfiguration
|
|
||||||
Name="Release|x64"
|
|
||||||
>
|
|
||||||
<Tool
|
|
||||||
Name="VCCLCompilerTool"
|
|
||||||
AdditionalIncludeDirectories=""
|
|
||||||
PreprocessorDefinitions=""
|
|
||||||
/>
|
|
||||||
</FileConfiguration>
|
|
||||||
</File>
|
|
||||||
</Files>
|
|
||||||
<Globals>
|
|
||||||
</Globals>
|
|
||||||
</VisualStudioProject>
|
|
228
sample/test0.vcxproj
Normal file
228
sample/test0.vcxproj
Normal file
|
@ -0,0 +1,228 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<Project DefaultTargets="Build" ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||||
|
<ItemGroup Label="ProjectConfigurations">
|
||||||
|
<ProjectConfiguration Include="Debug|Win32">
|
||||||
|
<Configuration>Debug</Configuration>
|
||||||
|
<Platform>Win32</Platform>
|
||||||
|
</ProjectConfiguration>
|
||||||
|
<ProjectConfiguration Include="Debug|x64">
|
||||||
|
<Configuration>Debug</Configuration>
|
||||||
|
<Platform>x64</Platform>
|
||||||
|
</ProjectConfiguration>
|
||||||
|
<ProjectConfiguration Include="Release|Win32">
|
||||||
|
<Configuration>Release</Configuration>
|
||||||
|
<Platform>Win32</Platform>
|
||||||
|
</ProjectConfiguration>
|
||||||
|
<ProjectConfiguration Include="Release|x64">
|
||||||
|
<Configuration>Release</Configuration>
|
||||||
|
<Platform>x64</Platform>
|
||||||
|
</ProjectConfiguration>
|
||||||
|
</ItemGroup>
|
||||||
|
<PropertyGroup Label="Globals">
|
||||||
|
<ProjectGuid>{1CDE4D2A-BE3A-4B9B-B28F-524A23084A8E}</ProjectGuid>
|
||||||
|
<WindowsTargetPlatformVersion>10.0.17763.0</WindowsTargetPlatformVersion>
|
||||||
|
</PropertyGroup>
|
||||||
|
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
|
||||||
|
<ConfigurationType>Application</ConfigurationType>
|
||||||
|
<PlatformToolset>v141</PlatformToolset>
|
||||||
|
<UseOfMfc>false</UseOfMfc>
|
||||||
|
<CharacterSet>MultiByte</CharacterSet>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
|
||||||
|
<ConfigurationType>Application</ConfigurationType>
|
||||||
|
<PlatformToolset>v141</PlatformToolset>
|
||||||
|
<UseOfMfc>false</UseOfMfc>
|
||||||
|
<CharacterSet>MultiByte</CharacterSet>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
|
||||||
|
<ConfigurationType>Application</ConfigurationType>
|
||||||
|
<PlatformToolset>v141</PlatformToolset>
|
||||||
|
<UseOfMfc>false</UseOfMfc>
|
||||||
|
<CharacterSet>MultiByte</CharacterSet>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
|
||||||
|
<ConfigurationType>Application</ConfigurationType>
|
||||||
|
<PlatformToolset>v141</PlatformToolset>
|
||||||
|
<UseOfMfc>false</UseOfMfc>
|
||||||
|
<CharacterSet>MultiByte</CharacterSet>
|
||||||
|
</PropertyGroup>
|
||||||
|
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
|
||||||
|
<ImportGroup Label="ExtensionSettings">
|
||||||
|
</ImportGroup>
|
||||||
|
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="PropertySheets">
|
||||||
|
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||||
|
<Import Project="$(VCTargetsPath)Microsoft.CPP.UpgradeFromVC60.props" />
|
||||||
|
</ImportGroup>
|
||||||
|
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="PropertySheets">
|
||||||
|
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||||
|
<Import Project="$(VCTargetsPath)Microsoft.CPP.UpgradeFromVC60.props" />
|
||||||
|
</ImportGroup>
|
||||||
|
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets">
|
||||||
|
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||||
|
<Import Project="$(VCTargetsPath)Microsoft.CPP.UpgradeFromVC60.props" />
|
||||||
|
</ImportGroup>
|
||||||
|
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets">
|
||||||
|
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||||
|
<Import Project="$(VCTargetsPath)Microsoft.CPP.UpgradeFromVC60.props" />
|
||||||
|
</ImportGroup>
|
||||||
|
<PropertyGroup Label="UserMacros" />
|
||||||
|
<PropertyGroup>
|
||||||
|
<_ProjectFileVersion>15.0.27924.0</_ProjectFileVersion>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
||||||
|
<LinkIncremental>true</LinkIncremental>
|
||||||
|
<IntDir>$(ProjectName)\$(Configuration)\</IntDir>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
||||||
|
<LinkIncremental>false</LinkIncremental>
|
||||||
|
<IntDir>$(ProjectName)\$(Configuration)\</IntDir>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
|
||||||
|
<LinkIncremental>true</LinkIncremental>
|
||||||
|
<IntDir>$(ProjectName)\$(Platform)\$(Configuration)\</IntDir>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
|
||||||
|
<LinkIncremental>false</LinkIncremental>
|
||||||
|
<IntDir>$(ProjectName)\$(Platform)\$(Configuration)\</IntDir>
|
||||||
|
</PropertyGroup>
|
||||||
|
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
||||||
|
<Midl>
|
||||||
|
<TypeLibraryName>.\Debug/test0.tlb</TypeLibraryName>
|
||||||
|
<HeaderFileName />
|
||||||
|
</Midl>
|
||||||
|
<ClCompile>
|
||||||
|
<Optimization>Disabled</Optimization>
|
||||||
|
<AdditionalIncludeDirectories>../;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||||
|
<PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
|
<MinimalRebuild>true</MinimalRebuild>
|
||||||
|
<BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
|
||||||
|
<RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
|
||||||
|
<PrecompiledHeaderOutputFile>.\Debug/test0.pch</PrecompiledHeaderOutputFile>
|
||||||
|
<WarningLevel>Level4</WarningLevel>
|
||||||
|
<SuppressStartupBanner>true</SuppressStartupBanner>
|
||||||
|
</ClCompile>
|
||||||
|
<ResourceCompile>
|
||||||
|
<PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
|
<Culture>0x0411</Culture>
|
||||||
|
</ResourceCompile>
|
||||||
|
<Link>
|
||||||
|
<SuppressStartupBanner>true</SuppressStartupBanner>
|
||||||
|
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||||
|
<ProgramDatabaseFile>.\Debug/test0.pdb</ProgramDatabaseFile>
|
||||||
|
<SubSystem>Console</SubSystem>
|
||||||
|
<RandomizedBaseAddress>false</RandomizedBaseAddress>
|
||||||
|
<DataExecutionPrevention />
|
||||||
|
<TargetMachine>MachineX86</TargetMachine>
|
||||||
|
</Link>
|
||||||
|
<Bscmake>
|
||||||
|
<SuppressStartupBanner>true</SuppressStartupBanner>
|
||||||
|
</Bscmake>
|
||||||
|
</ItemDefinitionGroup>
|
||||||
|
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
||||||
|
<Midl>
|
||||||
|
<TypeLibraryName>.\Release/test0.tlb</TypeLibraryName>
|
||||||
|
<HeaderFileName />
|
||||||
|
</Midl>
|
||||||
|
<ClCompile>
|
||||||
|
<Optimization>MaxSpeed</Optimization>
|
||||||
|
<InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion>
|
||||||
|
<AdditionalIncludeDirectories>../;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||||
|
<PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
|
<StringPooling>true</StringPooling>
|
||||||
|
<RuntimeLibrary>MultiThreaded</RuntimeLibrary>
|
||||||
|
<FunctionLevelLinking>true</FunctionLevelLinking>
|
||||||
|
<PrecompiledHeaderOutputFile>.\Release/test0.pch</PrecompiledHeaderOutputFile>
|
||||||
|
<WarningLevel>Level4</WarningLevel>
|
||||||
|
<SuppressStartupBanner>true</SuppressStartupBanner>
|
||||||
|
</ClCompile>
|
||||||
|
<ResourceCompile>
|
||||||
|
<PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
|
<Culture>0x0411</Culture>
|
||||||
|
</ResourceCompile>
|
||||||
|
<Link>
|
||||||
|
<SuppressStartupBanner>true</SuppressStartupBanner>
|
||||||
|
<SubSystem>Console</SubSystem>
|
||||||
|
<RandomizedBaseAddress>false</RandomizedBaseAddress>
|
||||||
|
<DataExecutionPrevention />
|
||||||
|
<TargetMachine>MachineX86</TargetMachine>
|
||||||
|
</Link>
|
||||||
|
<Bscmake>
|
||||||
|
<SuppressStartupBanner>true</SuppressStartupBanner>
|
||||||
|
</Bscmake>
|
||||||
|
</ItemDefinitionGroup>
|
||||||
|
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
|
||||||
|
<Midl>
|
||||||
|
<TargetEnvironment>X64</TargetEnvironment>
|
||||||
|
<TypeLibraryName>.\Debug/test0.tlb</TypeLibraryName>
|
||||||
|
<HeaderFileName />
|
||||||
|
</Midl>
|
||||||
|
<ClCompile>
|
||||||
|
<Optimization>Disabled</Optimization>
|
||||||
|
<AdditionalIncludeDirectories>../;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||||
|
<PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
|
<MinimalRebuild>true</MinimalRebuild>
|
||||||
|
<BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
|
||||||
|
<RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
|
||||||
|
<PrecompiledHeaderOutputFile>.\Debug/test0.pch</PrecompiledHeaderOutputFile>
|
||||||
|
<WarningLevel>Level4</WarningLevel>
|
||||||
|
<SuppressStartupBanner>true</SuppressStartupBanner>
|
||||||
|
<DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
|
||||||
|
</ClCompile>
|
||||||
|
<ResourceCompile>
|
||||||
|
<PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
|
<Culture>0x0411</Culture>
|
||||||
|
</ResourceCompile>
|
||||||
|
<Link>
|
||||||
|
<SuppressStartupBanner>true</SuppressStartupBanner>
|
||||||
|
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||||
|
<ProgramDatabaseFile>.\Debug/test0.pdb</ProgramDatabaseFile>
|
||||||
|
<SubSystem>Console</SubSystem>
|
||||||
|
<RandomizedBaseAddress>false</RandomizedBaseAddress>
|
||||||
|
<DataExecutionPrevention />
|
||||||
|
<TargetMachine>MachineX64</TargetMachine>
|
||||||
|
</Link>
|
||||||
|
<Bscmake>
|
||||||
|
<SuppressStartupBanner>true</SuppressStartupBanner>
|
||||||
|
</Bscmake>
|
||||||
|
</ItemDefinitionGroup>
|
||||||
|
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
|
||||||
|
<Midl>
|
||||||
|
<TargetEnvironment>X64</TargetEnvironment>
|
||||||
|
<TypeLibraryName>.\Release/test0.tlb</TypeLibraryName>
|
||||||
|
<HeaderFileName />
|
||||||
|
</Midl>
|
||||||
|
<ClCompile>
|
||||||
|
<Optimization>MaxSpeed</Optimization>
|
||||||
|
<InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion>
|
||||||
|
<AdditionalIncludeDirectories>../;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||||
|
<PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
|
<StringPooling>true</StringPooling>
|
||||||
|
<RuntimeLibrary>MultiThreaded</RuntimeLibrary>
|
||||||
|
<FunctionLevelLinking>true</FunctionLevelLinking>
|
||||||
|
<PrecompiledHeaderOutputFile>.\Release/test0.pch</PrecompiledHeaderOutputFile>
|
||||||
|
<WarningLevel>Level4</WarningLevel>
|
||||||
|
<SuppressStartupBanner>true</SuppressStartupBanner>
|
||||||
|
</ClCompile>
|
||||||
|
<ResourceCompile>
|
||||||
|
<PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
|
<Culture>0x0411</Culture>
|
||||||
|
</ResourceCompile>
|
||||||
|
<Link>
|
||||||
|
<SuppressStartupBanner>true</SuppressStartupBanner>
|
||||||
|
<SubSystem>Console</SubSystem>
|
||||||
|
<RandomizedBaseAddress>false</RandomizedBaseAddress>
|
||||||
|
<DataExecutionPrevention />
|
||||||
|
<TargetMachine>MachineX64</TargetMachine>
|
||||||
|
</Link>
|
||||||
|
<Bscmake>
|
||||||
|
<SuppressStartupBanner>true</SuppressStartupBanner>
|
||||||
|
</Bscmake>
|
||||||
|
</ItemDefinitionGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<ClCompile Include="test0.cpp" />
|
||||||
|
</ItemGroup>
|
||||||
|
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
|
||||||
|
<ImportGroup Label="ExtensionTargets">
|
||||||
|
</ImportGroup>
|
||||||
|
</Project>
|
|
@ -78,6 +78,8 @@ void putCPUinfo()
|
||||||
{ Cpu::tAVX512_VNNI, "avx512_vnni" },
|
{ Cpu::tAVX512_VNNI, "avx512_vnni" },
|
||||||
{ Cpu::tAVX512_BITALG, "avx512_bitalg" },
|
{ Cpu::tAVX512_BITALG, "avx512_bitalg" },
|
||||||
{ Cpu::tAVX512_VPOPCNTDQ, "avx512_vpopcntdq" },
|
{ Cpu::tAVX512_VPOPCNTDQ, "avx512_vpopcntdq" },
|
||||||
|
{ Cpu::tAVX512_BF16, "avx512_bf16" },
|
||||||
|
{ Cpu::tAVX512_VP2INTERSECT, "avx512_vp2intersect" },
|
||||||
};
|
};
|
||||||
for (size_t i = 0; i < NUM_OF_ARRAY(tbl); i++) {
|
for (size_t i = 0; i < NUM_OF_ARRAY(tbl); i++) {
|
||||||
if (cpu.has(tbl[i].type)) printf(" %s", tbl[i].str);
|
if (cpu.has(tbl[i].type)) printf(" %s", tbl[i].str);
|
||||||
|
|
|
@ -1,427 +0,0 @@
|
||||||
<?xml version="1.0" encoding="shift_jis"?>
|
|
||||||
<VisualStudioProject
|
|
||||||
ProjectType="Visual C++"
|
|
||||||
Version="9.00"
|
|
||||||
Name="test_util"
|
|
||||||
ProjectGUID="{CFC9B272-FDA1-4C87-B4EF-CDCA9B57F4DD}"
|
|
||||||
TargetFrameworkVersion="0"
|
|
||||||
>
|
|
||||||
<Platforms>
|
|
||||||
<Platform
|
|
||||||
Name="Win32"
|
|
||||||
/>
|
|
||||||
<Platform
|
|
||||||
Name="x64"
|
|
||||||
/>
|
|
||||||
</Platforms>
|
|
||||||
<ToolFiles>
|
|
||||||
</ToolFiles>
|
|
||||||
<Configurations>
|
|
||||||
<Configuration
|
|
||||||
Name="Debug|Win32"
|
|
||||||
OutputDirectory=".\Debug"
|
|
||||||
IntermediateDirectory=".\Debug"
|
|
||||||
ConfigurationType="1"
|
|
||||||
InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC60.vsprops"
|
|
||||||
UseOfMFC="0"
|
|
||||||
ATLMinimizesCRunTimeLibraryUsage="false"
|
|
||||||
CharacterSet="2"
|
|
||||||
>
|
|
||||||
<Tool
|
|
||||||
Name="VCPreBuildEventTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCCustomBuildTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCXMLDataGeneratorTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCWebServiceProxyGeneratorTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCMIDLTool"
|
|
||||||
TypeLibraryName=".\Debug/test_util.tlb"
|
|
||||||
HeaderFileName=""
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCCLCompilerTool"
|
|
||||||
Optimization="0"
|
|
||||||
AdditionalIncludeDirectories="../"
|
|
||||||
PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE"
|
|
||||||
MinimalRebuild="true"
|
|
||||||
BasicRuntimeChecks="3"
|
|
||||||
RuntimeLibrary="1"
|
|
||||||
PrecompiledHeaderFile=".\Debug/test_util.pch"
|
|
||||||
AssemblerListingLocation=".\Debug/"
|
|
||||||
ObjectFile=".\Debug/"
|
|
||||||
ProgramDataBaseFileName=".\Debug/"
|
|
||||||
WarningLevel="4"
|
|
||||||
SuppressStartupBanner="true"
|
|
||||||
DebugInformationFormat="4"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCManagedResourceCompilerTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCResourceCompilerTool"
|
|
||||||
PreprocessorDefinitions="_DEBUG"
|
|
||||||
Culture="1041"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPreLinkEventTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCLinkerTool"
|
|
||||||
OutputFile=".\Debug/test_util.exe"
|
|
||||||
LinkIncremental="2"
|
|
||||||
SuppressStartupBanner="true"
|
|
||||||
GenerateDebugInformation="true"
|
|
||||||
ProgramDatabaseFile=".\Debug/test_util.pdb"
|
|
||||||
SubSystem="1"
|
|
||||||
RandomizedBaseAddress="1"
|
|
||||||
DataExecutionPrevention="0"
|
|
||||||
TargetMachine="1"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCALinkTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCManifestTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCXDCMakeTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCBscMakeTool"
|
|
||||||
SuppressStartupBanner="true"
|
|
||||||
OutputFile=".\Debug/test_util.bsc"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCFxCopTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCAppVerifierTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPostBuildEventTool"
|
|
||||||
/>
|
|
||||||
</Configuration>
|
|
||||||
<Configuration
|
|
||||||
Name="Debug|x64"
|
|
||||||
OutputDirectory="$(PlatformName)\$(ConfigurationName)"
|
|
||||||
IntermediateDirectory="$(PlatformName)\$(ConfigurationName)"
|
|
||||||
ConfigurationType="1"
|
|
||||||
InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC60.vsprops"
|
|
||||||
UseOfMFC="0"
|
|
||||||
ATLMinimizesCRunTimeLibraryUsage="false"
|
|
||||||
CharacterSet="2"
|
|
||||||
>
|
|
||||||
<Tool
|
|
||||||
Name="VCPreBuildEventTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCCustomBuildTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCXMLDataGeneratorTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCWebServiceProxyGeneratorTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCMIDLTool"
|
|
||||||
TargetEnvironment="3"
|
|
||||||
TypeLibraryName=".\Debug/test_util.tlb"
|
|
||||||
HeaderFileName=""
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCCLCompilerTool"
|
|
||||||
Optimization="0"
|
|
||||||
AdditionalIncludeDirectories="../"
|
|
||||||
PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE"
|
|
||||||
MinimalRebuild="true"
|
|
||||||
BasicRuntimeChecks="3"
|
|
||||||
RuntimeLibrary="1"
|
|
||||||
PrecompiledHeaderFile=".\Debug/test_util.pch"
|
|
||||||
AssemblerListingLocation=".\Debug/"
|
|
||||||
ObjectFile=".\Debug/"
|
|
||||||
ProgramDataBaseFileName=".\Debug/"
|
|
||||||
WarningLevel="4"
|
|
||||||
SuppressStartupBanner="true"
|
|
||||||
DebugInformationFormat="3"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCManagedResourceCompilerTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCResourceCompilerTool"
|
|
||||||
PreprocessorDefinitions="_DEBUG"
|
|
||||||
Culture="1041"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPreLinkEventTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCLinkerTool"
|
|
||||||
OutputFile=".\Debug/test_util.exe"
|
|
||||||
LinkIncremental="2"
|
|
||||||
SuppressStartupBanner="true"
|
|
||||||
GenerateDebugInformation="true"
|
|
||||||
ProgramDatabaseFile=".\Debug/test_util.pdb"
|
|
||||||
SubSystem="1"
|
|
||||||
RandomizedBaseAddress="1"
|
|
||||||
DataExecutionPrevention="0"
|
|
||||||
TargetMachine="17"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCALinkTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCManifestTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCXDCMakeTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCBscMakeTool"
|
|
||||||
SuppressStartupBanner="true"
|
|
||||||
OutputFile=".\Debug/test_util.bsc"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCFxCopTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCAppVerifierTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPostBuildEventTool"
|
|
||||||
/>
|
|
||||||
</Configuration>
|
|
||||||
<Configuration
|
|
||||||
Name="Release|Win32"
|
|
||||||
OutputDirectory=".\Release"
|
|
||||||
IntermediateDirectory=".\Release"
|
|
||||||
ConfigurationType="1"
|
|
||||||
InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC60.vsprops"
|
|
||||||
UseOfMFC="0"
|
|
||||||
ATLMinimizesCRunTimeLibraryUsage="false"
|
|
||||||
CharacterSet="2"
|
|
||||||
>
|
|
||||||
<Tool
|
|
||||||
Name="VCPreBuildEventTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCCustomBuildTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCXMLDataGeneratorTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCWebServiceProxyGeneratorTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCMIDLTool"
|
|
||||||
TypeLibraryName=".\Release/test_util.tlb"
|
|
||||||
HeaderFileName=""
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCCLCompilerTool"
|
|
||||||
Optimization="2"
|
|
||||||
InlineFunctionExpansion="1"
|
|
||||||
AdditionalIncludeDirectories="../"
|
|
||||||
PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE"
|
|
||||||
StringPooling="true"
|
|
||||||
RuntimeLibrary="0"
|
|
||||||
EnableFunctionLevelLinking="true"
|
|
||||||
PrecompiledHeaderFile=".\Release/test_util.pch"
|
|
||||||
AssemblerListingLocation=".\Release/"
|
|
||||||
ObjectFile=".\Release/"
|
|
||||||
ProgramDataBaseFileName=".\Release/"
|
|
||||||
WarningLevel="4"
|
|
||||||
SuppressStartupBanner="true"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCManagedResourceCompilerTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCResourceCompilerTool"
|
|
||||||
PreprocessorDefinitions="NDEBUG"
|
|
||||||
Culture="1041"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPreLinkEventTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCLinkerTool"
|
|
||||||
OutputFile=".\Release/test_util.exe"
|
|
||||||
LinkIncremental="1"
|
|
||||||
SuppressStartupBanner="true"
|
|
||||||
ProgramDatabaseFile=".\Release/test_util.pdb"
|
|
||||||
SubSystem="1"
|
|
||||||
RandomizedBaseAddress="1"
|
|
||||||
DataExecutionPrevention="0"
|
|
||||||
TargetMachine="1"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCALinkTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCManifestTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCXDCMakeTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCBscMakeTool"
|
|
||||||
SuppressStartupBanner="true"
|
|
||||||
OutputFile=".\Release/test_util.bsc"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCFxCopTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCAppVerifierTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPostBuildEventTool"
|
|
||||||
/>
|
|
||||||
</Configuration>
|
|
||||||
<Configuration
|
|
||||||
Name="Release|x64"
|
|
||||||
OutputDirectory="$(PlatformName)\$(ConfigurationName)"
|
|
||||||
IntermediateDirectory="$(PlatformName)\$(ConfigurationName)"
|
|
||||||
ConfigurationType="1"
|
|
||||||
InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC60.vsprops"
|
|
||||||
UseOfMFC="0"
|
|
||||||
ATLMinimizesCRunTimeLibraryUsage="false"
|
|
||||||
CharacterSet="2"
|
|
||||||
>
|
|
||||||
<Tool
|
|
||||||
Name="VCPreBuildEventTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCCustomBuildTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCXMLDataGeneratorTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCWebServiceProxyGeneratorTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCMIDLTool"
|
|
||||||
TargetEnvironment="3"
|
|
||||||
TypeLibraryName=".\Release/test_util.tlb"
|
|
||||||
HeaderFileName=""
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCCLCompilerTool"
|
|
||||||
Optimization="2"
|
|
||||||
InlineFunctionExpansion="1"
|
|
||||||
AdditionalIncludeDirectories="../"
|
|
||||||
PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE"
|
|
||||||
StringPooling="true"
|
|
||||||
RuntimeLibrary="0"
|
|
||||||
EnableFunctionLevelLinking="true"
|
|
||||||
PrecompiledHeaderFile=".\Release/test_util.pch"
|
|
||||||
AssemblerListingLocation=".\Release/"
|
|
||||||
ObjectFile=".\Release/"
|
|
||||||
ProgramDataBaseFileName=".\Release/"
|
|
||||||
WarningLevel="4"
|
|
||||||
SuppressStartupBanner="true"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCManagedResourceCompilerTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCResourceCompilerTool"
|
|
||||||
PreprocessorDefinitions="NDEBUG"
|
|
||||||
Culture="1041"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPreLinkEventTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCLinkerTool"
|
|
||||||
OutputFile=".\Release/test_util.exe"
|
|
||||||
LinkIncremental="1"
|
|
||||||
SuppressStartupBanner="true"
|
|
||||||
ProgramDatabaseFile=".\Release/test_util.pdb"
|
|
||||||
SubSystem="1"
|
|
||||||
RandomizedBaseAddress="1"
|
|
||||||
DataExecutionPrevention="0"
|
|
||||||
TargetMachine="17"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCALinkTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCManifestTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCXDCMakeTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCBscMakeTool"
|
|
||||||
SuppressStartupBanner="true"
|
|
||||||
OutputFile=".\Release/test_util.bsc"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCFxCopTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCAppVerifierTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPostBuildEventTool"
|
|
||||||
/>
|
|
||||||
</Configuration>
|
|
||||||
</Configurations>
|
|
||||||
<References>
|
|
||||||
</References>
|
|
||||||
<Files>
|
|
||||||
<File
|
|
||||||
RelativePath="test_util.cpp"
|
|
||||||
>
|
|
||||||
<FileConfiguration
|
|
||||||
Name="Debug|Win32"
|
|
||||||
>
|
|
||||||
<Tool
|
|
||||||
Name="VCCLCompilerTool"
|
|
||||||
AdditionalIncludeDirectories=""
|
|
||||||
PreprocessorDefinitions=""
|
|
||||||
/>
|
|
||||||
</FileConfiguration>
|
|
||||||
<FileConfiguration
|
|
||||||
Name="Debug|x64"
|
|
||||||
>
|
|
||||||
<Tool
|
|
||||||
Name="VCCLCompilerTool"
|
|
||||||
AdditionalIncludeDirectories=""
|
|
||||||
PreprocessorDefinitions=""
|
|
||||||
/>
|
|
||||||
</FileConfiguration>
|
|
||||||
<FileConfiguration
|
|
||||||
Name="Release|Win32"
|
|
||||||
>
|
|
||||||
<Tool
|
|
||||||
Name="VCCLCompilerTool"
|
|
||||||
AdditionalIncludeDirectories=""
|
|
||||||
PreprocessorDefinitions=""
|
|
||||||
/>
|
|
||||||
</FileConfiguration>
|
|
||||||
<FileConfiguration
|
|
||||||
Name="Release|x64"
|
|
||||||
>
|
|
||||||
<Tool
|
|
||||||
Name="VCCLCompilerTool"
|
|
||||||
AdditionalIncludeDirectories=""
|
|
||||||
PreprocessorDefinitions=""
|
|
||||||
/>
|
|
||||||
</FileConfiguration>
|
|
||||||
</File>
|
|
||||||
</Files>
|
|
||||||
<Globals>
|
|
||||||
</Globals>
|
|
||||||
</VisualStudioProject>
|
|
228
sample/test_util.vcxproj
Normal file
228
sample/test_util.vcxproj
Normal file
|
@ -0,0 +1,228 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<Project DefaultTargets="Build" ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||||
|
<ItemGroup Label="ProjectConfigurations">
|
||||||
|
<ProjectConfiguration Include="Debug|Win32">
|
||||||
|
<Configuration>Debug</Configuration>
|
||||||
|
<Platform>Win32</Platform>
|
||||||
|
</ProjectConfiguration>
|
||||||
|
<ProjectConfiguration Include="Debug|x64">
|
||||||
|
<Configuration>Debug</Configuration>
|
||||||
|
<Platform>x64</Platform>
|
||||||
|
</ProjectConfiguration>
|
||||||
|
<ProjectConfiguration Include="Release|Win32">
|
||||||
|
<Configuration>Release</Configuration>
|
||||||
|
<Platform>Win32</Platform>
|
||||||
|
</ProjectConfiguration>
|
||||||
|
<ProjectConfiguration Include="Release|x64">
|
||||||
|
<Configuration>Release</Configuration>
|
||||||
|
<Platform>x64</Platform>
|
||||||
|
</ProjectConfiguration>
|
||||||
|
</ItemGroup>
|
||||||
|
<PropertyGroup Label="Globals">
|
||||||
|
<ProjectGuid>{CFC9B272-FDA1-4C87-B4EF-CDCA9B57F4DD}</ProjectGuid>
|
||||||
|
<WindowsTargetPlatformVersion>10.0.17763.0</WindowsTargetPlatformVersion>
|
||||||
|
</PropertyGroup>
|
||||||
|
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
|
||||||
|
<ConfigurationType>Application</ConfigurationType>
|
||||||
|
<PlatformToolset>v141</PlatformToolset>
|
||||||
|
<UseOfMfc>false</UseOfMfc>
|
||||||
|
<CharacterSet>MultiByte</CharacterSet>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
|
||||||
|
<ConfigurationType>Application</ConfigurationType>
|
||||||
|
<PlatformToolset>v141</PlatformToolset>
|
||||||
|
<UseOfMfc>false</UseOfMfc>
|
||||||
|
<CharacterSet>MultiByte</CharacterSet>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
|
||||||
|
<ConfigurationType>Application</ConfigurationType>
|
||||||
|
<PlatformToolset>v141</PlatformToolset>
|
||||||
|
<UseOfMfc>false</UseOfMfc>
|
||||||
|
<CharacterSet>MultiByte</CharacterSet>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
|
||||||
|
<ConfigurationType>Application</ConfigurationType>
|
||||||
|
<PlatformToolset>v141</PlatformToolset>
|
||||||
|
<UseOfMfc>false</UseOfMfc>
|
||||||
|
<CharacterSet>MultiByte</CharacterSet>
|
||||||
|
</PropertyGroup>
|
||||||
|
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
|
||||||
|
<ImportGroup Label="ExtensionSettings">
|
||||||
|
</ImportGroup>
|
||||||
|
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="PropertySheets">
|
||||||
|
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||||
|
<Import Project="$(VCTargetsPath)Microsoft.CPP.UpgradeFromVC60.props" />
|
||||||
|
</ImportGroup>
|
||||||
|
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="PropertySheets">
|
||||||
|
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||||
|
<Import Project="$(VCTargetsPath)Microsoft.CPP.UpgradeFromVC60.props" />
|
||||||
|
</ImportGroup>
|
||||||
|
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets">
|
||||||
|
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||||
|
<Import Project="$(VCTargetsPath)Microsoft.CPP.UpgradeFromVC60.props" />
|
||||||
|
</ImportGroup>
|
||||||
|
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets">
|
||||||
|
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||||
|
<Import Project="$(VCTargetsPath)Microsoft.CPP.UpgradeFromVC60.props" />
|
||||||
|
</ImportGroup>
|
||||||
|
<PropertyGroup Label="UserMacros" />
|
||||||
|
<PropertyGroup>
|
||||||
|
<_ProjectFileVersion>15.0.27924.0</_ProjectFileVersion>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
||||||
|
<LinkIncremental>true</LinkIncremental>
|
||||||
|
<IntDir>$(ProjectName)\$(Configuration)\</IntDir>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
|
||||||
|
<LinkIncremental>true</LinkIncremental>
|
||||||
|
<IntDir>$(ProjectName)\$(Platform)\$(Configuration)\</IntDir>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
||||||
|
<LinkIncremental>false</LinkIncremental>
|
||||||
|
<IntDir>$(ProjectName)\$(Configuration)\</IntDir>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
|
||||||
|
<LinkIncremental>false</LinkIncremental>
|
||||||
|
<IntDir>$(ProjectName)\$(Platform)\$(Configuration)\</IntDir>
|
||||||
|
</PropertyGroup>
|
||||||
|
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
||||||
|
<Midl>
|
||||||
|
<TypeLibraryName>.\Debug/test_util.tlb</TypeLibraryName>
|
||||||
|
<HeaderFileName />
|
||||||
|
</Midl>
|
||||||
|
<ClCompile>
|
||||||
|
<Optimization>Disabled</Optimization>
|
||||||
|
<AdditionalIncludeDirectories>../;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||||
|
<PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
|
<MinimalRebuild>true</MinimalRebuild>
|
||||||
|
<BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
|
||||||
|
<RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
|
||||||
|
<PrecompiledHeaderOutputFile>.\Debug/test_util.pch</PrecompiledHeaderOutputFile>
|
||||||
|
<WarningLevel>Level4</WarningLevel>
|
||||||
|
<SuppressStartupBanner>true</SuppressStartupBanner>
|
||||||
|
</ClCompile>
|
||||||
|
<ResourceCompile>
|
||||||
|
<PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
|
<Culture>0x0411</Culture>
|
||||||
|
</ResourceCompile>
|
||||||
|
<Link>
|
||||||
|
<SuppressStartupBanner>true</SuppressStartupBanner>
|
||||||
|
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||||
|
<ProgramDatabaseFile>.\Debug/test_util.pdb</ProgramDatabaseFile>
|
||||||
|
<SubSystem>Console</SubSystem>
|
||||||
|
<RandomizedBaseAddress>false</RandomizedBaseAddress>
|
||||||
|
<DataExecutionPrevention />
|
||||||
|
<TargetMachine>MachineX86</TargetMachine>
|
||||||
|
</Link>
|
||||||
|
<Bscmake>
|
||||||
|
<SuppressStartupBanner>true</SuppressStartupBanner>
|
||||||
|
</Bscmake>
|
||||||
|
</ItemDefinitionGroup>
|
||||||
|
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
|
||||||
|
<Midl>
|
||||||
|
<TargetEnvironment>X64</TargetEnvironment>
|
||||||
|
<TypeLibraryName>.\Debug/test_util.tlb</TypeLibraryName>
|
||||||
|
<HeaderFileName />
|
||||||
|
</Midl>
|
||||||
|
<ClCompile>
|
||||||
|
<Optimization>Disabled</Optimization>
|
||||||
|
<AdditionalIncludeDirectories>../;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||||
|
<PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
|
<MinimalRebuild>true</MinimalRebuild>
|
||||||
|
<BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
|
||||||
|
<RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
|
||||||
|
<PrecompiledHeaderOutputFile>.\Debug/test_util.pch</PrecompiledHeaderOutputFile>
|
||||||
|
<WarningLevel>Level4</WarningLevel>
|
||||||
|
<SuppressStartupBanner>true</SuppressStartupBanner>
|
||||||
|
<DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
|
||||||
|
</ClCompile>
|
||||||
|
<ResourceCompile>
|
||||||
|
<PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
|
<Culture>0x0411</Culture>
|
||||||
|
</ResourceCompile>
|
||||||
|
<Link>
|
||||||
|
<SuppressStartupBanner>true</SuppressStartupBanner>
|
||||||
|
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||||
|
<ProgramDatabaseFile>.\Debug/test_util.pdb</ProgramDatabaseFile>
|
||||||
|
<SubSystem>Console</SubSystem>
|
||||||
|
<RandomizedBaseAddress>false</RandomizedBaseAddress>
|
||||||
|
<DataExecutionPrevention />
|
||||||
|
<TargetMachine>MachineX64</TargetMachine>
|
||||||
|
</Link>
|
||||||
|
<Bscmake>
|
||||||
|
<SuppressStartupBanner>true</SuppressStartupBanner>
|
||||||
|
</Bscmake>
|
||||||
|
</ItemDefinitionGroup>
|
||||||
|
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
||||||
|
<Midl>
|
||||||
|
<TypeLibraryName>.\Release/test_util.tlb</TypeLibraryName>
|
||||||
|
<HeaderFileName />
|
||||||
|
</Midl>
|
||||||
|
<ClCompile>
|
||||||
|
<Optimization>MaxSpeed</Optimization>
|
||||||
|
<InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion>
|
||||||
|
<AdditionalIncludeDirectories>../;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||||
|
<PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
|
<StringPooling>true</StringPooling>
|
||||||
|
<RuntimeLibrary>MultiThreaded</RuntimeLibrary>
|
||||||
|
<FunctionLevelLinking>true</FunctionLevelLinking>
|
||||||
|
<PrecompiledHeaderOutputFile>.\Release/test_util.pch</PrecompiledHeaderOutputFile>
|
||||||
|
<WarningLevel>Level4</WarningLevel>
|
||||||
|
<SuppressStartupBanner>true</SuppressStartupBanner>
|
||||||
|
</ClCompile>
|
||||||
|
<ResourceCompile>
|
||||||
|
<PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
|
<Culture>0x0411</Culture>
|
||||||
|
</ResourceCompile>
|
||||||
|
<Link>
|
||||||
|
<SuppressStartupBanner>true</SuppressStartupBanner>
|
||||||
|
<SubSystem>Console</SubSystem>
|
||||||
|
<RandomizedBaseAddress>false</RandomizedBaseAddress>
|
||||||
|
<DataExecutionPrevention />
|
||||||
|
<TargetMachine>MachineX86</TargetMachine>
|
||||||
|
</Link>
|
||||||
|
<Bscmake>
|
||||||
|
<SuppressStartupBanner>true</SuppressStartupBanner>
|
||||||
|
</Bscmake>
|
||||||
|
</ItemDefinitionGroup>
|
||||||
|
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
|
||||||
|
<Midl>
|
||||||
|
<TargetEnvironment>X64</TargetEnvironment>
|
||||||
|
<TypeLibraryName>.\Release/test_util.tlb</TypeLibraryName>
|
||||||
|
<HeaderFileName />
|
||||||
|
</Midl>
|
||||||
|
<ClCompile>
|
||||||
|
<Optimization>MaxSpeed</Optimization>
|
||||||
|
<InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion>
|
||||||
|
<AdditionalIncludeDirectories>../;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||||
|
<PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
|
<StringPooling>true</StringPooling>
|
||||||
|
<RuntimeLibrary>MultiThreaded</RuntimeLibrary>
|
||||||
|
<FunctionLevelLinking>true</FunctionLevelLinking>
|
||||||
|
<PrecompiledHeaderOutputFile>.\Release/test_util.pch</PrecompiledHeaderOutputFile>
|
||||||
|
<WarningLevel>Level4</WarningLevel>
|
||||||
|
<SuppressStartupBanner>true</SuppressStartupBanner>
|
||||||
|
</ClCompile>
|
||||||
|
<ResourceCompile>
|
||||||
|
<PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
|
<Culture>0x0411</Culture>
|
||||||
|
</ResourceCompile>
|
||||||
|
<Link>
|
||||||
|
<SuppressStartupBanner>true</SuppressStartupBanner>
|
||||||
|
<SubSystem>Console</SubSystem>
|
||||||
|
<RandomizedBaseAddress>false</RandomizedBaseAddress>
|
||||||
|
<DataExecutionPrevention />
|
||||||
|
<TargetMachine>MachineX64</TargetMachine>
|
||||||
|
</Link>
|
||||||
|
<Bscmake>
|
||||||
|
<SuppressStartupBanner>true</SuppressStartupBanner>
|
||||||
|
</Bscmake>
|
||||||
|
</ItemDefinitionGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<ClCompile Include="test_util.cpp" />
|
||||||
|
</ItemGroup>
|
||||||
|
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
|
||||||
|
<ImportGroup Label="ExtensionTargets">
|
||||||
|
</ImportGroup>
|
||||||
|
</Project>
|
|
@ -39,7 +39,7 @@
|
||||||
using namespace Xbyak;
|
using namespace Xbyak;
|
||||||
|
|
||||||
class ToyVm : public Xbyak::CodeGenerator {
|
class ToyVm : public Xbyak::CodeGenerator {
|
||||||
typedef std::vector<uint32> Buffer;
|
typedef std::vector<uint32_t> Buffer;
|
||||||
public:
|
public:
|
||||||
enum Reg {
|
enum Reg {
|
||||||
A, B
|
A, B
|
||||||
|
@ -53,14 +53,14 @@ public:
|
||||||
{
|
{
|
||||||
::memset(mem_, 0, sizeof(mem_));
|
::memset(mem_, 0, sizeof(mem_));
|
||||||
}
|
}
|
||||||
void vldi(Reg r, uint16 imm) { encode(LDI, r, imm); }
|
void vldi(Reg r, uint16_t imm) { encode(LDI, r, imm); }
|
||||||
void vld(Reg r, uint16 idx) { encode(LD, r, idx); }
|
void vld(Reg r, uint16_t idx) { encode(LD, r, idx); }
|
||||||
void vst(Reg r, uint16 idx) { encode(ST, r, idx); }
|
void vst(Reg r, uint16_t idx) { encode(ST, r, idx); }
|
||||||
void vadd(Reg r, uint16 idx) { encode(ADD, r, idx); }
|
void vadd(Reg r, uint16_t idx) { encode(ADD, r, idx); }
|
||||||
void vaddi(Reg r, uint16 imm) { encode(ADDI, r, imm); }
|
void vaddi(Reg r, uint16_t imm) { encode(ADDI, r, imm); }
|
||||||
void vsub(Reg r, uint16 idx) { encode(SUB, r, idx); }
|
void vsub(Reg r, uint16_t idx) { encode(SUB, r, idx); }
|
||||||
void vsubi(Reg r, uint16 imm) { encode(SUBI, r, imm); }
|
void vsubi(Reg r, uint16_t imm) { encode(SUBI, r, imm); }
|
||||||
void vjnz(Reg r, int offset) { encode(JNZ, r, static_cast<uint16>(offset)); }
|
void vjnz(Reg r, int offset) { encode(JNZ, r, static_cast<uint16_t>(offset)); }
|
||||||
void vput(Reg r) { encode(PUT, r); }
|
void vput(Reg r) { encode(PUT, r); }
|
||||||
void setMark()
|
void setMark()
|
||||||
{
|
{
|
||||||
|
@ -73,12 +73,12 @@ public:
|
||||||
void run()
|
void run()
|
||||||
{
|
{
|
||||||
bool debug = false;//true;
|
bool debug = false;//true;
|
||||||
uint32 reg[2] = { 0, 0 };
|
uint32_t reg[2] = { 0, 0 };
|
||||||
const size_t end = code_.size();
|
const size_t end = code_.size();
|
||||||
uint32 pc = 0;
|
uint32_t pc = 0;
|
||||||
for (;;) {
|
for (;;) {
|
||||||
uint32 x = code_[pc];
|
uint32_t x = code_[pc];
|
||||||
uint32 code, r, imm;
|
uint32_t code, r, imm;
|
||||||
decode(code, r, imm, x);
|
decode(code, r, imm, x);
|
||||||
if (debug) {
|
if (debug) {
|
||||||
printf("---\n");
|
printf("---\n");
|
||||||
|
@ -149,11 +149,11 @@ public:
|
||||||
xor_(edi, edi);
|
xor_(edi, edi);
|
||||||
mov(mem, (size_t)mem_);
|
mov(mem, (size_t)mem_);
|
||||||
const size_t end = code_.size();
|
const size_t end = code_.size();
|
||||||
uint32 pc = 0;
|
uint32_t pc = 0;
|
||||||
uint32 labelNum = 0;
|
uint32_t labelNum = 0;
|
||||||
for (;;) {
|
for (;;) {
|
||||||
uint32 x = code_[pc];
|
uint32_t x = code_[pc];
|
||||||
uint32 code, r, imm;
|
uint32_t code, r, imm;
|
||||||
decode(code, r, imm, x);
|
decode(code, r, imm, x);
|
||||||
L(Label::toStr(labelNum++));
|
L(Label::toStr(labelNum++));
|
||||||
switch (code) {
|
switch (code) {
|
||||||
|
@ -229,18 +229,18 @@ public:
|
||||||
ret();
|
ret();
|
||||||
}
|
}
|
||||||
private:
|
private:
|
||||||
uint32 mem_[65536];
|
uint32_t mem_[65536];
|
||||||
Buffer code_;
|
Buffer code_;
|
||||||
int mark_;
|
int mark_;
|
||||||
void decode(uint32& code, uint32& r, uint32& imm, uint32 x)
|
void decode(uint32_t& code, uint32_t& r, uint32_t& imm, uint32_t x)
|
||||||
{
|
{
|
||||||
code = x >> 24;
|
code = x >> 24;
|
||||||
r = (x >> 16) & 0xff;
|
r = (x >> 16) & 0xff;
|
||||||
imm = x & 0xffff;
|
imm = x & 0xffff;
|
||||||
}
|
}
|
||||||
void encode(Code code, Reg r, uint16 imm = 0)
|
void encode(Code code, Reg r, uint16_t imm = 0)
|
||||||
{
|
{
|
||||||
uint32 x = (code << 24) | (r << 16) | imm;
|
uint32_t x = (code << 24) | (r << 16) | imm;
|
||||||
code_.push_back(x);
|
code_.push_back(x);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
@ -262,7 +262,7 @@ public:
|
||||||
*/
|
*/
|
||||||
vldi(A, 1); // c
|
vldi(A, 1); // c
|
||||||
vst(A, 0); // p(1)
|
vst(A, 0); // p(1)
|
||||||
vldi(B, static_cast<uint16>(n));
|
vldi(B, static_cast<uint16_t>(n));
|
||||||
vst(B, 2); // n
|
vst(B, 2); // n
|
||||||
// lp
|
// lp
|
||||||
setMark();
|
setMark();
|
||||||
|
@ -283,9 +283,9 @@ public:
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
void fibC(uint32 n)
|
void fibC(uint32_t n)
|
||||||
{
|
{
|
||||||
uint32 p, c, t;
|
uint32_t p, c, t;
|
||||||
p = 1;
|
p = 1;
|
||||||
c = 1;
|
c = 1;
|
||||||
lp:
|
lp:
|
||||||
|
|
|
@ -1,427 +0,0 @@
|
||||||
<?xml version="1.0" encoding="shift_jis"?>
|
|
||||||
<VisualStudioProject
|
|
||||||
ProjectType="Visual C++"
|
|
||||||
Version="9.00"
|
|
||||||
Name="toyvm"
|
|
||||||
ProjectGUID="{2E41C7AF-39FF-454C-B081-37445378DCB3}"
|
|
||||||
TargetFrameworkVersion="0"
|
|
||||||
>
|
|
||||||
<Platforms>
|
|
||||||
<Platform
|
|
||||||
Name="Win32"
|
|
||||||
/>
|
|
||||||
<Platform
|
|
||||||
Name="x64"
|
|
||||||
/>
|
|
||||||
</Platforms>
|
|
||||||
<ToolFiles>
|
|
||||||
</ToolFiles>
|
|
||||||
<Configurations>
|
|
||||||
<Configuration
|
|
||||||
Name="Debug|Win32"
|
|
||||||
OutputDirectory=".\Debug"
|
|
||||||
IntermediateDirectory=".\Debug"
|
|
||||||
ConfigurationType="1"
|
|
||||||
InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC60.vsprops"
|
|
||||||
UseOfMFC="0"
|
|
||||||
ATLMinimizesCRunTimeLibraryUsage="false"
|
|
||||||
CharacterSet="2"
|
|
||||||
>
|
|
||||||
<Tool
|
|
||||||
Name="VCPreBuildEventTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCCustomBuildTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCXMLDataGeneratorTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCWebServiceProxyGeneratorTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCMIDLTool"
|
|
||||||
TypeLibraryName=".\Debug/toyvm.tlb"
|
|
||||||
HeaderFileName=""
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCCLCompilerTool"
|
|
||||||
Optimization="0"
|
|
||||||
AdditionalIncludeDirectories="../"
|
|
||||||
PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE"
|
|
||||||
MinimalRebuild="true"
|
|
||||||
BasicRuntimeChecks="3"
|
|
||||||
RuntimeLibrary="1"
|
|
||||||
PrecompiledHeaderFile=".\Debug/toyvm.pch"
|
|
||||||
AssemblerListingLocation=".\Debug/"
|
|
||||||
ObjectFile=".\Debug/"
|
|
||||||
ProgramDataBaseFileName=".\Debug/"
|
|
||||||
WarningLevel="4"
|
|
||||||
SuppressStartupBanner="true"
|
|
||||||
DebugInformationFormat="4"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCManagedResourceCompilerTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCResourceCompilerTool"
|
|
||||||
PreprocessorDefinitions="_DEBUG"
|
|
||||||
Culture="1041"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPreLinkEventTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCLinkerTool"
|
|
||||||
OutputFile=".\Debug/toyvm.exe"
|
|
||||||
LinkIncremental="2"
|
|
||||||
SuppressStartupBanner="true"
|
|
||||||
GenerateDebugInformation="true"
|
|
||||||
ProgramDatabaseFile=".\Debug/toyvm.pdb"
|
|
||||||
SubSystem="1"
|
|
||||||
RandomizedBaseAddress="1"
|
|
||||||
DataExecutionPrevention="0"
|
|
||||||
TargetMachine="1"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCALinkTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCManifestTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCXDCMakeTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCBscMakeTool"
|
|
||||||
SuppressStartupBanner="true"
|
|
||||||
OutputFile=".\Debug/toyvm.bsc"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCFxCopTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCAppVerifierTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPostBuildEventTool"
|
|
||||||
/>
|
|
||||||
</Configuration>
|
|
||||||
<Configuration
|
|
||||||
Name="Release|Win32"
|
|
||||||
OutputDirectory=".\Release"
|
|
||||||
IntermediateDirectory=".\Release"
|
|
||||||
ConfigurationType="1"
|
|
||||||
InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC60.vsprops"
|
|
||||||
UseOfMFC="0"
|
|
||||||
ATLMinimizesCRunTimeLibraryUsage="false"
|
|
||||||
CharacterSet="2"
|
|
||||||
>
|
|
||||||
<Tool
|
|
||||||
Name="VCPreBuildEventTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCCustomBuildTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCXMLDataGeneratorTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCWebServiceProxyGeneratorTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCMIDLTool"
|
|
||||||
TypeLibraryName=".\Release/toyvm.tlb"
|
|
||||||
HeaderFileName=""
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCCLCompilerTool"
|
|
||||||
Optimization="2"
|
|
||||||
InlineFunctionExpansion="1"
|
|
||||||
AdditionalIncludeDirectories="../"
|
|
||||||
PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE"
|
|
||||||
StringPooling="true"
|
|
||||||
RuntimeLibrary="0"
|
|
||||||
EnableFunctionLevelLinking="true"
|
|
||||||
PrecompiledHeaderFile=".\Release/toyvm.pch"
|
|
||||||
AssemblerListingLocation=".\Release/"
|
|
||||||
ObjectFile=".\Release/"
|
|
||||||
ProgramDataBaseFileName=".\Release/"
|
|
||||||
WarningLevel="4"
|
|
||||||
SuppressStartupBanner="true"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCManagedResourceCompilerTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCResourceCompilerTool"
|
|
||||||
PreprocessorDefinitions="NDEBUG"
|
|
||||||
Culture="1041"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPreLinkEventTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCLinkerTool"
|
|
||||||
OutputFile=".\Release/toyvm.exe"
|
|
||||||
LinkIncremental="1"
|
|
||||||
SuppressStartupBanner="true"
|
|
||||||
ProgramDatabaseFile=".\Release/toyvm.pdb"
|
|
||||||
SubSystem="1"
|
|
||||||
RandomizedBaseAddress="1"
|
|
||||||
DataExecutionPrevention="0"
|
|
||||||
TargetMachine="1"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCALinkTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCManifestTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCXDCMakeTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCBscMakeTool"
|
|
||||||
SuppressStartupBanner="true"
|
|
||||||
OutputFile=".\Release/toyvm.bsc"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCFxCopTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCAppVerifierTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPostBuildEventTool"
|
|
||||||
/>
|
|
||||||
</Configuration>
|
|
||||||
<Configuration
|
|
||||||
Name="Debug|x64"
|
|
||||||
OutputDirectory="$(PlatformName)\$(ConfigurationName)"
|
|
||||||
IntermediateDirectory="$(PlatformName)\$(ConfigurationName)"
|
|
||||||
ConfigurationType="1"
|
|
||||||
InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC60.vsprops"
|
|
||||||
UseOfMFC="0"
|
|
||||||
ATLMinimizesCRunTimeLibraryUsage="false"
|
|
||||||
CharacterSet="2"
|
|
||||||
>
|
|
||||||
<Tool
|
|
||||||
Name="VCPreBuildEventTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCCustomBuildTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCXMLDataGeneratorTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCWebServiceProxyGeneratorTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCMIDLTool"
|
|
||||||
TargetEnvironment="3"
|
|
||||||
TypeLibraryName=".\Debug/toyvm.tlb"
|
|
||||||
HeaderFileName=""
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCCLCompilerTool"
|
|
||||||
Optimization="0"
|
|
||||||
AdditionalIncludeDirectories="../"
|
|
||||||
PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE"
|
|
||||||
MinimalRebuild="true"
|
|
||||||
BasicRuntimeChecks="3"
|
|
||||||
RuntimeLibrary="1"
|
|
||||||
PrecompiledHeaderFile=".\Debug/toyvm.pch"
|
|
||||||
AssemblerListingLocation=".\Debug/"
|
|
||||||
ObjectFile=".\Debug/"
|
|
||||||
ProgramDataBaseFileName=".\Debug/"
|
|
||||||
WarningLevel="4"
|
|
||||||
SuppressStartupBanner="true"
|
|
||||||
DebugInformationFormat="3"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCManagedResourceCompilerTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCResourceCompilerTool"
|
|
||||||
PreprocessorDefinitions="_DEBUG"
|
|
||||||
Culture="1041"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPreLinkEventTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCLinkerTool"
|
|
||||||
OutputFile=".\Debug/toyvm.exe"
|
|
||||||
LinkIncremental="2"
|
|
||||||
SuppressStartupBanner="true"
|
|
||||||
GenerateDebugInformation="true"
|
|
||||||
ProgramDatabaseFile=".\Debug/toyvm.pdb"
|
|
||||||
SubSystem="1"
|
|
||||||
RandomizedBaseAddress="1"
|
|
||||||
DataExecutionPrevention="0"
|
|
||||||
TargetMachine="17"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCALinkTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCManifestTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCXDCMakeTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCBscMakeTool"
|
|
||||||
SuppressStartupBanner="true"
|
|
||||||
OutputFile=".\Debug/toyvm.bsc"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCFxCopTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCAppVerifierTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPostBuildEventTool"
|
|
||||||
/>
|
|
||||||
</Configuration>
|
|
||||||
<Configuration
|
|
||||||
Name="Release|x64"
|
|
||||||
OutputDirectory="$(PlatformName)\$(ConfigurationName)"
|
|
||||||
IntermediateDirectory="$(PlatformName)\$(ConfigurationName)"
|
|
||||||
ConfigurationType="1"
|
|
||||||
InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC60.vsprops"
|
|
||||||
UseOfMFC="0"
|
|
||||||
ATLMinimizesCRunTimeLibraryUsage="false"
|
|
||||||
CharacterSet="2"
|
|
||||||
>
|
|
||||||
<Tool
|
|
||||||
Name="VCPreBuildEventTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCCustomBuildTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCXMLDataGeneratorTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCWebServiceProxyGeneratorTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCMIDLTool"
|
|
||||||
TargetEnvironment="3"
|
|
||||||
TypeLibraryName=".\Release/toyvm.tlb"
|
|
||||||
HeaderFileName=""
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCCLCompilerTool"
|
|
||||||
Optimization="2"
|
|
||||||
InlineFunctionExpansion="1"
|
|
||||||
AdditionalIncludeDirectories="../"
|
|
||||||
PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE"
|
|
||||||
StringPooling="true"
|
|
||||||
RuntimeLibrary="0"
|
|
||||||
EnableFunctionLevelLinking="true"
|
|
||||||
PrecompiledHeaderFile=".\Release/toyvm.pch"
|
|
||||||
AssemblerListingLocation=".\Release/"
|
|
||||||
ObjectFile=".\Release/"
|
|
||||||
ProgramDataBaseFileName=".\Release/"
|
|
||||||
WarningLevel="4"
|
|
||||||
SuppressStartupBanner="true"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCManagedResourceCompilerTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCResourceCompilerTool"
|
|
||||||
PreprocessorDefinitions="NDEBUG"
|
|
||||||
Culture="1041"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPreLinkEventTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCLinkerTool"
|
|
||||||
OutputFile=".\Release/toyvm.exe"
|
|
||||||
LinkIncremental="1"
|
|
||||||
SuppressStartupBanner="true"
|
|
||||||
ProgramDatabaseFile=".\Release/toyvm.pdb"
|
|
||||||
SubSystem="1"
|
|
||||||
RandomizedBaseAddress="1"
|
|
||||||
DataExecutionPrevention="0"
|
|
||||||
TargetMachine="17"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCALinkTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCManifestTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCXDCMakeTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCBscMakeTool"
|
|
||||||
SuppressStartupBanner="true"
|
|
||||||
OutputFile=".\Release/toyvm.bsc"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCFxCopTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCAppVerifierTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPostBuildEventTool"
|
|
||||||
/>
|
|
||||||
</Configuration>
|
|
||||||
</Configurations>
|
|
||||||
<References>
|
|
||||||
</References>
|
|
||||||
<Files>
|
|
||||||
<File
|
|
||||||
RelativePath="toyvm.cpp"
|
|
||||||
>
|
|
||||||
<FileConfiguration
|
|
||||||
Name="Debug|Win32"
|
|
||||||
>
|
|
||||||
<Tool
|
|
||||||
Name="VCCLCompilerTool"
|
|
||||||
AdditionalIncludeDirectories=""
|
|
||||||
PreprocessorDefinitions=""
|
|
||||||
/>
|
|
||||||
</FileConfiguration>
|
|
||||||
<FileConfiguration
|
|
||||||
Name="Release|Win32"
|
|
||||||
>
|
|
||||||
<Tool
|
|
||||||
Name="VCCLCompilerTool"
|
|
||||||
AdditionalIncludeDirectories=""
|
|
||||||
PreprocessorDefinitions=""
|
|
||||||
/>
|
|
||||||
</FileConfiguration>
|
|
||||||
<FileConfiguration
|
|
||||||
Name="Debug|x64"
|
|
||||||
>
|
|
||||||
<Tool
|
|
||||||
Name="VCCLCompilerTool"
|
|
||||||
AdditionalIncludeDirectories=""
|
|
||||||
PreprocessorDefinitions=""
|
|
||||||
/>
|
|
||||||
</FileConfiguration>
|
|
||||||
<FileConfiguration
|
|
||||||
Name="Release|x64"
|
|
||||||
>
|
|
||||||
<Tool
|
|
||||||
Name="VCCLCompilerTool"
|
|
||||||
AdditionalIncludeDirectories=""
|
|
||||||
PreprocessorDefinitions=""
|
|
||||||
/>
|
|
||||||
</FileConfiguration>
|
|
||||||
</File>
|
|
||||||
</Files>
|
|
||||||
<Globals>
|
|
||||||
</Globals>
|
|
||||||
</VisualStudioProject>
|
|
228
sample/toyvm.vcxproj
Normal file
228
sample/toyvm.vcxproj
Normal file
|
@ -0,0 +1,228 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<Project DefaultTargets="Build" ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||||
|
<ItemGroup Label="ProjectConfigurations">
|
||||||
|
<ProjectConfiguration Include="Debug|Win32">
|
||||||
|
<Configuration>Debug</Configuration>
|
||||||
|
<Platform>Win32</Platform>
|
||||||
|
</ProjectConfiguration>
|
||||||
|
<ProjectConfiguration Include="Debug|x64">
|
||||||
|
<Configuration>Debug</Configuration>
|
||||||
|
<Platform>x64</Platform>
|
||||||
|
</ProjectConfiguration>
|
||||||
|
<ProjectConfiguration Include="Release|Win32">
|
||||||
|
<Configuration>Release</Configuration>
|
||||||
|
<Platform>Win32</Platform>
|
||||||
|
</ProjectConfiguration>
|
||||||
|
<ProjectConfiguration Include="Release|x64">
|
||||||
|
<Configuration>Release</Configuration>
|
||||||
|
<Platform>x64</Platform>
|
||||||
|
</ProjectConfiguration>
|
||||||
|
</ItemGroup>
|
||||||
|
<PropertyGroup Label="Globals">
|
||||||
|
<ProjectGuid>{2E41C7AF-39FF-454C-B081-37445378DCB3}</ProjectGuid>
|
||||||
|
<WindowsTargetPlatformVersion>10.0.17763.0</WindowsTargetPlatformVersion>
|
||||||
|
</PropertyGroup>
|
||||||
|
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
|
||||||
|
<ConfigurationType>Application</ConfigurationType>
|
||||||
|
<PlatformToolset>v141</PlatformToolset>
|
||||||
|
<UseOfMfc>false</UseOfMfc>
|
||||||
|
<CharacterSet>MultiByte</CharacterSet>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
|
||||||
|
<ConfigurationType>Application</ConfigurationType>
|
||||||
|
<PlatformToolset>v141</PlatformToolset>
|
||||||
|
<UseOfMfc>false</UseOfMfc>
|
||||||
|
<CharacterSet>MultiByte</CharacterSet>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
|
||||||
|
<ConfigurationType>Application</ConfigurationType>
|
||||||
|
<PlatformToolset>v141</PlatformToolset>
|
||||||
|
<UseOfMfc>false</UseOfMfc>
|
||||||
|
<CharacterSet>MultiByte</CharacterSet>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
|
||||||
|
<ConfigurationType>Application</ConfigurationType>
|
||||||
|
<PlatformToolset>v141</PlatformToolset>
|
||||||
|
<UseOfMfc>false</UseOfMfc>
|
||||||
|
<CharacterSet>MultiByte</CharacterSet>
|
||||||
|
</PropertyGroup>
|
||||||
|
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
|
||||||
|
<ImportGroup Label="ExtensionSettings">
|
||||||
|
</ImportGroup>
|
||||||
|
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="PropertySheets">
|
||||||
|
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||||
|
<Import Project="$(VCTargetsPath)Microsoft.CPP.UpgradeFromVC60.props" />
|
||||||
|
</ImportGroup>
|
||||||
|
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="PropertySheets">
|
||||||
|
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||||
|
<Import Project="$(VCTargetsPath)Microsoft.CPP.UpgradeFromVC60.props" />
|
||||||
|
</ImportGroup>
|
||||||
|
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets">
|
||||||
|
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||||
|
<Import Project="$(VCTargetsPath)Microsoft.CPP.UpgradeFromVC60.props" />
|
||||||
|
</ImportGroup>
|
||||||
|
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets">
|
||||||
|
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||||
|
<Import Project="$(VCTargetsPath)Microsoft.CPP.UpgradeFromVC60.props" />
|
||||||
|
</ImportGroup>
|
||||||
|
<PropertyGroup Label="UserMacros" />
|
||||||
|
<PropertyGroup>
|
||||||
|
<_ProjectFileVersion>15.0.27924.0</_ProjectFileVersion>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
||||||
|
<LinkIncremental>true</LinkIncremental>
|
||||||
|
<IntDir>$(ProjectName)\$(Configuration)\</IntDir>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
||||||
|
<LinkIncremental>false</LinkIncremental>
|
||||||
|
<IntDir>$(ProjectName)\$(Configuration)\</IntDir>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
|
||||||
|
<LinkIncremental>true</LinkIncremental>
|
||||||
|
<IntDir>$(ProjectName)\$(Platform)\$(Configuration)\</IntDir>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
|
||||||
|
<LinkIncremental>false</LinkIncremental>
|
||||||
|
<IntDir>$(ProjectName)\$(Platform)\$(Configuration)\</IntDir>
|
||||||
|
</PropertyGroup>
|
||||||
|
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
||||||
|
<Midl>
|
||||||
|
<TypeLibraryName>.\Debug/toyvm.tlb</TypeLibraryName>
|
||||||
|
<HeaderFileName />
|
||||||
|
</Midl>
|
||||||
|
<ClCompile>
|
||||||
|
<Optimization>Disabled</Optimization>
|
||||||
|
<AdditionalIncludeDirectories>../;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||||
|
<PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
|
<MinimalRebuild>true</MinimalRebuild>
|
||||||
|
<BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
|
||||||
|
<RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
|
||||||
|
<PrecompiledHeaderOutputFile>.\Debug/toyvm.pch</PrecompiledHeaderOutputFile>
|
||||||
|
<WarningLevel>Level4</WarningLevel>
|
||||||
|
<SuppressStartupBanner>true</SuppressStartupBanner>
|
||||||
|
</ClCompile>
|
||||||
|
<ResourceCompile>
|
||||||
|
<PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
|
<Culture>0x0411</Culture>
|
||||||
|
</ResourceCompile>
|
||||||
|
<Link>
|
||||||
|
<SuppressStartupBanner>true</SuppressStartupBanner>
|
||||||
|
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||||
|
<ProgramDatabaseFile>.\Debug/toyvm.pdb</ProgramDatabaseFile>
|
||||||
|
<SubSystem>Console</SubSystem>
|
||||||
|
<RandomizedBaseAddress>false</RandomizedBaseAddress>
|
||||||
|
<DataExecutionPrevention />
|
||||||
|
<TargetMachine>MachineX86</TargetMachine>
|
||||||
|
</Link>
|
||||||
|
<Bscmake>
|
||||||
|
<SuppressStartupBanner>true</SuppressStartupBanner>
|
||||||
|
</Bscmake>
|
||||||
|
</ItemDefinitionGroup>
|
||||||
|
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
||||||
|
<Midl>
|
||||||
|
<TypeLibraryName>.\Release/toyvm.tlb</TypeLibraryName>
|
||||||
|
<HeaderFileName />
|
||||||
|
</Midl>
|
||||||
|
<ClCompile>
|
||||||
|
<Optimization>MaxSpeed</Optimization>
|
||||||
|
<InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion>
|
||||||
|
<AdditionalIncludeDirectories>../;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||||
|
<PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
|
<StringPooling>true</StringPooling>
|
||||||
|
<RuntimeLibrary>MultiThreaded</RuntimeLibrary>
|
||||||
|
<FunctionLevelLinking>true</FunctionLevelLinking>
|
||||||
|
<PrecompiledHeaderOutputFile>.\Release/toyvm.pch</PrecompiledHeaderOutputFile>
|
||||||
|
<WarningLevel>Level4</WarningLevel>
|
||||||
|
<SuppressStartupBanner>true</SuppressStartupBanner>
|
||||||
|
</ClCompile>
|
||||||
|
<ResourceCompile>
|
||||||
|
<PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
|
<Culture>0x0411</Culture>
|
||||||
|
</ResourceCompile>
|
||||||
|
<Link>
|
||||||
|
<SuppressStartupBanner>true</SuppressStartupBanner>
|
||||||
|
<SubSystem>Console</SubSystem>
|
||||||
|
<RandomizedBaseAddress>false</RandomizedBaseAddress>
|
||||||
|
<DataExecutionPrevention />
|
||||||
|
<TargetMachine>MachineX86</TargetMachine>
|
||||||
|
</Link>
|
||||||
|
<Bscmake>
|
||||||
|
<SuppressStartupBanner>true</SuppressStartupBanner>
|
||||||
|
</Bscmake>
|
||||||
|
</ItemDefinitionGroup>
|
||||||
|
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
|
||||||
|
<Midl>
|
||||||
|
<TargetEnvironment>X64</TargetEnvironment>
|
||||||
|
<TypeLibraryName>.\Debug/toyvm.tlb</TypeLibraryName>
|
||||||
|
<HeaderFileName />
|
||||||
|
</Midl>
|
||||||
|
<ClCompile>
|
||||||
|
<Optimization>Disabled</Optimization>
|
||||||
|
<AdditionalIncludeDirectories>../;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||||
|
<PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
|
<MinimalRebuild>true</MinimalRebuild>
|
||||||
|
<BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
|
||||||
|
<RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
|
||||||
|
<PrecompiledHeaderOutputFile>.\Debug/toyvm.pch</PrecompiledHeaderOutputFile>
|
||||||
|
<WarningLevel>Level4</WarningLevel>
|
||||||
|
<SuppressStartupBanner>true</SuppressStartupBanner>
|
||||||
|
<DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
|
||||||
|
</ClCompile>
|
||||||
|
<ResourceCompile>
|
||||||
|
<PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
|
<Culture>0x0411</Culture>
|
||||||
|
</ResourceCompile>
|
||||||
|
<Link>
|
||||||
|
<SuppressStartupBanner>true</SuppressStartupBanner>
|
||||||
|
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||||
|
<ProgramDatabaseFile>.\Debug/toyvm.pdb</ProgramDatabaseFile>
|
||||||
|
<SubSystem>Console</SubSystem>
|
||||||
|
<RandomizedBaseAddress>false</RandomizedBaseAddress>
|
||||||
|
<DataExecutionPrevention />
|
||||||
|
<TargetMachine>MachineX64</TargetMachine>
|
||||||
|
</Link>
|
||||||
|
<Bscmake>
|
||||||
|
<SuppressStartupBanner>true</SuppressStartupBanner>
|
||||||
|
</Bscmake>
|
||||||
|
</ItemDefinitionGroup>
|
||||||
|
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
|
||||||
|
<Midl>
|
||||||
|
<TargetEnvironment>X64</TargetEnvironment>
|
||||||
|
<TypeLibraryName>.\Release/toyvm.tlb</TypeLibraryName>
|
||||||
|
<HeaderFileName />
|
||||||
|
</Midl>
|
||||||
|
<ClCompile>
|
||||||
|
<Optimization>MaxSpeed</Optimization>
|
||||||
|
<InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion>
|
||||||
|
<AdditionalIncludeDirectories>../;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||||
|
<PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
|
<StringPooling>true</StringPooling>
|
||||||
|
<RuntimeLibrary>MultiThreaded</RuntimeLibrary>
|
||||||
|
<FunctionLevelLinking>true</FunctionLevelLinking>
|
||||||
|
<PrecompiledHeaderOutputFile>.\Release/toyvm.pch</PrecompiledHeaderOutputFile>
|
||||||
|
<WarningLevel>Level4</WarningLevel>
|
||||||
|
<SuppressStartupBanner>true</SuppressStartupBanner>
|
||||||
|
</ClCompile>
|
||||||
|
<ResourceCompile>
|
||||||
|
<PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
|
<Culture>0x0411</Culture>
|
||||||
|
</ResourceCompile>
|
||||||
|
<Link>
|
||||||
|
<SuppressStartupBanner>true</SuppressStartupBanner>
|
||||||
|
<SubSystem>Console</SubSystem>
|
||||||
|
<RandomizedBaseAddress>false</RandomizedBaseAddress>
|
||||||
|
<DataExecutionPrevention />
|
||||||
|
<TargetMachine>MachineX64</TargetMachine>
|
||||||
|
</Link>
|
||||||
|
<Bscmake>
|
||||||
|
<SuppressStartupBanner>true</SuppressStartupBanner>
|
||||||
|
</Bscmake>
|
||||||
|
</ItemDefinitionGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<ClCompile Include="toyvm.cpp" />
|
||||||
|
</ItemGroup>
|
||||||
|
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
|
||||||
|
<ImportGroup Label="ExtensionTargets">
|
||||||
|
</ImportGroup>
|
||||||
|
</Project>
|
|
@ -1,9 +1,18 @@
|
||||||
TARGET = make_nm normalize_prefix jmp address bad_address misc cvt_test cvt_test32
|
TARGET = make_nm normalize_prefix bad_address misc cvt_test cvt_test32 noexception
|
||||||
XBYAK_INC=../xbyak/xbyak.h
|
XBYAK_INC=../xbyak/xbyak.h
|
||||||
|
UNAME_S=$(shell uname -s)
|
||||||
BIT=32
|
BIT=32
|
||||||
ifeq ($(shell uname -m),x86_64)
|
ifeq ($(shell uname -m),x86_64)
|
||||||
BIT=64
|
BIT=64
|
||||||
endif
|
endif
|
||||||
|
ONLY_64BIT=0
|
||||||
|
ifeq ($(UNAME_S),Darwin)
|
||||||
|
# 32-bit binary is not supported
|
||||||
|
ONLY_64BIT=1
|
||||||
|
endif
|
||||||
|
ifeq ($(ONLY_64BIT),0)
|
||||||
|
TARGET += jmp address
|
||||||
|
endif
|
||||||
|
|
||||||
ifeq ($(BIT),64)
|
ifeq ($(BIT),64)
|
||||||
TARGET += jmp64 address64
|
TARGET += jmp64 address64
|
||||||
|
@ -36,18 +45,24 @@ cvt_test: cvt_test.cpp ../xbyak/xbyak.h
|
||||||
$(CXX) $(CFLAGS) $< -o $@
|
$(CXX) $(CFLAGS) $< -o $@
|
||||||
cvt_test32: cvt_test.cpp ../xbyak/xbyak.h
|
cvt_test32: cvt_test.cpp ../xbyak/xbyak.h
|
||||||
$(CXX) $(CFLAGS) $< -o $@ -DXBYAK32
|
$(CXX) $(CFLAGS) $< -o $@ -DXBYAK32
|
||||||
|
noexception: noexception.cpp ../xbyak/xbyak.h
|
||||||
|
$(CXX) $(CFLAGS) $< -o $@ -fno-exceptions
|
||||||
|
|
||||||
test: normalize_prefix jmp bad_address $(TARGET)
|
test_nm: normalize_prefix $(TARGET)
|
||||||
$(MAKE) -C ../gen
|
$(MAKE) -C ../gen
|
||||||
|
ifneq ($(ONLY_64BIT),1)
|
||||||
./test_nm.sh
|
./test_nm.sh
|
||||||
|
./test_nm.sh noexcept
|
||||||
|
./noexception
|
||||||
./test_nm.sh Y
|
./test_nm.sh Y
|
||||||
./test_nm.sh avx512
|
./test_nm.sh avx512
|
||||||
./test_address.sh
|
./test_address.sh
|
||||||
./jmp
|
./jmp
|
||||||
|
./cvt_test32
|
||||||
|
endif
|
||||||
./bad_address
|
./bad_address
|
||||||
./misc
|
./misc
|
||||||
./cvt_test
|
./cvt_test
|
||||||
./cvt_test32
|
|
||||||
ifeq ($(BIT),64)
|
ifeq ($(BIT),64)
|
||||||
./test_address.sh 64
|
./test_address.sh 64
|
||||||
./test_nm.sh 64
|
./test_nm.sh 64
|
||||||
|
@ -56,8 +71,10 @@ ifeq ($(BIT),64)
|
||||||
endif
|
endif
|
||||||
|
|
||||||
test_avx: normalize_prefix
|
test_avx: normalize_prefix
|
||||||
|
ifneq ($(ONLY_64BIT),0)
|
||||||
./test_avx.sh
|
./test_avx.sh
|
||||||
./test_avx.sh Y
|
./test_avx.sh Y
|
||||||
|
endif
|
||||||
ifeq ($(BIT),64)
|
ifeq ($(BIT),64)
|
||||||
./test_address.sh 64
|
./test_address.sh 64
|
||||||
./test_avx.sh 64
|
./test_avx.sh 64
|
||||||
|
@ -65,10 +82,18 @@ ifeq ($(BIT),64)
|
||||||
endif
|
endif
|
||||||
|
|
||||||
test_avx512: normalize_prefix
|
test_avx512: normalize_prefix
|
||||||
|
ifneq ($(ONLY_64BIT),0)
|
||||||
./test_avx512.sh
|
./test_avx512.sh
|
||||||
|
endif
|
||||||
ifeq ($(BIT),64)
|
ifeq ($(BIT),64)
|
||||||
./test_avx512.sh 64
|
./test_avx512.sh 64
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
test:
|
||||||
|
$(MAKE) test_nm
|
||||||
|
$(MAKE) test_avx
|
||||||
|
$(MAKE) test_avx512
|
||||||
|
|
||||||
clean:
|
clean:
|
||||||
rm -rf *.o $(TARGET) lib_run nm.cpp nm_frame make_512
|
rm -rf *.o $(TARGET) lib_run nm.cpp nm_frame make_512
|
||||||
|
|
||||||
|
|
|
@ -1,47 +1,28 @@
|
||||||
#include <xbyak/xbyak.h>
|
#include <xbyak/xbyak.h>
|
||||||
|
#include <cybozu/test.hpp>
|
||||||
#define TEST_EXCEPTION(state) \
|
|
||||||
{ \
|
|
||||||
num++; \
|
|
||||||
bool exception = false; \
|
|
||||||
try { \
|
|
||||||
state; \
|
|
||||||
} catch (...) { \
|
|
||||||
exception = true; \
|
|
||||||
} \
|
|
||||||
if (!exception) { \
|
|
||||||
printf("exception should arise for %s\n", #state); \
|
|
||||||
err++; \
|
|
||||||
} \
|
|
||||||
}
|
|
||||||
|
|
||||||
struct Code : Xbyak::CodeGenerator {
|
struct Code : Xbyak::CodeGenerator {
|
||||||
Code()
|
Code()
|
||||||
{
|
{
|
||||||
int err = 0;
|
CYBOZU_TEST_EXCEPTION(mov(eax, ptr [esp + esp]), std::exception);
|
||||||
int num = 0;
|
CYBOZU_TEST_EXCEPTION(mov(eax, ptr [ax]), std::exception); // not support
|
||||||
TEST_EXCEPTION(mov(eax, ptr [esp + esp]));
|
CYBOZU_TEST_EXCEPTION(mov(eax, ptr [esp * 4]), std::exception);
|
||||||
TEST_EXCEPTION(mov(eax, ptr [ax])); // not support
|
CYBOZU_TEST_EXCEPTION(mov(eax, ptr [eax * 16]), std::exception);
|
||||||
TEST_EXCEPTION(mov(eax, ptr [esp * 4]));
|
CYBOZU_TEST_EXCEPTION(mov(eax, ptr [eax + eax + eax]), std::exception);
|
||||||
TEST_EXCEPTION(mov(eax, ptr [eax * 16]));
|
CYBOZU_TEST_EXCEPTION(mov(eax, ptr [eax * 2 + ecx * 4]), std::exception);
|
||||||
TEST_EXCEPTION(mov(eax, ptr [eax + eax + eax]));
|
CYBOZU_TEST_EXCEPTION(mov(eax, ptr [eax * 2 + ecx * 4]), std::exception);
|
||||||
TEST_EXCEPTION(mov(eax, ptr [eax * 2 + ecx * 4]));
|
CYBOZU_TEST_EXCEPTION(mov(eax, ptr [xmm0]), std::exception);
|
||||||
TEST_EXCEPTION(mov(eax, ptr [eax * 2 + ecx * 4]));
|
CYBOZU_TEST_EXCEPTION(fld(dword [xmm0]), std::exception);
|
||||||
TEST_EXCEPTION(mov(eax, ptr [xmm0]));
|
CYBOZU_TEST_EXCEPTION(vgatherdpd(xmm0, ptr [eax * 2], ymm3), std::exception);
|
||||||
TEST_EXCEPTION(fld(dword [xmm0]));
|
CYBOZU_TEST_EXCEPTION(vgatherdpd(xmm0, ptr [xmm0 + xmm1], ymm3), std::exception);
|
||||||
TEST_EXCEPTION(vgatherdpd(xmm0, ptr [eax * 2], ymm3));
|
|
||||||
TEST_EXCEPTION(vgatherdpd(xmm0, ptr [xmm0 + xmm1], ymm3));
|
|
||||||
#ifdef XBYAK64
|
#ifdef XBYAK64
|
||||||
TEST_EXCEPTION(mov(eax, ptr [rax + eax]));
|
CYBOZU_TEST_EXCEPTION(mov(eax, ptr [rax + eax]), std::exception);
|
||||||
TEST_EXCEPTION(mov(eax, ptr [xmm0 + ymm0]));
|
CYBOZU_TEST_EXCEPTION(mov(eax, ptr [xmm0 + ymm0]), std::exception);
|
||||||
#endif
|
#endif
|
||||||
if (!err) {
|
|
||||||
printf("bad_address test %d ok\n", num);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
int main()
|
CYBOZU_TEST_AUTO(exception)
|
||||||
{
|
{
|
||||||
Code c;
|
Code c;
|
||||||
}
|
}
|
||||||
|
|
141
test/jmp.cpp
141
test/jmp.cpp
|
@ -117,7 +117,7 @@ CYBOZU_TEST_AUTO(test1)
|
||||||
int offset;
|
int offset;
|
||||||
bool isBack;
|
bool isBack;
|
||||||
bool isShort;
|
bool isShort;
|
||||||
uint8 result[6];
|
uint8_t result[6];
|
||||||
int size;
|
int size;
|
||||||
} tbl[] = {
|
} tbl[] = {
|
||||||
{ 0, true, true, { 0xeb, 0xfe }, 2 },
|
{ 0, true, true, { 0xeb, 0xfe }, 2 },
|
||||||
|
@ -133,7 +133,7 @@ CYBOZU_TEST_AUTO(test1)
|
||||||
const Tbl *p = &tbl[i];
|
const Tbl *p = &tbl[i];
|
||||||
for (int k = 0; k < 2; k++) {
|
for (int k = 0; k < 2; k++) {
|
||||||
TestJmp jmp(p->offset, p->isBack, p->isShort, k == 0);
|
TestJmp jmp(p->offset, p->isBack, p->isShort, k == 0);
|
||||||
const uint8 *q = (const uint8*)jmp.getCode();
|
const uint8_t *q = (const uint8_t*)jmp.getCode();
|
||||||
if (p->isBack) q += p->offset; /* skip nop */
|
if (p->isBack) q += p->offset; /* skip nop */
|
||||||
for (int j = 0; j < p->size; j++) {
|
for (int j = 0; j < p->size; j++) {
|
||||||
CYBOZU_TEST_EQUAL(q[j], p->result[j]);
|
CYBOZU_TEST_EQUAL(q[j], p->result[j]);
|
||||||
|
@ -205,6 +205,41 @@ CYBOZU_TEST_AUTO(testJmpCx)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
CYBOZU_TEST_AUTO(loop)
|
||||||
|
{
|
||||||
|
const uint8_t ok[] = {
|
||||||
|
// lp:
|
||||||
|
0x31, 0xC0, // xor eax, eax
|
||||||
|
0xE2, 0xFC, // loop lp
|
||||||
|
0xE0, 0xFA, // loopne lp
|
||||||
|
0xE1, 0xF8, // loope lp
|
||||||
|
};
|
||||||
|
struct Code : CodeGenerator {
|
||||||
|
Code(bool useLabel)
|
||||||
|
{
|
||||||
|
if (useLabel) {
|
||||||
|
Xbyak::Label lp = L();
|
||||||
|
xor_(eax, eax);
|
||||||
|
loop(lp);
|
||||||
|
loopne(lp);
|
||||||
|
loope(lp);
|
||||||
|
} else {
|
||||||
|
L("@@");
|
||||||
|
xor_(eax, eax);
|
||||||
|
loop("@b");
|
||||||
|
loopne("@b");
|
||||||
|
loope("@b");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
Code code1(false);
|
||||||
|
CYBOZU_TEST_EQUAL(code1.getSize(), sizeof(ok));
|
||||||
|
CYBOZU_TEST_EQUAL_ARRAY(code1.getCode(), ok, sizeof(ok));
|
||||||
|
Code code2(true);
|
||||||
|
CYBOZU_TEST_EQUAL(code2.getSize(), sizeof(ok));
|
||||||
|
CYBOZU_TEST_EQUAL_ARRAY(code2.getCode(), ok, sizeof(ok));
|
||||||
|
}
|
||||||
|
|
||||||
#ifdef _MSC_VER
|
#ifdef _MSC_VER
|
||||||
#pragma warning(disable : 4310)
|
#pragma warning(disable : 4310)
|
||||||
#endif
|
#endif
|
||||||
|
@ -337,11 +372,11 @@ CYBOZU_TEST_AUTO(test3)
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
Xbyak::uint8 bufL[4096 * 32];
|
uint8_t bufL[4096 * 32];
|
||||||
Xbyak::uint8 bufS[4096 * 2];
|
uint8_t bufS[4096 * 2];
|
||||||
|
|
||||||
struct MyAllocator : Xbyak::Allocator {
|
struct MyAllocator : Xbyak::Allocator {
|
||||||
Xbyak::uint8 *alloc(size_t size)
|
uint8_t *alloc(size_t size)
|
||||||
{
|
{
|
||||||
if (size < sizeof(bufS)) {
|
if (size < sizeof(bufS)) {
|
||||||
printf("test use bufS(%d)\n", (int)size);
|
printf("test use bufS(%d)\n", (int)size);
|
||||||
|
@ -354,7 +389,7 @@ struct MyAllocator : Xbyak::Allocator {
|
||||||
fprintf(stderr, "no memory %d\n", (int)size);
|
fprintf(stderr, "no memory %d\n", (int)size);
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
void free(Xbyak::uint8 *)
|
void free(uint8_t *)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
} myAlloc;
|
} myAlloc;
|
||||||
|
@ -393,6 +428,7 @@ CYBOZU_TEST_AUTO(test4)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifndef __APPLE__
|
||||||
CYBOZU_TEST_AUTO(test5)
|
CYBOZU_TEST_AUTO(test5)
|
||||||
{
|
{
|
||||||
struct Test5 : Xbyak::CodeGenerator {
|
struct Test5 : Xbyak::CodeGenerator {
|
||||||
|
@ -440,8 +476,9 @@ CYBOZU_TEST_AUTO(test5)
|
||||||
gm.assign((const char*)gc.getCode(), gc.getSize());
|
gm.assign((const char*)gc.getCode(), gc.getSize());
|
||||||
CYBOZU_TEST_EQUAL(fm, gm);
|
CYBOZU_TEST_EQUAL(fm, gm);
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
size_t getValue(const uint8* p)
|
size_t getValue(const uint8_t* p)
|
||||||
{
|
{
|
||||||
size_t v = 0;
|
size_t v = 0;
|
||||||
for (size_t i = 0; i < sizeof(size_t); i++) {
|
for (size_t i = 0; i < sizeof(size_t); i++) {
|
||||||
|
@ -450,7 +487,7 @@ size_t getValue(const uint8* p)
|
||||||
return v;
|
return v;
|
||||||
}
|
}
|
||||||
|
|
||||||
void checkAddr(const uint8 *p, size_t offset, size_t expect)
|
void checkAddr(const uint8_t *p, size_t offset, size_t expect)
|
||||||
{
|
{
|
||||||
size_t v = getValue(p + offset);
|
size_t v = getValue(p + offset);
|
||||||
CYBOZU_TEST_EQUAL(v, size_t(p) + expect);
|
CYBOZU_TEST_EQUAL(v, size_t(p) + expect);
|
||||||
|
@ -498,7 +535,7 @@ CYBOZU_TEST_AUTO(MovLabel)
|
||||||
|
|
||||||
const struct {
|
const struct {
|
||||||
int pos;
|
int pos;
|
||||||
uint8 ok;
|
uint8_t ok;
|
||||||
} tbl[] = {
|
} tbl[] = {
|
||||||
#ifdef XBYAK32
|
#ifdef XBYAK32
|
||||||
{ 0x00, 0x90 },
|
{ 0x00, 0x90 },
|
||||||
|
@ -532,11 +569,11 @@ CYBOZU_TEST_AUTO(MovLabel)
|
||||||
const bool useNewLabel = k == 0;
|
const bool useNewLabel = k == 0;
|
||||||
MovLabelCode code(grow, useNewLabel);
|
MovLabelCode code(grow, useNewLabel);
|
||||||
if (grow) code.ready();
|
if (grow) code.ready();
|
||||||
const uint8* const p = code.getCode();
|
const uint8_t* const p = code.getCode();
|
||||||
for (size_t i = 0; i < CYBOZU_NUM_OF_ARRAY(tbl); i++) {
|
for (size_t i = 0; i < CYBOZU_NUM_OF_ARRAY(tbl); i++) {
|
||||||
int pos = tbl[i].pos;
|
int pos = tbl[i].pos;
|
||||||
uint8 x = p[pos];
|
uint8_t x = p[pos];
|
||||||
uint8 ok = tbl[i].ok;
|
uint8_t ok = tbl[i].ok;
|
||||||
CYBOZU_TEST_EQUAL(x, ok);
|
CYBOZU_TEST_EQUAL(x, ok);
|
||||||
}
|
}
|
||||||
#ifdef XBYAK32
|
#ifdef XBYAK32
|
||||||
|
@ -1182,11 +1219,11 @@ CYBOZU_TEST_AUTO(rip_jmp)
|
||||||
CYBOZU_TEST_EQUAL(ret, ret1234() + ret9999());
|
CYBOZU_TEST_EQUAL(ret, ret1234() + ret9999());
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef XBYAK64_GCC
|
#if 0
|
||||||
CYBOZU_TEST_AUTO(rip_addr)
|
CYBOZU_TEST_AUTO(rip_addr)
|
||||||
{
|
{
|
||||||
/*
|
/*
|
||||||
assume |&x - &code| < 2GiB
|
we can't assume |&x - &code| < 2GiB anymore
|
||||||
*/
|
*/
|
||||||
static int x = 5;
|
static int x = 5;
|
||||||
struct Code : Xbyak::CodeGenerator {
|
struct Code : Xbyak::CodeGenerator {
|
||||||
|
@ -1201,6 +1238,8 @@ CYBOZU_TEST_AUTO(rip_addr)
|
||||||
CYBOZU_TEST_EQUAL(x, 123);
|
CYBOZU_TEST_EQUAL(x, 123);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifndef __APPLE__
|
||||||
CYBOZU_TEST_AUTO(rip_addr_with_fixed_buf)
|
CYBOZU_TEST_AUTO(rip_addr_with_fixed_buf)
|
||||||
{
|
{
|
||||||
MIE_ALIGN(4096) static char buf[8192];
|
MIE_ALIGN(4096) static char buf[8192];
|
||||||
|
@ -1225,6 +1264,7 @@ CYBOZU_TEST_AUTO(rip_addr_with_fixed_buf)
|
||||||
code.setProtectModeRW();
|
code.setProtectModeRW();
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
struct ReleaseTestCode : Xbyak::CodeGenerator {
|
struct ReleaseTestCode : Xbyak::CodeGenerator {
|
||||||
ReleaseTestCode(Label& L1, Label& L2, Label& L3)
|
ReleaseTestCode(Label& L1, Label& L2, Label& L3)
|
||||||
|
@ -1270,3 +1310,76 @@ CYBOZU_TEST_AUTO(release_label_after_code)
|
||||||
printf("id=%d %d %d %d %d\n", L1.getId(), L2.getId(), L3.getId(), L4.getId(), L5.getId());
|
printf("id=%d %d %d %d %d\n", L1.getId(), L2.getId(), L3.getId(), L4.getId(), L5.getId());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
struct JmpTypeCode : Xbyak::CodeGenerator {
|
||||||
|
void nops()
|
||||||
|
{
|
||||||
|
for (int i = 0; i < 130; i++) {
|
||||||
|
nop();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// return jmp code size
|
||||||
|
size_t gen(bool pre, bool large, Xbyak::CodeGenerator::LabelType type)
|
||||||
|
{
|
||||||
|
Label label;
|
||||||
|
if (pre) {
|
||||||
|
L(label);
|
||||||
|
if (large) nops();
|
||||||
|
size_t pos = getSize();
|
||||||
|
jmp(label, type);
|
||||||
|
return getSize() - pos;
|
||||||
|
} else {
|
||||||
|
size_t pos = getSize();
|
||||||
|
jmp(label, type);
|
||||||
|
size_t size = getSize() - pos;
|
||||||
|
if (large) nops();
|
||||||
|
L(label);
|
||||||
|
return size;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
CYBOZU_TEST_AUTO(setDefaultJmpNEAR)
|
||||||
|
{
|
||||||
|
const Xbyak::CodeGenerator::LabelType T_SHORT = Xbyak::CodeGenerator::T_SHORT;
|
||||||
|
const Xbyak::CodeGenerator::LabelType T_NEAR = Xbyak::CodeGenerator::T_NEAR;
|
||||||
|
const Xbyak::CodeGenerator::LabelType T_AUTO = Xbyak::CodeGenerator::T_AUTO;
|
||||||
|
const struct {
|
||||||
|
bool pre;
|
||||||
|
bool large;
|
||||||
|
Xbyak::CodeGenerator::LabelType type;
|
||||||
|
size_t expect1; // 0 means exception
|
||||||
|
size_t expect2;
|
||||||
|
} tbl[] = {
|
||||||
|
{ false, false, T_SHORT, 2, 2 },
|
||||||
|
{ false, false, T_NEAR, 5, 5 },
|
||||||
|
{ false, true, T_SHORT, 0, 0 },
|
||||||
|
{ false, true, T_NEAR, 5, 5 },
|
||||||
|
|
||||||
|
{ true, false, T_SHORT, 2, 2 },
|
||||||
|
{ true, false, T_NEAR, 5, 5 },
|
||||||
|
{ true, true, T_SHORT, 0, 0 },
|
||||||
|
{ true, true, T_NEAR, 5, 5 },
|
||||||
|
|
||||||
|
{ false, false, T_AUTO, 2, 5 },
|
||||||
|
{ false, true, T_AUTO, 0, 5 },
|
||||||
|
{ true, false, T_AUTO, 2, 2 },
|
||||||
|
{ true, true, T_AUTO, 5, 5 },
|
||||||
|
};
|
||||||
|
JmpTypeCode code1, code2;
|
||||||
|
code2.setDefaultJmpNEAR(true);
|
||||||
|
for (size_t i = 0; i < CYBOZU_NUM_OF_ARRAY(tbl); i++) {
|
||||||
|
if (tbl[i].expect1) {
|
||||||
|
size_t size = code1.gen(tbl[i].pre, tbl[i].large, tbl[i].type);
|
||||||
|
CYBOZU_TEST_EQUAL(size, tbl[i].expect1);
|
||||||
|
} else {
|
||||||
|
CYBOZU_TEST_EXCEPTION(code1.gen(tbl[i].pre, tbl[i].large, tbl[i].type), std::exception);
|
||||||
|
}
|
||||||
|
if (tbl[i].expect2) {
|
||||||
|
size_t size = code2.gen(tbl[i].pre, tbl[i].large, tbl[i].type);
|
||||||
|
CYBOZU_TEST_EQUAL(size, tbl[i].expect2);
|
||||||
|
} else {
|
||||||
|
CYBOZU_TEST_EXCEPTION(code2.gen(tbl[i].pre, tbl[i].large, tbl[i].type), std::exception);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -9,111 +9,111 @@ using namespace Xbyak;
|
||||||
|
|
||||||
const int bitEnd = 64;
|
const int bitEnd = 64;
|
||||||
|
|
||||||
const uint64 YMM_SAE = 1ULL << 0;
|
const uint64_t YMM_SAE = 1ULL << 0;
|
||||||
const uint64 _XMM = 1ULL << 1;
|
const uint64_t _XMM = 1ULL << 1;
|
||||||
const uint64 _MEM = 1ULL << 2;
|
const uint64_t _MEM = 1ULL << 2;
|
||||||
const uint64 _REG32 = 1ULL << 3;
|
const uint64_t _REG32 = 1ULL << 3;
|
||||||
const uint64 EAX = 1ULL << 4;
|
const uint64_t EAX = 1ULL << 4;
|
||||||
const uint64 IMM32 = 1ULL << 5;
|
const uint64_t IMM32 = 1ULL << 5;
|
||||||
const uint64 IMM8 = 1ULL << 6;
|
const uint64_t IMM8 = 1ULL << 6;
|
||||||
const uint64 _REG8 = 1ULL << 7;
|
const uint64_t _REG8 = 1ULL << 7;
|
||||||
const uint64 _REG16 = 1ULL << 8;
|
const uint64_t _REG16 = 1ULL << 8;
|
||||||
const uint64 XMM_K = 1ULL << 9;
|
const uint64_t XMM_K = 1ULL << 9;
|
||||||
const uint64 YMM_K = 1ULL << 10;
|
const uint64_t YMM_K = 1ULL << 10;
|
||||||
const uint64 ZMM_K = 1ULL << 11;
|
const uint64_t ZMM_K = 1ULL << 11;
|
||||||
const uint64 AX = 1ULL << 12;
|
const uint64_t AX = 1ULL << 12;
|
||||||
const uint64 AL = 1ULL << 13;
|
const uint64_t AL = 1ULL << 13;
|
||||||
const uint64 IMM_1 = 1ULL << 14;
|
const uint64_t IMM_1 = 1ULL << 14;
|
||||||
const uint64 MEM8 = 1ULL << 15;
|
const uint64_t MEM8 = 1ULL << 15;
|
||||||
const uint64 MEM16 = 1ULL << 16;
|
const uint64_t MEM16 = 1ULL << 16;
|
||||||
const uint64 MEM32 = 1ULL << 17;
|
const uint64_t MEM32 = 1ULL << 17;
|
||||||
const uint64 VM32Z = 1ULL << 19;
|
const uint64_t VM32Z = 1ULL << 19;
|
||||||
const uint64 K_K = 1ULL << 20;
|
const uint64_t K_K = 1ULL << 20;
|
||||||
const uint64 MEM_ONLY_DISP = 1ULL << 21;
|
const uint64_t MEM_ONLY_DISP = 1ULL << 21;
|
||||||
const uint64 VM32X_K = 1ULL << 23;
|
const uint64_t VM32X_K = 1ULL << 23;
|
||||||
const uint64 _YMM = 1ULL << 24;
|
const uint64_t _YMM = 1ULL << 24;
|
||||||
const uint64 VM32X_32 = 1ULL << 39;
|
const uint64_t VM32X_32 = 1ULL << 39;
|
||||||
const uint64 VM32X_64 = 1ULL << 40;
|
const uint64_t VM32X_64 = 1ULL << 40;
|
||||||
const uint64 VM32Y_32 = 1ULL << 41;
|
const uint64_t VM32Y_32 = 1ULL << 41;
|
||||||
const uint64 VM32Y_64 = 1ULL << 42;
|
const uint64_t VM32Y_64 = 1ULL << 42;
|
||||||
const uint64 VM32Z_K = 1ULL << 32;
|
const uint64_t VM32Z_K = 1ULL << 32;
|
||||||
#ifdef XBYAK64
|
#ifdef XBYAK64
|
||||||
const uint64 _MEMe = 1ULL << 25;
|
const uint64_t _MEMe = 1ULL << 25;
|
||||||
const uint64 REG32_2 = 1ULL << 26; // r8d, ...
|
const uint64_t REG32_2 = 1ULL << 26; // r8d, ...
|
||||||
const uint64 REG16_2 = 1ULL << 27; // r8w, ...
|
const uint64_t REG16_2 = 1ULL << 27; // r8w, ...
|
||||||
const uint64 REG8_2 = 1ULL << 28; // r8b, ...
|
const uint64_t REG8_2 = 1ULL << 28; // r8b, ...
|
||||||
const uint64 REG8_3 = 1ULL << 29; // spl, ...
|
const uint64_t REG8_3 = 1ULL << 29; // spl, ...
|
||||||
const uint64 _REG64 = 1ULL << 30; // rax, ...
|
const uint64_t _REG64 = 1ULL << 30; // rax, ...
|
||||||
const uint64 _REG64_2 = 1ULL << 31; // r8, ...
|
const uint64_t _REG64_2 = 1ULL << 31; // r8, ...
|
||||||
const uint64 _XMM2 = 1ULL << 33;
|
const uint64_t _XMM2 = 1ULL << 33;
|
||||||
const uint64 _YMM2 = 1ULL << 34;
|
const uint64_t _YMM2 = 1ULL << 34;
|
||||||
const uint64 VM32X = VM32X_32 | VM32X_64;
|
const uint64_t VM32X = VM32X_32 | VM32X_64;
|
||||||
const uint64 VM32Y = VM32Y_32 | VM32Y_64;
|
const uint64_t VM32Y = VM32Y_32 | VM32Y_64;
|
||||||
#else
|
#else
|
||||||
const uint64 _MEMe = 0;
|
const uint64_t _MEMe = 0;
|
||||||
const uint64 REG32_2 = 0;
|
const uint64_t REG32_2 = 0;
|
||||||
const uint64 REG16_2 = 0;
|
const uint64_t REG16_2 = 0;
|
||||||
const uint64 REG8_2 = 0;
|
const uint64_t REG8_2 = 0;
|
||||||
const uint64 REG8_3 = 0;
|
const uint64_t REG8_3 = 0;
|
||||||
const uint64 _REG64 = 0;
|
const uint64_t _REG64 = 0;
|
||||||
const uint64 _REG64_2 = 0;
|
const uint64_t _REG64_2 = 0;
|
||||||
const uint64 _XMM2 = 0;
|
const uint64_t _XMM2 = 0;
|
||||||
const uint64 _YMM2 = 0;
|
const uint64_t _YMM2 = 0;
|
||||||
const uint64 VM32X = VM32X_32;
|
const uint64_t VM32X = VM32X_32;
|
||||||
const uint64 VM32Y = VM32Y_32;
|
const uint64_t VM32Y = VM32Y_32;
|
||||||
#endif
|
#endif
|
||||||
const uint64 REG64 = _REG64 | _REG64_2;
|
const uint64_t REG64 = _REG64 | _REG64_2;
|
||||||
const uint64 REG32 = _REG32 | REG32_2 | EAX;
|
const uint64_t REG32 = _REG32 | REG32_2 | EAX;
|
||||||
const uint64 REG16 = _REG16 | REG16_2 | AX;
|
const uint64_t REG16 = _REG16 | REG16_2 | AX;
|
||||||
const uint64 REG32e = REG32 | REG64;
|
const uint64_t REG32e = REG32 | REG64;
|
||||||
const uint64 REG8 = _REG8 | REG8_2|AL;
|
const uint64_t REG8 = _REG8 | REG8_2|AL;
|
||||||
const uint64 MEM = _MEM | _MEMe;
|
const uint64_t MEM = _MEM | _MEMe;
|
||||||
const uint64 MEM64 = 1ULL << 35;
|
const uint64_t MEM64 = 1ULL << 35;
|
||||||
const uint64 YMM_ER = 1ULL << 36;
|
const uint64_t YMM_ER = 1ULL << 36;
|
||||||
const uint64 VM32Y_K = 1ULL << 37;
|
const uint64_t VM32Y_K = 1ULL << 37;
|
||||||
const uint64 IMM_2 = 1ULL << 38;
|
const uint64_t IMM_2 = 1ULL << 38;
|
||||||
const uint64 IMM = IMM_1 | IMM_2;
|
const uint64_t IMM = IMM_1 | IMM_2;
|
||||||
const uint64 YMM = _YMM | _YMM2;
|
const uint64_t YMM = _YMM | _YMM2;
|
||||||
const uint64 K = 1ULL << 43;
|
const uint64_t K = 1ULL << 43;
|
||||||
const uint64 _ZMM = 1ULL << 44;
|
const uint64_t _ZMM = 1ULL << 44;
|
||||||
const uint64 _ZMM2 = 1ULL << 45;
|
const uint64_t _ZMM2 = 1ULL << 45;
|
||||||
#ifdef XBYAK64
|
#ifdef XBYAK64
|
||||||
const uint64 ZMM = _ZMM | _ZMM2;
|
const uint64_t ZMM = _ZMM | _ZMM2;
|
||||||
const uint64 _YMM3 = 1ULL << 46;
|
const uint64_t _YMM3 = 1ULL << 46;
|
||||||
#else
|
#else
|
||||||
const uint64 ZMM = _ZMM;
|
const uint64_t ZMM = _ZMM;
|
||||||
const uint64 _YMM3 = 0;
|
const uint64_t _YMM3 = 0;
|
||||||
#endif
|
#endif
|
||||||
const uint64 K2 = 1ULL << 47;
|
const uint64_t K2 = 1ULL << 47;
|
||||||
const uint64 ZMM_SAE = 1ULL << 48;
|
const uint64_t ZMM_SAE = 1ULL << 48;
|
||||||
const uint64 ZMM_ER = 1ULL << 49;
|
const uint64_t ZMM_ER = 1ULL << 49;
|
||||||
#ifdef XBYAK64
|
#ifdef XBYAK64
|
||||||
const uint64 _XMM3 = 1ULL << 50;
|
const uint64_t _XMM3 = 1ULL << 50;
|
||||||
#else
|
#else
|
||||||
const uint64 _XMM3 = 0;
|
const uint64_t _XMM3 = 0;
|
||||||
#endif
|
#endif
|
||||||
const uint64 XMM = _XMM | _XMM2 | _XMM3;
|
const uint64_t XMM = _XMM | _XMM2 | _XMM3;
|
||||||
const uint64 XMM_SAE = 1ULL << 51;
|
const uint64_t XMM_SAE = 1ULL << 51;
|
||||||
#ifdef XBYAK64
|
#ifdef XBYAK64
|
||||||
const uint64 XMM_KZ = 1ULL << 52;
|
const uint64_t XMM_KZ = 1ULL << 52;
|
||||||
const uint64 YMM_KZ = 1ULL << 53;
|
const uint64_t YMM_KZ = 1ULL << 53;
|
||||||
const uint64 ZMM_KZ = 1ULL << 54;
|
const uint64_t ZMM_KZ = 1ULL << 54;
|
||||||
#else
|
#else
|
||||||
const uint64 XMM_KZ = 0;
|
const uint64_t XMM_KZ = 0;
|
||||||
const uint64 YMM_KZ = 0;
|
const uint64_t YMM_KZ = 0;
|
||||||
const uint64 ZMM_KZ = 0;
|
const uint64_t ZMM_KZ = 0;
|
||||||
#endif
|
#endif
|
||||||
const uint64 MEM_K = 1ULL << 55;
|
const uint64_t MEM_K = 1ULL << 55;
|
||||||
const uint64 M_1to2 = 1ULL << 56;
|
const uint64_t M_1to2 = 1ULL << 56;
|
||||||
const uint64 M_1to4 = 1ULL << 57;
|
const uint64_t M_1to4 = 1ULL << 57;
|
||||||
const uint64 M_1to8 = 1ULL << 58;
|
const uint64_t M_1to8 = 1ULL << 58;
|
||||||
const uint64 M_1to16 = 1ULL << 59;
|
const uint64_t M_1to16 = 1ULL << 59;
|
||||||
const uint64 XMM_ER = 1ULL << 60;
|
const uint64_t XMM_ER = 1ULL << 60;
|
||||||
const uint64 M_xword = 1ULL << 61;
|
const uint64_t M_xword = 1ULL << 61;
|
||||||
const uint64 M_yword = 1ULL << 62;
|
const uint64_t M_yword = 1ULL << 62;
|
||||||
const uint64 MY_1to4 = 1ULL << 18;
|
const uint64_t MY_1to4 = 1ULL << 18;
|
||||||
|
|
||||||
const uint64 NOPARA = 1ULL << (bitEnd - 1);
|
const uint64_t NOPARA = 1ULL << (bitEnd - 1);
|
||||||
|
|
||||||
class Test {
|
class Test {
|
||||||
Test(const Test&);
|
Test(const Test&);
|
||||||
|
@ -121,7 +121,7 @@ class Test {
|
||||||
const bool isXbyak_;
|
const bool isXbyak_;
|
||||||
int funcNum_;
|
int funcNum_;
|
||||||
// check all op1, op2, op3
|
// check all op1, op2, op3
|
||||||
void put(const std::string& nm, uint64 op1 = NOPARA, uint64 op2 = NOPARA, uint64 op3 = NOPARA, uint64 op4 = NOPARA) const
|
void put(const std::string& nm, uint64_t op1 = NOPARA, uint64_t op2 = NOPARA, uint64_t op3 = NOPARA, uint64_t op4 = NOPARA) const
|
||||||
{
|
{
|
||||||
for (int i = 0; i < bitEnd; i++) {
|
for (int i = 0; i < bitEnd; i++) {
|
||||||
if ((op1 & (1ULL << i)) == 0) continue;
|
if ((op1 & (1ULL << i)) == 0) continue;
|
||||||
|
@ -144,7 +144,7 @@ class Test {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
void put(const char *nm, uint64 op, const char *xbyak, const char *nasm) const
|
void put(const char *nm, uint64_t op, const char *xbyak, const char *nasm) const
|
||||||
{
|
{
|
||||||
for (int i = 0; i < bitEnd; i++) {
|
for (int i = 0; i < bitEnd; i++) {
|
||||||
if ((op & (1ULL << i)) == 0) continue;
|
if ((op & (1ULL << i)) == 0) continue;
|
||||||
|
@ -156,7 +156,7 @@ class Test {
|
||||||
printf("\n");
|
printf("\n");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
void put(const char *nm, const char *xbyak, const char *nasm = 0, uint64 op = NOPARA) const
|
void put(const char *nm, const char *xbyak, const char *nasm = 0, uint64_t op = NOPARA) const
|
||||||
{
|
{
|
||||||
if (nasm == 0) nasm = xbyak;
|
if (nasm == 0) nasm = xbyak;
|
||||||
for (int i = 0; i < bitEnd; i++) {
|
for (int i = 0; i < bitEnd; i++) {
|
||||||
|
@ -169,7 +169,7 @@ class Test {
|
||||||
printf("\n");
|
printf("\n");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
const char *get(uint64 type) const
|
const char *get(uint64_t type) const
|
||||||
{
|
{
|
||||||
int idx = (rand() / 31) & 7;
|
int idx = (rand() / 31) & 7;
|
||||||
switch (type) {
|
switch (type) {
|
||||||
|
@ -537,7 +537,7 @@ public:
|
||||||
printf("vaddpd(%s%s%s, %s, %s%s); dump();\n", r1, pk, pz, r2, r3, saeTblXbyak[sae]);
|
printf("vaddpd(%s%s%s, %s, %s%s); dump();\n", r1, pk, pz, r2, r3, saeTblXbyak[sae]);
|
||||||
} else {
|
} else {
|
||||||
if (kIdx) CYBOZU_SNPRINTF(pk, sizeof(pk), "{k%d}", kIdx);
|
if (kIdx) CYBOZU_SNPRINTF(pk, sizeof(pk), "{k%d}", kIdx);
|
||||||
if (z) pz = "{z}";
|
if (z && kIdx) pz = "{z}";
|
||||||
printf("vaddpd %s%s%s, %s, %s%s\n", r1, pk, pz, r2, r3, saeTblNASM[sae]);
|
printf("vaddpd %s%s%s, %s, %s%s\n", r1, pk, pz, r2, r3, saeTblNASM[sae]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -574,9 +574,9 @@ public:
|
||||||
for (size_t k = 0; k < N; k++) {
|
for (size_t k = 0; k < N; k++) {
|
||||||
#ifdef XBYAK64
|
#ifdef XBYAK64
|
||||||
for (int kIdx = 0; kIdx < 8; kIdx++) {
|
for (int kIdx = 0; kIdx < 8; kIdx++) {
|
||||||
|
put_vaddpd(xTbl[i], xTbl[j], xTbl[k], kIdx);
|
||||||
|
put_vaddpd(yTbl[i], yTbl[j], yTbl[k], kIdx);
|
||||||
for (int z = 0; z < 2; z++) {
|
for (int z = 0; z < 2; z++) {
|
||||||
put_vaddpd(xTbl[i], xTbl[j], xTbl[k], kIdx, z == 1);
|
|
||||||
put_vaddpd(yTbl[i], yTbl[j], yTbl[k], kIdx, z == 1);
|
|
||||||
for (int sae = 0; sae < 5; sae++) {
|
for (int sae = 0; sae < 5; sae++) {
|
||||||
put_vaddpd(zTbl[i], zTbl[j], zTbl[k], kIdx, z == 1, sae);
|
put_vaddpd(zTbl[i], zTbl[j], zTbl[k], kIdx, z == 1, sae);
|
||||||
}
|
}
|
||||||
|
@ -615,6 +615,13 @@ public:
|
||||||
put(p->name, K, _YMM, _YMM | MEM, IMM8);
|
put(p->name, K, _YMM, _YMM | MEM, IMM8);
|
||||||
put(p->name, K, _ZMM, _ZMM | MEM, IMM8);
|
put(p->name, K, _ZMM, _ZMM | MEM, IMM8);
|
||||||
}
|
}
|
||||||
|
put("vcmppd", K, XMM, M_1to2, IMM8);
|
||||||
|
put("vcmppd", K, YMM, M_1to4, IMM8);
|
||||||
|
put("vcmppd", K, ZMM, M_1to8, IMM8);
|
||||||
|
|
||||||
|
put("vcmpps", K, XMM, M_1to4, IMM8);
|
||||||
|
put("vcmpps", K, YMM, M_1to8, IMM8);
|
||||||
|
put("vcmpps", K, ZMM, M_1to16, IMM8);
|
||||||
}
|
}
|
||||||
put("vcmppd", K2, ZMM, ZMM_SAE, IMM);
|
put("vcmppd", K2, ZMM, ZMM_SAE, IMM);
|
||||||
#ifdef XBYAK64
|
#ifdef XBYAK64
|
||||||
|
|
340
test/make_nm.cpp
340
test/make_nm.cpp
|
@ -1,5 +1,4 @@
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#define XBYAK_NO_OP_NAMES
|
|
||||||
#include "xbyak/xbyak.h"
|
#include "xbyak/xbyak.h"
|
||||||
#include "xbyak/xbyak_bin2hex.h"
|
#include "xbyak/xbyak_bin2hex.h"
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
@ -11,111 +10,111 @@ using namespace Xbyak;
|
||||||
|
|
||||||
const int bitEnd = 64;
|
const int bitEnd = 64;
|
||||||
|
|
||||||
const uint64 MMX = 1ULL << 0;
|
const uint64_t MMX = 1ULL << 0;
|
||||||
const uint64 _XMM = 1ULL << 1;
|
const uint64_t _XMM = 1ULL << 1;
|
||||||
const uint64 _MEM = 1ULL << 2;
|
const uint64_t _MEM = 1ULL << 2;
|
||||||
const uint64 _REG32 = 1ULL << 3;
|
const uint64_t _REG32 = 1ULL << 3;
|
||||||
const uint64 EAX = 1ULL << 4;
|
const uint64_t EAX = 1ULL << 4;
|
||||||
const uint64 IMM32 = 1ULL << 5;
|
const uint64_t IMM32 = 1ULL << 5;
|
||||||
const uint64 IMM8 = 1ULL << 6;
|
const uint64_t IMM8 = 1ULL << 6;
|
||||||
const uint64 _REG8 = 1ULL << 7;
|
const uint64_t _REG8 = 1ULL << 7;
|
||||||
const uint64 _REG16 = 1ULL << 8;
|
const uint64_t _REG16 = 1ULL << 8;
|
||||||
const uint64 NEG8 = 1ULL << 9;
|
const uint64_t NEG8 = 1ULL << 9;
|
||||||
const uint64 IMM16 = 1ULL << 10;
|
const uint64_t IMM16 = 1ULL << 10;
|
||||||
const uint64 NEG16 = 1ULL << 11;
|
const uint64_t NEG16 = 1ULL << 11;
|
||||||
const uint64 AX = 1ULL << 12;
|
const uint64_t AX = 1ULL << 12;
|
||||||
const uint64 AL = 1ULL << 13;
|
const uint64_t AL = 1ULL << 13;
|
||||||
const uint64 IMM_1 = 1ULL << 14;
|
const uint64_t IMM_1 = 1ULL << 14;
|
||||||
const uint64 MEM8 = 1ULL << 15;
|
const uint64_t MEM8 = 1ULL << 15;
|
||||||
const uint64 MEM16 = 1ULL << 16;
|
const uint64_t MEM16 = 1ULL << 16;
|
||||||
const uint64 MEM32 = 1ULL << 17;
|
const uint64_t MEM32 = 1ULL << 17;
|
||||||
const uint64 ONE = 1ULL << 19;
|
const uint64_t ONE = 1ULL << 19;
|
||||||
const uint64 CL = 1ULL << 20;
|
const uint64_t CL = 1ULL << 20;
|
||||||
const uint64 MEM_ONLY_DISP = 1ULL << 21;
|
const uint64_t MEM_ONLY_DISP = 1ULL << 21;
|
||||||
const uint64 NEG32 = 1ULL << 23;
|
const uint64_t NEG32 = 1ULL << 23;
|
||||||
const uint64 _YMM = 1ULL << 24;
|
const uint64_t _YMM = 1ULL << 24;
|
||||||
const uint64 VM32X_32 = 1ULL << 39;
|
const uint64_t VM32X_32 = 1ULL << 39;
|
||||||
const uint64 VM32X_64 = 1ULL << 40;
|
const uint64_t VM32X_64 = 1ULL << 40;
|
||||||
const uint64 VM32Y_32 = 1ULL << 41;
|
const uint64_t VM32Y_32 = 1ULL << 41;
|
||||||
const uint64 VM32Y_64 = 1ULL << 42;
|
const uint64_t VM32Y_64 = 1ULL << 42;
|
||||||
#ifdef XBYAK64
|
#ifdef XBYAK64
|
||||||
const uint64 _MEMe = 1ULL << 25;
|
const uint64_t _MEMe = 1ULL << 25;
|
||||||
const uint64 REG32_2 = 1ULL << 26; // r8d, ...
|
const uint64_t REG32_2 = 1ULL << 26; // r8d, ...
|
||||||
const uint64 REG16_2 = 1ULL << 27; // r8w, ...
|
const uint64_t REG16_2 = 1ULL << 27; // r8w, ...
|
||||||
const uint64 REG8_2 = 1ULL << 28; // r8b, ...
|
const uint64_t REG8_2 = 1ULL << 28; // r8b, ...
|
||||||
const uint64 REG8_3 = 1ULL << 29; // spl, ...
|
const uint64_t REG8_3 = 1ULL << 29; // spl, ...
|
||||||
const uint64 _REG64 = 1ULL << 30; // rax, ...
|
const uint64_t _REG64 = 1ULL << 30; // rax, ...
|
||||||
const uint64 _REG64_2 = 1ULL << 31; // r8, ...
|
const uint64_t _REG64_2 = 1ULL << 31; // r8, ...
|
||||||
const uint64 RAX = 1ULL << 32;
|
const uint64_t RAX = 1ULL << 32;
|
||||||
const uint64 _XMM2 = 1ULL << 33;
|
const uint64_t _XMM2 = 1ULL << 33;
|
||||||
const uint64 _YMM2 = 1ULL << 34;
|
const uint64_t _YMM2 = 1ULL << 34;
|
||||||
const uint64 VM32X = VM32X_32 | VM32X_64;
|
const uint64_t VM32X = VM32X_32 | VM32X_64;
|
||||||
const uint64 VM32Y = VM32Y_32 | VM32Y_64;
|
const uint64_t VM32Y = VM32Y_32 | VM32Y_64;
|
||||||
#else
|
#else
|
||||||
const uint64 _MEMe = 0;
|
const uint64_t _MEMe = 0;
|
||||||
const uint64 REG32_2 = 0;
|
const uint64_t REG32_2 = 0;
|
||||||
const uint64 REG16_2 = 0;
|
const uint64_t REG16_2 = 0;
|
||||||
const uint64 REG8_2 = 0;
|
const uint64_t REG8_2 = 0;
|
||||||
const uint64 REG8_3 = 0;
|
const uint64_t REG8_3 = 0;
|
||||||
const uint64 _REG64 = 0;
|
const uint64_t _REG64 = 0;
|
||||||
const uint64 _REG64_2 = 0;
|
const uint64_t _REG64_2 = 0;
|
||||||
const uint64 RAX = 0;
|
const uint64_t RAX = 0;
|
||||||
const uint64 _XMM2 = 0;
|
const uint64_t _XMM2 = 0;
|
||||||
const uint64 _YMM2 = 0;
|
const uint64_t _YMM2 = 0;
|
||||||
const uint64 VM32X = VM32X_32;
|
const uint64_t VM32X = VM32X_32;
|
||||||
const uint64 VM32Y = VM32Y_32;
|
const uint64_t VM32Y = VM32Y_32;
|
||||||
#endif
|
#endif
|
||||||
const uint64 REG64 = _REG64 | _REG64_2 | RAX;
|
const uint64_t REG64 = _REG64 | _REG64_2 | RAX;
|
||||||
const uint64 REG32 = _REG32 | REG32_2 | EAX;
|
const uint64_t REG32 = _REG32 | REG32_2 | EAX;
|
||||||
const uint64 REG16 = _REG16 | REG16_2 | AX;
|
const uint64_t REG16 = _REG16 | REG16_2 | AX;
|
||||||
const uint64 REG32e = REG32 | REG64;
|
const uint64_t REG32e = REG32 | REG64;
|
||||||
const uint64 REG8 = _REG8 | REG8_2|AL;
|
const uint64_t REG8 = _REG8 | REG8_2|AL;
|
||||||
const uint64 MEM = _MEM | _MEMe;
|
const uint64_t MEM = _MEM | _MEMe;
|
||||||
const uint64 MEM64 = 1ULL << 35;
|
const uint64_t MEM64 = 1ULL << 35;
|
||||||
const uint64 ST0 = 1ULL << 36;
|
const uint64_t ST0 = 1ULL << 36;
|
||||||
const uint64 STi = 1ULL << 37;
|
const uint64_t STi = 1ULL << 37;
|
||||||
const uint64 IMM_2 = 1ULL << 38;
|
const uint64_t IMM_2 = 1ULL << 38;
|
||||||
const uint64 IMM = IMM_1 | IMM_2;
|
const uint64_t IMM = IMM_1 | IMM_2;
|
||||||
const uint64 XMM = _XMM | _XMM2;
|
const uint64_t XMM = _XMM | _XMM2;
|
||||||
const uint64 YMM = _YMM | _YMM2;
|
const uint64_t YMM = _YMM | _YMM2;
|
||||||
const uint64 K = 1ULL << 43;
|
const uint64_t K = 1ULL << 43;
|
||||||
const uint64 _ZMM = 1ULL << 44;
|
const uint64_t _ZMM = 1ULL << 44;
|
||||||
const uint64 _ZMM2 = 1ULL << 45;
|
const uint64_t _ZMM2 = 1ULL << 45;
|
||||||
#ifdef XBYAK64
|
#ifdef XBYAK64
|
||||||
const uint64 ZMM = _ZMM | _ZMM2;
|
const uint64_t ZMM = _ZMM | _ZMM2;
|
||||||
const uint64 _YMM3 = 1ULL << 46;
|
const uint64_t _YMM3 = 1ULL << 46;
|
||||||
#else
|
#else
|
||||||
const uint64 ZMM = _ZMM;
|
const uint64_t ZMM = _ZMM;
|
||||||
const uint64 _YMM3 = 0;
|
const uint64_t _YMM3 = 0;
|
||||||
#endif
|
#endif
|
||||||
const uint64 K2 = 1ULL << 47;
|
const uint64_t K2 = 1ULL << 47;
|
||||||
const uint64 ZMM_SAE = 1ULL << 48;
|
const uint64_t ZMM_SAE = 1ULL << 48;
|
||||||
const uint64 ZMM_ER = 1ULL << 49;
|
const uint64_t ZMM_ER = 1ULL << 49;
|
||||||
#ifdef XBYAK64
|
#ifdef XBYAK64
|
||||||
const uint64 _XMM3 = 1ULL << 50;
|
const uint64_t _XMM3 = 1ULL << 50;
|
||||||
#endif
|
#endif
|
||||||
const uint64 XMM_SAE = 1ULL << 51;
|
const uint64_t XMM_SAE = 1ULL << 51;
|
||||||
#ifdef XBYAK64
|
#ifdef XBYAK64
|
||||||
const uint64 XMM_KZ = 1ULL << 52;
|
const uint64_t XMM_KZ = 1ULL << 52;
|
||||||
const uint64 YMM_KZ = 1ULL << 53;
|
const uint64_t YMM_KZ = 1ULL << 53;
|
||||||
const uint64 ZMM_KZ = 1ULL << 54;
|
const uint64_t ZMM_KZ = 1ULL << 54;
|
||||||
#else
|
#else
|
||||||
const uint64 XMM_KZ = 0;
|
const uint64_t XMM_KZ = 0;
|
||||||
const uint64 YMM_KZ = 0;
|
const uint64_t YMM_KZ = 0;
|
||||||
const uint64 ZMM_KZ = 0;
|
const uint64_t ZMM_KZ = 0;
|
||||||
#endif
|
#endif
|
||||||
const uint64 MEM_K = 1ULL << 55;
|
const uint64_t MEM_K = 1ULL << 55;
|
||||||
const uint64 M_1to2 = 1ULL << 56;
|
const uint64_t M_1to2 = 1ULL << 56;
|
||||||
const uint64 M_1to4 = 1ULL << 57;
|
const uint64_t M_1to4 = 1ULL << 57;
|
||||||
const uint64 M_1to8 = 1ULL << 58;
|
const uint64_t M_1to8 = 1ULL << 58;
|
||||||
const uint64 M_1to16 = 1ULL << 59;
|
const uint64_t M_1to16 = 1ULL << 59;
|
||||||
const uint64 XMM_ER = 1ULL << 60;
|
const uint64_t XMM_ER = 1ULL << 60;
|
||||||
const uint64 M_xword = 1ULL << 61;
|
const uint64_t M_xword = 1ULL << 61;
|
||||||
const uint64 M_yword = 1ULL << 62;
|
const uint64_t M_yword = 1ULL << 62;
|
||||||
const uint64 MY_1to4 = 1ULL << 18;
|
const uint64_t MY_1to4 = 1ULL << 18;
|
||||||
const uint64 BNDREG = 1ULL << 22;
|
const uint64_t BNDREG = 1ULL << 22;
|
||||||
|
|
||||||
const uint64 NOPARA = 1ULL << (bitEnd - 1);
|
const uint64_t NOPARA = 1ULL << (bitEnd - 1);
|
||||||
|
|
||||||
class Test {
|
class Test {
|
||||||
Test(const Test&);
|
Test(const Test&);
|
||||||
|
@ -132,7 +131,7 @@ class Test {
|
||||||
}
|
}
|
||||||
|
|
||||||
// check all op1, op2, op3
|
// check all op1, op2, op3
|
||||||
void put(const std::string& nm, uint64 op1 = NOPARA, uint64 op2 = NOPARA, uint64 op3 = NOPARA, uint64 op4 = NOPARA) const
|
void put(const std::string& nm, uint64_t op1 = NOPARA, uint64_t op2 = NOPARA, uint64_t op3 = NOPARA, uint64_t op4 = NOPARA) const
|
||||||
{
|
{
|
||||||
for (int i = 0; i < bitEnd; i++) {
|
for (int i = 0; i < bitEnd; i++) {
|
||||||
if ((op1 & (1ULL << i)) == 0) continue;
|
if ((op1 & (1ULL << i)) == 0) continue;
|
||||||
|
@ -155,7 +154,7 @@ class Test {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
void put(const char *nm, uint64 op, const char *xbyak, const char *nasm) const
|
void put(const char *nm, uint64_t op, const char *xbyak, const char *nasm) const
|
||||||
{
|
{
|
||||||
for (int i = 0; i < bitEnd; i++) {
|
for (int i = 0; i < bitEnd; i++) {
|
||||||
if ((op & (1ULL << i)) == 0) continue;
|
if ((op & (1ULL << i)) == 0) continue;
|
||||||
|
@ -167,7 +166,7 @@ class Test {
|
||||||
printf("\n");
|
printf("\n");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
void put(const char *nm, const char *xbyak, const char *nasm = 0, uint64 op = NOPARA) const
|
void put(const char *nm, const char *xbyak, const char *nasm = 0, uint64_t op = NOPARA) const
|
||||||
{
|
{
|
||||||
if (nasm == 0) nasm = xbyak;
|
if (nasm == 0) nasm = xbyak;
|
||||||
for (int i = 0; i < bitEnd; i++) {
|
for (int i = 0; i < bitEnd; i++) {
|
||||||
|
@ -180,7 +179,7 @@ class Test {
|
||||||
printf("\n");
|
printf("\n");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
const char *get(uint64 type) const
|
const char *get(uint64_t type) const
|
||||||
{
|
{
|
||||||
int idx = (rand() / 31) & 7;
|
int idx = (rand() / 31) & 7;
|
||||||
if (type == ST0) {
|
if (type == ST0) {
|
||||||
|
@ -460,8 +459,14 @@ class Test {
|
||||||
"cqo",
|
"cqo",
|
||||||
"cmpsq",
|
"cmpsq",
|
||||||
"movsq",
|
"movsq",
|
||||||
|
"popfq",
|
||||||
|
"pushfq",
|
||||||
|
"lodsq",
|
||||||
|
"movsq",
|
||||||
"scasq",
|
"scasq",
|
||||||
"stosq",
|
"stosq",
|
||||||
|
"syscall",
|
||||||
|
"sysret",
|
||||||
#else
|
#else
|
||||||
"aaa",
|
"aaa",
|
||||||
"aad",
|
"aad",
|
||||||
|
@ -469,6 +474,7 @@ class Test {
|
||||||
"aas",
|
"aas",
|
||||||
"daa",
|
"daa",
|
||||||
"das",
|
"das",
|
||||||
|
"into",
|
||||||
"popad",
|
"popad",
|
||||||
"popfd",
|
"popfd",
|
||||||
"pusha",
|
"pusha",
|
||||||
|
@ -493,9 +499,17 @@ class Test {
|
||||||
"cmpsb",
|
"cmpsb",
|
||||||
"cmpsw",
|
"cmpsw",
|
||||||
"cmpsd",
|
"cmpsd",
|
||||||
|
"int3",
|
||||||
|
"leave",
|
||||||
|
"lodsb",
|
||||||
|
"lodsw",
|
||||||
|
"lodsd",
|
||||||
"movsb",
|
"movsb",
|
||||||
"movsw",
|
"movsw",
|
||||||
"movsd",
|
"movsd",
|
||||||
|
"outsb",
|
||||||
|
"outsw",
|
||||||
|
"outsd",
|
||||||
"scasb",
|
"scasb",
|
||||||
"scasw",
|
"scasw",
|
||||||
"scasd",
|
"scasd",
|
||||||
|
@ -508,6 +522,8 @@ class Test {
|
||||||
"stc",
|
"stc",
|
||||||
"std",
|
"std",
|
||||||
"sti",
|
"sti",
|
||||||
|
"sysenter",
|
||||||
|
"sysexit",
|
||||||
|
|
||||||
"emms",
|
"emms",
|
||||||
"pause",
|
"pause",
|
||||||
|
@ -540,6 +556,8 @@ class Test {
|
||||||
"fabs",
|
"fabs",
|
||||||
"faddp",
|
"faddp",
|
||||||
"fchs",
|
"fchs",
|
||||||
|
"fclex",
|
||||||
|
"fnclex",
|
||||||
"fcom",
|
"fcom",
|
||||||
"fcomp",
|
"fcomp",
|
||||||
"fcompp",
|
"fcompp",
|
||||||
|
@ -579,15 +597,52 @@ class Test {
|
||||||
"fxtract",
|
"fxtract",
|
||||||
"fyl2x",
|
"fyl2x",
|
||||||
"fyl2xp1",
|
"fyl2xp1",
|
||||||
|
|
||||||
|
"monitorx",
|
||||||
|
"mwaitx",
|
||||||
|
"clzero",
|
||||||
};
|
};
|
||||||
for (size_t i = 0; i < NUM_OF_ARRAY(tbl); i++) {
|
for (size_t i = 0; i < NUM_OF_ARRAY(tbl); i++) {
|
||||||
put(tbl[i]);
|
put(tbl[i]);
|
||||||
}
|
}
|
||||||
|
{
|
||||||
|
const char memTbl[][16] = {
|
||||||
|
"clflush",
|
||||||
|
"clflushopt",
|
||||||
|
"fbld",
|
||||||
|
"fbstp",
|
||||||
|
"fldcw",
|
||||||
|
"fldenv",
|
||||||
|
"frstor",
|
||||||
|
"fsave",
|
||||||
|
"fnsave",
|
||||||
|
"fstcw",
|
||||||
|
"fnstcw",
|
||||||
|
"fstenv",
|
||||||
|
"fnstenv",
|
||||||
|
"fstsw",
|
||||||
|
"fnstsw",
|
||||||
|
"fxrstor",
|
||||||
|
};
|
||||||
|
for (size_t i = 0; i < NUM_OF_ARRAY(memTbl); i++) {
|
||||||
|
put(memTbl[i], MEM);
|
||||||
|
}
|
||||||
|
put("fstsw", AX);
|
||||||
|
put("fnstsw", AX);
|
||||||
|
}
|
||||||
|
|
||||||
put("bswap", REG32e);
|
put("bswap", REG32e);
|
||||||
put("lea", REG32e|REG16, MEM);
|
put("lea", REG32e|REG16, MEM);
|
||||||
put("fldcw", MEM);
|
put("enter", IMM, IMM);
|
||||||
put("fstcw", MEM);
|
put(isXbyak_ ? "int_" : "int", IMM8);
|
||||||
|
put(isXbyak_ ? "in_" : "in", AL|AX|EAX, IMM8);
|
||||||
|
puts(isXbyak_ ? "in_(al, dx); dump();" : "in al, dx");
|
||||||
|
puts(isXbyak_ ? "in_(ax, dx); dump();" : "in ax, dx");
|
||||||
|
puts(isXbyak_ ? "in_(eax, dx); dump();" : "in eax, dx");
|
||||||
|
put(isXbyak_ ? "out_" : "out", IMM8, AL|AX|EAX);
|
||||||
|
puts(isXbyak_ ? "out_(dx, al); dump();" : "out dx, al");
|
||||||
|
puts(isXbyak_ ? "out_(dx, ax); dump();" : "out dx, ax");
|
||||||
|
puts(isXbyak_ ? "out_(dx, eax); dump();" : "out dx, eax");
|
||||||
}
|
}
|
||||||
void putJmp() const
|
void putJmp() const
|
||||||
{
|
{
|
||||||
|
@ -803,7 +858,7 @@ class Test {
|
||||||
SD = 1 << 3
|
SD = 1 << 3
|
||||||
};
|
};
|
||||||
const struct {
|
const struct {
|
||||||
uint8 code;
|
uint8_t code;
|
||||||
const char *name;
|
const char *name;
|
||||||
} sufTbl[] = {
|
} sufTbl[] = {
|
||||||
{ 0, "ps" },
|
{ 0, "ps" },
|
||||||
|
@ -812,7 +867,7 @@ class Test {
|
||||||
{ 0xF2, "sd" },
|
{ 0xF2, "sd" },
|
||||||
};
|
};
|
||||||
static const struct XmmTbl1 {
|
static const struct XmmTbl1 {
|
||||||
uint8 code;
|
uint8_t code;
|
||||||
int mode;
|
int mode;
|
||||||
const char *name;
|
const char *name;
|
||||||
bool hasImm;
|
bool hasImm;
|
||||||
|
@ -841,7 +896,7 @@ class Test {
|
||||||
for (size_t j = 0; j < NUM_OF_ARRAY(sufTbl); j++) {
|
for (size_t j = 0; j < NUM_OF_ARRAY(sufTbl); j++) {
|
||||||
if (!(p->mode & (1 << j))) continue;
|
if (!(p->mode & (1 << j))) continue;
|
||||||
char buf[16];
|
char buf[16];
|
||||||
sprintf(buf, "%s%s", p->name, sufTbl[j].name);
|
snprintf(buf, sizeof(buf), "%s%s", p->name, sufTbl[j].name);
|
||||||
if (p->hasImm) {
|
if (p->hasImm) {
|
||||||
put(buf, XMM, XMM|MEM, IMM);
|
put(buf, XMM, XMM|MEM, IMM);
|
||||||
} else {
|
} else {
|
||||||
|
@ -891,8 +946,8 @@ class Test {
|
||||||
{
|
{
|
||||||
static const struct Tbl {
|
static const struct Tbl {
|
||||||
const char *name;
|
const char *name;
|
||||||
uint64 op1;
|
uint64_t op1;
|
||||||
uint64 op2;
|
uint64_t op2;
|
||||||
} tbl[] = {
|
} tbl[] = {
|
||||||
{ "cvtpi2ps", XMM, MMX|MEM },
|
{ "cvtpi2ps", XMM, MMX|MEM },
|
||||||
{ "cvtps2pi", MMX, XMM|MEM },
|
{ "cvtps2pi", MMX, XMM|MEM },
|
||||||
|
@ -928,7 +983,9 @@ class Test {
|
||||||
}
|
}
|
||||||
void putCmov() const
|
void putCmov() const
|
||||||
{
|
{
|
||||||
const char tbl[][4] = {
|
const struct {
|
||||||
|
const char *s;
|
||||||
|
} tbl[] = {
|
||||||
"o",
|
"o",
|
||||||
"no",
|
"no",
|
||||||
"b",
|
"b",
|
||||||
|
@ -961,12 +1018,12 @@ class Test {
|
||||||
"g",
|
"g",
|
||||||
};
|
};
|
||||||
for (size_t i = 0; i < NUM_OF_ARRAY(tbl); i++) {
|
for (size_t i = 0; i < NUM_OF_ARRAY(tbl); i++) {
|
||||||
char buf[16];
|
char buf[32];
|
||||||
sprintf(buf, "cmov%s", tbl[i]);
|
snprintf(buf, sizeof(buf), "cmov%s", tbl[i].s);
|
||||||
put(buf, REG16, REG16|MEM);
|
put(buf, REG16, REG16|MEM);
|
||||||
put(buf, REG32, REG32|MEM);
|
put(buf, REG32, REG32|MEM);
|
||||||
put(buf, REG64, REG64|MEM);
|
put(buf, REG64, REG64|MEM);
|
||||||
sprintf(buf, "set%s", tbl[i]);
|
snprintf(buf, sizeof(buf), "set%s", tbl[i].s);
|
||||||
put(buf, REG8|REG8_3|MEM);
|
put(buf, REG8|REG8_3|MEM);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1088,6 +1145,33 @@ class Test {
|
||||||
put("pop", REG32|MEM32);
|
put("pop", REG32|MEM32);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
void putPushPop8_16() const
|
||||||
|
{
|
||||||
|
const struct {
|
||||||
|
int b;
|
||||||
|
uint32_t v;
|
||||||
|
} tbl[] = {
|
||||||
|
{ 8, 0x7f },
|
||||||
|
{ 8, 0x80 },
|
||||||
|
{ 8, 0xff },
|
||||||
|
{ 8, 0x100 },
|
||||||
|
{ 8, 0x12345 },
|
||||||
|
{ 16, 0x7fff },
|
||||||
|
{ 16, 0x8000 },
|
||||||
|
{ 16, 0xffff },
|
||||||
|
{ 16, 0x10000 },
|
||||||
|
{ 16, 0x12345 },
|
||||||
|
};
|
||||||
|
for (size_t i = 0; i < NUM_OF_ARRAY(tbl); i++) {
|
||||||
|
const char *b = tbl[i].b == 8 ? "byte" : "word";
|
||||||
|
uint32_t v = tbl[i].v;
|
||||||
|
if (isXbyak_) {
|
||||||
|
printf("push(%s, 0x%x);dump();\n", b, v);
|
||||||
|
} else {
|
||||||
|
printf("push %s 0x%x\n", b, v);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
void putTest() const
|
void putTest() const
|
||||||
{
|
{
|
||||||
const char *p = "test";
|
const char *p = "test";
|
||||||
|
@ -1121,6 +1205,30 @@ class Test {
|
||||||
put("mov", REG64, tbl[i].a, tbl[i].b);
|
put("mov", REG64, tbl[i].a, tbl[i].b);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
void putLoadSeg() const
|
||||||
|
{
|
||||||
|
const struct Tbl {
|
||||||
|
const char *name;
|
||||||
|
bool support64Bit;
|
||||||
|
} tbl[] = {
|
||||||
|
#ifdef XBYAK32
|
||||||
|
{ "lds", false },
|
||||||
|
{ "les", false },
|
||||||
|
#endif
|
||||||
|
{ "lss", true },
|
||||||
|
{ "lfs", true },
|
||||||
|
{ "lgs", true },
|
||||||
|
};
|
||||||
|
for (size_t i = 0; i < NUM_OF_ARRAY(tbl); i++) {
|
||||||
|
const Tbl *p = &tbl[i];
|
||||||
|
put(p->name, REG16|REG32, MEM);
|
||||||
|
#ifdef XBYAK64
|
||||||
|
if (p->support64Bit) {
|
||||||
|
put(p->name, REG64, MEM);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
}
|
||||||
// only nasm
|
// only nasm
|
||||||
void putMovImm64() const
|
void putMovImm64() const
|
||||||
{
|
{
|
||||||
|
@ -1176,6 +1284,7 @@ class Test {
|
||||||
put("cmpxchg8b", MEM);
|
put("cmpxchg8b", MEM);
|
||||||
#ifdef XBYAK64
|
#ifdef XBYAK64
|
||||||
put("cmpxchg16b", MEM);
|
put("cmpxchg16b", MEM);
|
||||||
|
put("fxrstor64", MEM);
|
||||||
#endif
|
#endif
|
||||||
{
|
{
|
||||||
const char tbl[][8] = {
|
const char tbl[][8] = {
|
||||||
|
@ -1384,9 +1493,9 @@ class Test {
|
||||||
void putMPX() const
|
void putMPX() const
|
||||||
{
|
{
|
||||||
#ifdef XBYAK64
|
#ifdef XBYAK64
|
||||||
const uint64 reg = REG64;
|
const uint64_t reg = REG64;
|
||||||
#else
|
#else
|
||||||
const uint64 reg = REG32;
|
const uint64_t reg = REG32;
|
||||||
#endif
|
#endif
|
||||||
put("bndcl", BNDREG, reg|MEM);
|
put("bndcl", BNDREG, reg|MEM);
|
||||||
put("bndcu", BNDREG, reg|MEM);
|
put("bndcu", BNDREG, reg|MEM);
|
||||||
|
@ -2414,6 +2523,7 @@ public:
|
||||||
separateFunc();
|
separateFunc();
|
||||||
putSSE4_2();
|
putSSE4_2();
|
||||||
putSeg(); // same behavior as yasm for mov rax, cx
|
putSeg(); // same behavior as yasm for mov rax, cx
|
||||||
|
putPushPop8_16();
|
||||||
#else
|
#else
|
||||||
putSIMPLE();
|
putSIMPLE();
|
||||||
putReg1();
|
putReg1();
|
||||||
|
@ -2423,6 +2533,7 @@ public:
|
||||||
putPushPop();
|
putPushPop();
|
||||||
putTest();
|
putTest();
|
||||||
separateFunc();
|
separateFunc();
|
||||||
|
putLoadSeg();
|
||||||
putEtc();
|
putEtc();
|
||||||
putShift();
|
putShift();
|
||||||
putShxd();
|
putShxd();
|
||||||
|
@ -2447,7 +2558,6 @@ public:
|
||||||
putFpuMem32_64();
|
putFpuMem32_64();
|
||||||
separateFunc();
|
separateFunc();
|
||||||
putFpuMem16_32_64();
|
putFpuMem16_32_64();
|
||||||
put("clflush", MEM); // current nasm is ok
|
|
||||||
putFpu();
|
putFpu();
|
||||||
putFpuFpu();
|
putFpuFpu();
|
||||||
putCmp();
|
putCmp();
|
||||||
|
@ -2546,7 +2656,7 @@ public:
|
||||||
printf("vaddpd(%s%s%s, %s, %s%s); dump();\n", r1, pk, pz, r2, r3, saeTblXbyak[sae]);
|
printf("vaddpd(%s%s%s, %s, %s%s); dump();\n", r1, pk, pz, r2, r3, saeTblXbyak[sae]);
|
||||||
} else {
|
} else {
|
||||||
if (kIdx) CYBOZU_SNPRINTF(pk, sizeof(pk), "{k%d}", kIdx);
|
if (kIdx) CYBOZU_SNPRINTF(pk, sizeof(pk), "{k%d}", kIdx);
|
||||||
if (z) pz = "{z}";
|
if (z && kIdx) pz = "{z}";
|
||||||
printf("vaddpd %s%s%s, %s, %s%s\n", r1, pk, pz, r2, r3, saeTblNASM[sae]);
|
printf("vaddpd %s%s%s, %s, %s%s\n", r1, pk, pz, r2, r3, saeTblNASM[sae]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -2583,9 +2693,9 @@ public:
|
||||||
for (size_t k = 0; k < N; k++) {
|
for (size_t k = 0; k < N; k++) {
|
||||||
#ifdef XBYAK64
|
#ifdef XBYAK64
|
||||||
for (int kIdx = 0; kIdx < 8; kIdx++) {
|
for (int kIdx = 0; kIdx < 8; kIdx++) {
|
||||||
|
put_vaddpd(xTbl[i], xTbl[j], xTbl[k], kIdx);
|
||||||
|
put_vaddpd(yTbl[i], yTbl[j], yTbl[k], kIdx);
|
||||||
for (int z = 0; z < 2; z++) {
|
for (int z = 0; z < 2; z++) {
|
||||||
put_vaddpd(xTbl[i], xTbl[j], xTbl[k], kIdx, z == 1);
|
|
||||||
put_vaddpd(yTbl[i], yTbl[j], yTbl[k], kIdx, z == 1);
|
|
||||||
for (int sae = 0; sae < 5; sae++) {
|
for (int sae = 0; sae < 5; sae++) {
|
||||||
put_vaddpd(zTbl[i], zTbl[j], zTbl[k], kIdx, z == 1, sae);
|
put_vaddpd(zTbl[i], zTbl[j], zTbl[k], kIdx, z == 1, sae);
|
||||||
}
|
}
|
||||||
|
|
134
test/misc.cpp
134
test/misc.cpp
|
@ -97,13 +97,43 @@ CYBOZU_TEST_AUTO(align)
|
||||||
CYBOZU_TEST_EQUAL(size_t(getCurr()) % alignSize, 0u);
|
CYBOZU_TEST_EQUAL(size_t(getCurr()) % alignSize, 0u);
|
||||||
}
|
}
|
||||||
align(alignSize);
|
align(alignSize);
|
||||||
const uint8 *p = getCurr();
|
const uint8_t *p = getCurr();
|
||||||
// do nothing if aligned
|
// do nothing if aligned
|
||||||
align(alignSize);
|
align(alignSize);
|
||||||
CYBOZU_TEST_EQUAL(p, getCurr());
|
CYBOZU_TEST_EQUAL(p, getCurr());
|
||||||
}
|
}
|
||||||
} c;
|
} c;
|
||||||
}
|
}
|
||||||
|
CYBOZU_TEST_AUTO(kmask)
|
||||||
|
{
|
||||||
|
struct Code : Xbyak::CodeGenerator {
|
||||||
|
Code()
|
||||||
|
{
|
||||||
|
CYBOZU_TEST_EXCEPTION(kmovb(k1, ax), std::exception);
|
||||||
|
CYBOZU_TEST_EXCEPTION(kmovw(k1, ax), std::exception);
|
||||||
|
CYBOZU_TEST_EXCEPTION(kmovd(k1, ax), std::exception);
|
||||||
|
CYBOZU_TEST_EXCEPTION(kmovq(k1, eax), std::exception);
|
||||||
|
#ifdef XBYAK64
|
||||||
|
CYBOZU_TEST_EXCEPTION(kmovb(k1, rax), std::exception);
|
||||||
|
CYBOZU_TEST_EXCEPTION(kmovw(k1, rax), std::exception);
|
||||||
|
CYBOZU_TEST_EXCEPTION(kmovd(k1, rax), std::exception);
|
||||||
|
CYBOZU_TEST_NO_EXCEPTION(kmovq(k1, rax));
|
||||||
|
#endif
|
||||||
|
CYBOZU_TEST_NO_EXCEPTION(vmovaps(xm0|k0, ptr[eax]));
|
||||||
|
checkT_z();
|
||||||
|
}
|
||||||
|
void checkT_z()
|
||||||
|
{
|
||||||
|
const uint8_t *p1 = getCurr();
|
||||||
|
vmovaps(zm0, ptr[eax]);
|
||||||
|
const uint8_t *p2 = getCurr();
|
||||||
|
vmovaps(zm0|T_z, ptr[eax]);
|
||||||
|
const uint8_t *end = getCurr();
|
||||||
|
CYBOZU_TEST_EQUAL(p2 - p1, end - p2);
|
||||||
|
CYBOZU_TEST_EQUAL_ARRAY(p1, p2, end - p2);
|
||||||
|
}
|
||||||
|
} c;
|
||||||
|
}
|
||||||
|
|
||||||
#ifdef XBYAK64
|
#ifdef XBYAK64
|
||||||
CYBOZU_TEST_AUTO(vfmaddps)
|
CYBOZU_TEST_AUTO(vfmaddps)
|
||||||
|
@ -683,4 +713,106 @@ CYBOZU_TEST_AUTO(gf2)
|
||||||
CYBOZU_TEST_EQUAL(c.getSize(), n);
|
CYBOZU_TEST_EQUAL(c.getSize(), n);
|
||||||
CYBOZU_TEST_EQUAL_ARRAY(c.getCode(), tbl, n);
|
CYBOZU_TEST_EQUAL_ARRAY(c.getCode(), tbl, n);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
CYBOZU_TEST_AUTO(bf16)
|
||||||
|
{
|
||||||
|
struct Code : Xbyak::CodeGenerator {
|
||||||
|
Code()
|
||||||
|
{
|
||||||
|
vcvtne2ps2bf16(xmm0 | k1, xmm1, ptr [rax + 64]);
|
||||||
|
vcvtne2ps2bf16(ymm0 | k1 | T_z, ymm0, ptr [rax + 64]);
|
||||||
|
vcvtne2ps2bf16(zmm0 | k1, zmm1, ptr [rax + 64]);
|
||||||
|
|
||||||
|
vcvtneps2bf16(xmm0, xword [rax + 64]);
|
||||||
|
vcvtneps2bf16(xmm0 | k1, yword [rax + 64]);
|
||||||
|
vcvtneps2bf16(ymm0 | k1, zword [rax + 64]);
|
||||||
|
vcvtneps2bf16(ymm0 | k1, ptr [rax + 64]);
|
||||||
|
|
||||||
|
vdpbf16ps(xmm0 | k1, xmm1, ptr [rax + 64]);
|
||||||
|
vdpbf16ps(ymm0 | k1, ymm1, ptr [rax + 64]);
|
||||||
|
vdpbf16ps(zmm0 | k1, zmm1, ptr [rax + 64]);
|
||||||
|
}
|
||||||
|
} c;
|
||||||
|
const uint8_t tbl[] = {
|
||||||
|
0x62, 0xf2, 0x77, 0x09, 0x72, 0x40, 0x04,
|
||||||
|
0x62, 0xf2, 0x7f, 0xa9, 0x72, 0x40, 0x02,
|
||||||
|
0x62, 0xf2, 0x77, 0x49, 0x72, 0x40, 0x01,
|
||||||
|
|
||||||
|
0x62, 0xf2, 0x7e, 0x08, 0x72, 0x40, 0x04,
|
||||||
|
0x62, 0xf2, 0x7e, 0x29, 0x72, 0x40, 0x02,
|
||||||
|
0x62, 0xf2, 0x7e, 0x49, 0x72, 0x40, 0x01,
|
||||||
|
0x62, 0xf2, 0x7e, 0x49, 0x72, 0x40, 0x01,
|
||||||
|
|
||||||
|
0x62, 0xf2, 0x76, 0x09, 0x52, 0x40, 0x04,
|
||||||
|
0x62, 0xf2, 0x76, 0x29, 0x52, 0x40, 0x02,
|
||||||
|
0x62, 0xf2, 0x76, 0x49, 0x52, 0x40, 0x01,
|
||||||
|
};
|
||||||
|
const size_t n = sizeof(tbl) / sizeof(tbl[0]);
|
||||||
|
CYBOZU_TEST_EQUAL(c.getSize(), n);
|
||||||
|
CYBOZU_TEST_EQUAL_ARRAY(c.getCode(), tbl, n);
|
||||||
|
}
|
||||||
|
|
||||||
|
CYBOZU_TEST_AUTO(AMX)
|
||||||
|
{
|
||||||
|
struct Code : Xbyak::CodeGenerator {
|
||||||
|
Code()
|
||||||
|
{
|
||||||
|
ldtilecfg(ptr[rax + rcx * 4 + 64]);
|
||||||
|
sttilecfg(ptr[rsp + rax * 8 + 128]);
|
||||||
|
tileloadd(tmm3, ptr[rdi + rdx * 2 + 8]);
|
||||||
|
tileloaddt1(tmm4, ptr[r8 + r9 + 32]);
|
||||||
|
tilerelease();
|
||||||
|
tilestored(ptr[r10 + r11 * 2 + 32], tmm2);
|
||||||
|
tilezero(tmm7);
|
||||||
|
tdpbssd(tmm1, tmm2, tmm3);
|
||||||
|
tdpbsud(tmm2, tmm3, tmm4);
|
||||||
|
tdpbusd(tmm3, tmm4, tmm5);
|
||||||
|
tdpbuud(tmm4, tmm5, tmm6);
|
||||||
|
tdpbf16ps(tmm5, tmm6, tmm7);
|
||||||
|
}
|
||||||
|
} c;
|
||||||
|
// generated code by patch
|
||||||
|
const uint8_t tbl[] = {
|
||||||
|
0xc4, 0xe2, 0x78, 0x49, 0x44, 0x88, 0x40, 0xc4, 0xe2, 0x79, 0x49, 0x84, 0xc4, 0x80, 0x00, 0x00,
|
||||||
|
0x00, 0xc4, 0xe2, 0x7b, 0x4b, 0x5c, 0x57, 0x08, 0xc4, 0x82, 0x79, 0x4b, 0x64, 0x08, 0x20, 0xc4,
|
||||||
|
0xe2, 0x78, 0x49, 0xc0, 0xc4, 0x82, 0x7a, 0x4b, 0x54, 0x5a, 0x20, 0xc4, 0xe2, 0x7b, 0x49, 0xf8,
|
||||||
|
0xc4, 0xe2, 0x63, 0x5e, 0xca, 0xc4, 0xe2, 0x5a, 0x5e, 0xd3, 0xc4, 0xe2, 0x51, 0x5e, 0xdc, 0xc4,
|
||||||
|
0xe2, 0x48, 0x5e, 0xe5, 0xc4, 0xe2, 0x42, 0x5c, 0xee,
|
||||||
|
};
|
||||||
|
const size_t n = sizeof(tbl) / sizeof(tbl[0]);
|
||||||
|
CYBOZU_TEST_EQUAL(c.getSize(), n);
|
||||||
|
CYBOZU_TEST_EQUAL_ARRAY(c.getCode(), tbl, n);
|
||||||
|
}
|
||||||
|
|
||||||
|
CYBOZU_TEST_AUTO(tileloadd)
|
||||||
|
{
|
||||||
|
struct Code : Xbyak::CodeGenerator {
|
||||||
|
Code()
|
||||||
|
{
|
||||||
|
tileloadd(tmm1, ptr[r8+r8]);
|
||||||
|
tileloadd(tmm1, ptr[rax+rcx*4]);
|
||||||
|
tileloadd(tmm1, ptr[r8+r9*1+0x40]);
|
||||||
|
}
|
||||||
|
void notSupported()
|
||||||
|
{
|
||||||
|
tileloadd(tmm1, ptr[r8]);
|
||||||
|
}
|
||||||
|
void notSupported2()
|
||||||
|
{
|
||||||
|
tileloadd(tmm1, ptr[r8*2]);
|
||||||
|
}
|
||||||
|
} c;
|
||||||
|
const uint8_t tbl[] = {
|
||||||
|
0xC4, 0x82, 0x7B, 0x4B, 0x0C, 0x00,
|
||||||
|
0xC4, 0xE2, 0x7B, 0x4B, 0x0C, 0x88,
|
||||||
|
0xC4, 0x82, 0x7B, 0x4B, 0x4C, 0x08, 0x40,
|
||||||
|
};
|
||||||
|
const size_t n = sizeof(tbl) / sizeof(tbl[0]);
|
||||||
|
CYBOZU_TEST_EQUAL(c.getSize(), n);
|
||||||
|
CYBOZU_TEST_EQUAL_ARRAY(c.getCode(), tbl, n);
|
||||||
|
|
||||||
|
// current version does not support this sibmem format
|
||||||
|
CYBOZU_TEST_EXCEPTION(c.notSupported(), std::exception);
|
||||||
|
CYBOZU_TEST_EXCEPTION(c.notSupported2(), std::exception);
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -1,7 +1,8 @@
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#define XBYAK_NO_OP_NAMES
|
|
||||||
#define XBYAK_ENABLE_OMITTED_OPERAND
|
#define XBYAK_ENABLE_OMITTED_OPERAND
|
||||||
#include "xbyak/xbyak.h"
|
#include "xbyak/xbyak.h"
|
||||||
|
#define CYBOZU_TEST_DISABLE_AUTO_RUN
|
||||||
|
#include "cybozu/test.hpp"
|
||||||
|
|
||||||
using namespace Xbyak;
|
using namespace Xbyak;
|
||||||
|
|
||||||
|
@ -15,39 +16,27 @@ public:
|
||||||
#include "nm.cpp"
|
#include "nm.cpp"
|
||||||
};
|
};
|
||||||
|
|
||||||
#define _STR(x) #x
|
|
||||||
#define TEST(syntax) err = true; try { syntax; err = false; } catch (Xbyak::Error) { } catch (...) { } if (!err) printf("should be err:%s;\n", _STR(syntax))
|
|
||||||
|
|
||||||
class ErrorSample : public CodeGenerator {
|
class ErrorSample : public CodeGenerator {
|
||||||
void operator=(const ErrorSample&);
|
void operator=(const ErrorSample&);
|
||||||
public:
|
public:
|
||||||
void gen()
|
void gen()
|
||||||
{
|
{
|
||||||
bool err;
|
#ifndef XBYAK_NO_EXCEPTION
|
||||||
TEST(mov(ptr[eax],1));
|
CYBOZU_TEST_EXCEPTION(mov(ptr[eax],1), std::exception);
|
||||||
TEST(test(ptr[eax],1));
|
CYBOZU_TEST_EXCEPTION(test(ptr[eax],1), std::exception);
|
||||||
TEST(adc(ptr[eax],1));
|
CYBOZU_TEST_EXCEPTION(adc(ptr[eax],1), std::exception);
|
||||||
TEST(setz(eax));
|
CYBOZU_TEST_EXCEPTION(setz(eax), std::exception);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
int main()
|
int main()
|
||||||
try
|
|
||||||
{
|
{
|
||||||
size_t size = sizeof(Xbyak::Operand);
|
// the size of Operand exceeds 32 bit.
|
||||||
if (size != 4) {
|
CYBOZU_TEST_EQUAL(sizeof(Xbyak::Operand), 8u);
|
||||||
printf("sizeof Operand %d\n", (int)size);
|
|
||||||
}
|
|
||||||
try {
|
|
||||||
Sample s;
|
Sample s;
|
||||||
s.gen();
|
s.gen();
|
||||||
} catch (std::exception& e) {
|
|
||||||
printf("ERR:%s\n", e.what());
|
|
||||||
} catch (...) {
|
|
||||||
printf("unknown error\n");
|
|
||||||
}
|
|
||||||
ErrorSample es;
|
ErrorSample es;
|
||||||
es.gen();
|
es.gen();
|
||||||
} catch (std::exception& e) {
|
|
||||||
printf("err %s\n", e.what());
|
|
||||||
return 1;
|
|
||||||
}
|
}
|
||||||
|
|
111
test/noexception.cpp
Normal file
111
test/noexception.cpp
Normal file
|
@ -0,0 +1,111 @@
|
||||||
|
#define XBYAK_NO_EXCEPTION
|
||||||
|
#include <xbyak/xbyak.h>
|
||||||
|
|
||||||
|
using namespace Xbyak;
|
||||||
|
|
||||||
|
int g_err = 0;
|
||||||
|
int g_test = 0;
|
||||||
|
|
||||||
|
void assertEq(int x, int y)
|
||||||
|
{
|
||||||
|
if (x != y) {
|
||||||
|
printf("ERR x=%d y=%d\n", x, y);
|
||||||
|
g_err++;
|
||||||
|
}
|
||||||
|
g_test++;
|
||||||
|
}
|
||||||
|
|
||||||
|
void assertBool(bool b)
|
||||||
|
{
|
||||||
|
if (!b) {
|
||||||
|
printf("ERR assertBool\n");
|
||||||
|
g_err++;
|
||||||
|
}
|
||||||
|
g_test++;
|
||||||
|
}
|
||||||
|
|
||||||
|
void test1()
|
||||||
|
{
|
||||||
|
const int v = 123;
|
||||||
|
struct Code : CodeGenerator {
|
||||||
|
Code()
|
||||||
|
{
|
||||||
|
mov(eax, v);
|
||||||
|
ret();
|
||||||
|
}
|
||||||
|
} c;
|
||||||
|
int (*f)() = c.getCode<int (*)()>();
|
||||||
|
assertEq(f(), v);
|
||||||
|
assertEq(Xbyak::GetError(), ERR_NONE);
|
||||||
|
}
|
||||||
|
|
||||||
|
void test2()
|
||||||
|
{
|
||||||
|
struct Code : CodeGenerator {
|
||||||
|
Code()
|
||||||
|
{
|
||||||
|
Label lp;
|
||||||
|
L(lp);
|
||||||
|
L(lp);
|
||||||
|
}
|
||||||
|
} c;
|
||||||
|
assertEq(Xbyak::GetError(), ERR_LABEL_IS_REDEFINED);
|
||||||
|
Xbyak::ClearError();
|
||||||
|
}
|
||||||
|
|
||||||
|
void test3()
|
||||||
|
{
|
||||||
|
static struct EmptyAllocator : Xbyak::Allocator {
|
||||||
|
uint8_t *alloc() { return 0; }
|
||||||
|
} emptyAllocator;
|
||||||
|
struct Code : CodeGenerator {
|
||||||
|
Code() : CodeGenerator(8, 0, &emptyAllocator)
|
||||||
|
{
|
||||||
|
mov(eax, 3);
|
||||||
|
assertBool(Xbyak::GetError() == 0);
|
||||||
|
mov(eax, 3);
|
||||||
|
mov(eax, 3);
|
||||||
|
assertBool(Xbyak::GetError() != 0);
|
||||||
|
Xbyak::ClearError();
|
||||||
|
assertBool(Xbyak::GetError() == 0);
|
||||||
|
}
|
||||||
|
} c;
|
||||||
|
}
|
||||||
|
|
||||||
|
void test4()
|
||||||
|
{
|
||||||
|
struct Code : CodeGenerator {
|
||||||
|
Code()
|
||||||
|
{
|
||||||
|
mov(ptr[eax], 1);
|
||||||
|
assertBool(Xbyak::GetError() != 0);
|
||||||
|
Xbyak::ClearError();
|
||||||
|
|
||||||
|
test(ptr[eax], 1);
|
||||||
|
assertBool(Xbyak::GetError() != 0);
|
||||||
|
Xbyak::ClearError();
|
||||||
|
|
||||||
|
adc(ptr[eax], 1);
|
||||||
|
assertBool(Xbyak::GetError() != 0);
|
||||||
|
Xbyak::ClearError();
|
||||||
|
|
||||||
|
setz(eax);
|
||||||
|
assertBool(Xbyak::GetError() != 0);
|
||||||
|
Xbyak::ClearError();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
int main()
|
||||||
|
{
|
||||||
|
test1();
|
||||||
|
test2();
|
||||||
|
test3();
|
||||||
|
test4();
|
||||||
|
if (g_err) {
|
||||||
|
printf("err %d/%d\n", g_err, g_test);
|
||||||
|
} else {
|
||||||
|
printf("all ok %d\n", g_test);
|
||||||
|
}
|
||||||
|
return g_err != 0;
|
||||||
|
}
|
|
@ -6,7 +6,7 @@
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
#include <memory.h>
|
#include <memory.h>
|
||||||
|
|
||||||
typedef unsigned char uint8;
|
typedef unsigned char uint8_t;
|
||||||
|
|
||||||
std::string normalize(const std::string& line)
|
std::string normalize(const std::string& line)
|
||||||
{
|
{
|
||||||
|
|
2
test/set_opt.bat
Normal file
2
test/set_opt.bat
Normal file
|
@ -0,0 +1,2 @@
|
||||||
|
@echo off
|
||||||
|
set OPT=/EHsc -I../xbyak -I./ /W4 -D_CRT_SECURE_NO_WARNINGS /nologo
|
|
@ -218,7 +218,7 @@ void check(int x, int y)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void verify(const Xbyak::uint8 *f, int pNum)
|
void verify(const Xbyak::uint8_t *f, int pNum)
|
||||||
{
|
{
|
||||||
switch (pNum) {
|
switch (pNum) {
|
||||||
case 0:
|
case 0:
|
||||||
|
@ -264,7 +264,7 @@ void testAll()
|
||||||
}
|
}
|
||||||
for (int tNum = 0; tNum < maxNum; tNum++) {
|
for (int tNum = 0; tNum < maxNum; tNum++) {
|
||||||
// printf("pNum=%d, tNum=%d, stackSize=%d\n", pNum, tNum | opt, stackSize);
|
// printf("pNum=%d, tNum=%d, stackSize=%d\n", pNum, tNum | opt, stackSize);
|
||||||
const Xbyak::uint8 *f = code.getCurr();
|
const Xbyak::uint8_t *f = code.getCurr();
|
||||||
code.gen(pNum, tNum | opt, stackSize);
|
code.gen(pNum, tNum | opt, stackSize);
|
||||||
verify(f, pNum);
|
verify(f, pNum);
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -20,7 +20,6 @@ echo "compile nm_frame.cpp"
|
||||||
g++ $CFLAGS -DXBYAK_TEST nm_frame.cpp -o nm_frame
|
g++ $CFLAGS -DXBYAK_TEST nm_frame.cpp -o nm_frame
|
||||||
./nm_frame > x.lst
|
./nm_frame > x.lst
|
||||||
diff ok.lst x.lst && echo "ok"
|
diff ok.lst x.lst && echo "ok"
|
||||||
wc x.lst
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -33,12 +33,11 @@ g++ $CFLAGS make_nm.cpp -o make_nm
|
||||||
./make_nm > a.asm
|
./make_nm > a.asm
|
||||||
echo "asm"
|
echo "asm"
|
||||||
$EXE -f$OPT3 a.asm -l a.lst
|
$EXE -f$OPT3 a.asm -l a.lst
|
||||||
awk '{if (index($3, "-")) { conti=substr($3, 0, length($3) - 1) } else { conti = conti $3; print conti; conti = "" }} ' < a.lst | $FILTER > ok.lst
|
awk '{if (index($3, "-")) { conti=substr($3, 0, length($3) - 1) } else { conti = conti $3; print conti; conti = "" }} ' < a.lst | $FILTER | grep -v "1+1" > ok.lst
|
||||||
|
|
||||||
echo "xbyak"
|
echo "xbyak"
|
||||||
./make_nm jit > nm.cpp
|
./make_nm jit > nm.cpp
|
||||||
echo "compile nm_frame.cpp"
|
echo "compile nm_frame.cpp"
|
||||||
g++ $CFLAGS -DXBYAK_TEST nm_frame.cpp -o nm_frame
|
g++ $CFLAGS -DXBYAK_TEST nm_frame.cpp -o nm_frame
|
||||||
./nm_frame | $FILTER > x.lst
|
./nm_frame | $FILTER > x.lst
|
||||||
diff ok.lst x.lst && echo "ok"
|
diff -B ok.lst x.lst && echo "ok"
|
||||||
exit 0
|
|
||||||
|
|
|
@ -29,5 +29,4 @@ echo "xbyak"
|
||||||
echo "compile nm_frame.cpp"
|
echo "compile nm_frame.cpp"
|
||||||
g++ $CFLAGS -DXBYAK_TEST nm_frame.cpp -o nm_frame -DXBYAK_AVX512
|
g++ $CFLAGS -DXBYAK_TEST nm_frame.cpp -o nm_frame -DXBYAK_AVX512
|
||||||
./nm_frame | $FILTER > x.lst
|
./nm_frame | $FILTER > x.lst
|
||||||
diff ok.lst x.lst && echo "ok"
|
diff -B ok.lst x.lst && echo "ok"
|
||||||
exit 0
|
|
||||||
|
|
|
@ -7,3 +7,7 @@ echo ** yasm-avx(32bit) ***
|
||||||
call test_avx Y
|
call test_avx Y
|
||||||
echo ** yasm-avx(64bit) ***
|
echo ** yasm-avx(64bit) ***
|
||||||
call test_avx Y64
|
call test_avx Y64
|
||||||
|
echo ** nasm-avx512(32bit) ***
|
||||||
|
call test_avx512
|
||||||
|
echo ** nasm-avx512(64bit) ***
|
||||||
|
call test_avx512 64
|
||||||
|
|
|
@ -17,6 +17,10 @@ if /i "%1"=="Y" (
|
||||||
set OPT2=-DUSE_YASM -DXBYAK64
|
set OPT2=-DUSE_YASM -DXBYAK64
|
||||||
set OPT3=win64
|
set OPT3=win64
|
||||||
set FILTER=normalize_prefix
|
set FILTER=normalize_prefix
|
||||||
|
) else if /i "%1"=="noexcept" (
|
||||||
|
set EXE=nasm.exe
|
||||||
|
set OPT2=-DXBYAK32 -DXBYAK_NO_EXCEPTION
|
||||||
|
set OPT3=win32
|
||||||
) else (
|
) else (
|
||||||
set EXE=nasm.exe
|
set EXE=nasm.exe
|
||||||
set OPT2=-DXBYAK32
|
set OPT2=-DXBYAK32
|
||||||
|
@ -27,7 +31,7 @@ bmake -f Makefile.win all
|
||||||
echo cl -I../ make_nm.cpp %OPT% %OPT2% /EHs
|
echo cl -I../ make_nm.cpp %OPT% %OPT2% /EHs
|
||||||
cl -I../ make_nm.cpp %OPT% %OPT2% /EHs
|
cl -I../ make_nm.cpp %OPT% %OPT2% /EHs
|
||||||
make_nm > a.asm
|
make_nm > a.asm
|
||||||
rm a.lst
|
rm -rf a.lst
|
||||||
echo %EXE% -f %OPT3% -l a.lst a.asm
|
echo %EXE% -f %OPT3% -l a.lst a.asm
|
||||||
%EXE% -f %OPT3% -l a.lst a.asm
|
%EXE% -f %OPT3% -l a.lst a.asm
|
||||||
rem connect "?????-" and "??"
|
rem connect "?????-" and "??"
|
||||||
|
@ -39,5 +43,4 @@ if /i "%Y%"=="1" (
|
||||||
make_nm jit > nm.cpp
|
make_nm jit > nm.cpp
|
||||||
cl -I../ -DXBYAK_TEST nm_frame.cpp %OPT% %OPT2%
|
cl -I../ -DXBYAK_TEST nm_frame.cpp %OPT% %OPT2%
|
||||||
nm_frame |%FILTER% > x.lst
|
nm_frame |%FILTER% > x.lst
|
||||||
diff -w x.lst ok.lst
|
diff -wb x.lst ok.lst && echo "ok"
|
||||||
wc x.lst
|
|
||||||
|
|
|
@ -25,6 +25,11 @@ else if ($1 == "avx512") then
|
||||||
set OPT2="-DXBYAK64 -DUSE_AVX512"
|
set OPT2="-DXBYAK64 -DUSE_AVX512"
|
||||||
set OPT3=win64
|
set OPT3=win64
|
||||||
set FILTER=./normalize_prefix
|
set FILTER=./normalize_prefix
|
||||||
|
else if ($1 == "noexcept") then
|
||||||
|
echo "nasm(32bit) without exception"
|
||||||
|
set EXE=nasm
|
||||||
|
set OPT2="-DXBYAK32 -DXBYAK_NO_EXCEPTION"
|
||||||
|
set OPT3=win32
|
||||||
else
|
else
|
||||||
echo "nasm(32bit)"
|
echo "nasm(32bit)"
|
||||||
set EXE=nasm
|
set EXE=nasm
|
||||||
|
@ -33,18 +38,17 @@ else
|
||||||
endif
|
endif
|
||||||
|
|
||||||
set CFLAGS="-Wall -fno-operator-names -I../ $OPT2"
|
set CFLAGS="-Wall -fno-operator-names -I../ $OPT2"
|
||||||
echo "compile make_nm.cpp"
|
echo "compile make_nm.cpp with $CFLAGS"
|
||||||
g++ $CFLAGS make_nm.cpp -o make_nm
|
g++ $CFLAGS make_nm.cpp -o make_nm
|
||||||
|
|
||||||
./make_nm > a.asm
|
./make_nm > a.asm
|
||||||
echo "asm"
|
echo "asm"
|
||||||
$EXE -f$OPT3 a.asm -l a.lst
|
$EXE -f$OPT3 a.asm -l a.lst
|
||||||
awk '{if (index($3, "-")) { conti=substr($3, 0, length($3) - 1) } else { conti = conti $3; print conti; conti = "" }} ' < a.lst | $FILTER > ok.lst
|
awk '{if (index($3, "-")) { conti=substr($3, 0, length($3) - 1) } else { conti = conti $3; print conti; conti = "" }} ' < a.lst | $FILTER | grep -v "1+1" > ok.lst
|
||||||
|
|
||||||
echo "xbyak"
|
echo "xbyak"
|
||||||
./make_nm jit > nm.cpp
|
./make_nm jit > nm.cpp
|
||||||
echo "compile nm_frame.cpp"
|
echo "compile nm_frame.cpp"
|
||||||
g++ $CFLAGS -DXBYAK_TEST nm_frame.cpp -o nm_frame
|
g++ $CFLAGS -DXBYAK_TEST nm_frame.cpp -o nm_frame
|
||||||
./nm_frame | $FILTER > x.lst
|
./nm_frame | $FILTER > x.lst
|
||||||
diff ok.lst x.lst && echo "ok"
|
diff -B ok.lst x.lst && echo "ok"
|
||||||
exit 0
|
|
||||||
|
|
24
xbyak.sln
24
xbyak.sln
|
@ -1,19 +1,20 @@
|
||||||
ţ˝Žż
|
Microsoft Visual Studio Solution File, Format Version 12.00
|
||||||
Microsoft Visual Studio Solution File, Format Version 10.00
|
# Visual Studio 15
|
||||||
# Visual Studio 2008
|
VisualStudioVersion = 15.0.28010.2016
|
||||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "bf", "sample\bf.vcproj", "{654BD79B-59D3-4B10-BBAA-158BAB272828}"
|
MinimumVisualStudioVersion = 10.0.40219.1
|
||||||
|
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "bf", "sample\bf.vcxproj", "{654BD79B-59D3-4B10-BBAA-158BAB272828}"
|
||||||
EndProject
|
EndProject
|
||||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "calc", "sample\calc.vcproj", "{5FDDFAA6-B947-491D-A17E-BBD863846579}"
|
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "calc", "sample\calc.vcxproj", "{5FDDFAA6-B947-491D-A17E-BBD863846579}"
|
||||||
EndProject
|
EndProject
|
||||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "quantize", "sample\quantize.vcproj", "{D06753BF-E1F3-4578-9B18-08673327F77C}"
|
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "quantize", "sample\quantize.vcxproj", "{D06753BF-E1F3-4578-9B18-08673327F77C}"
|
||||||
EndProject
|
EndProject
|
||||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "test0", "sample\test0.vcproj", "{1CDE4D2A-BE3A-4B9B-B28F-524A23084A8E}"
|
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "test0", "sample\test0.vcxproj", "{1CDE4D2A-BE3A-4B9B-B28F-524A23084A8E}"
|
||||||
EndProject
|
EndProject
|
||||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "toyvm", "sample\toyvm.vcproj", "{2E41C7AF-39FF-454C-B081-37445378DCB3}"
|
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "toyvm", "sample\toyvm.vcxproj", "{2E41C7AF-39FF-454C-B081-37445378DCB3}"
|
||||||
EndProject
|
EndProject
|
||||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "test_util", "sample\test_util.vcproj", "{CFC9B272-FDA1-4C87-B4EF-CDCA9B57F4DD}"
|
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "test_util", "sample\test_util.vcxproj", "{CFC9B272-FDA1-4C87-B4EF-CDCA9B57F4DD}"
|
||||||
EndProject
|
EndProject
|
||||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "calc2", "sample\calc2.vcproj", "{8EC11C7F-1B5C-4787-8940-B9B3AAF1D204}"
|
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "calc2", "sample\calc2.vcxproj", "{8EC11C7F-1B5C-4787-8940-B9B3AAF1D204}"
|
||||||
EndProject
|
EndProject
|
||||||
Global
|
Global
|
||||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||||
|
@ -83,4 +84,7 @@ Global
|
||||||
GlobalSection(SolutionProperties) = preSolution
|
GlobalSection(SolutionProperties) = preSolution
|
||||||
HideSolutionNode = FALSE
|
HideSolutionNode = FALSE
|
||||||
EndGlobalSection
|
EndGlobalSection
|
||||||
|
GlobalSection(ExtensibilityGlobals) = postSolution
|
||||||
|
SolutionGuid = {DAE0012B-DDCC-4614-9110-D52E351B2A80}
|
||||||
|
EndGlobalSection
|
||||||
EndGlobal
|
EndGlobal
|
||||||
|
|
818
xbyak/xbyak.h
818
xbyak/xbyak.h
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
|
@ -1,6 +1,18 @@
|
||||||
#ifndef XBYAK_XBYAK_UTIL_H_
|
#ifndef XBYAK_XBYAK_UTIL_H_
|
||||||
#define XBYAK_XBYAK_UTIL_H_
|
#define XBYAK_XBYAK_UTIL_H_
|
||||||
|
|
||||||
|
#ifdef XBYAK_ONLY_CLASS_CPU
|
||||||
|
#include <stdint.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <algorithm>
|
||||||
|
#include <assert.h>
|
||||||
|
#ifndef XBYAK_THROW
|
||||||
|
#define XBYAK_THROW(x) ;
|
||||||
|
#define XBYAK_THROW_RET(x, y) return y;
|
||||||
|
#endif
|
||||||
|
#else
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
/**
|
/**
|
||||||
utility class and functions for Xbyak
|
utility class and functions for Xbyak
|
||||||
Xbyak::util::Clock ; rdtsc timer
|
Xbyak::util::Clock ; rdtsc timer
|
||||||
|
@ -8,6 +20,7 @@
|
||||||
@note this header is UNDER CONSTRUCTION!
|
@note this header is UNDER CONSTRUCTION!
|
||||||
*/
|
*/
|
||||||
#include "xbyak.h"
|
#include "xbyak.h"
|
||||||
|
#endif // XBYAK_ONLY_CLASS_CPU
|
||||||
|
|
||||||
#if defined(__i386__) || defined(__x86_64__) || defined(_M_IX86) || defined(_M_X64)
|
#if defined(__i386__) || defined(__x86_64__) || defined(_M_IX86) || defined(_M_X64)
|
||||||
#define XBYAK_INTEL_CPU_SPECIFIC
|
#define XBYAK_INTEL_CPU_SPECIFIC
|
||||||
|
@ -54,6 +67,20 @@
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef XBYAK_USE_VTUNE
|
||||||
|
// -I /opt/intel/vtune_amplifier/include/ -L /opt/intel/vtune_amplifier/lib64 -ljitprofiling -ldl
|
||||||
|
#include <jitprofiling.h>
|
||||||
|
#ifdef _MSC_VER
|
||||||
|
#pragma comment(lib, "libittnotify.lib")
|
||||||
|
#endif
|
||||||
|
#ifdef __linux__
|
||||||
|
#include <dlfcn.h>
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
#ifdef __linux__
|
||||||
|
#define XBYAK_USE_PERF
|
||||||
|
#endif
|
||||||
|
|
||||||
namespace Xbyak { namespace util {
|
namespace Xbyak { namespace util {
|
||||||
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
|
@ -65,7 +92,7 @@ typedef enum {
|
||||||
CPU detection class
|
CPU detection class
|
||||||
*/
|
*/
|
||||||
class Cpu {
|
class Cpu {
|
||||||
uint64 type_;
|
uint64_t type_;
|
||||||
//system topology
|
//system topology
|
||||||
bool x2APIC_supported_;
|
bool x2APIC_supported_;
|
||||||
static const size_t maxTopologyLevels = 2;
|
static const size_t maxTopologyLevels = 2;
|
||||||
|
@ -132,6 +159,11 @@ class Cpu {
|
||||||
numCores_[level - 1] = extractBit(data[1], 0, 15);
|
numCores_[level - 1] = extractBit(data[1], 0, 15);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
/*
|
||||||
|
Fallback values in case a hypervisor has 0xB leaf zeroed-out.
|
||||||
|
*/
|
||||||
|
numCores_[SmtLevel - 1] = (std::max)(1u, numCores_[SmtLevel - 1]);
|
||||||
|
numCores_[CoreLevel - 1] = (std::max)(numCores_[SmtLevel - 1], numCores_[CoreLevel - 1]);
|
||||||
} else {
|
} else {
|
||||||
/*
|
/*
|
||||||
Failed to deremine num of cores without x2APIC support.
|
Failed to deremine num of cores without x2APIC support.
|
||||||
|
@ -199,24 +231,24 @@ public:
|
||||||
int displayFamily; // family + extFamily
|
int displayFamily; // family + extFamily
|
||||||
int displayModel; // model + extModel
|
int displayModel; // model + extModel
|
||||||
|
|
||||||
unsigned int getNumCores(IntelCpuTopologyLevel level) {
|
unsigned int getNumCores(IntelCpuTopologyLevel level) const {
|
||||||
if (!x2APIC_supported_) throw Error(ERR_X2APIC_IS_NOT_SUPPORTED);
|
if (!x2APIC_supported_) XBYAK_THROW_RET(ERR_X2APIC_IS_NOT_SUPPORTED, 0)
|
||||||
switch (level) {
|
switch (level) {
|
||||||
case SmtLevel: return numCores_[level - 1];
|
case SmtLevel: return numCores_[level - 1];
|
||||||
case CoreLevel: return numCores_[level - 1] / numCores_[SmtLevel - 1];
|
case CoreLevel: return numCores_[level - 1] / numCores_[SmtLevel - 1];
|
||||||
default: throw Error(ERR_X2APIC_IS_NOT_SUPPORTED);
|
default: XBYAK_THROW_RET(ERR_X2APIC_IS_NOT_SUPPORTED, 0)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
unsigned int getDataCacheLevels() const { return dataCacheLevels_; }
|
unsigned int getDataCacheLevels() const { return dataCacheLevels_; }
|
||||||
unsigned int getCoresSharingDataCache(unsigned int i) const
|
unsigned int getCoresSharingDataCache(unsigned int i) const
|
||||||
{
|
{
|
||||||
if (i >= dataCacheLevels_) throw Error(ERR_BAD_PARAMETER);
|
if (i >= dataCacheLevels_) XBYAK_THROW_RET(ERR_BAD_PARAMETER, 0)
|
||||||
return coresSharignDataCache_[i];
|
return coresSharignDataCache_[i];
|
||||||
}
|
}
|
||||||
unsigned int getDataCacheSize(unsigned int i) const
|
unsigned int getDataCacheSize(unsigned int i) const
|
||||||
{
|
{
|
||||||
if (i >= dataCacheLevels_) throw Error(ERR_BAD_PARAMETER);
|
if (i >= dataCacheLevels_) XBYAK_THROW_RET(ERR_BAD_PARAMETER, 0)
|
||||||
return dataCacheSize_[i];
|
return dataCacheSize_[i];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -250,7 +282,7 @@ public:
|
||||||
(void)data;
|
(void)data;
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
static inline uint64 getXfeature()
|
static inline uint64_t getXfeature()
|
||||||
{
|
{
|
||||||
#ifdef XBYAK_INTEL_CPU_SPECIFIC
|
#ifdef XBYAK_INTEL_CPU_SPECIFIC
|
||||||
#ifdef _MSC_VER
|
#ifdef _MSC_VER
|
||||||
|
@ -260,13 +292,13 @@ public:
|
||||||
// xgetvb is not support on gcc 4.2
|
// xgetvb is not support on gcc 4.2
|
||||||
// __asm__ volatile("xgetbv" : "=a"(eax), "=d"(edx) : "c"(0));
|
// __asm__ volatile("xgetbv" : "=a"(eax), "=d"(edx) : "c"(0));
|
||||||
__asm__ volatile(".byte 0x0f, 0x01, 0xd0" : "=a"(eax), "=d"(edx) : "c"(0));
|
__asm__ volatile(".byte 0x0f, 0x01, 0xd0" : "=a"(eax), "=d"(edx) : "c"(0));
|
||||||
return ((uint64)edx << 32) | eax;
|
return ((uint64_t)edx << 32) | eax;
|
||||||
#endif
|
#endif
|
||||||
#else
|
#else
|
||||||
return 0;
|
return 0;
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
typedef uint64 Type;
|
typedef uint64_t Type;
|
||||||
|
|
||||||
static const Type NONE = 0;
|
static const Type NONE = 0;
|
||||||
static const Type tMMX = 1 << 0;
|
static const Type tMMX = 1 << 0;
|
||||||
|
@ -303,34 +335,39 @@ public:
|
||||||
static const Type tADX = 1 << 28; // adcx, adox
|
static const Type tADX = 1 << 28; // adcx, adox
|
||||||
static const Type tRDSEED = 1 << 29; // rdseed
|
static const Type tRDSEED = 1 << 29; // rdseed
|
||||||
static const Type tSMAP = 1 << 30; // stac
|
static const Type tSMAP = 1 << 30; // stac
|
||||||
static const Type tHLE = uint64(1) << 31; // xacquire, xrelease, xtest
|
static const Type tHLE = uint64_t(1) << 31; // xacquire, xrelease, xtest
|
||||||
static const Type tRTM = uint64(1) << 32; // xbegin, xend, xabort
|
static const Type tRTM = uint64_t(1) << 32; // xbegin, xend, xabort
|
||||||
static const Type tF16C = uint64(1) << 33; // vcvtph2ps, vcvtps2ph
|
static const Type tF16C = uint64_t(1) << 33; // vcvtph2ps, vcvtps2ph
|
||||||
static const Type tMOVBE = uint64(1) << 34; // mobve
|
static const Type tMOVBE = uint64_t(1) << 34; // mobve
|
||||||
static const Type tAVX512F = uint64(1) << 35;
|
static const Type tAVX512F = uint64_t(1) << 35;
|
||||||
static const Type tAVX512DQ = uint64(1) << 36;
|
static const Type tAVX512DQ = uint64_t(1) << 36;
|
||||||
static const Type tAVX512_IFMA = uint64(1) << 37;
|
static const Type tAVX512_IFMA = uint64_t(1) << 37;
|
||||||
static const Type tAVX512IFMA = tAVX512_IFMA;
|
static const Type tAVX512IFMA = tAVX512_IFMA;
|
||||||
static const Type tAVX512PF = uint64(1) << 38;
|
static const Type tAVX512PF = uint64_t(1) << 38;
|
||||||
static const Type tAVX512ER = uint64(1) << 39;
|
static const Type tAVX512ER = uint64_t(1) << 39;
|
||||||
static const Type tAVX512CD = uint64(1) << 40;
|
static const Type tAVX512CD = uint64_t(1) << 40;
|
||||||
static const Type tAVX512BW = uint64(1) << 41;
|
static const Type tAVX512BW = uint64_t(1) << 41;
|
||||||
static const Type tAVX512VL = uint64(1) << 42;
|
static const Type tAVX512VL = uint64_t(1) << 42;
|
||||||
static const Type tAVX512_VBMI = uint64(1) << 43;
|
static const Type tAVX512_VBMI = uint64_t(1) << 43;
|
||||||
static const Type tAVX512VBMI = tAVX512_VBMI; // changed by Intel's manual
|
static const Type tAVX512VBMI = tAVX512_VBMI; // changed by Intel's manual
|
||||||
static const Type tAVX512_4VNNIW = uint64(1) << 44;
|
static const Type tAVX512_4VNNIW = uint64_t(1) << 44;
|
||||||
static const Type tAVX512_4FMAPS = uint64(1) << 45;
|
static const Type tAVX512_4FMAPS = uint64_t(1) << 45;
|
||||||
static const Type tPREFETCHWT1 = uint64(1) << 46;
|
static const Type tPREFETCHWT1 = uint64_t(1) << 46;
|
||||||
static const Type tPREFETCHW = uint64(1) << 47;
|
static const Type tPREFETCHW = uint64_t(1) << 47;
|
||||||
static const Type tSHA = uint64(1) << 48;
|
static const Type tSHA = uint64_t(1) << 48;
|
||||||
static const Type tMPX = uint64(1) << 49;
|
static const Type tMPX = uint64_t(1) << 49;
|
||||||
static const Type tAVX512_VBMI2 = uint64(1) << 50;
|
static const Type tAVX512_VBMI2 = uint64_t(1) << 50;
|
||||||
static const Type tGFNI = uint64(1) << 51;
|
static const Type tGFNI = uint64_t(1) << 51;
|
||||||
static const Type tVAES = uint64(1) << 52;
|
static const Type tVAES = uint64_t(1) << 52;
|
||||||
static const Type tVPCLMULQDQ = uint64(1) << 53;
|
static const Type tVPCLMULQDQ = uint64_t(1) << 53;
|
||||||
static const Type tAVX512_VNNI = uint64(1) << 54;
|
static const Type tAVX512_VNNI = uint64_t(1) << 54;
|
||||||
static const Type tAVX512_BITALG = uint64(1) << 55;
|
static const Type tAVX512_BITALG = uint64_t(1) << 55;
|
||||||
static const Type tAVX512_VPOPCNTDQ = uint64(1) << 56;
|
static const Type tAVX512_VPOPCNTDQ = uint64_t(1) << 56;
|
||||||
|
static const Type tAVX512_BF16 = uint64_t(1) << 57;
|
||||||
|
static const Type tAVX512_VP2INTERSECT = uint64_t(1) << 58;
|
||||||
|
static const Type tAMX_TILE = uint64_t(1) << 59;
|
||||||
|
static const Type tAMX_INT8 = uint64_t(1) << 60;
|
||||||
|
static const Type tAMX_BF16 = uint64_t(1) << 61;
|
||||||
|
|
||||||
Cpu()
|
Cpu()
|
||||||
: type_(NONE)
|
: type_(NONE)
|
||||||
|
@ -385,7 +422,7 @@ public:
|
||||||
|
|
||||||
if (type_ & tOSXSAVE) {
|
if (type_ & tOSXSAVE) {
|
||||||
// check XFEATURE_ENABLED_MASK[2:1] = '11b'
|
// check XFEATURE_ENABLED_MASK[2:1] = '11b'
|
||||||
uint64 bv = getXfeature();
|
uint64_t bv = getXfeature();
|
||||||
if ((bv & 6) == 6) {
|
if ((bv & 6) == 6) {
|
||||||
if (ECX & (1U << 28)) type_ |= tAVX;
|
if (ECX & (1U << 28)) type_ |= tAVX;
|
||||||
if (ECX & (1U << 12)) type_ |= tFMA;
|
if (ECX & (1U << 12)) type_ |= tFMA;
|
||||||
|
@ -410,6 +447,12 @@ public:
|
||||||
if (ECX & (1U << 14)) type_ |= tAVX512_VPOPCNTDQ;
|
if (ECX & (1U << 14)) type_ |= tAVX512_VPOPCNTDQ;
|
||||||
if (EDX & (1U << 2)) type_ |= tAVX512_4VNNIW;
|
if (EDX & (1U << 2)) type_ |= tAVX512_4VNNIW;
|
||||||
if (EDX & (1U << 3)) type_ |= tAVX512_4FMAPS;
|
if (EDX & (1U << 3)) type_ |= tAVX512_4FMAPS;
|
||||||
|
if (EDX & (1U << 8)) type_ |= tAVX512_VP2INTERSECT;
|
||||||
|
}
|
||||||
|
// EAX=07H, ECX=1
|
||||||
|
getCpuidEx(7, 1, data);
|
||||||
|
if (type_ & tAVX512F) {
|
||||||
|
if (EAX & (1U << 5)) type_ |= tAVX512_BF16;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -428,6 +471,9 @@ public:
|
||||||
if (EBX & (1U << 14)) type_ |= tMPX;
|
if (EBX & (1U << 14)) type_ |= tMPX;
|
||||||
if (EBX & (1U << 29)) type_ |= tSHA;
|
if (EBX & (1U << 29)) type_ |= tSHA;
|
||||||
if (ECX & (1U << 0)) type_ |= tPREFETCHWT1;
|
if (ECX & (1U << 0)) type_ |= tPREFETCHWT1;
|
||||||
|
if (EDX & (1U << 24)) type_ |= tAMX_TILE;
|
||||||
|
if (EDX & (1U << 25)) type_ |= tAMX_INT8;
|
||||||
|
if (EDX & (1U << 22)) type_ |= tAMX_BF16;
|
||||||
}
|
}
|
||||||
setFamily();
|
setFamily();
|
||||||
setNumCores();
|
setNumCores();
|
||||||
|
@ -435,9 +481,11 @@ public:
|
||||||
}
|
}
|
||||||
void putFamily() const
|
void putFamily() const
|
||||||
{
|
{
|
||||||
|
#ifndef XBYAK_ONLY_CLASS_CPU
|
||||||
printf("family=%d, model=%X, stepping=%d, extFamily=%d, extModel=%X\n",
|
printf("family=%d, model=%X, stepping=%d, extFamily=%d, extModel=%X\n",
|
||||||
family, model, stepping, extFamily, extModel);
|
family, model, stepping, extFamily, extModel);
|
||||||
printf("display:family=%X, model=%X\n", displayFamily, displayModel);
|
printf("display:family=%X, model=%X\n", displayFamily, displayModel);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
bool has(Type type) const
|
bool has(Type type) const
|
||||||
{
|
{
|
||||||
|
@ -445,9 +493,10 @@ public:
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
#ifndef XBYAK_ONLY_CLASS_CPU
|
||||||
class Clock {
|
class Clock {
|
||||||
public:
|
public:
|
||||||
static inline uint64 getRdtsc()
|
static inline uint64_t getRdtsc()
|
||||||
{
|
{
|
||||||
#ifdef XBYAK_INTEL_CPU_SPECIFIC
|
#ifdef XBYAK_INTEL_CPU_SPECIFIC
|
||||||
#ifdef _MSC_VER
|
#ifdef _MSC_VER
|
||||||
|
@ -455,7 +504,7 @@ public:
|
||||||
#else
|
#else
|
||||||
unsigned int eax, edx;
|
unsigned int eax, edx;
|
||||||
__asm__ volatile("rdtsc" : "=a"(eax), "=d"(edx));
|
__asm__ volatile("rdtsc" : "=a"(eax), "=d"(edx));
|
||||||
return ((uint64)edx << 32) | eax;
|
return ((uint64_t)edx << 32) | eax;
|
||||||
#endif
|
#endif
|
||||||
#else
|
#else
|
||||||
// TODO: Need another impl of Clock or rdtsc-equivalent for non-x86 cpu
|
// TODO: Need another impl of Clock or rdtsc-equivalent for non-x86 cpu
|
||||||
|
@ -477,10 +526,10 @@ public:
|
||||||
count_++;
|
count_++;
|
||||||
}
|
}
|
||||||
int getCount() const { return count_; }
|
int getCount() const { return count_; }
|
||||||
uint64 getClock() const { return clock_; }
|
uint64_t getClock() const { return clock_; }
|
||||||
void clear() { count_ = 0; clock_ = 0; }
|
void clear() { count_ = 0; clock_ = 0; }
|
||||||
private:
|
private:
|
||||||
uint64 clock_;
|
uint64_t clock_;
|
||||||
int count_;
|
int count_;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -530,7 +579,7 @@ public:
|
||||||
{
|
{
|
||||||
if (n_ == maxTblNum) {
|
if (n_ == maxTblNum) {
|
||||||
fprintf(stderr, "ERR Pack::can't append\n");
|
fprintf(stderr, "ERR Pack::can't append\n");
|
||||||
throw Error(ERR_BAD_PARAMETER);
|
XBYAK_THROW_RET(ERR_BAD_PARAMETER, *this)
|
||||||
}
|
}
|
||||||
tbl_[n_++] = &t;
|
tbl_[n_++] = &t;
|
||||||
return *this;
|
return *this;
|
||||||
|
@ -539,7 +588,7 @@ public:
|
||||||
{
|
{
|
||||||
if (n > maxTblNum) {
|
if (n > maxTblNum) {
|
||||||
fprintf(stderr, "ERR Pack::init bad n=%d\n", (int)n);
|
fprintf(stderr, "ERR Pack::init bad n=%d\n", (int)n);
|
||||||
throw Error(ERR_BAD_PARAMETER);
|
XBYAK_THROW(ERR_BAD_PARAMETER)
|
||||||
}
|
}
|
||||||
n_ = n;
|
n_ = n;
|
||||||
for (size_t i = 0; i < n; i++) {
|
for (size_t i = 0; i < n; i++) {
|
||||||
|
@ -550,7 +599,7 @@ public:
|
||||||
{
|
{
|
||||||
if (n >= n_) {
|
if (n >= n_) {
|
||||||
fprintf(stderr, "ERR Pack bad n=%d(%d)\n", (int)n, (int)n_);
|
fprintf(stderr, "ERR Pack bad n=%d(%d)\n", (int)n, (int)n_);
|
||||||
throw Error(ERR_BAD_PARAMETER);
|
XBYAK_THROW_RET(ERR_BAD_PARAMETER, rax)
|
||||||
}
|
}
|
||||||
return *tbl_[n];
|
return *tbl_[n];
|
||||||
}
|
}
|
||||||
|
@ -563,7 +612,7 @@ public:
|
||||||
if (num == size_t(-1)) num = n_ - pos;
|
if (num == size_t(-1)) num = n_ - pos;
|
||||||
if (pos + num > n_) {
|
if (pos + num > n_) {
|
||||||
fprintf(stderr, "ERR Pack::sub bad pos=%d, num=%d\n", (int)pos, (int)num);
|
fprintf(stderr, "ERR Pack::sub bad pos=%d, num=%d\n", (int)pos, (int)num);
|
||||||
throw Error(ERR_BAD_PARAMETER);
|
XBYAK_THROW_RET(ERR_BAD_PARAMETER, Pack())
|
||||||
}
|
}
|
||||||
Pack pack;
|
Pack pack;
|
||||||
pack.n_ = num;
|
pack.n_ = num;
|
||||||
|
@ -638,9 +687,9 @@ public:
|
||||||
, t(t_)
|
, t(t_)
|
||||||
{
|
{
|
||||||
using namespace Xbyak;
|
using namespace Xbyak;
|
||||||
if (pNum < 0 || pNum > 4) throw Error(ERR_BAD_PNUM);
|
if (pNum < 0 || pNum > 4) XBYAK_THROW(ERR_BAD_PNUM)
|
||||||
const int allRegNum = pNum + tNum_ + (useRcx_ ? 1 : 0) + (useRdx_ ? 1 : 0);
|
const int allRegNum = pNum + tNum_ + (useRcx_ ? 1 : 0) + (useRdx_ ? 1 : 0);
|
||||||
if (tNum_ < 0 || allRegNum > maxRegNum) throw Error(ERR_BAD_TNUM);
|
if (tNum_ < 0 || allRegNum > maxRegNum) XBYAK_THROW(ERR_BAD_TNUM)
|
||||||
const Reg64& _rsp = code->rsp;
|
const Reg64& _rsp = code->rsp;
|
||||||
saveNum_ = (std::max)(0, allRegNum - noSaveNum);
|
saveNum_ = (std::max)(0, allRegNum - noSaveNum);
|
||||||
const int *tbl = getOrderTbl() + noSaveNum;
|
const int *tbl = getOrderTbl() + noSaveNum;
|
||||||
|
@ -682,12 +731,7 @@ public:
|
||||||
~StackFrame()
|
~StackFrame()
|
||||||
{
|
{
|
||||||
if (!makeEpilog_) return;
|
if (!makeEpilog_) return;
|
||||||
try {
|
|
||||||
close();
|
close();
|
||||||
} catch (std::exception& e) {
|
|
||||||
printf("ERR:StackFrame %s\n", e.what());
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
private:
|
private:
|
||||||
const int *getOrderTbl() const
|
const int *getOrderTbl() const
|
||||||
|
@ -722,5 +766,137 @@ private:
|
||||||
};
|
};
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
} } // end of util
|
class Profiler {
|
||||||
|
int mode_;
|
||||||
|
const char *suffix_;
|
||||||
|
const void *startAddr_;
|
||||||
|
#ifdef XBYAK_USE_PERF
|
||||||
|
FILE *fp_;
|
||||||
|
#endif
|
||||||
|
public:
|
||||||
|
enum {
|
||||||
|
None = 0,
|
||||||
|
Perf = 1,
|
||||||
|
VTune = 2
|
||||||
|
};
|
||||||
|
Profiler()
|
||||||
|
: mode_(None)
|
||||||
|
, suffix_("")
|
||||||
|
, startAddr_(0)
|
||||||
|
#ifdef XBYAK_USE_PERF
|
||||||
|
, fp_(0)
|
||||||
|
#endif
|
||||||
|
{
|
||||||
|
}
|
||||||
|
// append suffix to funcName
|
||||||
|
void setNameSuffix(const char *suffix)
|
||||||
|
{
|
||||||
|
suffix_ = suffix;
|
||||||
|
}
|
||||||
|
void setStartAddr(const void *startAddr)
|
||||||
|
{
|
||||||
|
startAddr_ = startAddr;
|
||||||
|
}
|
||||||
|
void init(int mode)
|
||||||
|
{
|
||||||
|
mode_ = None;
|
||||||
|
switch (mode) {
|
||||||
|
default:
|
||||||
|
case None:
|
||||||
|
return;
|
||||||
|
case Perf:
|
||||||
|
#ifdef XBYAK_USE_PERF
|
||||||
|
close();
|
||||||
|
{
|
||||||
|
const int pid = getpid();
|
||||||
|
char name[128];
|
||||||
|
snprintf(name, sizeof(name), "/tmp/perf-%d.map", pid);
|
||||||
|
fp_ = fopen(name, "a+");
|
||||||
|
if (fp_ == 0) {
|
||||||
|
fprintf(stderr, "can't open %s\n", name);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
mode_ = Perf;
|
||||||
|
#endif
|
||||||
|
return;
|
||||||
|
case VTune:
|
||||||
|
#ifdef XBYAK_USE_VTUNE
|
||||||
|
dlopen("dummy", RTLD_LAZY); // force to load dlopen to enable jit profiling
|
||||||
|
if (iJIT_IsProfilingActive() != iJIT_SAMPLING_ON) {
|
||||||
|
fprintf(stderr, "VTune profiling is not active\n");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
mode_ = VTune;
|
||||||
|
#endif
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
~Profiler()
|
||||||
|
{
|
||||||
|
close();
|
||||||
|
}
|
||||||
|
void close()
|
||||||
|
{
|
||||||
|
#ifdef XBYAK_USE_PERF
|
||||||
|
if (fp_ == 0) return;
|
||||||
|
fclose(fp_);
|
||||||
|
fp_ = 0;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
void set(const char *funcName, const void *startAddr, size_t funcSize) const
|
||||||
|
{
|
||||||
|
if (mode_ == None) return;
|
||||||
|
#if !defined(XBYAK_USE_PERF) && !defined(XBYAK_USE_VTUNE)
|
||||||
|
(void)funcName;
|
||||||
|
(void)startAddr;
|
||||||
|
(void)funcSize;
|
||||||
|
#endif
|
||||||
|
#ifdef XBYAK_USE_PERF
|
||||||
|
if (mode_ == Perf) {
|
||||||
|
if (fp_ == 0) return;
|
||||||
|
fprintf(fp_, "%llx %zx %s%s", (long long)startAddr, funcSize, funcName, suffix_);
|
||||||
|
/*
|
||||||
|
perf does not recognize the function name which is less than 3,
|
||||||
|
so append '_' at the end of the name if necessary
|
||||||
|
*/
|
||||||
|
size_t n = strlen(funcName) + strlen(suffix_);
|
||||||
|
for (size_t i = n; i < 3; i++) {
|
||||||
|
fprintf(fp_, "_");
|
||||||
|
}
|
||||||
|
fprintf(fp_, "\n");
|
||||||
|
fflush(fp_);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
#ifdef XBYAK_USE_VTUNE
|
||||||
|
if (mode_ != VTune) return;
|
||||||
|
char className[] = "";
|
||||||
|
char fileName[] = "";
|
||||||
|
iJIT_Method_Load jmethod = {};
|
||||||
|
jmethod.method_id = iJIT_GetNewMethodID();
|
||||||
|
jmethod.class_file_name = className;
|
||||||
|
jmethod.source_file_name = fileName;
|
||||||
|
jmethod.method_load_address = const_cast<void*>(startAddr);
|
||||||
|
jmethod.method_size = funcSize;
|
||||||
|
jmethod.line_number_size = 0;
|
||||||
|
char buf[128];
|
||||||
|
snprintf(buf, sizeof(buf), "%s%s", funcName, suffix_);
|
||||||
|
jmethod.method_name = buf;
|
||||||
|
iJIT_NotifyEvent(iJVM_EVENT_TYPE_METHOD_LOAD_FINISHED, (void*)&jmethod);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
/*
|
||||||
|
for continuous set
|
||||||
|
funcSize = endAddr - <previous set endAddr>
|
||||||
|
*/
|
||||||
|
void set(const char *funcName, const void *endAddr)
|
||||||
|
{
|
||||||
|
set(funcName, startAddr_, (size_t)endAddr - (size_t)startAddr_);
|
||||||
|
startAddr_ = endAddr;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
#endif // XBYAK_ONLY_CLASS_CPU
|
||||||
|
|
||||||
|
} } // end of util
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
Loading…
Reference in a new issue