aboutsummaryrefslogtreecommitdiffhomepage
path: root/readme_e.txt
blob: 3f4d5cc2bab42e4f6cf2af4521a4f140ff462ec1 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185

    Xbyak 2.24 ; JIT assembler for x86(IA32), x64(AMD64, x86-64) by C++

-----------------------------------------------------------------------------
<Abstract>

This is a header file which enables dynamically to assemble x86(IA32),
x64(AMD64, x86-64) mnemonic.

-----------------------------------------------------------------------------
<Feature>
header file only
    you can use Xbyak's functions at once if xbyak.h is included.

MMX/MMX2/SSE/SSE2/SSE3/SSSE3/SSE4/FPU(partial) are available.

Windows Xp(32bit, 64bit), Vista, Linux(32bit, 64bit), Intel Mac ready
support Visual Studio C++ 2005 Express Ed., VC2008 Pro,
mingw 3.4.2, icc 7.2, gcc 4.1.1, and so on.

Note: "-fno-operator-names" option is required on gcc to avoid analyzing
"and", "or", etc. as operators.

-----------------------------------------------------------------------------
<Install>
The following files are necessary. Please add the path to your compile
directories.

xbyak.h
xbyak_bin2hex.h
xbyak_mnemonic.h

Linux:
>make install
These files are copied into /usr/local/include/xbyak .
-----------------------------------------------------------------------------
<Syntax>

Make Xbyak::CodeGenerator and make the class method and get the function
pointer by calling cgetCode() and casting the return value.

NASM              Xbyak

mov eax, ebx  --> mov(eax, ebx);
inc ecx           inc(ecx);
ret           --> ret();

Addressing

(ptr|dword|word|byte) [base + index * (1|2|4|8) + displacement]

NASM                   Xbyak
mov eax, [ebx+ecx] --> mov (eax, ptr[ebx+ecx]);
test byte [esp], 4 --> test (byte [esp], 4);

NB. dword, word and byte are class members, then don't use dword as
unsigned int, for example.

Label

L("L1");
    jmp ("L1");

    jmp ("L2");
    ...
    a few mnemonics(8-bit displacement jmp)
    ...
L("L2");

    jmp ("L3", T_NEAR);
    ...
    a lot of mnemonics(32-bit displacement jmp)
    ...
L("L3");

Call hasUndefinedLabel() to verify your code has no undefined label.

1. support @@, @f, @b like MASM

  L("@@"); // <A>
  jmp("@b"); // jmp to <A>
  jmp("@f"); // jmp to <B>
  L("@@"); // <B>
  jmp("@b"); // jmp to <B>

2. localization of label by calling inLocalLabel(), outLocallabel()

void func1()
{
    inLocalLabel();
    L(".lp"); // <A>
    ...
    jmp(".lp"); // jmpt to <A>
    outLocalLabel();
}

void func2()
{
    L(".lp"); // <B>
    func1();
    jmp(".lp"); // jmp to <B>
}

Code size
The default max code size is 2048 bytes. Please set it in constructor of
CodeGenerator() if you want to use large size.

class Quantize : public Xbyak::CodeGenerator {
public:
    Quantize()
        : CodeGenerator(8192)
    {
    }
    ...
};

See main.cpp

-----------------------------------------------------------------------------
<Macro>

XBYAK32 is defined on 32bit.
XBYAK64 is defined on 64bit.
XBYAK64_WIN is defined on 64bit Windows
XBYAK64_GCC is defined on 64bit gcc

-----------------------------------------------------------------------------
<Sample>

test0.cpp ; tiny sample of Xbyak(x86, x64)
quantize.cpp ; JIT optimized quantization by fast division(x86 only)
calc.cpp ; assemble and estimate a given polynomial(x86, x64)
bf.cpp ; JIT brainfuck(x86, x64)

-----------------------------------------------------------------------------
<Remark>

The current version does not support 3D Now!, 80bit FPU load/store
 and some special mnemonics.
Please mail to me if necessary.

-----------------------------------------------------------------------------
<License>

modified new BSD License
http://www.opensource.org/licenses/bsd-license.php
-----------------------------------------------------------------------------
<History>

2010/Apr/16 ver 2.24 change the prototype of rewrite() method
2010/Apr/15 ver 2.23 fix align() and xbyak_util.h for Mac
2010/Feb/16 ver 2.22 fix inLocalLabel()/outLocalLabel()
2009/Dec/09 ver 2.21 support cygwin(gcc 4.3.2)
2009/Nov/28 support a part of FPU
2009/Jun/25 fix mov(qword[rax], imm); (thanks to Martin)
2009/Mar/10 fix redundant REX.W prefix on jmp/call reg64
2009/Feb/24 add movq reg64, mmx/xmm; movq mmx/xmm, reg64
2009/Feb/13 movd(xmm7, dword[eax]) drops 0x66 prefix (thanks to Gabest)
2008/Dec/30 fix call in short relative address(thanks to kato san)
2008/Sep/18 support @@, @f, @b and localization of label(thanks to nobu-q san)
2008/Sep/18 support ptr [rip + 32bit offset] (thanks to Dango-Chu san)
2008/Jun/03 fix align(). mov(ptr[eax],1) throws ERR_MEM_SIZE_IS_NOT_SPECIFIED.
2008/Jun/02 support memory interface allocated by user
2008/May/26 fix protect() to avoid invalid setting(thanks to shinichiro_h san)
2008/Apr/30 add cmpxchg16b, cdqe
2008/Apr/29 support x86
2008/Apr/14 code refactoring
2008/Mar/12 add bsr/bsf
2008/Feb/14 fix output of sub eax, 1234 (thanks to Robert)
2007/Nov/5  support lock, xadd, xchg
2007/Nov/2  support SSSE3/SSE4 (thanks to Dango-Chu san)
2007/Feb/4  fix the bug that exception doesn't occur under the condition
            which the offset of jmp mnemonic without T_NEAR is over 127.
2007/Jan/21 fix the bug to create address like [disp]
            select smaller representation for mov (eax|ax|al, [disp])
2007/Jan/4  first version

-----------------------------------------------------------------------------
<Author>

MITSUNARI Shigeo(herumi at nifty dot com)

---
$Revision: 1.43 $
$Date: 2010/04/16 03:48:59 $