add XBYAK_NO_OP_NAMES macro

This commit is contained in:
MITSUNARI Shigeo 2012-11-09 21:30:40 +09:00
parent e38b389398
commit 2ae4f4ea6c
5 changed files with 57 additions and 6 deletions

View File

@ -584,8 +584,19 @@ void put()
};
for (int i = 0; i < NUM_OF_ARRAY(tbl); i++) {
const Tbl *p = &tbl[i];
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("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);
if (isOpName) {
printf("#endif\n");
}
}
}
@ -618,7 +629,17 @@ void put()
};
for (int i = 0; i < NUM_OF_ARRAY(tbl); i++) {
const Tbl *p = &tbl[i];
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("void %s(const Operand& op) { opR_ModM(op, 0, %d, 0x%02X); }\n", p->name, p->ext, p->code);
if (isOpName) {
printf("#endif\n");
}
}
}
{

View File

@ -1,5 +1,5 @@
Xbyak 3.62 ; JIT assembler for x86(IA32), x64(AMD64, x86-64) by C++
Xbyak 3.70 ; JIT assembler for x86(IA32), x64(AMD64, x86-64) by C++
=============
Abstract
@ -30,6 +30,7 @@ MMX/MMX2/SSE/SSE2/SSE3/SSSE3/SSE4/FPU(*partial*)/AVX
* 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.
Install
-------------
@ -222,6 +223,7 @@ http://opensource.org/licenses/BSD-3-Clause
History
-------------
* 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
* 2012/Nov/01 ver 3.61 add fldcw/fstcw
* 2012/May/03 ver 3.60 change interface of Allocator

View File

@ -1,5 +1,5 @@
C++用x86(IA-32), x64(AMD64, x86-64) JITアセンブラ Xbyak version 3.62
C++用x86(IA-32), x64(AMD64, x86-64) JITアセンブラ Xbyak version 3.70
-----------------------------------------------------------------------------
◎概要
@ -25,6 +25,7 @@
※ gccではand, or, xorなどを演算子として解釈してしまうため
-fno-operator-namesオプションを追加してコンパイルしてください
あるいはXBYAK_NO_OP_NAMESを定義するとand()の代わりにand_()を使うようになります.
-----------------------------------------------------------------------------
◎準備
@ -242,6 +243,7 @@ sample/{echo,hello}.bfは http://www.kmonos.net/alang/etc/brainfuck.php から
-----------------------------------------------------------------------------
◎履歴
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
2012/11/01 ver 3.61 add fldcw/fstcw
2012/05/03 ver 3.60 Allocatorクラスのインタフェースを変更

View File

@ -9,8 +9,15 @@
@note modified new BSD license
http://opensource.org/licenses/BSD-3-Clause
*/
#if not +0
#error "use -fno-operator-names to use 'not', 'xor, 'and' as function names"
/*
XBYAK_NO_OP_NAMES will result in the instructions and(), or(), xor() and not()
to be replaced by and_(), or_(), xor_() and not_(), which is useful for compilers
that don't support -fno-operator-names
*/
#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."
#endif
#endif
#include <stdio.h> // for debug print
@ -55,7 +62,7 @@ namespace Xbyak {
enum {
DEFAULT_MAX_CODE_SIZE = 4096,
VERSION = 0x3602 /* 0xABCD = A.BC(D) */
VERSION = 0x3700 /* 0xABCD = A.BC(D) */
};
#ifndef MIE_INTEGER_TYPE_DEFINED

View File

@ -1,4 +1,4 @@
const char *getVersionString() const { return "3.602"; }
const char *getVersionString() const { return "3.70"; }
void packssdw(const Mmx& mmx, const Operand& op) { opMMX(mmx, op, 0x6B); }
void packsswb(const Mmx& mmx, const Operand& op) { opMMX(mmx, op, 0x63); }
void packuswb(const Mmx& mmx, const Operand& op) { opMMX(mmx, op, 0x67); }
@ -372,18 +372,33 @@ 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
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
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
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
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
void dec(const Operand& op) { opIncDec(op, 0x48, 1); }
void inc(const Operand& op) { opIncDec(op, 0x40, 0); }
void div(const Operand& op) { opR_ModM(op, 0, 6, 0xF6); }
@ -391,7 +406,11 @@ 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
void not(const Operand& op) { opR_ModM(op, 0, 2, 0xF6); }
#endif
void rcl(const Operand& op, int imm) { opShift(op, imm, 2); }
void rcl(const Operand& op, const Reg8& cl) { opShift(op, cl, 2); }
void rcr(const Operand& op, int imm) { opShift(op, imm, 3); }