mirror of
https://github.com/FEX-Emu/xbyak.git
synced 2025-02-23 06:40:49 +00:00
add XBYAK_NO_OP_NAMES macro
This commit is contained in:
parent
e38b389398
commit
2ae4f4ea6c
@ -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");
|
||||
}
|
||||
}
|
||||
}
|
||||
{
|
||||
|
@ -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
|
||||
|
@ -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クラスのインタフェースを変更
|
||||
|
@ -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
|
||||
|
@ -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); }
|
||||
|
Loading…
x
Reference in New Issue
Block a user