/[dynamips]/upstream/dynamips-0.2.5/amd64_trans.c
This is repository of my old source code which isn't updated any more. Go to git.rot13.org for current projects!
ViewVC logotype

Contents of /upstream/dynamips-0.2.5/amd64_trans.c

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1 - (show annotations)
Sat Oct 6 16:01:44 2007 UTC (16 years, 5 months ago) by dpavlin
File MIME type: text/plain
File size: 78066 byte(s)
import 0.2.5 from upstream

1 /*
2 * Cisco 7200 (Predator) simulation platform.
3 * Copyright (c) 2005,2006 Christophe Fillot (cf@utc.fr)
4 */
5
6 #include <stdio.h>
7 #include <stdlib.h>
8 #include <unistd.h>
9 #include <string.h>
10 #include <sys/types.h>
11 #include <sys/stat.h>
12 #include <sys/mman.h>
13 #include <fcntl.h>
14
15 #include "amd64_trans.h"
16 #include "cp0.h"
17 #include "memory.h"
18
19 /* Set an IRQ */
20 void mips64_set_irq(cpu_mips_t *cpu,m_uint8_t irq)
21 {
22 m_uint32_t m;
23 m = (1 << (irq + MIPS_CP0_CAUSE_ISHIFT)) & MIPS_CP0_CAUSE_IMASK;
24 atomic_or(&cpu->irq_cause,m);
25 }
26
27 /* Clear an IRQ */
28 void mips64_clear_irq(cpu_mips_t *cpu,m_uint8_t irq)
29 {
30 m_uint32_t m;
31 m = (1 << (irq + MIPS_CP0_CAUSE_ISHIFT)) & MIPS_CP0_CAUSE_IMASK;
32 atomic_and(&cpu->irq_cause,~m);
33
34 if (!cpu->irq_cause)
35 cpu->irq_pending = 0;
36 }
37
38 /* Load a 64 bit immediate value */
39 static inline void mips64_load_imm(insn_block_t *b,u_int reg,
40 m_uint64_t value)
41 {
42 if (value > 0xffffffffULL)
43 amd64_mov_reg_imm_size(b->jit_ptr,reg,value,8);
44 else
45 amd64_mov_reg_imm(b->jit_ptr,reg,value);
46 }
47
48 /* Set the Pointer Counter (PC) register */
49 void mips64_set_pc(insn_block_t *b,m_uint64_t new_pc)
50 {
51 mips64_load_imm(b,AMD64_RAX,new_pc);
52 amd64_mov_membase_reg(b->jit_ptr,
53 AMD64_R15,OFFSET(cpu_mips_t,pc),
54 AMD64_RAX,8);
55 }
56
57 /* Set the Return Address (RA) register */
58 void mips64_set_ra(insn_block_t *b,m_uint64_t ret_pc)
59 {
60 mips64_load_imm(b,AMD64_RAX,ret_pc);
61 amd64_mov_membase_reg(b->jit_ptr,AMD64_R15,
62 REG_OFFSET(MIPS_GPR_RA),
63 AMD64_RAX,8);
64 }
65
66 /* Set Jump */
67 static void mips64_set_jump(cpu_mips_t *cpu,insn_block_t *b,m_uint64_t new_pc,
68 int local_jump)
69 {
70 int return_to_caller = FALSE;
71 u_char *jump_ptr;
72
73 if (cpu->sym_trace && !local_jump)
74 return_to_caller = TRUE;
75
76 if (!return_to_caller && insn_block_local_addr(b,new_pc,&jump_ptr)) {
77 if (jump_ptr) {
78 amd64_jump_code(b->jit_ptr,jump_ptr);
79 } else {
80 insn_block_record_patch(b,b->jit_ptr,new_pc);
81 amd64_jump32(b->jit_ptr,0);
82 }
83 } else {
84 /* save PC */
85 mips64_set_pc(b,new_pc);
86
87 /* address is in another block, for now, returns to caller */
88 insn_block_push_epilog(b);
89 }
90 }
91
92 /* Basic C call */
93 static forced_inline
94 void mips64_emit_basic_c_call(insn_block_t *b,void *f)
95 {
96 amd64_mov_reg_imm(b->jit_ptr,AMD64_RCX,f);
97 amd64_call_reg(b->jit_ptr,AMD64_RCX);
98 }
99
100 /* Emit a simple call to a C function without any parameter */
101 static void mips64_emit_c_call(insn_block_t *b,void *f)
102 {
103 mips64_set_pc(b,b->start_pc+((b->mips_trans_pos-1)<<2));
104 amd64_mov_reg_imm(b->jit_ptr,AMD64_RCX,f);
105 amd64_call_reg(b->jit_ptr,AMD64_RCX);
106 }
107
108 /* Fast memory operation prototype */
109 typedef void (*memop_fast_access)(insn_block_t *b,int target);
110
111 /* Fast LW */
112 static void mips64_memop_fast_lw(insn_block_t *b,int target)
113 {
114 amd64_mov_reg_memindex(b->jit_ptr,AMD64_RAX,AMD64_RBX,0,AMD64_RSI,0,4);
115 amd64_bswap32(b->jit_ptr,X86_EAX);
116 amd64_movsxd_reg_reg(b->jit_ptr,AMD64_RDX,X86_EAX);
117
118 /* Save value in register */
119 amd64_mov_membase_reg(b->jit_ptr,AMD64_R15,REG_OFFSET(target),AMD64_RDX,8);
120 }
121
122 /* Fast SW */
123 static void mips64_memop_fast_sw(insn_block_t *b,int target)
124 {
125 /* Load value from register */
126 amd64_mov_reg_membase(b->jit_ptr,AMD64_RAX,AMD64_R15,REG_OFFSET(target),4);
127 amd64_bswap32(b->jit_ptr,X86_EAX);
128 amd64_mov_memindex_reg(b->jit_ptr,AMD64_RBX,0,AMD64_RSI,0,AMD64_RAX,4);
129 }
130
131 /* Fast memory operation */
132 static void mips64_emit_memop_fast(insn_block_t *b,int op,
133 int base,int offset,
134 int target,int keep_ll_bit,
135 memop_fast_access op_handler)
136 {
137 m_uint64_t val = sign_extend(offset,16);
138 u_char *test1,*test2,*test3;
139 u_char *p_exception,*p_exit;
140
141 /* RDI = CPU instance */
142 amd64_mov_reg_reg(b->jit_ptr,AMD64_RDI,AMD64_R15,8);
143
144 /* RSI = GPR[base] + sign-extended offset */
145 mips64_load_imm(b,AMD64_RSI,val);
146 amd64_alu_reg_membase(b->jit_ptr,X86_ADD,
147 AMD64_RSI,AMD64_RDI,REG_OFFSET(base));
148
149 /* RBX = mts64_entry index */
150 amd64_mov_reg_reg(b->jit_ptr,AMD64_RBX,AMD64_RSI,8);
151 amd64_shift_reg_imm(b->jit_ptr,X86_SHR,AMD64_RBX,MTS64_HASH_SHIFT);
152 amd64_alu_reg_imm(b->jit_ptr,X86_AND,AMD64_RBX,MTS64_HASH_MASK);
153
154 /* RCX = mts64_cache */
155 amd64_mov_reg_membase(b->jit_ptr,AMD64_RCX,
156 AMD64_R15,OFFSET(cpu_mips_t,mts64_cache),8);
157
158 /* RAX = mts64_entry */
159 amd64_mov_reg_memindex(b->jit_ptr,AMD64_RAX,AMD64_RCX,0,AMD64_RBX,3,8);
160
161 /* Do we have a non-null entry ? */
162 amd64_test_reg_reg_size(b->jit_ptr,AMD64_RAX,AMD64_RAX,8);
163 test1 = b->jit_ptr;
164 amd64_branch8(b->jit_ptr, X86_CC_Z, 0, 1);
165
166 /* RCX = start */
167 amd64_mov_reg_membase(b->jit_ptr,AMD64_RCX,
168 AMD64_RAX,OFFSET(mts64_entry_t,start),8);
169
170 /* RDX = mask (sign-extended), RBX = action */
171 amd64_mov_reg_membase(b->jit_ptr,AMD64_RDX,
172 AMD64_RAX,OFFSET(mts64_entry_t,mask),4);
173 amd64_mov_reg_membase(b->jit_ptr,AMD64_RBX,
174 AMD64_RAX,OFFSET(mts64_entry_t,action),8);
175 amd64_movsxd_reg_reg(b->jit_ptr,AMD64_RDX,X86_EDX);
176 amd64_alu_reg_reg(b->jit_ptr,X86_AND,AMD64_RDX,AMD64_RSI);
177
178 /* Virtual Address in the good range ? */
179 amd64_alu_reg_reg(b->jit_ptr,X86_CMP,AMD64_RDX,AMD64_RCX);
180 test2 = b->jit_ptr;
181 amd64_branch8(b->jit_ptr, X86_CC_NE, 0, 1);
182
183 /* Device access ? */
184 amd64_mov_reg_reg(b->jit_ptr,AMD64_R8,AMD64_RBX,8);
185 amd64_alu_reg_imm(b->jit_ptr,X86_AND,AMD64_R8,MTS_DEV_MASK);
186 test3 = b->jit_ptr;
187 amd64_branch8(b->jit_ptr, X86_CC_NZ, 0, 1);
188
189 /* === Fast access === */
190 amd64_alu_reg_reg(b->jit_ptr,X86_SUB,AMD64_RSI,AMD64_RCX);
191
192 /* Memory access */
193 op_handler(b,target);
194
195 p_exit = b->jit_ptr;
196 amd64_jump8(b->jit_ptr,0);
197
198 /* === Slow lookup === */
199 amd64_patch(test1,b->jit_ptr);
200 amd64_patch(test2,b->jit_ptr);
201 amd64_patch(test3,b->jit_ptr);
202
203 /* Save PC for exception handling */
204 mips64_set_pc(b,b->start_pc+((b->mips_trans_pos-1)<<2));
205
206 /* RDX = target register */
207 amd64_mov_reg_imm(b->jit_ptr,AMD64_RDX,target);
208
209 /* Call memory access function */
210 amd64_call_membase(b->jit_ptr,AMD64_RDI,MEMOP_OFFSET(op));
211
212 /* Exception ? */
213 amd64_test_reg_reg_size(b->jit_ptr,AMD64_RAX,AMD64_RAX,4);
214 p_exception = b->jit_ptr;
215 amd64_branch8(b->jit_ptr, X86_CC_Z, 0, 1);
216 insn_block_push_epilog(b);
217
218 amd64_patch(p_exit,b->jit_ptr);
219 amd64_patch(p_exception,b->jit_ptr);
220 }
221
222 /* Memory operation */
223 static void mips64_emit_memop(insn_block_t *b,int op,int base,int offset,
224 int target,int keep_ll_bit)
225 {
226 m_uint64_t val = sign_extend(offset,16);
227 u_char *test1;
228
229 /* Save PC for exception handling */
230 mips64_set_pc(b,b->start_pc+((b->mips_trans_pos-1)<<2));
231
232 /* RDI = CPU instance */
233 amd64_mov_reg_reg(b->jit_ptr,AMD64_RDI,AMD64_R15,8);
234
235 if (!keep_ll_bit) {
236 amd64_clear_reg(b->jit_ptr,AMD64_RCX);
237 amd64_mov_membase_reg(b->jit_ptr,AMD64_RDI,OFFSET(cpu_mips_t,ll_bit),
238 X86_ECX,4);
239 }
240
241 /* RSI = GPR[base] + sign-extended offset */
242 mips64_load_imm(b,AMD64_RSI,val);
243 amd64_alu_reg_membase(b->jit_ptr,X86_ADD,
244 AMD64_RSI,AMD64_RDI,REG_OFFSET(base));
245
246 /* RDX = target register */
247 amd64_mov_reg_imm(b->jit_ptr,AMD64_RDX,target);
248
249 /* Call memory access function */
250 amd64_call_membase(b->jit_ptr,AMD64_RDI,MEMOP_OFFSET(op));
251
252 /* Exception ? */
253 amd64_test_reg_reg_size(b->jit_ptr,AMD64_RAX,AMD64_RAX,4);
254 test1 = b->jit_ptr;
255 amd64_branch8(b->jit_ptr, X86_CC_Z, 0, 1);
256 insn_block_push_epilog(b);
257 amd64_patch(test1,b->jit_ptr);
258 }
259
260 /* Coprocessor Register transfert operation */
261 static void mips64_emit_cp_xfr_op(insn_block_t *b,int rt,int rd,void *f)
262 {
263 /* update pc */
264 mips64_set_pc(b,b->start_pc+((b->mips_trans_pos-1)<<2));
265
266 /* cp0 register */
267 amd64_mov_reg_imm(b->jit_ptr,AMD64_RDX,rd);
268
269 /* gpr */
270 amd64_mov_reg_imm(b->jit_ptr,AMD64_RSI,rt);
271
272 /* cpu instance */
273 amd64_mov_reg_reg(b->jit_ptr,AMD64_RDI,AMD64_R15,8);
274
275 mips64_emit_basic_c_call(b,f);
276 }
277
278 /* Virtual Breakpoint */
279 void mips64_emit_breakpoint(insn_block_t *b)
280 {
281 amd64_mov_reg_reg(b->jit_ptr,AMD64_RDI,AMD64_R15,8);
282 mips64_emit_c_call(b,mips64_run_breakpoint);
283 }
284
285 /* Unknown opcode handler */
286 static fastcall void mips64_unknown_opcode(cpu_mips_t *cpu,m_uint32_t opcode)
287 {
288 printf("CPU = %p\n",cpu);
289
290 printf("MIPS64: unhandled opcode 0x%8.8x at 0x%llx (ra=0x%llx)\n",
291 opcode,cpu->pc,cpu->gpr[MIPS_GPR_RA]);
292
293 mips64_dump_regs(cpu);
294 }
295
296 /* Emit unhandled instruction code */
297 static int mips64_emit_unknown(cpu_mips_t *cpu,insn_block_t *b,
298 mips_insn_t opcode)
299 {
300 amd64_mov_reg_imm(b->jit_ptr,AMD64_RSI,opcode);
301 amd64_mov_reg_reg(b->jit_ptr,AMD64_RDI,AMD64_R15,8);
302
303 mips64_emit_c_call(b,mips64_unknown_opcode);
304 return(0);
305 }
306
307 /* Invalid delay slot handler */
308 static fastcall void mips64_invalid_delay_slot(cpu_mips_t *cpu)
309 {
310 printf("MIPS64: invalid instruction in delay slot at 0x%llx (ra=0x%llx)\n",
311 cpu->pc,cpu->gpr[MIPS_GPR_RA]);
312
313 mips64_dump_regs(cpu);
314
315 /* Halt the virtual CPU */
316 cpu->pc = 0;
317 }
318
319 /* Emit unhandled instruction code */
320 int mips64_emit_invalid_delay_slot(insn_block_t *b)
321 {
322 amd64_mov_reg_reg(b->jit_ptr,AMD64_RDI,AMD64_R15,8);
323 mips64_emit_c_call(b,mips64_invalid_delay_slot);
324 return(0);
325 }
326
327 /*
328 * Increment count register and trigger the timer IRQ if value in compare
329 * register is the same.
330 */
331 void mips64_inc_cp0_count_reg(insn_block_t *b)
332 {
333 amd64_inc_membase(b->jit_ptr,AMD64_R15,OFFSET(cpu_mips_t,cp0_virt_cnt_reg));
334
335 #if 0 /* TIMER_IRQ */
336 u_char *test1;
337
338 /* increment the virtual count register */
339 amd64_mov_reg_membase(b->jit_ptr,AMD64_RAX,
340 AMD64_R15,OFFSET(cpu_mips_t,cp0_virt_cnt_reg),4);
341 amd64_inc_reg_size(b->jit_ptr,AMD64_RAX,4);
342 amd64_mov_membase_reg(b->jit_ptr,AMD64_R15,
343 OFFSET(cpu_mips_t,cp0_virt_cnt_reg),
344 AMD64_RAX,4);
345
346 /* check with the virtual compare register */
347 amd64_alu_reg_membase_size(b->jit_ptr,X86_CMP,AMD64_RAX,
348 AMD64_R15,OFFSET(cpu_mips_t,cp0_virt_cmp_reg),4);
349 test1 = b->jit_ptr;
350 amd64_branch8(b->jit_ptr, X86_CC_NE, 0, 1);
351
352 /* we have to trigger the timer irq */
353 amd64_mov_reg_reg(b->jit_ptr,AMD64_RDI,AMD64_R15,8);
354 mips64_emit_basic_c_call(b,mips64_trigger_timer_irq);
355
356 amd64_patch(test1,b->jit_ptr);
357 #endif
358 }
359
360 /* Check if there are pending IRQ */
361 void mips64_check_pending_irq(insn_block_t *b)
362 {
363 u_char *test1;
364
365 /* Check the pending IRQ flag */
366 amd64_mov_reg_membase(b->jit_ptr,AMD64_RAX,
367 AMD64_R15,OFFSET(cpu_mips_t,irq_pending),4);
368
369 amd64_test_reg_reg_size(b->jit_ptr,AMD64_RAX,AMD64_RAX,4);
370 test1 = b->jit_ptr;
371 amd64_branch8(b->jit_ptr, X86_CC_Z, 0, 1);
372
373 /* Update PC */
374 mips64_set_pc(b,b->start_pc+((b->mips_trans_pos-1)<<2));
375
376 /* Trigger the IRQ */
377 amd64_mov_reg_reg(b->jit_ptr,AMD64_RDI,AMD64_R15,8);
378 mips64_emit_basic_c_call(b,mips64_trigger_irq);
379 insn_block_push_epilog(b);
380
381 amd64_patch(test1,b->jit_ptr);
382 }
383
384 /* Increment the number of executed instructions (performance debugging) */
385 void mips64_inc_perf_counter(insn_block_t *b)
386 {
387 amd64_inc_membase(b->jit_ptr,AMD64_R15,OFFSET(cpu_mips_t,perf_counter));
388 }
389
390 /* ADD */
391 static int mips64_emit_ADD(cpu_mips_t *cpu,insn_block_t *b,mips_insn_t insn)
392 {
393 int rs = bits(insn,21,25);
394 int rt = bits(insn,16,20);
395 int rd = bits(insn,11,15);
396
397 amd64_mov_reg_membase(b->jit_ptr,AMD64_RAX,AMD64_R15,REG_OFFSET(rs),8);
398 amd64_alu_reg_membase(b->jit_ptr,X86_ADD,AMD64_RAX,AMD64_R15,
399 REG_OFFSET(rt));
400
401 amd64_movsxd_reg_reg(b->jit_ptr,AMD64_RAX,X86_EAX);
402 amd64_mov_membase_reg(b->jit_ptr,AMD64_R15,REG_OFFSET(rd),AMD64_RAX,8);
403 return(0);
404 }
405
406 /* ADDI */
407 static int mips64_emit_ADDI(cpu_mips_t *cpu,insn_block_t *b,mips_insn_t insn)
408 {
409 int rs = bits(insn,21,25);
410 int rt = bits(insn,16,20);
411 int imm = bits(insn,0,15);
412 m_uint64_t val = sign_extend(imm,16);
413
414 /* TODO: Exception handling */
415
416 mips64_load_imm(b,AMD64_RAX,val);
417 amd64_alu_reg_membase(b->jit_ptr,X86_ADD,AMD64_RAX,
418 AMD64_R15,REG_OFFSET(rs));
419
420 amd64_movsxd_reg_reg(b->jit_ptr,AMD64_RAX,X86_EAX);
421 amd64_mov_membase_reg(b->jit_ptr,AMD64_R15,REG_OFFSET(rt),AMD64_RAX,8);
422 return(0);
423 }
424
425 /* ADDIU */
426 static int mips64_emit_ADDIU(cpu_mips_t *cpu,insn_block_t *b,mips_insn_t insn)
427 {
428 int rs = bits(insn,21,25);
429 int rt = bits(insn,16,20);
430 int imm = bits(insn,0,15);
431 m_uint64_t val = sign_extend(imm,16);
432
433 mips64_load_imm(b,AMD64_RAX,val);
434
435 if (rs != 0) {
436 amd64_alu_reg_membase(b->jit_ptr,X86_ADD,AMD64_RAX,
437 AMD64_R15,REG_OFFSET(rs));
438 }
439
440 amd64_movsxd_reg_reg(b->jit_ptr,AMD64_RDX,X86_EAX);
441 amd64_mov_membase_reg(b->jit_ptr,AMD64_R15,REG_OFFSET(rt),AMD64_RDX,8);
442 return(0);
443 }
444
445 /* ADDU */
446 static int mips64_emit_ADDU(cpu_mips_t *cpu,insn_block_t *b,mips_insn_t insn)
447 {
448 int rs = bits(insn,21,25);
449 int rt = bits(insn,16,20);
450 int rd = bits(insn,11,15);
451
452 amd64_mov_reg_membase(b->jit_ptr,AMD64_RAX,AMD64_R15,REG_OFFSET(rs),8);
453 amd64_alu_reg_membase(b->jit_ptr,X86_ADD,AMD64_RAX,AMD64_R15,
454 REG_OFFSET(rt));
455
456 amd64_movsxd_reg_reg(b->jit_ptr,AMD64_RAX,X86_EAX);
457 amd64_mov_membase_reg(b->jit_ptr,AMD64_R15,REG_OFFSET(rd),AMD64_RAX,8);
458 return(0);
459 }
460
461 /* AND */
462 static int mips64_emit_AND(cpu_mips_t *cpu,insn_block_t *b,mips_insn_t insn)
463 {
464 int rs = bits(insn,21,25);
465 int rt = bits(insn,16,20);
466 int rd = bits(insn,11,15);
467
468 amd64_mov_reg_membase(b->jit_ptr,AMD64_RAX,AMD64_R15,REG_OFFSET(rs),8);
469 amd64_alu_reg_membase(b->jit_ptr,X86_AND,AMD64_RAX,AMD64_R15,
470 REG_OFFSET(rt));
471 amd64_mov_membase_reg(b->jit_ptr,AMD64_R15,REG_OFFSET(rd),AMD64_RAX,8);
472 return(0);
473 }
474
475 /* ANDI */
476 static int mips64_emit_ANDI(cpu_mips_t *cpu,insn_block_t *b,mips_insn_t insn)
477 {
478 int rs = bits(insn,21,25);
479 int rt = bits(insn,16,20);
480 int imm = bits(insn,0,15);
481
482 mips64_load_imm(b,AMD64_RAX,imm);
483
484 amd64_alu_reg_membase(b->jit_ptr,X86_AND,AMD64_RAX,
485 AMD64_R15,REG_OFFSET(rs));
486
487 amd64_mov_membase_reg(b->jit_ptr,AMD64_R15,REG_OFFSET(rt),AMD64_RAX,8);
488 return(0);
489 }
490
491 /* B (Branch, virtual instruction) */
492 static int mips64_emit_B(cpu_mips_t *cpu,insn_block_t *b,mips_insn_t insn)
493 {
494 int offset = bits(insn,0,15);
495 m_uint64_t new_pc;
496
497 /* compute the new pc */
498 new_pc = b->start_pc + (b->mips_trans_pos << 2);
499 new_pc += sign_extend(offset << 2,18);
500
501 /* insert the instruction in the delay slot */
502 insn_fetch_and_emit(cpu,b,1);
503
504 /* set the new pc in cpu structure */
505 mips64_set_jump(cpu,b,new_pc,1);
506 return(0);
507 }
508
509 /* BAL (Branch and Link, virtual instruction) */
510 static int mips64_emit_BAL(cpu_mips_t *cpu,insn_block_t *b,mips_insn_t insn)
511 {
512 int offset = bits(insn,0,15);
513 m_uint64_t new_pc;
514
515 /* compute the new pc */
516 new_pc = b->start_pc + (b->mips_trans_pos << 2);
517 new_pc += sign_extend(offset << 2,18);
518
519 /* set the return address (instruction after the delay slot) */
520 mips64_set_ra(b,b->start_pc + ((b->mips_trans_pos + 1) << 2));
521
522 /* insert the instruction in the delay slot */
523 insn_fetch_and_emit(cpu,b,1);
524
525 /* set the new pc in cpu structure */
526 mips64_set_jump(cpu,b,new_pc,0);
527 return(0);
528 }
529
530 /* BEQ (Branch On Equal) */
531 static int mips64_emit_BEQ(cpu_mips_t *cpu,insn_block_t *b,mips_insn_t insn)
532 {
533 int rs = bits(insn,21,25);
534 int rt = bits(insn,16,20);
535 int offset = bits(insn,0,15);
536 u_char *test1;
537 m_uint64_t new_pc;
538
539 /* compute the new pc */
540 new_pc = b->start_pc + (b->mips_trans_pos << 2);
541 new_pc += sign_extend(offset << 2,18);
542
543 /*
544 * compare gpr[rs] and gpr[rt].
545 */
546 amd64_mov_reg_membase(b->jit_ptr,AMD64_RAX,AMD64_R15,REG_OFFSET(rs),8);
547 amd64_alu_reg_membase(b->jit_ptr,X86_CMP,AMD64_RAX,
548 AMD64_R15,REG_OFFSET(rt));
549 test1 = b->jit_ptr;
550 amd64_branch32(b->jit_ptr, X86_CC_NE, 0, 1);
551
552 /* insert the instruction in the delay slot */
553 insn_fetch_and_emit(cpu,b,2);
554
555 /* set the new pc in cpu structure */
556 mips64_set_jump(cpu,b,new_pc,1);
557
558 amd64_patch(test1,b->jit_ptr);
559
560 /* if the branch is not taken, we have to execute the delay slot too */
561 insn_fetch_and_emit(cpu,b,1);
562 return(0);
563 }
564
565 /* BEQL (Branch On Equal Likely) */
566 static int mips64_emit_BEQL(cpu_mips_t *cpu,insn_block_t *b,mips_insn_t insn)
567 {
568 int rs = bits(insn,21,25);
569 int rt = bits(insn,16,20);
570 int offset = bits(insn,0,15);
571 u_char *test1;
572 m_uint64_t new_pc;
573
574 /* compute the new pc */
575 new_pc = b->start_pc + (b->mips_trans_pos << 2);
576 new_pc += sign_extend(offset << 2,18);
577
578 /*
579 * compare gpr[rs] and gpr[rt].
580 */
581 amd64_mov_reg_membase(b->jit_ptr,AMD64_RAX,AMD64_R15,REG_OFFSET(rs),8);
582 amd64_alu_reg_membase(b->jit_ptr,X86_CMP,AMD64_RAX,
583 AMD64_R15,REG_OFFSET(rt));
584 test1 = b->jit_ptr;
585 amd64_branch32(b->jit_ptr, X86_CC_NE, 0, 1);
586
587 /* insert the instruction in the delay slot */
588 insn_fetch_and_emit(cpu,b,1);
589
590 /* set the new pc in cpu structure */
591 mips64_set_jump(cpu,b,new_pc,1);
592
593 amd64_patch(test1,b->jit_ptr);
594 return(0);
595 }
596
597 /* BEQZ (Branch On Equal Zero) */
598 static int mips64_emit_BEQZ(cpu_mips_t *cpu,insn_block_t *b,mips_insn_t insn)
599 {
600 int rs = bits(insn,21,25);
601 int offset = bits(insn,0,15);
602 u_char *test1;
603 m_uint64_t new_pc;
604
605 /* compute the new pc */
606 new_pc = b->start_pc + (b->mips_trans_pos << 2);
607 new_pc += sign_extend(offset << 2,18);
608
609 /*
610 * compare gpr[rs] with 0.
611 */
612 amd64_mov_reg_membase(b->jit_ptr,AMD64_RAX,AMD64_R15,REG_OFFSET(rs),8);
613 amd64_test_reg_reg(b->jit_ptr,AMD64_RAX,AMD64_RAX);
614 test1 = b->jit_ptr;
615 amd64_branch32(b->jit_ptr, X86_CC_NZ, 0, 1);
616
617 /* insert the instruction in the delay slot */
618 insn_fetch_and_emit(cpu,b,2);
619
620 /* set the new pc in cpu structure */
621 mips64_set_jump(cpu,b,new_pc,1);
622
623 amd64_patch(test1,b->jit_ptr);
624
625 /* if the branch is not taken, we have to execute the delay slot too */
626 insn_fetch_and_emit(cpu,b,1);
627 return(0);
628 }
629
630 /* BNEZ (Branch On Not Equal Zero) */
631 static int mips64_emit_BNEZ(cpu_mips_t *cpu,insn_block_t *b,mips_insn_t insn)
632 {
633 int rs = bits(insn,21,25);
634 int offset = bits(insn,0,15);
635 u_char *test1;
636 m_uint64_t new_pc;
637
638 /* compute the new pc */
639 new_pc = b->start_pc + (b->mips_trans_pos << 2);
640 new_pc += sign_extend(offset << 2,18);
641
642 /*
643 * compare gpr[rs] with 0.
644 */
645 amd64_mov_reg_membase(b->jit_ptr,AMD64_RAX,AMD64_R15,REG_OFFSET(rs),8);
646 amd64_test_reg_reg(b->jit_ptr,AMD64_RAX,AMD64_RAX);
647 test1 = b->jit_ptr;
648 amd64_branch32(b->jit_ptr, X86_CC_Z, 0, 1);
649
650 /* insert the instruction in the delay slot */
651 insn_fetch_and_emit(cpu,b,2);
652
653 /* set the new pc in cpu structure */
654 mips64_set_jump(cpu,b,new_pc,1);
655
656 amd64_patch(test1,b->jit_ptr);
657
658 /* if the branch is not taken, we have to execute the delay slot too */
659 insn_fetch_and_emit(cpu,b,1);
660 return(0);
661 }
662
663 /* BGEZ (Branch On Greater or Equal Than Zero) */
664 static int mips64_emit_BGEZ(cpu_mips_t *cpu,insn_block_t *b,mips_insn_t insn)
665 {
666 int rs = bits(insn,21,25);
667 int offset = bits(insn,0,15);
668 u_char *test1;
669 m_uint64_t new_pc;
670
671 /* compute the new pc */
672 new_pc = b->start_pc + (b->mips_trans_pos << 2);
673 new_pc += sign_extend(offset << 2,18);
674
675 /* If sign bit is set, don't take the branch */
676 amd64_mov_reg_membase(b->jit_ptr,AMD64_RAX,AMD64_R15,REG_OFFSET(rs),8);
677 amd64_test_reg_reg(b->jit_ptr,AMD64_RAX,AMD64_RAX);
678 test1 = b->jit_ptr;
679 amd64_branch32(b->jit_ptr, X86_CC_S, 0, 1);
680
681 /* insert the instruction in the delay slot */
682 insn_fetch_and_emit(cpu,b,2);
683
684 /* set the new pc in cpu structure */
685 mips64_set_jump(cpu,b,new_pc,1);
686
687 amd64_patch(test1,b->jit_ptr);
688
689 /* if the branch is not taken, we have to execute the delay slot too */
690 insn_fetch_and_emit(cpu,b,1);
691 return(0);
692 }
693
694 /* BGEZAL (Branch On Greater or Equal Than Zero And Link) */
695 static int mips64_emit_BGEZAL(cpu_mips_t *cpu,insn_block_t *b,mips_insn_t insn)
696 {
697 int rs = bits(insn,21,25);
698 int offset = bits(insn,0,15);
699 u_char *test1;
700 m_uint64_t new_pc;
701
702 /* compute the new pc */
703 new_pc = b->start_pc + (b->mips_trans_pos << 2);
704 new_pc += sign_extend(offset << 2,18);
705
706 /* set the return address (instruction after the delay slot) */
707 mips64_set_ra(b,b->start_pc + ((b->mips_trans_pos + 1) << 2));
708
709 /* If sign bit is set, don't take the branch */
710 amd64_mov_reg_membase(b->jit_ptr,AMD64_RAX,AMD64_R15,REG_OFFSET(rs),8);
711 amd64_test_reg_reg(b->jit_ptr,AMD64_RAX,AMD64_RAX);
712 test1 = b->jit_ptr;
713 amd64_branch32(b->jit_ptr, X86_CC_S, 0, 1);
714
715 /* insert the instruction in the delay slot */
716 insn_fetch_and_emit(cpu,b,2);
717
718 /* set the new pc in cpu structure */
719 mips64_set_jump(cpu,b,new_pc,1);
720
721 amd64_patch(test1,b->jit_ptr);
722
723 /* if the branch is not taken, we have to execute the delay slot too */
724 insn_fetch_and_emit(cpu,b,1);
725 return(0);
726 }
727
728 /* BGEZALL (Branch On Greater or Equal Than Zero And Link Likely) */
729 static int mips64_emit_BGEZALL(cpu_mips_t *cpu,insn_block_t *b,
730 mips_insn_t insn)
731 {
732 int rs = bits(insn,21,25);
733 int offset = bits(insn,0,15);
734 u_char *test1;
735 m_uint64_t new_pc;
736
737 /* compute the new pc */
738 new_pc = b->start_pc + (b->mips_trans_pos << 2);
739 new_pc += sign_extend(offset << 2,18);
740
741 /* set the return address (instruction after the delay slot) */
742 mips64_set_ra(b,b->start_pc + ((b->mips_trans_pos + 1) << 2));
743
744 /* If sign bit is set, don't take the branch */
745 amd64_mov_reg_membase(b->jit_ptr,AMD64_RAX,AMD64_R15,REG_OFFSET(rs),8);
746 amd64_test_reg_reg(b->jit_ptr,AMD64_RAX,AMD64_RAX);
747 test1 = b->jit_ptr;
748 amd64_branch32(b->jit_ptr, X86_CC_S, 0, 1);
749
750 /* insert the instruction in the delay slot */
751 insn_fetch_and_emit(cpu,b,1);
752
753 /* set the new pc in cpu structure */
754 mips64_set_jump(cpu,b,new_pc,1);
755
756 amd64_patch(test1,b->jit_ptr);
757 return(0);
758 }
759
760 /* BGEZL (Branch On Greater or Equal Than Zero Likely) */
761 static int mips64_emit_BGEZL(cpu_mips_t *cpu,insn_block_t *b,mips_insn_t insn)
762 {
763 int rs = bits(insn,21,25);
764 int offset = bits(insn,0,15);
765 u_char *test1;
766 m_uint64_t new_pc;
767
768 /* compute the new pc */
769 new_pc = b->start_pc + (b->mips_trans_pos << 2);
770 new_pc += sign_extend(offset << 2,18);
771
772 /* If sign bit is set, don't take the branch */
773 amd64_mov_reg_membase(b->jit_ptr,AMD64_RAX,AMD64_R15,REG_OFFSET(rs),8);
774 amd64_test_reg_reg(b->jit_ptr,AMD64_RAX,AMD64_RAX);
775 test1 = b->jit_ptr;
776 amd64_branch32(b->jit_ptr, X86_CC_S, 0, 1);
777
778 /* insert the instruction in the delay slot */
779 insn_fetch_and_emit(cpu,b,1);
780
781 /* set the new pc in cpu structure */
782 mips64_set_jump(cpu,b,new_pc,1);
783
784 amd64_patch(test1,b->jit_ptr);
785 return(0);
786 }
787
788 /* BGTZ (Branch On Greater Than Zero) */
789 static int mips64_emit_BGTZ(cpu_mips_t *cpu,insn_block_t *b,mips_insn_t insn)
790 {
791 int rs = bits(insn,21,25);
792 int offset = bits(insn,0,15);
793 u_char *test1;
794 m_uint64_t new_pc;
795
796 /* compute the new pc */
797 new_pc = b->start_pc + (b->mips_trans_pos << 2);
798 new_pc += sign_extend(offset << 2,18);
799
800 /* compare reg to zero */
801 amd64_mov_reg_membase(b->jit_ptr,AMD64_RAX,AMD64_R15,REG_OFFSET(rs),8);
802 amd64_clear_reg(b->jit_ptr,AMD64_RCX);
803
804 amd64_alu_reg_reg(b->jit_ptr,X86_CMP,AMD64_RAX,AMD64_RCX);
805 test1 = b->jit_ptr;
806 amd64_branch32(b->jit_ptr, X86_CC_LE, 0, 1);
807
808 /* insert the instruction in the delay slot */
809 insn_fetch_and_emit(cpu,b,2);
810
811 /* set the new pc in cpu structure */
812 mips64_set_jump(cpu,b,new_pc,1);
813
814 amd64_patch(test1,b->jit_ptr);
815
816 /* if the branch is not taken, we have to execute the delay slot too */
817 insn_fetch_and_emit(cpu,b,1);
818 return(0);
819 }
820
821 /* BGTZL (Branch On Greater Than Zero Likely) */
822 static int mips64_emit_BGTZL(cpu_mips_t *cpu,insn_block_t *b,mips_insn_t insn)
823 {
824 int rs = bits(insn,21,25);
825 int offset = bits(insn,0,15);
826 u_char *test1;
827 m_uint64_t new_pc;
828
829 /* compute the new pc */
830 new_pc = b->start_pc + (b->mips_trans_pos << 2);
831 new_pc += sign_extend(offset << 2,18);
832
833 /* compare reg to zero */
834 amd64_mov_reg_membase(b->jit_ptr,AMD64_RAX,AMD64_R15,REG_OFFSET(rs),8);
835 amd64_clear_reg(b->jit_ptr,AMD64_RCX);
836
837 amd64_alu_reg_reg(b->jit_ptr,X86_CMP,AMD64_RAX,AMD64_RCX);
838 test1 = b->jit_ptr;
839 amd64_branch32(b->jit_ptr, X86_CC_LE, 0, 1);
840
841 /* insert the instruction in the delay slot */
842 insn_fetch_and_emit(cpu,b,1);
843
844 /* set the new pc in cpu structure */
845 mips64_set_jump(cpu,b,new_pc,1);
846
847 amd64_patch(test1,b->jit_ptr);
848 return(0);
849 }
850
851 /* BLEZ (Branch On Less or Equal Than Zero) */
852 static int mips64_emit_BLEZ(cpu_mips_t *cpu,insn_block_t *b,mips_insn_t insn)
853 {
854 int rs = bits(insn,21,25);
855 int offset = bits(insn,0,15);
856 u_char *test1;
857 m_uint64_t new_pc;
858
859 /* compute the new pc */
860 new_pc = b->start_pc + (b->mips_trans_pos << 2);
861 new_pc += sign_extend(offset << 2,18);
862
863 /* compare reg to zero */
864 amd64_mov_reg_membase(b->jit_ptr,AMD64_RAX,AMD64_R15,REG_OFFSET(rs),8);
865 amd64_clear_reg(b->jit_ptr,AMD64_RCX);
866
867 amd64_alu_reg_reg(b->jit_ptr,X86_CMP,AMD64_RAX,AMD64_RCX);
868 test1 = b->jit_ptr;
869 amd64_branch32(b->jit_ptr, X86_CC_GT, 0, 1);
870
871 /* insert the instruction in the delay slot */
872 insn_fetch_and_emit(cpu,b,2);
873
874 /* set the new pc in cpu structure */
875 mips64_set_jump(cpu,b,new_pc,1);
876
877 amd64_patch(test1,b->jit_ptr);
878
879 /* if the branch is not taken, we have to execute the delay slot too */
880 insn_fetch_and_emit(cpu,b,1);
881 return(0);
882 }
883
884 /* BLEZL (Branch On Less or Equal Than Zero Likely) */
885 static int mips64_emit_BLEZL(cpu_mips_t *cpu,insn_block_t *b,mips_insn_t insn)
886 {
887 int rs = bits(insn,21,25);
888 int offset = bits(insn,0,15);
889 u_char *test1;
890 m_uint64_t new_pc;
891
892 /* compute the new pc */
893 new_pc = b->start_pc + (b->mips_trans_pos << 2);
894 new_pc += sign_extend(offset << 2,18);
895
896 /* compare reg to zero */
897 amd64_mov_reg_membase(b->jit_ptr,AMD64_RAX,AMD64_R15,REG_OFFSET(rs),8);
898 amd64_clear_reg(b->jit_ptr,AMD64_RCX);
899
900 amd64_alu_reg_reg(b->jit_ptr,X86_CMP,AMD64_RAX,AMD64_RCX);
901 test1 = b->jit_ptr;
902 amd64_branch32(b->jit_ptr, X86_CC_GT, 0, 1);
903
904 /* insert the instruction in the delay slot */
905 insn_fetch_and_emit(cpu,b,1);
906
907 /* set the new pc in cpu structure */
908 mips64_set_jump(cpu,b,new_pc,1);
909
910 amd64_patch(test1,b->jit_ptr);
911 return(0);
912 }
913
914 /* BLTZ (Branch On Less Than Zero) */
915 static int mips64_emit_BLTZ(cpu_mips_t *cpu,insn_block_t *b,mips_insn_t insn)
916 {
917 int rs = bits(insn,21,25);
918 int offset = bits(insn,0,15);
919 u_char *test1;
920 m_uint64_t new_pc;
921
922 /* compute the new pc */
923 new_pc = b->start_pc + (b->mips_trans_pos << 2);
924 new_pc += sign_extend(offset << 2,18);
925
926 /* If sign bit isn't set, don't take the branch */
927 amd64_mov_reg_membase(b->jit_ptr,AMD64_RAX,AMD64_R15,REG_OFFSET(rs),8);
928 amd64_test_reg_reg(b->jit_ptr,AMD64_RAX,AMD64_RAX);
929 test1 = b->jit_ptr;
930 amd64_branch32(b->jit_ptr, X86_CC_NS, 0, 1);
931
932 /* insert the instruction in the delay slot */
933 insn_fetch_and_emit(cpu,b,2);
934
935 /* set the new pc in cpu structure */
936 mips64_set_jump(cpu,b,new_pc,1);
937
938 amd64_patch(test1,b->jit_ptr);
939
940 /* if the branch is not taken, we have to execute the delay slot too */
941 insn_fetch_and_emit(cpu,b,1);
942 return(0);
943 }
944
945 /* BLTZAL (Branch On Less Than Zero And Link) */
946 static int mips64_emit_BLTZAL(cpu_mips_t *cpu,insn_block_t *b,mips_insn_t insn)
947 {
948 int rs = bits(insn,21,25);
949 int offset = bits(insn,0,15);
950 u_char *test1;
951 m_uint64_t new_pc;
952
953 /* compute the new pc */
954 new_pc = b->start_pc + (b->mips_trans_pos << 2);
955 new_pc += sign_extend(offset << 2,18);
956
957 /* set the return address (instruction after the delay slot) */
958 mips64_set_ra(b,b->start_pc + ((b->mips_trans_pos + 1) << 2));
959
960 /* If sign bit isn't set, don't take the branch */
961 amd64_mov_reg_membase(b->jit_ptr,AMD64_RAX,AMD64_R15,REG_OFFSET(rs),8);
962 amd64_test_reg_reg(b->jit_ptr,AMD64_RAX,AMD64_RAX);
963 test1 = b->jit_ptr;
964 amd64_branch32(b->jit_ptr, X86_CC_NS, 0, 1);
965
966 /* insert the instruction in the delay slot */
967 insn_fetch_and_emit(cpu,b,2);
968
969 /* set the new pc in cpu structure */
970 mips64_set_jump(cpu,b,new_pc,1);
971
972 amd64_patch(test1,b->jit_ptr);
973
974 /* if the branch is not taken, we have to execute the delay slot too */
975 insn_fetch_and_emit(cpu,b,1);
976 return(0);
977 }
978
979 /* BLTZALL (Branch On Less Than Zero And Link Likely) */
980 static int mips64_emit_BLTZALL(cpu_mips_t *cpu,insn_block_t *b,
981 mips_insn_t insn)
982 {
983 int rs = bits(insn,21,25);
984 int offset = bits(insn,0,15);
985 u_char *test1;
986 m_uint64_t new_pc;
987
988 /* compute the new pc */
989 new_pc = b->start_pc + (b->mips_trans_pos << 2);
990 new_pc += sign_extend(offset << 2,18);
991
992 /* set the return address (instruction after the delay slot) */
993 mips64_set_ra(b,b->start_pc + ((b->mips_trans_pos + 1) << 2));
994
995 /* If sign bit isn't set, don't take the branch */
996 amd64_mov_reg_membase(b->jit_ptr,AMD64_RAX,AMD64_R15,REG_OFFSET(rs),8);
997 amd64_test_reg_reg(b->jit_ptr,AMD64_RAX,AMD64_RAX);
998 test1 = b->jit_ptr;
999 amd64_branch32(b->jit_ptr, X86_CC_NS, 0, 1);
1000
1001 /* insert the instruction in the delay slot */
1002 insn_fetch_and_emit(cpu,b,1);
1003
1004 /* set the new pc in cpu structure */
1005 mips64_set_jump(cpu,b,new_pc,1);
1006
1007 amd64_patch(test1,b->jit_ptr);
1008 return(0);
1009 }
1010
1011 /* BLTZL (Branch On Less Than Zero Likely) */
1012 static int mips64_emit_BLTZL(cpu_mips_t *cpu,insn_block_t *b,mips_insn_t insn)
1013 {
1014 int rs = bits(insn,21,25);
1015 int offset = bits(insn,0,15);
1016 u_char *test1;
1017 m_uint64_t new_pc;
1018
1019 /* compute the new pc */
1020 new_pc = b->start_pc + (b->mips_trans_pos << 2);
1021 new_pc += sign_extend(offset << 2,18);
1022
1023 /* If sign bit isn't set, don't take the branch */
1024 amd64_mov_reg_membase(b->jit_ptr,AMD64_RAX,AMD64_R15,REG_OFFSET(rs),8);
1025 amd64_test_reg_reg(b->jit_ptr,AMD64_RAX,AMD64_RAX);
1026 test1 = b->jit_ptr;
1027 amd64_branch32(b->jit_ptr, X86_CC_NS, 0, 1);
1028
1029 /* insert the instruction in the delay slot */
1030 insn_fetch_and_emit(cpu,b,1);
1031
1032 /* set the new pc in cpu structure */
1033 mips64_set_jump(cpu,b,new_pc,1);
1034
1035 amd64_patch(test1,b->jit_ptr);
1036 return(0);
1037 }
1038
1039 /* BNE (Branch On Not Equal) */
1040 static int mips64_emit_BNE(cpu_mips_t *cpu,insn_block_t *b,mips_insn_t insn)
1041 {
1042 int rs = bits(insn,21,25);
1043 int rt = bits(insn,16,20);
1044 int offset = bits(insn,0,15);
1045 u_char *test1;
1046 m_uint64_t new_pc;
1047
1048 /* compute the new pc */
1049 new_pc = b->start_pc + (b->mips_trans_pos << 2);
1050 new_pc += sign_extend(offset << 2,18);
1051
1052 /*
1053 * compare gpr[rs] and gpr[rt].
1054 */
1055 amd64_mov_reg_membase(b->jit_ptr,AMD64_RAX,AMD64_R15,REG_OFFSET(rs),8);
1056 amd64_alu_reg_membase(b->jit_ptr,X86_CMP,AMD64_RAX,
1057 AMD64_R15,REG_OFFSET(rt));
1058 test1 = b->jit_ptr;
1059 amd64_branch32(b->jit_ptr, X86_CC_E, 0, 1);
1060
1061 /* insert the instruction in the delay slot */
1062 insn_fetch_and_emit(cpu,b,2);
1063
1064 /* set the new pc in cpu structure */
1065 mips64_set_jump(cpu,b,new_pc,1);
1066
1067 amd64_patch(test1,b->jit_ptr);
1068
1069 /* if the branch is not taken, we have to execute the delay slot too */
1070 insn_fetch_and_emit(cpu,b,1);
1071 return(0);
1072 }
1073
1074 /* BNEL (Branch On Not Equal Likely) */
1075 static int mips64_emit_BNEL(cpu_mips_t *cpu,insn_block_t *b,mips_insn_t insn)
1076 {
1077 int rs = bits(insn,21,25);
1078 int rt = bits(insn,16,20);
1079 int offset = bits(insn,0,15);
1080 u_char *test1;
1081 m_uint64_t new_pc;
1082
1083 /* compute the new pc */
1084 new_pc = b->start_pc + (b->mips_trans_pos << 2);
1085 new_pc += sign_extend(offset << 2,18);
1086
1087 /*
1088 * compare gpr[rs] and gpr[rt].
1089 */
1090 amd64_mov_reg_membase(b->jit_ptr,AMD64_RAX,AMD64_R15,REG_OFFSET(rs),8);
1091 amd64_alu_reg_membase(b->jit_ptr,X86_CMP,AMD64_RAX,
1092 AMD64_R15,REG_OFFSET(rt));
1093 test1 = b->jit_ptr;
1094 amd64_branch32(b->jit_ptr, X86_CC_E, 0, 1);
1095
1096 /* insert the instruction in the delay slot */
1097 insn_fetch_and_emit(cpu,b,1);
1098
1099 /* set the new pc in cpu structure */
1100 mips64_set_jump(cpu,b,new_pc,1);
1101
1102 amd64_patch(test1,b->jit_ptr);
1103 return(0);
1104 }
1105
1106 /* BREAK */
1107 static int mips64_emit_BREAK(cpu_mips_t *cpu,insn_block_t *b,mips_insn_t insn)
1108 {
1109 u_int code = bits(insn,6,25);
1110
1111 amd64_mov_reg_imm(b->jit_ptr,AMD64_RSI,code);
1112 amd64_mov_reg_reg(b->jit_ptr,AMD64_RDI,AMD64_R15,8);
1113 mips64_emit_basic_c_call(b,mips64_exec_break);
1114 insn_block_push_epilog(b);
1115 return(0);
1116 }
1117
1118 /* CACHE */
1119 static int mips64_emit_CACHE(cpu_mips_t *cpu,insn_block_t *b,mips_insn_t insn)
1120 {
1121 int base = bits(insn,21,25);
1122 int op = bits(insn,16,20);
1123 int offset = bits(insn,0,15);
1124
1125 mips64_emit_memop(b,MIPS_MEMOP_CACHE,base,offset,op,0);
1126 return(0);
1127 }
1128
1129 /* CFC0 */
1130 static int mips64_emit_CFC0(cpu_mips_t *cpu,insn_block_t *b,mips_insn_t insn)
1131 {
1132 int rt = bits(insn,16,20);
1133 int rd = bits(insn,11,15);
1134
1135 mips64_emit_cp_xfr_op(b,rt,rd,cp0_exec_cfc0);
1136 return(0);
1137 }
1138
1139 /* CTC0 */
1140 static int mips64_emit_CTC0(cpu_mips_t *cpu,insn_block_t *b,mips_insn_t insn)
1141 {
1142 int rt = bits(insn,16,20);
1143 int rd = bits(insn,11,15);
1144
1145 mips64_emit_cp_xfr_op(b,rt,rd,cp0_exec_ctc0);
1146 return(0);
1147 }
1148
1149 /* DADDIU */
1150 static int mips64_emit_DADDIU(cpu_mips_t *cpu,insn_block_t *b,mips_insn_t insn)
1151 {
1152 int rs = bits(insn,21,25);
1153 int rt = bits(insn,16,20);
1154 int imm = bits(insn,0,15);
1155 m_uint64_t val = sign_extend(imm,16);
1156
1157 mips64_load_imm(b,AMD64_RCX,val);
1158 amd64_alu_reg_membase(b->jit_ptr,X86_ADD,AMD64_RCX,
1159 AMD64_R15,REG_OFFSET(rs));
1160 amd64_mov_membase_reg(b->jit_ptr,AMD64_R15,REG_OFFSET(rt),AMD64_RCX,8);
1161 return(0);
1162 }
1163
1164 /* DADDU: rd = rs + rt */
1165 static int mips64_emit_DADDU(cpu_mips_t *cpu,insn_block_t *b,mips_insn_t insn)
1166 {
1167 int rs = bits(insn,21,25);
1168 int rt = bits(insn,16,20);
1169 int rd = bits(insn,11,15);
1170
1171 amd64_mov_reg_membase(b->jit_ptr,AMD64_RCX,AMD64_R15,REG_OFFSET(rs),8);
1172 amd64_alu_reg_membase(b->jit_ptr,X86_ADD,AMD64_RCX,
1173 AMD64_R15,REG_OFFSET(rt));
1174 amd64_mov_membase_reg(b->jit_ptr,AMD64_R15,REG_OFFSET(rd),AMD64_RCX,8);
1175 return(0);
1176 }
1177
1178 /* DIV */
1179 static int mips64_emit_DIV(cpu_mips_t *cpu,insn_block_t *b,mips_insn_t insn)
1180 {
1181 int rs = bits(insn,21,25);
1182 int rt = bits(insn,16,20);
1183
1184 /* eax = gpr[rs] */
1185 amd64_clear_reg(b->jit_ptr,AMD64_RDX);
1186 amd64_mov_reg_membase(b->jit_ptr,AMD64_RAX,AMD64_R15,REG_OFFSET(rs),4);
1187
1188 /* ecx = gpr[rt] */
1189 amd64_mov_reg_membase(b->jit_ptr,AMD64_RCX,AMD64_R15,REG_OFFSET(rt),4);
1190
1191 /* eax = quotient (LO), edx = remainder (HI) */
1192 amd64_div_reg_size(b->jit_ptr,AMD64_RCX,1,4);
1193
1194 /* store LO */
1195 amd64_movsxd_reg_reg(b->jit_ptr,AMD64_RAX,X86_EAX);
1196 amd64_mov_membase_reg(b->jit_ptr,AMD64_R15,OFFSET(cpu_mips_t,lo),
1197 AMD64_RAX,8);
1198
1199 /* store HI */
1200 amd64_movsxd_reg_reg(b->jit_ptr,AMD64_RDX,X86_EDX);
1201 amd64_mov_membase_reg(b->jit_ptr,AMD64_R15,OFFSET(cpu_mips_t,hi),
1202 AMD64_RDX,8);
1203 return(0);
1204 }
1205
1206 /* DIVU */
1207 static int mips64_emit_DIVU(cpu_mips_t *cpu,insn_block_t *b,mips_insn_t insn)
1208 {
1209 int rs = bits(insn,21,25);
1210 int rt = bits(insn,16,20);
1211
1212 /* eax = gpr[rs] */
1213 amd64_clear_reg(b->jit_ptr,AMD64_RDX);
1214 amd64_mov_reg_membase(b->jit_ptr,AMD64_RAX,AMD64_R15,REG_OFFSET(rs),4);
1215
1216 /* ecx = gpr[rt] */
1217 amd64_mov_reg_membase(b->jit_ptr,AMD64_RCX,AMD64_R15,REG_OFFSET(rt),4);
1218
1219 /* eax = quotient (LO), edx = remainder (HI) */
1220 amd64_div_reg_size(b->jit_ptr,AMD64_RCX,0,4);
1221
1222 /* store LO */
1223 amd64_movsxd_reg_reg(b->jit_ptr,AMD64_RAX,X86_EAX);
1224 amd64_mov_membase_reg(b->jit_ptr,AMD64_R15,OFFSET(cpu_mips_t,lo),
1225 AMD64_RAX,8);
1226
1227 /* store HI */
1228 amd64_movsxd_reg_reg(b->jit_ptr,AMD64_RDX,X86_EDX);
1229 amd64_mov_membase_reg(b->jit_ptr,AMD64_R15,OFFSET(cpu_mips_t,hi),
1230 AMD64_RDX,8);
1231 return(0);
1232 }
1233
1234 /* DMFC0 */
1235 static int mips64_emit_DMFC0(cpu_mips_t *cpu,insn_block_t *b,mips_insn_t insn)
1236 {
1237 int rt = bits(insn,16,20);
1238 int rd = bits(insn,11,15);
1239
1240 mips64_emit_cp_xfr_op(b,rt,rd,cp0_exec_dmfc0);
1241 return(0);
1242 }
1243
1244 /* DMFC1 */
1245 static int mips64_emit_DMFC1(cpu_mips_t *cpu,insn_block_t *b,mips_insn_t insn)
1246 {
1247 int rt = bits(insn,16,20);
1248 int rd = bits(insn,11,15);
1249
1250 mips64_emit_cp_xfr_op(b,rt,rd,mips64_exec_dmfc1);
1251 return(0);
1252 }
1253
1254 /* DMTC0 */
1255 static int mips64_emit_DMTC0(cpu_mips_t *cpu,insn_block_t *b,mips_insn_t insn)
1256 {
1257 int rt = bits(insn,16,20);
1258 int rd = bits(insn,11,15);
1259
1260 mips64_emit_cp_xfr_op(b,rt,rd,cp0_exec_dmtc0);
1261 return(0);
1262 }
1263
1264 /* DMTC1 */
1265 static int mips64_emit_DMTC1(cpu_mips_t *cpu,insn_block_t *b,mips_insn_t insn)
1266 {
1267 int rt = bits(insn,16,20);
1268 int rd = bits(insn,11,15);
1269
1270 mips64_emit_cp_xfr_op(b,rt,rd,mips64_exec_dmtc1);
1271 return(0);
1272 }
1273
1274 /* DSLL */
1275 static int mips64_emit_DSLL(cpu_mips_t *cpu,insn_block_t *b,mips_insn_t insn)
1276 {
1277 int rt = bits(insn,16,20);
1278 int rd = bits(insn,11,15);
1279 int sa = bits(insn,6,10);
1280
1281 amd64_mov_reg_membase(b->jit_ptr,AMD64_RAX,AMD64_R15,REG_OFFSET(rt),8);
1282 amd64_shift_reg_imm(b->jit_ptr,X86_SHL,AMD64_RAX,sa);
1283 amd64_mov_membase_reg(b->jit_ptr,AMD64_R15,REG_OFFSET(rd),AMD64_RAX,8);
1284 return(0);
1285 }
1286
1287 /* DSLL32 */
1288 static int mips64_emit_DSLL32(cpu_mips_t *cpu,insn_block_t *b,mips_insn_t insn)
1289 {
1290 int rt = bits(insn,16,20);
1291 int rd = bits(insn,11,15);
1292 int sa = bits(insn,6,10);
1293
1294 amd64_mov_reg_membase(b->jit_ptr,AMD64_RAX,AMD64_R15,REG_OFFSET(rt),8);
1295 amd64_shift_reg_imm(b->jit_ptr,X86_SHL,AMD64_RAX,sa+32);
1296 amd64_mov_membase_reg(b->jit_ptr,AMD64_R15,REG_OFFSET(rd),AMD64_RAX,8);
1297 return(0);
1298 }
1299
1300 /* DSLLV */
1301 static int mips64_emit_DSLLV(cpu_mips_t *cpu,insn_block_t *b,mips_insn_t insn)
1302 {
1303 int rs = bits(insn,21,25);
1304 int rt = bits(insn,16,20);
1305 int rd = bits(insn,11,15);
1306
1307 amd64_mov_reg_membase(b->jit_ptr,AMD64_RCX,AMD64_R15,REG_OFFSET(rs),4);
1308 amd64_alu_reg_imm(b->jit_ptr,X86_AND,AMD64_RCX,0x3f);
1309
1310 amd64_mov_reg_membase(b->jit_ptr,AMD64_RAX,AMD64_R15,REG_OFFSET(rt),8);
1311 amd64_shift_reg(b->jit_ptr,X86_SHL,AMD64_RAX);
1312 amd64_mov_membase_reg(b->jit_ptr,AMD64_R15,REG_OFFSET(rd),AMD64_RAX,8);
1313 return(0);
1314 }
1315
1316 /* DSRA */
1317 static int mips64_emit_DSRA(cpu_mips_t *cpu,insn_block_t *b,mips_insn_t insn)
1318 {
1319 int rt = bits(insn,16,20);
1320 int rd = bits(insn,11,15);
1321 int sa = bits(insn,6,10);
1322
1323 amd64_mov_reg_membase(b->jit_ptr,AMD64_RAX,AMD64_R15,REG_OFFSET(rt),8);
1324 amd64_shift_reg_imm(b->jit_ptr,X86_SAR,AMD64_RAX,sa);
1325 amd64_mov_membase_reg(b->jit_ptr,AMD64_R15,REG_OFFSET(rd),AMD64_RAX,8);
1326 return(0);
1327 }
1328
1329 /* DSRA32 */
1330 static int mips64_emit_DSRA32(cpu_mips_t *cpu,insn_block_t *b,mips_insn_t insn)
1331 {
1332 int rt = bits(insn,16,20);
1333 int rd = bits(insn,11,15);
1334 int sa = bits(insn,6,10);
1335
1336 amd64_mov_reg_membase(b->jit_ptr,AMD64_RAX,AMD64_R15,REG_OFFSET(rt),8);
1337 amd64_shift_reg_imm(b->jit_ptr,X86_SAR,AMD64_RAX,sa+32);
1338 amd64_mov_membase_reg(b->jit_ptr,AMD64_R15,REG_OFFSET(rd),AMD64_RAX,8);
1339 return(0);
1340 }
1341
1342 /* DSRAV */
1343 static int mips64_emit_DSRAV(cpu_mips_t *cpu,insn_block_t *b,mips_insn_t insn)
1344 {
1345 int rs = bits(insn,21,25);
1346 int rt = bits(insn,16,20);
1347 int rd = bits(insn,11,15);
1348
1349 amd64_mov_reg_membase(b->jit_ptr,AMD64_RCX,AMD64_R15,REG_OFFSET(rs),4);
1350 amd64_alu_reg_imm(b->jit_ptr,X86_AND,AMD64_RCX,0x3f);
1351
1352 amd64_mov_reg_membase(b->jit_ptr,AMD64_RAX,AMD64_R15,REG_OFFSET(rt),8);
1353 amd64_shift_reg(b->jit_ptr,X86_SAR,AMD64_RAX);
1354 amd64_mov_membase_reg(b->jit_ptr,AMD64_R15,REG_OFFSET(rd),AMD64_RAX,8);
1355 return(0);
1356 }
1357
1358 /* DSRL */
1359 static int mips64_emit_DSRL(cpu_mips_t *cpu,insn_block_t *b,mips_insn_t insn)
1360 {
1361 int rt = bits(insn,16,20);
1362 int rd = bits(insn,11,15);
1363 int sa = bits(insn,6,10);
1364
1365 amd64_mov_reg_membase(b->jit_ptr,AMD64_RAX,AMD64_R15,REG_OFFSET(rt),8);
1366 amd64_shift_reg_imm(b->jit_ptr,X86_SHR,AMD64_RAX,sa);
1367 amd64_mov_membase_reg(b->jit_ptr,AMD64_R15,REG_OFFSET(rd),AMD64_RAX,8);
1368 return(0);
1369 }
1370
1371 /* DSRL32 */
1372 static int mips64_emit_DSRL32(cpu_mips_t *cpu,insn_block_t *b,mips_insn_t insn)
1373 {
1374 int rt = bits(insn,16,20);
1375 int rd = bits(insn,11,15);
1376 int sa = bits(insn,6,10);
1377
1378 amd64_mov_reg_membase(b->jit_ptr,AMD64_RAX,AMD64_R15,REG_OFFSET(rt),8);
1379 amd64_shift_reg_imm(b->jit_ptr,X86_SHR,AMD64_RAX,sa+32);
1380 amd64_mov_membase_reg(b->jit_ptr,AMD64_R15,REG_OFFSET(rd),AMD64_RAX,8);
1381 return(0);
1382 }
1383
1384 /* DSRLV */
1385 static int mips64_emit_DSRLV(cpu_mips_t *cpu,insn_block_t *b,mips_insn_t insn)
1386 {
1387 int rs = bits(insn,21,25);
1388 int rt = bits(insn,16,20);
1389 int rd = bits(insn,11,15);
1390
1391 amd64_mov_reg_membase(b->jit_ptr,AMD64_RCX,AMD64_R15,REG_OFFSET(rs),4);
1392 amd64_alu_reg_imm(b->jit_ptr,X86_AND,AMD64_RCX,0x3f);
1393
1394 amd64_mov_reg_membase(b->jit_ptr,AMD64_RAX,AMD64_R15,REG_OFFSET(rt),8);
1395 amd64_shift_reg(b->jit_ptr,X86_SHR,AMD64_RAX);
1396 amd64_mov_membase_reg(b->jit_ptr,AMD64_R15,REG_OFFSET(rd),AMD64_RAX,8);
1397 return(0);
1398 }
1399
1400 /* DSUBU: rd = rs - rt */
1401 static int mips64_emit_DSUBU(cpu_mips_t *cpu,insn_block_t *b,mips_insn_t insn)
1402 {
1403 int rs = bits(insn,21,25);
1404 int rt = bits(insn,16,20);
1405 int rd = bits(insn,11,15);
1406
1407 amd64_mov_reg_membase(b->jit_ptr,AMD64_RAX,AMD64_R15,REG_OFFSET(rs),8);
1408 amd64_alu_reg_membase(b->jit_ptr,X86_SUB,AMD64_RAX,
1409 AMD64_R15,REG_OFFSET(rt));
1410 amd64_mov_membase_reg(b->jit_ptr,AMD64_R15,REG_OFFSET(rd),AMD64_RAX,8);
1411 return(0);
1412 }
1413
1414 /* ERET */
1415 static int mips64_emit_ERET(cpu_mips_t *cpu,insn_block_t *b,mips_insn_t insn)
1416 {
1417 mips64_set_pc(b,b->start_pc+((b->mips_trans_pos-1)<<2));
1418 amd64_mov_reg_reg(b->jit_ptr,AMD64_RDI,AMD64_R15,8);
1419 mips64_emit_basic_c_call(b,mips64_exec_eret);
1420 insn_block_push_epilog(b);
1421 return(0);
1422 }
1423
1424 /* J (Jump) */
1425 static int mips64_emit_J(cpu_mips_t *cpu,insn_block_t *b,mips_insn_t insn)
1426 {
1427 u_int instr_index = bits(insn,0,25);
1428 m_uint64_t new_pc;
1429
1430 /* compute the new pc */
1431 new_pc = b->start_pc + (b->mips_trans_pos << 2);
1432 new_pc &= ~((1 << 28) - 1);
1433 new_pc |= instr_index << 2;
1434
1435 /* insert the instruction in the delay slot */
1436 insn_fetch_and_emit(cpu,b,1);
1437
1438 /* set the new pc in cpu structure */
1439 mips64_set_jump(cpu,b,new_pc,1);
1440 return(0);
1441 }
1442
1443 /* JAL (Jump And Link) */
1444 static int mips64_emit_JAL(cpu_mips_t *cpu,insn_block_t *b,mips_insn_t insn)
1445 {
1446 u_int instr_index = bits(insn,0,25);
1447 m_uint64_t new_pc;
1448
1449 /* compute the new pc */
1450 new_pc = b->start_pc + (b->mips_trans_pos << 2);
1451 new_pc &= ~((1 << 28) - 1);
1452 new_pc |= instr_index << 2;
1453
1454 /* set the return address (instruction after the delay slot) */
1455 mips64_set_ra(b,b->start_pc + ((b->mips_trans_pos + 1) << 2));
1456
1457 /* insert the instruction in the delay slot */
1458 insn_fetch_and_emit(cpu,b,1);
1459
1460 /* set the new pc in cpu structure */
1461 mips64_set_jump(cpu,b,new_pc,0);
1462 return(0);
1463 }
1464
1465 /* JALR (Jump and Link Register) */
1466 static int mips64_emit_JALR(cpu_mips_t *cpu,insn_block_t *b,mips_insn_t insn)
1467 {
1468 int rs = bits(insn,21,25);
1469 int rd = bits(insn,11,15);
1470 m_uint64_t ret_pc;
1471
1472 /* set the return pc (instruction after the delay slot) in GPR[rd] */
1473 ret_pc = b->start_pc + ((b->mips_trans_pos + 1) << 2);
1474 mips64_load_imm(b,AMD64_RAX,ret_pc);
1475 amd64_mov_membase_reg(b->jit_ptr,AMD64_R15,REG_OFFSET(rd),AMD64_RAX,8);
1476
1477 /* get the new pc */
1478 amd64_mov_reg_membase(b->jit_ptr,AMD64_R14,AMD64_R15,REG_OFFSET(rs),8);
1479
1480 #if DEBUG_JR0
1481 {
1482 u_char *test1;
1483
1484 amd64_test_reg_reg(b->jit_ptr,AMD64_R14,AMD64_R14);
1485 test1 = b->jit_ptr;
1486 amd64_branch8(b->jit_ptr, X86_CC_NZ, 0, 1);
1487 amd64_mov_reg_reg(b->jit_ptr,AMD64_RDI,AMD64_R15,8);
1488 mips64_emit_c_call(b,mips64_debug_jr0);
1489 amd64_patch(test1,b->jit_ptr);
1490 }
1491 #endif
1492
1493 /* insert the instruction in the delay slot */
1494 insn_fetch_and_emit(cpu,b,1);
1495
1496 /* set the new pc */
1497 amd64_mov_membase_reg(b->jit_ptr,AMD64_R15,OFFSET(cpu_mips_t,pc),
1498 AMD64_R14,8);
1499
1500 /* returns to the caller which will determine the next path */
1501 insn_block_push_epilog(b);
1502 return(0);
1503 }
1504
1505 /* JR (Jump Register) */
1506 static int mips64_emit_JR(cpu_mips_t *cpu,insn_block_t *b,mips_insn_t insn)
1507 {
1508 int rs = bits(insn,21,25);
1509
1510 /* get the new pc */
1511 amd64_mov_reg_membase(b->jit_ptr,AMD64_R14,AMD64_R15,REG_OFFSET(rs),8);
1512
1513 #if DEBUG_JR0
1514 {
1515 u_char *test1;
1516
1517 amd64_test_reg_reg(b->jit_ptr,AMD64_RCX,AMD64_RCX);
1518 test1 = b->jit_ptr;
1519 amd64_branch8(b->jit_ptr, X86_CC_NZ, 0, 1);
1520 amd64_mov_reg_reg(b->jit_ptr,AMD64_RDI,AMD64_R15,8);
1521 mips64_emit_c_call(b,mips64_debug_jr0);
1522 amd64_patch(test1,b->jit_ptr);
1523 }
1524 #endif
1525
1526 /* insert the instruction in the delay slot */
1527 insn_fetch_and_emit(cpu,b,1);
1528
1529 /* set the new pc */
1530 amd64_mov_membase_reg(b->jit_ptr,
1531 AMD64_R15,OFFSET(cpu_mips_t,pc),
1532 AMD64_R14,8);
1533
1534 /* returns to the caller which will determine the next path */
1535 insn_block_push_epilog(b);
1536 return(0);
1537 }
1538
1539 /* LB (Load Byte) */
1540 static int mips64_emit_LB(cpu_mips_t *cpu,insn_block_t *b,mips_insn_t insn)
1541 {
1542 int base = bits(insn,21,25);
1543 int rt = bits(insn,16,20);
1544 int offset = bits(insn,0,15);
1545
1546 mips64_emit_memop(b,MIPS_MEMOP_LB,base,offset,rt,TRUE);
1547 return(0);
1548 }
1549
1550 /* LBU (Load Byte Unsigned) */
1551 static int mips64_emit_LBU(cpu_mips_t *cpu,insn_block_t *b,mips_insn_t insn)
1552 {
1553 int base = bits(insn,21,25);
1554 int rt = bits(insn,16,20);
1555 int offset = bits(insn,0,15);
1556
1557 mips64_emit_memop(b,MIPS_MEMOP_LBU,base,offset,rt,TRUE);
1558 return(0);
1559 }
1560
1561 /* LD (Load Double-Word) */
1562 static int mips64_emit_LD(cpu_mips_t *cpu,insn_block_t *b,mips_insn_t insn)
1563 {
1564 int base = bits(insn,21,25);
1565 int rt = bits(insn,16,20);
1566 int offset = bits(insn,0,15);
1567
1568 mips64_emit_memop(b,MIPS_MEMOP_LD,base,offset,rt,TRUE);
1569 return(0);
1570 }
1571
1572 /* LDC1 (Load Double-Word to Coprocessor 1) */
1573 static int mips64_emit_LDC1(cpu_mips_t *cpu,insn_block_t *b,mips_insn_t insn)
1574 {
1575 int base = bits(insn,21,25);
1576 int ft = bits(insn,16,20);
1577 int offset = bits(insn,0,15);
1578
1579 mips64_emit_memop(b,MIPS_MEMOP_LDC1,base,offset,ft,TRUE);
1580 return(0);
1581 }
1582
1583 /* LDL (Load Double-Word Left) */
1584 static int mips64_emit_LDL(cpu_mips_t *cpu,insn_block_t *b,mips_insn_t insn)
1585 {
1586 int base = bits(insn,21,25);
1587 int rt = bits(insn,16,20);
1588 int offset = bits(insn,0,15);
1589
1590 mips64_emit_memop(b,MIPS_MEMOP_LDL,base,offset,rt,TRUE);
1591 return(0);
1592 }
1593
1594 /* LDR (Load Double-Word Right) */
1595 static int mips64_emit_LDR(cpu_mips_t *cpu,insn_block_t *b,mips_insn_t insn)
1596 {
1597 int base = bits(insn,21,25);
1598 int rt = bits(insn,16,20);
1599 int offset = bits(insn,0,15);
1600
1601 mips64_emit_memop(b,MIPS_MEMOP_LDR,base,offset,rt,TRUE);
1602 return(0);
1603 }
1604
1605 /* LH (Load Half-Word) */
1606 static int mips64_emit_LH(cpu_mips_t *cpu,insn_block_t *b,mips_insn_t insn)
1607 {
1608 int base = bits(insn,21,25);
1609 int rt = bits(insn,16,20);
1610 int offset = bits(insn,0,15);
1611
1612 mips64_emit_memop(b,MIPS_MEMOP_LH,base,offset,rt,TRUE);
1613 return(0);
1614 }
1615
1616 /* LHU (Load Half-Word Unsigned) */
1617 static int mips64_emit_LHU(cpu_mips_t *cpu,insn_block_t *b,mips_insn_t insn)
1618 {
1619 int base = bits(insn,21,25);
1620 int rt = bits(insn,16,20);
1621 int offset = bits(insn,0,15);
1622
1623 mips64_emit_memop(b,MIPS_MEMOP_LHU,base,offset,rt,TRUE);
1624 return(0);
1625 }
1626
1627 /* LI (virtual) */
1628 static int mips64_emit_LI(cpu_mips_t *cpu,insn_block_t *b,mips_insn_t insn)
1629 {
1630 int rt = bits(insn,16,20);
1631 int imm = bits(insn,0,15);
1632 m_uint64_t val = sign_extend(imm,16);
1633
1634 mips64_load_imm(b,AMD64_RCX,val);
1635 amd64_mov_membase_reg(b->jit_ptr,AMD64_R15,REG_OFFSET(rt),AMD64_RCX,8);
1636 return(0);
1637 }
1638
1639 /* LL (Load Linked) */
1640 static int mips64_emit_LL(cpu_mips_t *cpu,insn_block_t *b,mips_insn_t insn)
1641 {
1642 int base = bits(insn,21,25);
1643 int rt = bits(insn,16,20);
1644 int offset = bits(insn,0,15);
1645
1646 mips64_emit_memop(b,MIPS_MEMOP_LL,base,offset,rt,TRUE);
1647 return(0);
1648 }
1649
1650 /* LUI */
1651 static int mips64_emit_LUI(cpu_mips_t *cpu,insn_block_t *b,mips_insn_t insn)
1652 {
1653 int rt = bits(insn,16,20);
1654 int imm = bits(insn,0,15);
1655 m_uint64_t val = sign_extend(imm,16) << 16;
1656
1657 #if 1
1658 mips64_load_imm(b,AMD64_RCX,val);
1659 #else
1660 amd64_mov_reg_imm(b->jit_ptr,AMD64_RCX,imm);
1661 amd64_shift_reg_imm(b->jit_ptr,X86_SHL,AMD64_RCX,48);
1662 amd64_shift_reg_imm(b->jit_ptr,X86_SAR,AMD64_RCX,32);
1663 #endif
1664
1665 amd64_mov_membase_reg(b->jit_ptr,AMD64_R15,REG_OFFSET(rt),AMD64_RCX,8);
1666 return(0);
1667 }
1668
1669 /* LW (Load Word) */
1670 static int mips64_emit_LW(cpu_mips_t *cpu,insn_block_t *b,mips_insn_t insn)
1671 {
1672 int base = bits(insn,21,25);
1673 int rt = bits(insn,16,20);
1674 int offset = bits(insn,0,15);
1675
1676 if (cpu->fast_memop) {
1677 mips64_emit_memop_fast(b,MIPS_MEMOP_LW,base,offset,rt,TRUE,
1678 mips64_memop_fast_lw);
1679 } else {
1680 mips64_emit_memop(b,MIPS_MEMOP_LW,base,offset,rt,TRUE);
1681 }
1682 return(0);
1683 }
1684
1685 /* LWL (Load Word Left) */
1686 static int mips64_emit_LWL(cpu_mips_t *cpu,insn_block_t *b,mips_insn_t insn)
1687 {
1688 int base = bits(insn,21,25);
1689 int rt = bits(insn,16,20);
1690 int offset = bits(insn,0,15);
1691
1692 mips64_emit_memop(b,MIPS_MEMOP_LWL,base,offset,rt,TRUE);
1693 return(0);
1694 }
1695
1696 /* LWR (Load Word Right) */
1697 static int mips64_emit_LWR(cpu_mips_t *cpu,insn_block_t *b,mips_insn_t insn)
1698 {
1699 int base = bits(insn,21,25);
1700 int rt = bits(insn,16,20);
1701 int offset = bits(insn,0,15);
1702
1703 mips64_emit_memop(b,MIPS_MEMOP_LWR,base,offset,rt,TRUE);
1704 return(0);
1705 }
1706
1707 /* LWU (Load Word Unsigned) */
1708 static int mips64_emit_LWU(cpu_mips_t *cpu,insn_block_t *b,mips_insn_t insn)
1709 {
1710 int base = bits(insn,21,25);
1711 int rt = bits(insn,16,20);
1712 int offset = bits(insn,0,15);
1713
1714 mips64_emit_memop(b,MIPS_MEMOP_LWU,base,offset,rt,TRUE);
1715 return(0);
1716 }
1717
1718 /* MFC0 */
1719 static int mips64_emit_MFC0(cpu_mips_t *cpu,insn_block_t *b,mips_insn_t insn)
1720 {
1721 int rt = bits(insn,16,20);
1722 int rd = bits(insn,11,15);
1723
1724 mips64_emit_cp_xfr_op(b,rt,rd,cp0_exec_mfc0);
1725 return(0);
1726 }
1727
1728 /* MFC1 */
1729 static int mips64_emit_MFC1(cpu_mips_t *cpu,insn_block_t *b,mips_insn_t insn)
1730 {
1731 int rt = bits(insn,16,20);
1732 int rd = bits(insn,11,15);
1733
1734 mips64_emit_cp_xfr_op(b,rt,rd,mips64_exec_mfc1);
1735 return(0);
1736 }
1737
1738 /* MFHI */
1739 static int mips64_emit_MFHI(cpu_mips_t *cpu,insn_block_t *b,mips_insn_t insn)
1740 {
1741 int rd = bits(insn,11,15);
1742
1743 amd64_mov_reg_membase(b->jit_ptr,AMD64_RDX,
1744 AMD64_R15,OFFSET(cpu_mips_t,hi),8);
1745 amd64_mov_membase_reg(b->jit_ptr,AMD64_R15,REG_OFFSET(rd),AMD64_RDX,8);
1746 return(0);
1747 }
1748
1749 /* MFLO */
1750 static int mips64_emit_MFLO(cpu_mips_t *cpu,insn_block_t *b,mips_insn_t insn)
1751 {
1752 int rd = bits(insn,11,15);
1753
1754 if (!rd) return(0);
1755
1756 amd64_mov_reg_membase(b->jit_ptr,AMD64_RDX,
1757 AMD64_R15,OFFSET(cpu_mips_t,lo),8);
1758 amd64_mov_membase_reg(b->jit_ptr,AMD64_R15,REG_OFFSET(rd),AMD64_RDX,8);
1759 return(0);
1760 }
1761
1762 /* MOVE (virtual instruction, real: ADDU) */
1763 static int mips64_emit_MOVE(cpu_mips_t *cpu,insn_block_t *b,mips_insn_t insn)
1764 {
1765 int rs = bits(insn,21,25);
1766 int rd = bits(insn,11,15);
1767
1768 amd64_mov_reg_membase(b->jit_ptr,AMD64_RDX,AMD64_R15,REG_OFFSET(rs),4);
1769 amd64_movsxd_reg_reg(b->jit_ptr,AMD64_RDX,X86_EDX);
1770 amd64_mov_membase_reg(b->jit_ptr,AMD64_R15,REG_OFFSET(rd),AMD64_RDX,8);
1771 return(0);
1772 }
1773
1774 /* MTC0 */
1775 static int mips64_emit_MTC0(cpu_mips_t *cpu,insn_block_t *b,mips_insn_t insn)
1776 {
1777 int rt = bits(insn,16,20);
1778 int rd = bits(insn,11,15);
1779
1780 mips64_emit_cp_xfr_op(b,rt,rd,cp0_exec_mtc0);
1781 return(0);
1782 }
1783
1784 /* MTC1 */
1785 static int mips64_emit_MTC1(cpu_mips_t *cpu,insn_block_t *b,mips_insn_t insn)
1786 {
1787 int rt = bits(insn,16,20);
1788 int rd = bits(insn,11,15);
1789
1790 mips64_emit_cp_xfr_op(b,rt,rd,mips64_exec_mtc1);
1791 return(0);
1792 }
1793
1794 /* MTHI */
1795 static int mips64_emit_MTHI(cpu_mips_t *cpu,insn_block_t *b,mips_insn_t insn)
1796 {
1797 int rs = bits(insn,21,25);
1798
1799 amd64_mov_reg_membase(b->jit_ptr,AMD64_RDX,AMD64_R15,REG_OFFSET(rs),8);
1800
1801 amd64_mov_membase_reg(b->jit_ptr,
1802 AMD64_R15,OFFSET(cpu_mips_t,hi),AMD64_RDX,8);
1803 return(0);
1804 }
1805
1806 /* MTLO */
1807 static int mips64_emit_MTLO(cpu_mips_t *cpu,insn_block_t *b,mips_insn_t insn)
1808 {
1809 int rs = bits(insn,21,25);
1810
1811 amd64_mov_reg_membase(b->jit_ptr,AMD64_RDX,AMD64_R15,REG_OFFSET(rs),8);
1812
1813 amd64_mov_membase_reg(b->jit_ptr,
1814 AMD64_R15,OFFSET(cpu_mips_t,lo),AMD64_RDX,8);
1815 return(0);
1816 }
1817
1818 /* MUL */
1819 static int mips64_emit_MUL(cpu_mips_t *cpu,insn_block_t *b,mips_insn_t insn)
1820 {
1821 int rs = bits(insn,21,25);
1822 int rt = bits(insn,16,20);
1823 int rd = bits(insn,11,15);
1824
1825 /* eax = gpr[rs] */
1826 amd64_mov_reg_membase(b->jit_ptr,AMD64_RAX,AMD64_R15,REG_OFFSET(rs),4);
1827
1828 /* ecx = gpr[rt] */
1829 amd64_mov_reg_membase(b->jit_ptr,AMD64_RCX,AMD64_R15,REG_OFFSET(rt),4);
1830
1831 amd64_mul_reg_size(b->jit_ptr,AMD64_RCX,1,4);
1832
1833 /* store result in gpr[rd] */
1834 amd64_movsxd_reg_reg(b->jit_ptr,AMD64_RAX,X86_EAX);
1835 amd64_mov_membase_reg(b->jit_ptr,AMD64_R15,REG_OFFSET(rd),AMD64_RAX,8);
1836 return(0);
1837 }
1838
1839 /* MULT */
1840 static int mips64_emit_MULT(cpu_mips_t *cpu,insn_block_t *b,mips_insn_t insn)
1841 {
1842 int rs = bits(insn,21,25);
1843 int rt = bits(insn,16,20);
1844
1845 /* eax = gpr[rs] */
1846 amd64_mov_reg_membase(b->jit_ptr,AMD64_RAX,AMD64_R15,REG_OFFSET(rs),4);
1847
1848 /* ecx = gpr[rt] */
1849 amd64_mov_reg_membase(b->jit_ptr,AMD64_RCX,AMD64_R15,REG_OFFSET(rt),4);
1850
1851 amd64_mul_reg_size(b->jit_ptr,AMD64_RCX,1,4);
1852
1853 /* store LO */
1854 amd64_movsxd_reg_reg(b->jit_ptr,AMD64_RAX,X86_EAX);
1855 amd64_mov_membase_reg(b->jit_ptr,AMD64_R15,OFFSET(cpu_mips_t,lo),
1856 AMD64_RAX,8);
1857
1858 /* store HI */
1859 amd64_movsxd_reg_reg(b->jit_ptr,AMD64_RDX,X86_EDX);
1860 amd64_mov_membase_reg(b->jit_ptr,AMD64_R15,OFFSET(cpu_mips_t,hi),
1861 AMD64_RDX,8);
1862 return(0);
1863 }
1864
1865 /* MULTU */
1866 static int mips64_emit_MULTU(cpu_mips_t *cpu,insn_block_t *b,mips_insn_t insn)
1867 {
1868 int rs = bits(insn,21,25);
1869 int rt = bits(insn,16,20);
1870
1871 /* eax = gpr[rs] */
1872 amd64_mov_reg_membase(b->jit_ptr,AMD64_RAX,AMD64_R15,REG_OFFSET(rs),4);
1873
1874 /* ecx = gpr[rt] */
1875 amd64_mov_reg_membase(b->jit_ptr,AMD64_RCX,AMD64_R15,REG_OFFSET(rt),4);
1876
1877 amd64_mul_reg_size(b->jit_ptr,AMD64_RCX,0,4);
1878
1879 /* store LO */
1880 amd64_movsxd_reg_reg(b->jit_ptr,AMD64_RAX,X86_EAX);
1881 amd64_mov_membase_reg(b->jit_ptr,AMD64_R15,OFFSET(cpu_mips_t,lo),
1882 AMD64_RAX,8);
1883
1884 /* store HI */
1885 amd64_movsxd_reg_reg(b->jit_ptr,AMD64_RDX,X86_EDX);
1886 amd64_mov_membase_reg(b->jit_ptr,AMD64_R15,OFFSET(cpu_mips_t,hi),
1887 AMD64_RDX,8);
1888 return(0);
1889 }
1890
1891 /* NOP */
1892 static int mips64_emit_NOP(cpu_mips_t *cpu,insn_block_t *b,mips_insn_t insn)
1893 {
1894 return(0);
1895 }
1896
1897 /* NOR */
1898 static int mips64_emit_NOR(cpu_mips_t *cpu,insn_block_t *b,mips_insn_t insn)
1899 {
1900 int rs = bits(insn,21,25);
1901 int rt = bits(insn,16,20);
1902 int rd = bits(insn,11,15);
1903
1904 amd64_mov_reg_membase(b->jit_ptr,AMD64_RAX,AMD64_R15,REG_OFFSET(rs),8);
1905 amd64_alu_reg_membase(b->jit_ptr,X86_OR,AMD64_RAX,AMD64_R15,
1906 REG_OFFSET(rt));
1907 amd64_not_reg(b->jit_ptr,AMD64_RAX);
1908 amd64_mov_membase_reg(b->jit_ptr,AMD64_R15,REG_OFFSET(rd),AMD64_RAX,8);
1909 return(0);
1910 }
1911
1912 /* OR */
1913 static int mips64_emit_OR(cpu_mips_t *cpu,insn_block_t *b,mips_insn_t insn)
1914 {
1915 int rs = bits(insn,21,25);
1916 int rt = bits(insn,16,20);
1917 int rd = bits(insn,11,15);
1918
1919 amd64_mov_reg_membase(b->jit_ptr,AMD64_RAX,AMD64_R15,REG_OFFSET(rs),8);
1920 amd64_alu_reg_membase(b->jit_ptr,X86_OR,AMD64_RAX,AMD64_R15,
1921 REG_OFFSET(rt));
1922 amd64_mov_membase_reg(b->jit_ptr,AMD64_R15,REG_OFFSET(rd),AMD64_RAX,8);
1923 return(0);
1924 }
1925
1926 /* ORI */
1927 static int mips64_emit_ORI(cpu_mips_t *cpu,insn_block_t *b,mips_insn_t insn)
1928 {
1929 int rs = bits(insn,21,25);
1930 int rt = bits(insn,16,20);
1931 int imm = bits(insn,0,15);
1932
1933 mips64_load_imm(b,AMD64_RAX,imm);
1934
1935 amd64_alu_reg_membase(b->jit_ptr,X86_OR,AMD64_RAX,
1936 AMD64_R15,REG_OFFSET(rs));
1937
1938 amd64_mov_membase_reg(b->jit_ptr,AMD64_R15,REG_OFFSET(rt),AMD64_RAX,8);
1939 return(0);
1940 }
1941
1942 /* PREF */
1943 static int mips64_emit_PREF(cpu_mips_t *cpu,insn_block_t *b,mips_insn_t insn)
1944 {
1945 amd64_nop(b->jit_ptr);
1946 return(0);
1947 }
1948
1949 /* PREFI */
1950 static int mips64_emit_PREFI(cpu_mips_t *cpu,insn_block_t *b,mips_insn_t insn)
1951 {
1952 amd64_nop(b->jit_ptr);
1953 return(0);
1954 }
1955
1956 /* SB (Store Byte) */
1957 static int mips64_emit_SB(cpu_mips_t *cpu,insn_block_t *b,mips_insn_t insn)
1958 {
1959 int base = bits(insn,21,25);
1960 int rt = bits(insn,16,20);
1961 int offset = bits(insn,0,15);
1962
1963 mips64_emit_memop(b,MIPS_MEMOP_SB,base,offset,rt,FALSE);
1964 return(0);
1965 }
1966
1967 /* SC (Store Conditional) */
1968 static int mips64_emit_SC(cpu_mips_t *cpu,insn_block_t *b,mips_insn_t insn)
1969 {
1970 int base = bits(insn,21,25);
1971 int rt = bits(insn,16,20);
1972 int offset = bits(insn,0,15);
1973
1974 mips64_emit_memop(b,MIPS_MEMOP_SC,base,offset,rt,TRUE);
1975 return(0);
1976 }
1977
1978 /* SD (Store Double-Word) */
1979 static int mips64_emit_SD(cpu_mips_t *cpu,insn_block_t *b,mips_insn_t insn)
1980 {
1981 int base = bits(insn,21,25);
1982 int rt = bits(insn,16,20);
1983 int offset = bits(insn,0,15);
1984
1985 mips64_emit_memop(b,MIPS_MEMOP_SD,base,offset,rt,FALSE);
1986 return(0);
1987 }
1988
1989 /* SDL (Store Double-Word Left) */
1990 static int mips64_emit_SDL(cpu_mips_t *cpu,insn_block_t *b,mips_insn_t insn)
1991 {
1992 int base = bits(insn,21,25);
1993 int rt = bits(insn,16,20);
1994 int offset = bits(insn,0,15);
1995
1996 mips64_emit_memop(b,MIPS_MEMOP_SDL,base,offset,rt,FALSE);
1997 return(0);
1998 }
1999
2000 /* SDR (Store Double-Word Right) */
2001 static int mips64_emit_SDR(cpu_mips_t *cpu,insn_block_t *b,mips_insn_t insn)
2002 {
2003 int base = bits(insn,21,25);
2004 int rt = bits(insn,16,20);
2005 int offset = bits(insn,0,15);
2006
2007 mips64_emit_memop(b,MIPS_MEMOP_SDR,base,offset,rt,FALSE);
2008 return(0);
2009 }
2010
2011 /* SDC1 (Store Double-Word from Coprocessor 1) */
2012 static int mips64_emit_SDC1(cpu_mips_t *cpu,insn_block_t *b,mips_insn_t insn)
2013 {
2014 int base = bits(insn,21,25);
2015 int ft = bits(insn,16,20);
2016 int offset = bits(insn,0,15);
2017
2018 mips64_emit_memop(b,MIPS_MEMOP_SDC1,base,offset,ft,FALSE);
2019 return(0);
2020 }
2021
2022 /* SH (Store Half-Word) */
2023 static int mips64_emit_SH(cpu_mips_t *cpu,insn_block_t *b,mips_insn_t insn)
2024 {
2025 int base = bits(insn,21,25);
2026 int rt = bits(insn,16,20);
2027 int offset = bits(insn,0,15);
2028
2029 mips64_emit_memop(b,MIPS_MEMOP_SH,base,offset,rt,FALSE);
2030 return(0);
2031 }
2032
2033 /* SLL */
2034 static int mips64_emit_SLL(cpu_mips_t *cpu,insn_block_t *b,mips_insn_t insn)
2035 {
2036 int rt = bits(insn,16,20);
2037 int rd = bits(insn,11,15);
2038 int sa = bits(insn,6,10);
2039
2040 amd64_mov_reg_membase(b->jit_ptr,AMD64_RAX,AMD64_R15,REG_OFFSET(rt),4);
2041 amd64_shift_reg_imm(b->jit_ptr,X86_SHL,AMD64_RAX,sa);
2042
2043 amd64_movsxd_reg_reg(b->jit_ptr,AMD64_RAX,X86_EAX);
2044 amd64_mov_membase_reg(b->jit_ptr,AMD64_R15,REG_OFFSET(rd),AMD64_RAX,8);
2045 return(0);
2046 }
2047
2048 /* SLLV */
2049 static int mips64_emit_SLLV(cpu_mips_t *cpu,insn_block_t *b,mips_insn_t insn)
2050 {
2051 int rs = bits(insn,21,25);
2052 int rt = bits(insn,16,20);
2053 int rd = bits(insn,11,15);
2054
2055 amd64_mov_reg_membase(b->jit_ptr,AMD64_RCX,AMD64_R15,REG_OFFSET(rs),4);
2056 amd64_alu_reg_imm(b->jit_ptr,X86_AND,AMD64_RCX,0x1f);
2057
2058 amd64_mov_reg_membase(b->jit_ptr,AMD64_RAX,AMD64_R15,REG_OFFSET(rt),4);
2059 amd64_shift_reg(b->jit_ptr,X86_SHL,AMD64_RAX);
2060
2061 amd64_movsxd_reg_reg(b->jit_ptr,AMD64_RAX,X86_EAX);
2062 amd64_mov_membase_reg(b->jit_ptr,AMD64_R15,REG_OFFSET(rd),AMD64_RAX,8);
2063 return(0);
2064 }
2065
2066 /* SLT */
2067 static int mips64_emit_SLT(cpu_mips_t *cpu,insn_block_t *b,mips_insn_t insn)
2068 {
2069 int rs = bits(insn,21,25);
2070 int rt = bits(insn,16,20);
2071 int rd = bits(insn,11,15);
2072 u_char *test1;
2073
2074 /* RDX = gpr[rs] */
2075 amd64_mov_reg_membase(b->jit_ptr,AMD64_RDX,AMD64_R15,REG_OFFSET(rs),8);
2076
2077 /* RAX = gpr[rt] */
2078 amd64_mov_reg_membase(b->jit_ptr,AMD64_RAX,AMD64_R15,REG_OFFSET(rt),8);
2079
2080 /* we set rd to 1 when gpr[rs] < gpr[rt] */
2081 amd64_clear_reg(b->jit_ptr,AMD64_RCX);
2082 amd64_mov_membase_reg(b->jit_ptr,AMD64_R15,REG_OFFSET(rd),AMD64_RCX,8);
2083
2084 amd64_alu_reg_reg(b->jit_ptr,X86_CMP,AMD64_RDX,AMD64_RAX);
2085 test1 = b->jit_ptr;
2086 amd64_branch8(b->jit_ptr, X86_CC_GE, 0, 1);
2087
2088 amd64_inc_membase(b->jit_ptr,AMD64_R15,REG_OFFSET(rd));
2089
2090 /* end */
2091 amd64_patch(test1,b->jit_ptr);
2092 return(0);
2093 }
2094
2095 /* SLTI */
2096 static int mips64_emit_SLTI(cpu_mips_t *cpu,insn_block_t *b,mips_insn_t insn)
2097 {
2098 int rs = bits(insn,21,25);
2099 int rt = bits(insn,16,20);
2100 int imm = bits(insn,0,15);
2101 m_uint64_t val = sign_extend(imm,16);
2102 u_char *test1;
2103
2104 /* RDX = val */
2105 mips64_load_imm(b,AMD64_RDX,val);
2106
2107 /* RAX = gpr[rs] */
2108 amd64_mov_reg_membase(b->jit_ptr,AMD64_RAX,AMD64_R15,REG_OFFSET(rs),8);
2109
2110 /* we set rt to 1 when gpr[rs] < val */
2111 amd64_clear_reg(b->jit_ptr,AMD64_RCX);
2112 amd64_mov_membase_reg(b->jit_ptr,AMD64_R15,REG_OFFSET(rt),AMD64_RCX,8);
2113
2114 amd64_alu_reg_reg(b->jit_ptr,X86_CMP,AMD64_RAX,AMD64_RDX);
2115 test1 = b->jit_ptr;
2116 amd64_branch8(b->jit_ptr, X86_CC_GE, 0, 1);
2117
2118 amd64_inc_membase(b->jit_ptr,AMD64_R15,REG_OFFSET(rt));
2119
2120 /* end */
2121 amd64_patch(test1,b->jit_ptr);
2122 return(0);
2123 }
2124
2125 /* SLTU */
2126 static int mips64_emit_SLTU(cpu_mips_t *cpu,insn_block_t *b,mips_insn_t insn)
2127 {
2128 int rs = bits(insn,21,25);
2129 int rt = bits(insn,16,20);
2130 int rd = bits(insn,11,15);
2131 u_char *test1;
2132
2133 /* RDX = gpr[rs] */
2134 amd64_mov_reg_membase(b->jit_ptr,AMD64_RDX,AMD64_R15,REG_OFFSET(rs),8);
2135
2136 /* RAX = gpr[rt] */
2137 amd64_mov_reg_membase(b->jit_ptr,AMD64_RAX,AMD64_R15,REG_OFFSET(rt),8);
2138
2139 /* we set rd to 1 when gpr[rs] < gpr[rt] */
2140 amd64_clear_reg(b->jit_ptr,AMD64_RCX);
2141 amd64_mov_membase_reg(b->jit_ptr,AMD64_R15,REG_OFFSET(rd),AMD64_RCX,8);
2142
2143 amd64_alu_reg_reg(b->jit_ptr,X86_CMP,AMD64_RDX,AMD64_RAX);
2144 test1 = b->jit_ptr;
2145 amd64_branch8(b->jit_ptr, X86_CC_AE, 0, 0);
2146
2147 amd64_inc_membase(b->jit_ptr,AMD64_R15,REG_OFFSET(rd));
2148
2149 /* end */
2150 amd64_patch(test1,b->jit_ptr);
2151 return(0);
2152 }
2153
2154 /* SLTIU */
2155 static int mips64_emit_SLTIU(cpu_mips_t *cpu,insn_block_t *b,mips_insn_t insn)
2156 {
2157 int rs = bits(insn,21,25);
2158 int rt = bits(insn,16,20);
2159 int imm = bits(insn,0,15);
2160 m_uint64_t val = sign_extend(imm,16);
2161 u_char *test1;
2162
2163 /* RDX = val */
2164 mips64_load_imm(b,AMD64_RDX,val);
2165
2166 /* RAX = gpr[rs] */
2167 amd64_mov_reg_membase(b->jit_ptr,AMD64_RAX,AMD64_R15,REG_OFFSET(rs),8);
2168
2169 /* we set rt to 1 when gpr[rs] < val */
2170 amd64_clear_reg(b->jit_ptr,AMD64_RCX);
2171 amd64_mov_membase_reg(b->jit_ptr,AMD64_R15,REG_OFFSET(rt),AMD64_RCX,8);
2172
2173 amd64_alu_reg_reg(b->jit_ptr,X86_CMP,AMD64_RAX,AMD64_RDX);
2174 test1 = b->jit_ptr;
2175 amd64_branch8(b->jit_ptr, X86_CC_AE, 0, 0);
2176
2177 amd64_inc_membase(b->jit_ptr,AMD64_R15,REG_OFFSET(rt));
2178
2179 /* end */
2180 amd64_patch(test1,b->jit_ptr);
2181 return(0);
2182 }
2183
2184 /* SRA */
2185 static int mips64_emit_SRA(cpu_mips_t *cpu,insn_block_t *b,mips_insn_t insn)
2186 {
2187 int rt = bits(insn,16,20);
2188 int rd = bits(insn,11,15);
2189 int sa = bits(insn,6,10);
2190
2191 amd64_mov_reg_membase(b->jit_ptr,AMD64_RAX,AMD64_R15,REG_OFFSET(rt),4);
2192 amd64_shift_reg_imm_size(b->jit_ptr,X86_SAR,AMD64_RAX,sa,4);
2193
2194 amd64_movsxd_reg_reg(b->jit_ptr,AMD64_RAX,X86_EAX);
2195 amd64_mov_membase_reg(b->jit_ptr,AMD64_R15,REG_OFFSET(rd),AMD64_RAX,8);
2196 return(0);
2197 }
2198
2199 /* SRAV */
2200 static int mips64_emit_SRAV(cpu_mips_t *cpu,insn_block_t *b,mips_insn_t insn)
2201 {
2202 int rs = bits(insn,21,25);
2203 int rt = bits(insn,16,20);
2204 int rd = bits(insn,11,15);
2205
2206 amd64_mov_reg_membase(b->jit_ptr,AMD64_RCX,AMD64_R15,REG_OFFSET(rs),4);
2207 amd64_alu_reg_imm(b->jit_ptr,X86_AND,AMD64_RCX,0x1f);
2208
2209 amd64_mov_reg_membase(b->jit_ptr,AMD64_RAX,AMD64_R15,REG_OFFSET(rt),4);
2210 amd64_shift_reg_size(b->jit_ptr,X86_SAR,AMD64_RAX,4);
2211
2212 amd64_movsxd_reg_reg(b->jit_ptr,AMD64_RAX,X86_EAX);
2213 amd64_mov_membase_reg(b->jit_ptr,AMD64_R15,REG_OFFSET(rd),AMD64_RAX,8);
2214 return(0);
2215 }
2216
2217 /* SRL */
2218 static int mips64_emit_SRL(cpu_mips_t *cpu,insn_block_t *b,mips_insn_t insn)
2219 {
2220 int rt = bits(insn,16,20);
2221 int rd = bits(insn,11,15);
2222 int sa = bits(insn,6,10);
2223
2224 amd64_mov_reg_membase(b->jit_ptr,AMD64_RAX,AMD64_R15,REG_OFFSET(rt),4);
2225 amd64_shift_reg_imm(b->jit_ptr,X86_SHR,AMD64_RAX,sa);
2226
2227 amd64_movsxd_reg_reg(b->jit_ptr,AMD64_RAX,X86_EAX);
2228 amd64_mov_membase_reg(b->jit_ptr,AMD64_R15,REG_OFFSET(rd),AMD64_RAX,8);
2229 return(0);
2230 }
2231
2232 /* SRLV */
2233 static int mips64_emit_SRLV(cpu_mips_t *cpu,insn_block_t *b,mips_insn_t insn)
2234 {
2235 int rs = bits(insn,21,25);
2236 int rt = bits(insn,16,20);
2237 int rd = bits(insn,11,15);
2238
2239 amd64_mov_reg_membase(b->jit_ptr,AMD64_RCX,AMD64_R15,REG_OFFSET(rs),4);
2240 amd64_alu_reg_imm(b->jit_ptr,X86_AND,AMD64_RCX,0x1f);
2241
2242 amd64_mov_reg_membase(b->jit_ptr,AMD64_RAX,AMD64_R15,REG_OFFSET(rt),4);
2243 amd64_shift_reg(b->jit_ptr,X86_SHR,AMD64_RAX);
2244
2245 amd64_movsxd_reg_reg(b->jit_ptr,AMD64_RAX,X86_EAX);
2246 amd64_mov_membase_reg(b->jit_ptr,AMD64_R15,REG_OFFSET(rd),AMD64_RAX,8);
2247 return(0);
2248 }
2249
2250 /* SUB */
2251 static int mips64_emit_SUB(cpu_mips_t *cpu,insn_block_t *b,mips_insn_t insn)
2252 {
2253 int rs = bits(insn,21,25);
2254 int rt = bits(insn,16,20);
2255 int rd = bits(insn,11,15);
2256
2257 /* TODO: Exception handling */
2258 amd64_mov_reg_membase(b->jit_ptr,AMD64_RAX,AMD64_R15,REG_OFFSET(rs),8);
2259 amd64_alu_reg_membase(b->jit_ptr,X86_SUB,AMD64_RAX,AMD64_R15,
2260 REG_OFFSET(rt));
2261
2262 amd64_movsxd_reg_reg(b->jit_ptr,AMD64_RAX,X86_EAX);
2263 amd64_mov_membase_reg(b->jit_ptr,AMD64_R15,REG_OFFSET(rd),AMD64_RAX,8);
2264 return(0);
2265 }
2266
2267 /* SUBU */
2268 static int mips64_emit_SUBU(cpu_mips_t *cpu,insn_block_t *b,mips_insn_t insn)
2269 {
2270 int rs = bits(insn,21,25);
2271 int rt = bits(insn,16,20);
2272 int rd = bits(insn,11,15);
2273
2274 amd64_mov_reg_membase(b->jit_ptr,AMD64_RAX,AMD64_R15,REG_OFFSET(rs),8);
2275 amd64_alu_reg_membase(b->jit_ptr,X86_SUB,AMD64_RAX,AMD64_R15,
2276 REG_OFFSET(rt));
2277
2278 amd64_movsxd_reg_reg(b->jit_ptr,AMD64_RAX,X86_EAX);
2279 amd64_mov_membase_reg(b->jit_ptr,AMD64_R15,REG_OFFSET(rd),AMD64_RAX,8);
2280 return(0);
2281 }
2282
2283 /* SW (Store Word) */
2284 static int mips64_emit_SW(cpu_mips_t *cpu,insn_block_t *b,mips_insn_t insn)
2285 {
2286 int base = bits(insn,21,25);
2287 int rt = bits(insn,16,20);
2288 int offset = bits(insn,0,15);
2289
2290 if (cpu->fast_memop) {
2291 mips64_emit_memop_fast(b,MIPS_MEMOP_SW,base,offset,rt,FALSE,
2292 mips64_memop_fast_sw);
2293 } else {
2294 mips64_emit_memop(b,MIPS_MEMOP_SW,base,offset,rt,FALSE);
2295 }
2296 return(0);
2297 }
2298
2299 /* SWL (Store Word Left) */
2300 static int mips64_emit_SWL(cpu_mips_t *cpu,insn_block_t *b,mips_insn_t insn)
2301 {
2302 int base = bits(insn,21,25);
2303 int rt = bits(insn,16,20);
2304 int offset = bits(insn,0,15);
2305
2306 mips64_emit_memop(b,MIPS_MEMOP_SWL,base,offset,rt,FALSE);
2307 return(0);
2308 }
2309
2310 /* SWR (Store Word Right) */
2311 static int mips64_emit_SWR(cpu_mips_t *cpu,insn_block_t *b,mips_insn_t insn)
2312 {
2313 int base = bits(insn,21,25);
2314 int rt = bits(insn,16,20);
2315 int offset = bits(insn,0,15);
2316
2317 mips64_emit_memop(b,MIPS_MEMOP_SWR,base,offset,rt,FALSE);
2318 return(0);
2319 }
2320
2321 /* SYNC */
2322 static int mips64_emit_SYNC(cpu_mips_t *cpu,insn_block_t *b,mips_insn_t insn)
2323 {
2324 return(0);
2325 }
2326
2327 /* SYSCALL */
2328 static int mips64_emit_SYSCALL(cpu_mips_t *cpu,insn_block_t *b,
2329 mips_insn_t insn)
2330 {
2331 mips64_set_pc(b,b->start_pc+((b->mips_trans_pos-1)<<2));
2332 amd64_mov_reg_reg(b->jit_ptr,AMD64_RDI,AMD64_R15,8);
2333 mips64_emit_basic_c_call(b,mips64_exec_syscall);
2334 insn_block_push_epilog(b);
2335 return(0);
2336 }
2337
2338 /* TEQ (Trap If Equal) */
2339 static int mips64_emit_TEQ(cpu_mips_t *cpu,insn_block_t *b,mips_insn_t insn)
2340 {
2341 int rs = bits(insn,21,25);
2342 int rt = bits(insn,16,20);
2343 u_char *test1;
2344
2345 /*
2346 * compare gpr[rs] and gpr[rt].
2347 */
2348 amd64_mov_reg_membase(b->jit_ptr,AMD64_RAX,AMD64_R15,REG_OFFSET(rs),8);
2349 amd64_alu_reg_membase(b->jit_ptr,X86_CMP,AMD64_RAX,
2350 AMD64_R15,REG_OFFSET(rt));
2351 test1 = b->jit_ptr;
2352 amd64_branch8(b->jit_ptr, X86_CC_NE, 0, 1);
2353
2354 /* Generate trap exception */
2355 amd64_mov_reg_reg(b->jit_ptr,AMD64_RDI,AMD64_R15,8);
2356 mips64_emit_c_call(b,mips64_trigger_trap_exception);
2357 insn_block_push_epilog(b);
2358
2359 /* end */
2360 amd64_patch(test1,b->jit_ptr);
2361 return(0);
2362 }
2363
2364 /* TEQI (Trap If Equal Immediate) */
2365 static int mips64_emit_TEQI(cpu_mips_t *cpu,insn_block_t *b,mips_insn_t insn)
2366 {
2367 int rs = bits(insn,21,25);
2368 int imm = bits(insn,0,15);
2369 m_uint64_t val = sign_extend(imm,16);
2370 u_char *test1;
2371
2372 /* RDX = val */
2373 mips64_load_imm(b,AMD64_RDX,val);
2374
2375 /* RAX = gpr[rs] */
2376 amd64_mov_reg_membase(b->jit_ptr,AMD64_RAX,AMD64_R15,REG_OFFSET(rs),8);
2377
2378 amd64_alu_reg_reg(b->jit_ptr,X86_CMP,AMD64_RAX,AMD64_RDX);
2379 test1 = b->jit_ptr;
2380 amd64_branch8(b->jit_ptr, X86_CC_NE, 0, 1);
2381
2382 /* Generate trap exception */
2383 amd64_mov_reg_reg(b->jit_ptr,AMD64_RDI,AMD64_R15,8);
2384 mips64_emit_c_call(b,mips64_trigger_trap_exception);
2385 insn_block_push_epilog(b);
2386
2387 /* end */
2388 amd64_patch(test1,b->jit_ptr);
2389 return(0);
2390 }
2391
2392 /* TLBP */
2393 static int mips64_emit_TLBP(cpu_mips_t *cpu,insn_block_t *b,mips_insn_t insn)
2394 {
2395 mips64_set_pc(b,b->start_pc+((b->mips_trans_pos-1)<<2));
2396 amd64_mov_reg_reg(b->jit_ptr,AMD64_RDI,AMD64_R15,8);
2397 mips64_emit_basic_c_call(b,cp0_exec_tlbp);
2398 return(0);
2399 }
2400
2401 /* TLBR */
2402 static int mips64_emit_TLBR(cpu_mips_t *cpu,insn_block_t *b,mips_insn_t insn)
2403 {
2404 mips64_set_pc(b,b->start_pc+((b->mips_trans_pos-1)<<2));
2405 amd64_mov_reg_reg(b->jit_ptr,AMD64_RDI,AMD64_R15,8);
2406 mips64_emit_basic_c_call(b,cp0_exec_tlbr);
2407 return(0);
2408 }
2409
2410 /* TLBWI */
2411 static int mips64_emit_TLBWI(cpu_mips_t *cpu,insn_block_t *b,mips_insn_t insn)
2412 {
2413 mips64_set_pc(b,b->start_pc+((b->mips_trans_pos-1)<<2));
2414 amd64_mov_reg_reg(b->jit_ptr,AMD64_RDI,AMD64_R15,8);
2415 mips64_emit_basic_c_call(b,cp0_exec_tlbwi);
2416 return(0);
2417 }
2418
2419 /* TLBWR */
2420 static int mips64_emit_TLBWR(cpu_mips_t *cpu,insn_block_t *b,mips_insn_t insn)
2421 {
2422 mips64_set_pc(b,b->start_pc+((b->mips_trans_pos-1)<<2));
2423 amd64_mov_reg_reg(b->jit_ptr,AMD64_RDI,AMD64_R15,8);
2424 mips64_emit_basic_c_call(b,cp0_exec_tlbwr);
2425 return(0);
2426 }
2427
2428 /* XOR */
2429 static int mips64_emit_XOR(cpu_mips_t *cpu,insn_block_t *b,mips_insn_t insn)
2430 {
2431 int rs = bits(insn,21,25);
2432 int rt = bits(insn,16,20);
2433 int rd = bits(insn,11,15);
2434
2435 amd64_mov_reg_membase(b->jit_ptr,AMD64_RAX,AMD64_R15,REG_OFFSET(rs),8);
2436 amd64_alu_reg_membase(b->jit_ptr,X86_XOR,AMD64_RAX,AMD64_R15,
2437 REG_OFFSET(rt));
2438 amd64_mov_membase_reg(b->jit_ptr,AMD64_R15,REG_OFFSET(rd),AMD64_RAX,8);
2439 return(0);
2440 }
2441
2442 /* XORI */
2443 static int mips64_emit_XORI(cpu_mips_t *cpu,insn_block_t *b,mips_insn_t insn)
2444 {
2445 int rs = bits(insn,21,25);
2446 int rt = bits(insn,16,20);
2447 int imm = bits(insn,0,15);
2448
2449 mips64_load_imm(b,AMD64_RAX,imm);
2450
2451 amd64_alu_reg_membase(b->jit_ptr,X86_XOR,AMD64_RAX,
2452 AMD64_R15,REG_OFFSET(rs));
2453
2454 amd64_mov_membase_reg(b->jit_ptr,AMD64_R15,REG_OFFSET(rt),AMD64_RAX,8);
2455 return(0);
2456 }
2457
2458 /* MIPS instruction array */
2459 struct insn_tag mips64_insn_tags[] = {
2460 { mips64_emit_LI , 0xffe00000 , 0x24000000, 1 }, /* virtual */
2461 { mips64_emit_MOVE , 0xfc1f07ff , 0x00000021, 1 }, /* virtual */
2462 { mips64_emit_B , 0xffff0000 , 0x10000000, 0 }, /* virtual */
2463 { mips64_emit_BAL , 0xffff0000 , 0x04110000, 0 }, /* virtual */
2464 { mips64_emit_BEQZ , 0xfc1f0000 , 0x10000000, 0 }, /* virtual */
2465 { mips64_emit_BNEZ , 0xfc1f0000 , 0x14000000, 0 }, /* virtual */
2466 { mips64_emit_ADD , 0xfc0007ff , 0x00000020, 1 },
2467 { mips64_emit_ADDI , 0xfc000000 , 0x20000000, 1 },
2468 { mips64_emit_ADDIU , 0xfc000000 , 0x24000000, 1 },
2469 { mips64_emit_ADDU , 0xfc0007ff , 0x00000021, 1 },
2470 { mips64_emit_AND , 0xfc0007ff , 0x00000024, 1 },
2471 { mips64_emit_ANDI , 0xfc000000 , 0x30000000, 1 },
2472 { mips64_emit_BEQ , 0xfc000000 , 0x10000000, 0 },
2473 { mips64_emit_BEQL , 0xfc000000 , 0x50000000, 0 },
2474 { mips64_emit_BGEZ , 0xfc1f0000 , 0x04010000, 0 },
2475 { mips64_emit_BGEZAL , 0xfc1f0000 , 0x04110000, 0 },
2476 { mips64_emit_BGEZALL , 0xfc1f0000 , 0x04130000, 0 },
2477 { mips64_emit_BGEZL , 0xfc1f0000 , 0x04030000, 0 },
2478 { mips64_emit_BGTZ , 0xfc1f0000 , 0x1c000000, 0 },
2479 { mips64_emit_BGTZL , 0xfc1f0000 , 0x5c000000, 0 },
2480 { mips64_emit_BLEZ , 0xfc1f0000 , 0x18000000, 0 },
2481 { mips64_emit_BLEZL , 0xfc1f0000 , 0x58000000, 0 },
2482 { mips64_emit_BLTZ , 0xfc1f0000 , 0x04000000, 0 },
2483 { mips64_emit_BLTZAL , 0xfc1f0000 , 0x04100000, 0 },
2484 { mips64_emit_BLTZALL , 0xfc1f0000 , 0x04120000, 0 },
2485 { mips64_emit_BLTZL , 0xfc1f0000 , 0x04020000, 0 },
2486 { mips64_emit_BNE , 0xfc000000 , 0x14000000, 0 },
2487 { mips64_emit_BNEL , 0xfc000000 , 0x54000000, 0 },
2488 { mips64_emit_BREAK , 0xfc00003f , 0x0000000d, 1 },
2489 { mips64_emit_CACHE , 0xfc000000 , 0xbc000000, 1 },
2490 { mips64_emit_CFC0 , 0xffe007ff , 0x40400000, 1 },
2491 { mips64_emit_CTC0 , 0xffe007ff , 0x40600000, 1 },
2492 { mips64_emit_DADDIU , 0xfc000000 , 0x64000000, 1 },
2493 { mips64_emit_DADDU , 0xfc0007ff , 0x0000002d, 1 },
2494 { mips64_emit_DIV , 0xfc00ffff , 0x0000001a, 1 },
2495 { mips64_emit_DIVU , 0xfc00ffff , 0x0000001b, 1 },
2496 { mips64_emit_DMFC0 , 0xffe007f8 , 0x40200000, 1 },
2497 { mips64_emit_DMFC1 , 0xffe007ff , 0x44200000, 1 },
2498 { mips64_emit_DMTC0 , 0xffe007f8 , 0x40a00000, 1 },
2499 { mips64_emit_DMTC1 , 0xffe007ff , 0x44a00000, 1 },
2500 { mips64_emit_DSLL , 0xffe0003f , 0x00000038, 1 },
2501 { mips64_emit_DSLL32 , 0xffe0003f , 0x0000003c, 1 },
2502 { mips64_emit_DSLLV , 0xfc0007ff , 0x00000014, 1 },
2503 { mips64_emit_DSRA , 0xffe0003f , 0x0000003b, 1 },
2504 { mips64_emit_DSRA32 , 0xffe0003f , 0x0000003f, 1 },
2505 { mips64_emit_DSRAV , 0xfc0007ff , 0x00000017, 1 },
2506 { mips64_emit_DSRL , 0xffe0003f , 0x0000003a, 1 },
2507 { mips64_emit_DSRL32 , 0xffe0003f , 0x0000003e, 1 },
2508 { mips64_emit_DSRLV , 0xfc0007ff , 0x00000016, 1 },
2509 { mips64_emit_DSUBU , 0xfc0007ff , 0x0000002f, 1 },
2510 { mips64_emit_ERET , 0xffffffff , 0x42000018, 0 },
2511 { mips64_emit_J , 0xfc000000 , 0x08000000, 0 },
2512 { mips64_emit_JAL , 0xfc000000 , 0x0c000000, 0 },
2513 { mips64_emit_JALR , 0xfc1f003f , 0x00000009, 0 },
2514 { mips64_emit_JR , 0xfc1ff83f , 0x00000008, 0 },
2515 { mips64_emit_LB , 0xfc000000 , 0x80000000, 1 },
2516 { mips64_emit_LBU , 0xfc000000 , 0x90000000, 1 },
2517 { mips64_emit_LD , 0xfc000000 , 0xdc000000, 1 },
2518 { mips64_emit_LDC1 , 0xfc000000 , 0xd4000000, 1 },
2519 { mips64_emit_LDL , 0xfc000000 , 0x68000000, 1 },
2520 { mips64_emit_LDR , 0xfc000000 , 0x6c000000, 1 },
2521 { mips64_emit_LH , 0xfc000000 , 0x84000000, 1 },
2522 { mips64_emit_LHU , 0xfc000000 , 0x94000000, 1 },
2523 { mips64_emit_LL , 0xfc000000 , 0xc0000000, 1 },
2524 { mips64_emit_LUI , 0xffe00000 , 0x3c000000, 1 },
2525 { mips64_emit_LW , 0xfc000000 , 0x8c000000, 1 },
2526 { mips64_emit_LWL , 0xfc000000 , 0x88000000, 1 },
2527 { mips64_emit_LWR , 0xfc000000 , 0x98000000, 1 },
2528 { mips64_emit_LWU , 0xfc000000 , 0x9c000000, 1 },
2529 { mips64_emit_MFC0 , 0xffe007ff , 0x40000000, 1 },
2530 { mips64_emit_CFC0 , 0xffe007ff , 0x40000001, 1 }, /* MFC0 / Set 1 */
2531 { mips64_emit_MFC1 , 0xffe007ff , 0x44000000, 1 },
2532 { mips64_emit_MFHI , 0xffff07ff , 0x00000010, 1 },
2533 { mips64_emit_MFLO , 0xffff07ff , 0x00000012, 1 },
2534 { mips64_emit_MTC0 , 0xffe007ff , 0x40800000, 1 },
2535 { mips64_emit_MTC1 , 0xffe007ff , 0x44800000, 1 },
2536 { mips64_emit_MTHI , 0xfc1fffff , 0x00000011, 1 },
2537 { mips64_emit_MTLO , 0xfc1fffff , 0x00000013, 1 },
2538 { mips64_emit_MUL , 0xfc0007ff , 0x70000002, 1 },
2539 { mips64_emit_MULT , 0xfc00ffff , 0x00000018, 1 },
2540 { mips64_emit_MULTU , 0xfc00ffff , 0x00000019, 1 },
2541 { mips64_emit_NOP , 0xffffffff , 0x00000000, 1 },
2542 { mips64_emit_NOR , 0xfc0007ff , 0x00000027, 1 },
2543 { mips64_emit_OR , 0xfc0007ff , 0x00000025, 1 },
2544 { mips64_emit_ORI , 0xfc000000 , 0x34000000, 1 },
2545 { mips64_emit_PREF , 0xfc000000 , 0xcc000000, 1 },
2546 { mips64_emit_PREFI , 0xfc0007ff , 0x4c00000f, 1 },
2547 { mips64_emit_SB , 0xfc000000 , 0xa0000000, 1 },
2548 { mips64_emit_SC , 0xfc000000 , 0xe0000000, 1 },
2549 { mips64_emit_SD , 0xfc000000 , 0xfc000000, 1 },
2550 { mips64_emit_SDC1 , 0xfc000000 , 0xf4000000, 1 },
2551 { mips64_emit_SDL , 0xfc000000 , 0xb0000000, 1 },
2552 { mips64_emit_SDR , 0xfc000000 , 0xb4000000, 1 },
2553 { mips64_emit_SH , 0xfc000000 , 0xa4000000, 1 },
2554 { mips64_emit_SLL , 0xffe0003f , 0x00000000, 1 },
2555 { mips64_emit_SLLV , 0xfc0007ff , 0x00000004, 1 },
2556 { mips64_emit_SLT , 0xfc0007ff , 0x0000002a, 1 },
2557 { mips64_emit_SLTI , 0xfc000000 , 0x28000000, 1 },
2558 { mips64_emit_SLTIU , 0xfc000000 , 0x2c000000, 1 },
2559 { mips64_emit_SLTU , 0xfc0007ff , 0x0000002b, 1 },
2560 { mips64_emit_SRA , 0xffe0003f , 0x00000003, 1 },
2561 { mips64_emit_SRAV , 0xfc0007ff , 0x00000007, 1 },
2562 { mips64_emit_SRL , 0xffe0003f , 0x00000002, 1 },
2563 { mips64_emit_SRLV , 0xfc0007ff , 0x00000006, 1 },
2564 { mips64_emit_SUB , 0xfc0007ff , 0x00000022, 1 },
2565 { mips64_emit_SUBU , 0xfc0007ff , 0x00000023, 1 },
2566 { mips64_emit_SW , 0xfc000000 , 0xac000000, 1 },
2567 { mips64_emit_SWL , 0xfc000000 , 0xa8000000, 1 },
2568 { mips64_emit_SWR , 0xfc000000 , 0xb8000000, 1 },
2569 { mips64_emit_SYNC , 0xfffff83f , 0x0000000f, 1 },
2570 { mips64_emit_SYSCALL , 0xfc00003f , 0x0000000c, 1 },
2571 { mips64_emit_TEQ , 0xfc00003f , 0x00000034, 1 },
2572 { mips64_emit_TEQI , 0xfc1f0000 , 0x040c0000, 1 },
2573 { mips64_emit_TLBP , 0xffffffff , 0x42000008, 1 },
2574 { mips64_emit_TLBR , 0xffffffff , 0x42000001, 1 },
2575 { mips64_emit_TLBWI , 0xffffffff , 0x42000002, 1 },
2576 { mips64_emit_TLBWR , 0xffffffff , 0x42000006, 1 },
2577 { mips64_emit_XOR , 0xfc0007ff , 0x00000026, 1 },
2578 { mips64_emit_XORI , 0xfc000000 , 0x38000000, 1 },
2579 { mips64_emit_unknown , 0x00000000 , 0x00000000, 1 },
2580 };

  ViewVC Help
Powered by ViewVC 1.1.26