and_(), or_() are always available

This commit is contained in:
MITSUNARI Shigeo 2012-11-17 22:06:49 +09:00
parent 3468bfb1f8
commit 195b5f0558
5 changed files with 17 additions and 19 deletions

View File

@ -587,10 +587,9 @@ void put()
const std::string name = p->name;
bool isOpName = name == "and" || name == "or" || name == "xor";
if (isOpName) {
printf("#ifdef XBYAK_NO_OP_NAMES\n");
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("#else\n");
printf("#ifndef XBYAK_NO_OP_NAMES\n");
}
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);
@ -632,9 +631,8 @@ void put()
const std::string name = p->name;
bool isOpName = name == "not";
if (isOpName) {
printf("#ifdef XBYAK_NO_OP_NAMES\n");
printf("void %s_(const Operand& op) { opR_ModM(op, 0, %d, 0x%02X); }\n", p->name, p->ext, p->code);
printf("#else\n");
printf("#ifndef XBYAK_NO_OP_NAMES\n");
}
printf("void %s(const Operand& op) { opR_ModM(op, 0, %d, 0x%02X); }\n", p->name, p->ext, p->code);
if (isOpName) {

View File

@ -29,8 +29,9 @@ MMX/MMX2/SSE/SSE2/SSE3/SSSE3/SSE4/FPU(*partial*)/AVX
* mingw 3.4.2
* icc 7.2
>Note: "-fno-operator-names" option is required on gcc to avoid analyzing "and", "or", etc. as operators.
Or define XBYAK_NO_OP_NAMES to replace and() with and_() and so on.
>Note: Xbyak uses and(), or(), xor(), not() functions, so "-fno-operator-names" option is required on gcc.
Or define XBYAK_NO_OP_NAMES and use and_(), or_(), xor_(), not_() instead of them.
and_(), or_(), xor_(), not_() are available if XBYAK_NO_OP_NAMES is not defined.
Install
-------------
@ -222,6 +223,7 @@ http://opensource.org/licenses/BSD-3-Clause
History
-------------
* 2012/Nov/17 and_(), or_(), xor_(), not_() are available if XBYAK_NO_OP_NAMES is not defined.
* 2012/Nov/17 change eax, ebx, ptr and so on in CodeGenerator as static member and alias of them are defined in Xbyak::util.
* 2012/Nov/09 ver 3.70 XBYAK_NO_OP_NAMES macro is added to use and_() instead of and() (thanks to Mattias)
* 2012/Nov/01 ver 3.62 add fwait/fnwait/finit/fninit

View File

@ -23,9 +23,10 @@
Intel Mac
などで動作確認をしています.
※ gccではand, or, xorなどを演算子として解釈してしまうため
-fno-operator-namesオプションを追加してコンパイルしてください
あるいはXBYAK_NO_OP_NAMESを定義するとand()の代わりにand_()を使うようになります.
※ Xbyakはデフォルトでand(), or(), xor(), not()関数を使います.
gccではそれらを演算子として解釈してしまうため-fno-operator-namesオプションを追加してコンパイルしてください
あるいはXBYAK_NO_OP_NAMESを定義してand_(), or_(), xor_(), not_()を使ってください.
and_(), or_(), xor_(), not_()はXBYAK_NO_OP_NAMESされていないときでも使えます
-----------------------------------------------------------------------------
◎準備
@ -243,6 +244,7 @@ sample/{echo,hello}.bfは http://www.kmonos.net/alang/etc/brainfuck.php から
-----------------------------------------------------------------------------
◎履歴
2012/11/17 and_(), or_(), xor_(), not_()をXBYAK_NO_OP_NAMESが定義されていないときでも使えるようにした
2012/11/17 CodeGeneratorのeax, ecx, ptrなどのメンバ変数をstaticにしconst参照をXbyak::utilにも定義
2012/11/09 ver 3.70 and()をand_()にするためのマクロXBYAK_NO_OP_NAMESを追加(thanks to Mattias)
2012/11/01 ver 3.62 add fwait/fnwait/finit/fninit

View File

@ -5,13 +5,13 @@
@file xbyak.h
@brief Xbyak ; JIT assembler for x86(IA32)/x64 by C++
@author herumi
@url http://homepage1.nifty.com/herumi/soft/xbyak_e.html
@url https://github.com/herumi/xbyak, http://homepage1.nifty.com/herumi/soft/xbyak_e.html
@note modified new BSD license
http://opensource.org/licenses/BSD-3-Clause
*/
#ifndef XBYAK_NO_OP_NAMES
#if not +0 // trick to detect whether 'not' is operator or not
#error "use -fno-operator-names to use 'not', 'xor', 'or', 'and' as function names or define XBYAK_NO_OP_NAMES to get 'not_', 'xor_', 'or_', 'and_' instead."
#error "use -fno-operator-names option if you want to use and(), or(), xor(), not() as function names, Or define XBYAK_NO_OP_NAMES and use and_(), or_(), xor_(), not_()."
#endif
#endif

View File

@ -372,19 +372,17 @@ void adc(const Operand& op1, const Operand& op2) { opRM_RM(op1, op2, 0x10); }
void adc(const Operand& op, uint32 imm) { opRM_I(op, imm, 0x10, 2); }
void add(const Operand& op1, const Operand& op2) { opRM_RM(op1, op2, 0x00); }
void add(const Operand& op, uint32 imm) { opRM_I(op, imm, 0x00, 0); }
#ifdef XBYAK_NO_OP_NAMES
void and_(const Operand& op1, const Operand& op2) { opRM_RM(op1, op2, 0x20); }
void and_(const Operand& op, uint32 imm) { opRM_I(op, imm, 0x20, 4); }
#else
#ifndef XBYAK_NO_OP_NAMES
void and(const Operand& op1, const Operand& op2) { opRM_RM(op1, op2, 0x20); }
void and(const Operand& op, uint32 imm) { opRM_I(op, imm, 0x20, 4); }
#endif
void cmp(const Operand& op1, const Operand& op2) { opRM_RM(op1, op2, 0x38); }
void cmp(const Operand& op, uint32 imm) { opRM_I(op, imm, 0x38, 7); }
#ifdef XBYAK_NO_OP_NAMES
void or_(const Operand& op1, const Operand& op2) { opRM_RM(op1, op2, 0x08); }
void or_(const Operand& op, uint32 imm) { opRM_I(op, imm, 0x08, 1); }
#else
#ifndef XBYAK_NO_OP_NAMES
void or(const Operand& op1, const Operand& op2) { opRM_RM(op1, op2, 0x08); }
void or(const Operand& op, uint32 imm) { opRM_I(op, imm, 0x08, 1); }
#endif
@ -392,10 +390,9 @@ void sbb(const Operand& op1, const Operand& op2) { opRM_RM(op1, op2, 0x18); }
void sbb(const Operand& op, uint32 imm) { opRM_I(op, imm, 0x18, 3); }
void sub(const Operand& op1, const Operand& op2) { opRM_RM(op1, op2, 0x28); }
void sub(const Operand& op, uint32 imm) { opRM_I(op, imm, 0x28, 5); }
#ifdef XBYAK_NO_OP_NAMES
void xor_(const Operand& op1, const Operand& op2) { opRM_RM(op1, op2, 0x30); }
void xor_(const Operand& op, uint32 imm) { opRM_I(op, imm, 0x30, 6); }
#else
#ifndef XBYAK_NO_OP_NAMES
void xor(const Operand& op1, const Operand& op2) { opRM_RM(op1, op2, 0x30); }
void xor(const Operand& op, uint32 imm) { opRM_I(op, imm, 0x30, 6); }
#endif
@ -406,9 +403,8 @@ void idiv(const Operand& op) { opR_ModM(op, 0, 7, 0xF6); }
void imul(const Operand& op) { opR_ModM(op, 0, 5, 0xF6); }
void mul(const Operand& op) { opR_ModM(op, 0, 4, 0xF6); }
void neg(const Operand& op) { opR_ModM(op, 0, 3, 0xF6); }
#ifdef XBYAK_NO_OP_NAMES
void not_(const Operand& op) { opR_ModM(op, 0, 2, 0xF6); }
#else
#ifndef XBYAK_NO_OP_NAMES
void not(const Operand& op) { opR_ModM(op, 0, 2, 0xF6); }
#endif
void rcl(const Operand& op, int imm) { opShift(op, imm, 2); }