~ppsspp/ppsspp/ppsspp_1.3.0

« back to all changes in this revision

Viewing changes to unittest/TestArm64Emitter.cpp

  • Committer: Sérgio Benjamim
  • Date: 2017-01-02 00:12:05 UTC
  • Revision ID: sergio_br2@yahoo.com.br-20170102001205-cxbta9za203nmjwm
1.3.0 source (from ppsspp_1.3.0-r160.p5.l1762.a165.t83~56~ubuntu16.04.1.tar.xz).

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
#include "Common/Arm64Emitter.h"
 
2
#include "Core/MIPS/JitCommon/JitState.h"
 
3
#include "Core/MIPS/JitCommon/JitCommon.h"
 
4
#include "Core/MIPS/MIPSVFPUUtils.h"
 
5
#include "Core/Util/DisArm64.h"
 
6
 
 
7
#include <string.h>
 
8
 
 
9
#include "UnitTest.h"
 
10
 
 
11
static bool CheckLast(Arm64Gen::ARM64XEmitter &emit, const char *comp) {
 
12
        u32 instr;
 
13
        memcpy(&instr, emit.GetCodePointer() - 4, 4);
 
14
        char disasm[512];
 
15
        Arm64Dis(0, instr, disasm, sizeof(disasm), true);
 
16
        EXPECT_EQ_STR(std::string(disasm), std::string(comp));
 
17
        return true;
 
18
}
 
19
 
 
20
static void DisassembleARMBetween(const u8 *start, const u8 *end) {
 
21
        while (start < end) {
 
22
                char disasm[512];
 
23
                uint32_t instr;
 
24
                memcpy(&instr, start, 4);
 
25
                Arm64Dis(0, instr, disasm, sizeof(disasm), true);
 
26
                printf("%s\n", disasm);
 
27
                start += 4;
 
28
        }
 
29
}
 
30
 
 
31
#undef ADD
 
32
 
 
33
bool TestArm64Emitter() {
 
34
        using namespace Arm64Gen;
 
35
 
 
36
        int lz = CountLeadingZeros(0x0000400000000000, 64);
 
37
        EXPECT_EQ_INT(lz, 17);
 
38
 
 
39
 
 
40
        u32 code[512];
 
41
        ARM64XEmitter emitter((u8 *)code);
 
42
        ARM64FloatEmitter fp(&emitter);
 
43
 
 
44
        fp.EOR(Q0, Q1, Q2);
 
45
        RET(CheckLast(emitter, "6e221c20 eor q0, q1, q2"));
 
46
        fp.EOR(D0, D1, D2);
 
47
        RET(CheckLast(emitter, "2e221c20 eor d0, d1, d2"));
 
48
        fp.SHRN(32, D0, Q3, 8);
 
49
        RET(CheckLast(emitter, "0f388460 shrn.32.64 d0, q3, #8"));
 
50
        fp.SHRN(8, D0, Q3, 4);
 
51
        RET(CheckLast(emitter, "0f0c8460 shrn.8.16 d0, q3, #4"));
 
52
 
 
53
        fp.XTN(32, D0, Q3);
 
54
        RET(CheckLast(emitter, "0ea12860 xtn.32.64 d0, q3"));
 
55
        fp.XTN(8, D4, Q1);
 
56
        RET(CheckLast(emitter, "0e212824 xtn.8.16 d4, q1"));
 
57
 
 
58
        fp.UMIN(32, D0, D3, D4);
 
59
        RET(CheckLast(emitter, "2ea46c60 umin.32 d0, d3, d4"));
 
60
        fp.UMAX(16, Q0, Q3, Q4);
 
61
        RET(CheckLast(emitter, "6e646460 umax.16 q0, q3, q4"));
 
62
        fp.SMIN(8, D0, D3, D4);
 
63
        RET(CheckLast(emitter, "0e246c60 smin.8 d0, d3, d4"));
 
64
        fp.SMAX(16, D0, D3, D4);
 
65
        RET(CheckLast(emitter, "0e646460 smax.16 d0, d3, d4"));
 
66
 
 
67
        fp.SHL(32, D0, D3, 18);
 
68
        RET(CheckLast(emitter, "0f325460 shl.32 d0, d3, #18"));
 
69
        fp.USHR(16, Q0, Q3, 7);
 
70
        RET(CheckLast(emitter, "6f190460 ushr.16 q0, q3, #7"));
 
71
        fp.SSHR(64, Q0, Q3, 38);
 
72
        RET(CheckLast(emitter, "4f5a0460 sshr.64 q0, q3, #38"));
 
73
 
 
74
        emitter.LDRH(INDEX_UNSIGNED, W3, X7, 18);
 
75
        RET(CheckLast(emitter, "794024e3 ldrh w3, [x7, #18]"));
 
76
        emitter.LDRSH(INDEX_UNSIGNED, W3, X7, 18);
 
77
        RET(CheckLast(emitter, "79c024e3 ldrsh w3, [x7, #18]"));
 
78
        fp.SCVTF(32, Q3, Q7, 7);
 
79
        RET(CheckLast(emitter, "4f39e4e3 scvtf q3.s, q7.s, #7"));
 
80
        fp.UCVTF(32, D3, D7, 15);
 
81
        RET(CheckLast(emitter, "2f31e4e3 ucvtf d3.s, d7.s, #15"));
 
82
 
 
83
        fp.LDP(128, INDEX_SIGNED, Q3, Q7, X3, 32);
 
84
        RET(CheckLast(emitter, "ad411c63 ldp q3, q7, [x3, #32]"));
 
85
        fp.STP(128, INDEX_SIGNED, Q3, Q7, X3, 32);
 
86
        RET(CheckLast(emitter, "ad011c63 stp q3, q7, [x3, #32]"));
 
87
 
 
88
        emitter.STP(INDEX_SIGNED, W21, W1, X27, 48);
 
89
        RET(CheckLast(emitter, "29060775 stp w21, w1, [x27, #48]"));
 
90
        emitter.STNP(W21, W1, X27, 48);
 
91
        RET(CheckLast(emitter, "28060775 stnp w21, w1, [x27, #48]"));
 
92
 
 
93
        emitter.MRS(X25, FIELD_NZCV);
 
94
        RET(CheckLast(emitter, "d53b4219 mrs x25, nzcv"));
 
95
        emitter._MSR(FIELD_NZCV, X25);
 
96
        RET(CheckLast(emitter, "d51b4219 msr nzcv, x25"));
 
97
 
 
98
        fp.DUP(32, Q1, Q30, 3);
 
99
        RET(CheckLast(emitter, "4e1c07c1 dup q1, q30.s[3]"));
 
100
        fp.UXTL(8, Q1, D8);
 
101
        RET(CheckLast(emitter, "2f08a501 uxtl.16.8 q1, d8"));
 
102
        fp.LDR(8, INDEX_PRE, Q1, X1, 96);
 
103
        RET(CheckLast(emitter, "3c460c21 ldr b1, [x1, #96]!"));
 
104
        fp.LDR(8, INDEX_POST, Q1, X1, 96);
 
105
        RET(CheckLast(emitter, "3c460421 ldr b1, [x1], #96"));
 
106
        fp.LDR(8, INDEX_UNSIGNED, Q1, X1, 96);
 
107
        RET(CheckLast(emitter, "3d418021 ldr b1, [x1, #96]"));
 
108
        fp.LDR(16, INDEX_UNSIGNED, Q1, X1, 96);
 
109
        RET(CheckLast(emitter, "7d40c021 ldr h1, [x1, #96]"));
 
110
        fp.LDR(32, INDEX_UNSIGNED, Q1, X1, 96);
 
111
        RET(CheckLast(emitter, "bd406021 ldr s1, [x1, #96]"));
 
112
        fp.LDR(64, INDEX_UNSIGNED, Q1, X1, 96);
 
113
        RET(CheckLast(emitter, "fd403021 ldr d1, [x1, #96]"));
 
114
        fp.LDR(128, INDEX_UNSIGNED, Q1, X1, 96);
 
115
        RET(CheckLast(emitter, "3dc01821 ldr q1, [x1, #96]"));
 
116
        fp.STR(8, INDEX_UNSIGNED, Q1, X1, 96);
 
117
        RET(CheckLast(emitter, "3d018021 str b1, [x1, #96]"));
 
118
        fp.STR(16, INDEX_UNSIGNED, Q1, X1, 96);
 
119
        RET(CheckLast(emitter, "7d00c021 str h1, [x1, #96]"));
 
120
        fp.STR(32, INDEX_UNSIGNED, Q1, X1, 96);
 
121
        RET(CheckLast(emitter, "bd006021 str s1, [x1, #96]"));
 
122
        fp.STR(64, INDEX_UNSIGNED, Q1, X1, 96);
 
123
        RET(CheckLast(emitter, "fd003021 str d1, [x1, #96]"));
 
124
        fp.STR(128, INDEX_UNSIGNED, Q1, X1, 96);
 
125
        RET(CheckLast(emitter, "3d801821 str q1, [x1, #96]"));
 
126
        fp.FMLA(32, D1, D2, D3);
 
127
        RET(CheckLast(emitter, "0e23cc41 fmla.32 d1, d2, d3"));
 
128
        fp.FMLS(64, Q1, Q2, Q3);
 
129
        RET(CheckLast(emitter, "4ee3cc41 fmls.64 q1, q2, q3"));
 
130
        fp.FADD(32, Q1, Q13, Q21);
 
131
        RET(CheckLast(emitter, "4e35d5a1 fadd.32 q1, q13, q21"));
 
132
        fp.FMUL(32, D1, D13, D21);
 
133
        RET(CheckLast(emitter, "2e35dda1 fmul.32 d1, d13, d21"));
 
134
        fp.INS(32, Q3, 1, Q12, 3);
 
135
        RET(CheckLast(emitter, "6e0c6583 ins q3.s[1], q12.s[3]"));
 
136
        fp.INS(8, D4, 5, D11, 2);
 
137
        RET(CheckLast(emitter, "6e0b1564 ins d4.b[5], d11.b[2]"));
 
138
        emitter.NEG(X1, X2);
 
139
        RET(CheckLast(emitter, "cb0203e1 neg x1, x2"));
 
140
 
 
141
        emitter.ADD(X1, X2, X3, ArithOption(X1, ST_LSL, 3));
 
142
        RET(CheckLast(emitter, "8b030c41 add x1, x2, x3, lsl #3"));
 
143
        //emitter.EXTR(W1, W3, 0, 7);
 
144
        //RET(CheckLast(emitter, "53033061 extr w1, w3, w7"));
 
145
        //fp.FCVTL(32, Q6, D25);
 
146
        //RET(CheckLast(emitter, "4fa29820 fcvtl q6, d25"));
 
147
        fp.FMUL(32, Q0, Q1, Q2, 3);
 
148
        RET(CheckLast(emitter, "4fa29820 fmul q0, q1, q2.4s[3]"));  // A real disasm says fmla  v0.2s, v1.2s, v2.s[1]  but I think our way is more readable
 
149
        fp.FMLA(32, D0, D1, D2, 1);
 
150
        RET(CheckLast(emitter, "0fa21020 fmla d0, d1, d2.2s[1]"));
 
151
        fp.FCSEL(S0, S1, S2, CC_CS);
 
152
        RET(CheckLast(emitter, "1e222c20 fcsel s0, s1, s2, cs"));
 
153
        float value = 1.0;
 
154
        uint8_t imm8;
 
155
        FPImm8FromFloat(value, &imm8);
 
156
        fp.FMOV(S7, imm8);
 
157
        RET(CheckLast(emitter, "1e2e1007 fmov s7, #1.000000"));
 
158
        FPImm8FromFloat(-value, &imm8);
 
159
        fp.FMOV(S7, imm8);
 
160
        RET(CheckLast(emitter, "1e3e1007 fmov s7, #-1.000000"));
 
161
        fp.FMADD(S1, S2, S3, S4);
 
162
        RET(CheckLast(emitter, "1f031041 fmadd s1, s2, s3, s4"));
 
163
        fp.FNMSUB(D1, D2, D3, D4);
 
164
        RET(CheckLast(emitter, "1f639041 fnmsub d1, d2, d3, d4"));
 
165
        fp.FMAX(S1, S2, S3);
 
166
        RET(CheckLast(emitter, "1e234841 fmax s1, s2, s3"));
 
167
        fp.FNMUL(D1, D2, D3);
 
168
        RET(CheckLast(emitter, "1e638841 fnmul d1, d2, d3"));
 
169
        fp.SCVTF(S13, W7);
 
170
        RET(CheckLast(emitter, "1e2200ed scvtf s13, w7"));
 
171
        emitter.UBFM(W1, W3, 0, 7);
 
172
        RET(CheckLast(emitter, "53001c61 ubfm w1, w3, #0, #7"));
 
173
        fp.FMOV(W1, S3);
 
174
        RET(CheckLast(emitter, "1e260061 fmov w1, s3"));
 
175
        fp.FMOV(S1, W3);
 
176
        RET(CheckLast(emitter, "1e270061 fmov s1, w3"));
 
177
        /*
 
178
        fp.FMOV(X1, D3);
 
179
        RET(CheckLast(emitter, "1e260061 fmov x1, d3"));
 
180
        fp.FMOV(D1, X3);
 
181
        RET(CheckLast(emitter, "1e270061 fmov d1, x3"));
 
182
        */
 
183
        fp.SCVTF(S13, S12);
 
184
        RET(CheckLast(emitter, "5e21d98d scvtf s13, s12"));
 
185
        fp.FCVTS(S13, S12, ROUND_N);
 
186
        RET(CheckLast(emitter, "5e21a98d fcvtns s13, s12"));
 
187
        fp.FCVTS(D13, D12, ROUND_P);
 
188
        RET(CheckLast(emitter, "5ee1a98d fcvtps d13, d12"));
 
189
        fp.FCVTS(W13, S12, ROUND_N);
 
190
        RET(CheckLast(emitter, "1e20018d fcvtns w13, s12"));
 
191
        fp.FCVTS(S22, S12, ROUND_Z);
 
192
        RET(CheckLast(emitter, "5ea1b996 fcvtzs s22, s12"));
 
193
        fp.FCVTS(X3, D2, ROUND_M);
 
194
        RET(CheckLast(emitter, "9e700043 fcvtms x3, d2"));
 
195
        fp.UCVTF(S12, X3, 8);
 
196
        RET(CheckLast(emitter, "9e03e06c ucvtf s12, x3, #8"));
 
197
        fp.SCVTF(S12, W13, 12);
 
198
        RET(CheckLast(emitter, "1e02d1ac scvtf s12, w13, #12"));
 
199
        fp.FCVTS(W12, S3, ROUND_Z);
 
200
        RET(CheckLast(emitter, "1e38006c fcvtzs w12, s3"));
 
201
        emitter.LSLV(W1, W2, W3);
 
202
        RET(CheckLast(emitter, "1ac32041 lslv w1, w2, w3"));
 
203
        emitter.LSRV(W1, W2, W3);
 
204
        RET(CheckLast(emitter, "1ac32441 lsrv w1, w2, w3"));
 
205
        emitter.UDIV(W1, W2, W3);
 
206
        RET(CheckLast(emitter, "1ac30841 udiv w1, w2, w3"));
 
207
        emitter.RBIT(W3, W2);
 
208
        RET(CheckLast(emitter, "5ac00043 rbit w3, w2"));
 
209
        emitter.CMP(W3, 3, false);
 
210
        RET(CheckLast(emitter, "71000c7f cmp w3, #3"));
 
211
        emitter.MADD(W3, W7, W1, W8);
 
212
        RET(CheckLast(emitter, "1b0120e3 madd w3, w7, w1, w8"));
 
213
        emitter.SMADDL(X3, W6, W1, X8);
 
214
        RET(CheckLast(emitter, "9b2120c3 smaddl x3, w6, w1, x8"));
 
215
        emitter.BRK(3);
 
216
        RET(CheckLast(emitter, "d4200060 brk #3"));
 
217
        emitter.CSEL(X3, X5, X7, CC_GT);
 
218
        RET(CheckLast(emitter, "9a87c0a3 csel x3, x5, x7, gt"));
 
219
        emitter.LDR(W23, X3, X12);
 
220
        RET(CheckLast(emitter, "b86c6877 ldr w23, [x3 + x12]"));
 
221
        emitter.LDP(INDEX_SIGNED, X23, X5, X3, 32);
 
222
        RET(CheckLast(emitter, "a9421477 ldp x23, x5, [x3, #32]"));
 
223
        emitter.LDP(INDEX_SIGNED, W23, W5, X3, 36);
 
224
        RET(CheckLast(emitter, "29449477 ldp w23, w5, [x3, #36]"));
 
225
        emitter.STP(INDEX_PRE, W23, W5, SP, -16);
 
226
        RET(CheckLast(emitter, "29be17f7 stp w23, w5, [x31, #-16]!"));  
 
227
        emitter.STP(INDEX_POST, W23, W5, X3, 36);
 
228
        RET(CheckLast(emitter, "28849477 stp w23, w5, [x3], #36"));
 
229
        emitter.LDP(INDEX_POST, W23, W5, X3, 36);
 
230
        RET(CheckLast(emitter, "28c49477 ldp w23, w5, [x3], #36"));
 
231
        emitter.STR(INDEX_PRE, W23, SP, -16);
 
232
        RET(CheckLast(emitter, "b81f0ff7 str w23, [x31, #-16]!"));
 
233
        emitter.STR(INDEX_UNSIGNED, W23, X3, 36);
 
234
        RET(CheckLast(emitter, "b9002477 str w23, [x3, #36]"));
 
235
        emitter.MOV(X1, X2, ArithOption(X1, ST_LSL, 14));
 
236
        RET(CheckLast(emitter, "aa023be1 mov x1, x2, lsl #14"));
 
237
        emitter.LSLV(X1, X2, X30);
 
238
        RET(CheckLast(emitter, "9ade2041 lslv x1, x2, x30"));
 
239
        emitter.CMP(W2, W30);
 
240
        RET(CheckLast(emitter, "6b1e005f cmp w2, w30"));
 
241
        emitter.ADD(X1, X2, X30);
 
242
        RET(CheckLast(emitter, "8b1e0041 add x1, x2, x30"));
 
243
        emitter.SUB(W1, W2, W30);
 
244
        RET(CheckLast(emitter, "4b1e0041 sub w1, w2, w30"));
 
245
        emitter.SUBS(W1, W2, W30);
 
246
        RET(CheckLast(emitter, "6b1e0041 subs w1, w2, w30"));
 
247
        emitter.EOR(X1, X2, X30);
 
248
        RET(CheckLast(emitter, "ca1e0041 eor x1, x2, x30"));
 
249
        emitter.AND(W1, W2, W30);
 
250
        RET(CheckLast(emitter, "0a1e0041 and w1, w2, w30"));
 
251
        emitter.ANDS(W1, W2, W30);
 
252
        RET(CheckLast(emitter, "6a1e0041 ands w1, w2, w30"));
 
253
        emitter.ORR(X1, X2, X30);
 
254
        RET(CheckLast(emitter, "aa1e0041 orr x1, x2, x30"));
 
255
        fp.FMUL(S0, S12, S22);
 
256
        RET(CheckLast(emitter, "1e360980 fmul s0, s12, s22"));
 
257
        emitter.ADD(X23, X30, 123, false);
 
258
        RET(CheckLast(emitter, "9101efd7 add x23, x30, #123"));
 
259
        emitter.MOV(X23, X30);
 
260
        RET(CheckLast(emitter, "aa1e03f7 mov x23, x30"));
 
261
        fp.FSQRT(S20, S25);
 
262
        RET(CheckLast(emitter, "1e21c334 fsqrt s20, s25"));
 
263
        fp.FNEG(S20, S25);
 
264
        RET(CheckLast(emitter, "1e214334 fneg s20, s25"));
 
265
        fp.FABS(S20, S25);
 
266
        RET(CheckLast(emitter, "1e20c334 fabs s20, s25"));
 
267
        fp.FMOV(S20, S25);
 
268
        RET(CheckLast(emitter, "1e204334 fmov s20, s25"));
 
269
        fp.MOV(Q20, Q25);
 
270
        RET(CheckLast(emitter, "4eb91f34 mov q20, q25"));
 
271
        fp.FCMP(S7);
 
272
        RET(CheckLast(emitter, "1e2020e8 fcmp s7, #0.0"));
 
273
        fp.FCMP(D7, D3);
 
274
        RET(CheckLast(emitter, "1e6320e0 fcmp d7, d3"));
 
275
        emitter.ORRI2R(X1, X3, 0x3F, INVALID_REG);
 
276
        RET(CheckLast(emitter, "b2401461 orr x1, x3, #0x3f"));
 
277
        emitter.EORI2R(X1, X3, 0x3F0000003F0, INVALID_REG);
 
278
        RET(CheckLast(emitter, "d21c1461 eor x1, x3, #0x3f0000003f0"));
 
279
 
 
280
        printf("yay!\n");
 
281
        //emitter.ANDI2R(W1, W3, 0xFF00FF00FF00FF00ULL, INVALID_REG);
 
282
        //RET(CheckLast(emitter, "00000000 and x1, x3, 0xFF00FF00FF00FF00"));
 
283
 
 
284
        // fp.FMUL(Q0, Q1, Q2);
 
285
        // RET(CheckLast(emitter, "4b3e4041 sub w1, w2, w30"));
 
286
        return true;
 
287
}