diff options
Diffstat (limited to 'dynasm')
-rw-r--r-- | dynasm/dasm_mips.h | 13 | ||||
-rw-r--r-- | dynasm/dasm_mips.lua | 625 | ||||
-rw-r--r-- | dynasm/dynasm.lua | 1 |
3 files changed, 407 insertions, 232 deletions
diff --git a/dynasm/dasm_mips.h b/dynasm/dasm_mips.h index 71a835b2..7d06aa72 100644 --- a/dynasm/dasm_mips.h +++ b/dynasm/dasm_mips.h | |||
@@ -355,14 +355,15 @@ int dasm_encode(Dst_DECL, void *buffer) | |||
355 | CK(n >= 0, UNDEF_PC); | 355 | CK(n >= 0, UNDEF_PC); |
356 | n = *DASM_POS2PTR(D, n); | 356 | n = *DASM_POS2PTR(D, n); |
357 | if (ins & 2048) | 357 | if (ins & 2048) |
358 | n = n - (int)((char *)cp - base); | ||
359 | else | ||
360 | n = (n + (int)(size_t)base) & 0x0fffffff; | 358 | n = (n + (int)(size_t)base) & 0x0fffffff; |
361 | patchrel: | 359 | else |
360 | n = n - (int)((char *)cp - base); | ||
361 | patchrel: { | ||
362 | unsigned int e = 16 + ((ins >> 12) & 15); | ||
362 | CK((n & 3) == 0 && | 363 | CK((n & 3) == 0 && |
363 | ((n + ((ins & 2048) ? 0x00020000 : 0)) >> | 364 | ((n + ((ins & 2048) ? 0 : (1<<(e+1)))) >> (e+2)) == 0, RANGE_REL); |
364 | ((ins & 2048) ? 18 : 28)) == 0, RANGE_REL); | 365 | cp[-1] |= ((n>>2) & ((1<<e)-1)); |
365 | cp[-1] |= ((n>>2) & ((ins & 2048) ? 0x0000ffff: 0x03ffffff)); | 366 | } |
366 | break; | 367 | break; |
367 | case DASM_LABEL_LG: | 368 | case DASM_LABEL_LG: |
368 | ins &= 2047; if (ins >= 20) D->globals[ins-10] = (void *)(base + n); | 369 | ins &= 2047; if (ins >= 20) D->globals[ins-10] = (void *)(base + n); |
diff --git a/dynasm/dasm_mips.lua b/dynasm/dasm_mips.lua index bd2a2b43..ccdc53cd 100644 --- a/dynasm/dasm_mips.lua +++ b/dynasm/dasm_mips.lua | |||
@@ -6,6 +6,7 @@ | |||
6 | ------------------------------------------------------------------------------ | 6 | ------------------------------------------------------------------------------ |
7 | 7 | ||
8 | local mips64 = mips64 | 8 | local mips64 = mips64 |
9 | local mipsr6 = _map_def.MIPSR6 | ||
9 | 10 | ||
10 | -- Module information: | 11 | -- Module information: |
11 | local _info = { | 12 | local _info = { |
@@ -238,7 +239,6 @@ local map_op = { | |||
238 | bne_3 = "14000000STB", | 239 | bne_3 = "14000000STB", |
239 | blez_2 = "18000000SB", | 240 | blez_2 = "18000000SB", |
240 | bgtz_2 = "1c000000SB", | 241 | bgtz_2 = "1c000000SB", |
241 | addi_3 = "20000000TSI", | ||
242 | li_2 = "24000000TI", | 242 | li_2 = "24000000TI", |
243 | addiu_3 = "24000000TSI", | 243 | addiu_3 = "24000000TSI", |
244 | slti_3 = "28000000TSI", | 244 | slti_3 = "28000000TSI", |
@@ -248,40 +248,22 @@ local map_op = { | |||
248 | ori_3 = "34000000TSU", | 248 | ori_3 = "34000000TSU", |
249 | xori_3 = "38000000TSU", | 249 | xori_3 = "38000000TSU", |
250 | lui_2 = "3c000000TU", | 250 | lui_2 = "3c000000TU", |
251 | beqzl_2 = "50000000SB", | ||
252 | beql_3 = "50000000STB", | ||
253 | bnezl_2 = "54000000SB", | ||
254 | bnel_3 = "54000000STB", | ||
255 | blezl_2 = "58000000SB", | ||
256 | bgtzl_2 = "5c000000SB", | ||
257 | daddi_3 = mips64 and "60000000TSI", | ||
258 | daddiu_3 = mips64 and "64000000TSI", | 251 | daddiu_3 = mips64 and "64000000TSI", |
259 | ldl_2 = mips64 and "68000000TO", | 252 | ldl_2 = mips64 and "68000000TO", |
260 | ldr_2 = mips64 and "6c000000TO", | 253 | ldr_2 = mips64 and "6c000000TO", |
261 | lb_2 = "80000000TO", | 254 | lb_2 = "80000000TO", |
262 | lh_2 = "84000000TO", | 255 | lh_2 = "84000000TO", |
263 | lwl_2 = "88000000TO", | ||
264 | lw_2 = "8c000000TO", | 256 | lw_2 = "8c000000TO", |
265 | lbu_2 = "90000000TO", | 257 | lbu_2 = "90000000TO", |
266 | lhu_2 = "94000000TO", | 258 | lhu_2 = "94000000TO", |
267 | lwr_2 = "98000000TO", | ||
268 | lwu_2 = mips64 and "9c000000TO", | 259 | lwu_2 = mips64 and "9c000000TO", |
269 | sb_2 = "a0000000TO", | 260 | sb_2 = "a0000000TO", |
270 | sh_2 = "a4000000TO", | 261 | sh_2 = "a4000000TO", |
271 | swl_2 = "a8000000TO", | ||
272 | sw_2 = "ac000000TO", | 262 | sw_2 = "ac000000TO", |
273 | sdl_2 = mips64 and "b0000000TO", | ||
274 | sdr_2 = mips64 and "b1000000TO", | ||
275 | swr_2 = "b8000000TO", | ||
276 | cache_2 = "bc000000NO", | ||
277 | ll_2 = "c0000000TO", | ||
278 | lwc1_2 = "c4000000HO", | 263 | lwc1_2 = "c4000000HO", |
279 | pref_2 = "cc000000NO", | ||
280 | ldc1_2 = "d4000000HO", | 264 | ldc1_2 = "d4000000HO", |
281 | ld_2 = mips64 and "dc000000TO", | 265 | ld_2 = mips64 and "dc000000TO", |
282 | sc_2 = "e0000000TO", | ||
283 | swc1_2 = "e4000000HO", | 266 | swc1_2 = "e4000000HO", |
284 | scd_2 = mips64 and "f0000000TO", | ||
285 | sdc1_2 = "f4000000HO", | 267 | sdc1_2 = "f4000000HO", |
286 | sd_2 = mips64 and "fc000000TO", | 268 | sd_2 = mips64 and "fc000000TO", |
287 | 269 | ||
@@ -289,10 +271,6 @@ local map_op = { | |||
289 | nop_0 = "00000000", | 271 | nop_0 = "00000000", |
290 | sll_3 = "00000000DTA", | 272 | sll_3 = "00000000DTA", |
291 | sextw_2 = "00000000DT", | 273 | sextw_2 = "00000000DT", |
292 | movf_2 = "00000001DS", | ||
293 | movf_3 = "00000001DSC", | ||
294 | movt_2 = "00010001DS", | ||
295 | movt_3 = "00010001DSC", | ||
296 | srl_3 = "00000002DTA", | 274 | srl_3 = "00000002DTA", |
297 | rotr_3 = "00200002DTA", | 275 | rotr_3 = "00200002DTA", |
298 | sra_3 = "00000003DTA", | 276 | sra_3 = "00000003DTA", |
@@ -301,31 +279,16 @@ local map_op = { | |||
301 | rotrv_3 = "00000046DTS", | 279 | rotrv_3 = "00000046DTS", |
302 | drotrv_3 = mips64 and "00000056DTS", | 280 | drotrv_3 = mips64 and "00000056DTS", |
303 | srav_3 = "00000007DTS", | 281 | srav_3 = "00000007DTS", |
304 | jr_1 = "00000008S", | ||
305 | jalr_1 = "0000f809S", | 282 | jalr_1 = "0000f809S", |
306 | jalr_2 = "00000009DS", | 283 | jalr_2 = "00000009DS", |
307 | movz_3 = "0000000aDST", | ||
308 | movn_3 = "0000000bDST", | ||
309 | syscall_0 = "0000000c", | 284 | syscall_0 = "0000000c", |
310 | syscall_1 = "0000000cY", | 285 | syscall_1 = "0000000cY", |
311 | break_0 = "0000000d", | 286 | break_0 = "0000000d", |
312 | break_1 = "0000000dY", | 287 | break_1 = "0000000dY", |
313 | sync_0 = "0000000f", | 288 | sync_0 = "0000000f", |
314 | mfhi_1 = "00000010D", | ||
315 | mthi_1 = "00000011S", | ||
316 | mflo_1 = "00000012D", | ||
317 | mtlo_1 = "00000013S", | ||
318 | dsllv_3 = mips64 and "00000014DTS", | 289 | dsllv_3 = mips64 and "00000014DTS", |
319 | dsrlv_3 = mips64 and "00000016DTS", | 290 | dsrlv_3 = mips64 and "00000016DTS", |
320 | dsrav_3 = mips64 and "00000017DTS", | 291 | dsrav_3 = mips64 and "00000017DTS", |
321 | mult_2 = "00000018ST", | ||
322 | multu_2 = "00000019ST", | ||
323 | div_2 = "0000001aST", | ||
324 | divu_2 = "0000001bST", | ||
325 | dmult_2 = mips64 and "0000001cST", | ||
326 | dmultu_2 = mips64 and "0000001dST", | ||
327 | ddiv_2 = mips64 and "0000001eST", | ||
328 | ddivu_2 = mips64 and "0000001fST", | ||
329 | add_3 = "00000020DST", | 292 | add_3 = "00000020DST", |
330 | move_2 = mips64 and "00000025DS" or "00000021DS", | 293 | move_2 = mips64 and "00000025DS" or "00000021DS", |
331 | addu_3 = "00000021DST", | 294 | addu_3 = "00000021DST", |
@@ -369,32 +332,9 @@ local map_op = { | |||
369 | bgez_2 = "04010000SB", | 332 | bgez_2 = "04010000SB", |
370 | bltzl_2 = "04020000SB", | 333 | bltzl_2 = "04020000SB", |
371 | bgezl_2 = "04030000SB", | 334 | bgezl_2 = "04030000SB", |
372 | tgei_2 = "04080000SI", | ||
373 | tgeiu_2 = "04090000SI", | ||
374 | tlti_2 = "040a0000SI", | ||
375 | tltiu_2 = "040b0000SI", | ||
376 | teqi_2 = "040c0000SI", | ||
377 | tnei_2 = "040e0000SI", | ||
378 | bltzal_2 = "04100000SB", | ||
379 | bal_1 = "04110000B", | 335 | bal_1 = "04110000B", |
380 | bgezal_2 = "04110000SB", | ||
381 | bltzall_2 = "04120000SB", | ||
382 | bgezall_2 = "04130000SB", | ||
383 | synci_1 = "041f0000O", | 336 | synci_1 = "041f0000O", |
384 | 337 | ||
385 | -- Opcode SPECIAL2. | ||
386 | madd_2 = "70000000ST", | ||
387 | maddu_2 = "70000001ST", | ||
388 | mul_3 = "70000002DST", | ||
389 | msub_2 = "70000004ST", | ||
390 | msubu_2 = "70000005ST", | ||
391 | clz_2 = "70000020DS=", | ||
392 | clo_2 = "70000021DS=", | ||
393 | dclz_2 = mips64 and "70000024DS=", | ||
394 | dclo_2 = mips64 and "70000025DS=", | ||
395 | sdbbp_0 = "7000003f", | ||
396 | sdbbp_1 = "7000003fY", | ||
397 | |||
398 | -- Opcode SPECIAL3. | 338 | -- Opcode SPECIAL3. |
399 | ext_4 = "7c000000TSAM", -- Note: last arg is msbd = size-1 | 339 | ext_4 = "7c000000TSAM", -- Note: last arg is msbd = size-1 |
400 | dextm_4 = mips64 and "7c000001TSAM", -- Args: pos | size-1-32 | 340 | dextm_4 = mips64 and "7c000001TSAM", -- Args: pos | size-1-32 |
@@ -445,15 +385,6 @@ local map_op = { | |||
445 | ctc1_2 = "44c00000TG", | 385 | ctc1_2 = "44c00000TG", |
446 | mthc1_2 = "44e00000TG", | 386 | mthc1_2 = "44e00000TG", |
447 | 387 | ||
448 | bc1f_1 = "45000000B", | ||
449 | bc1f_2 = "45000000CB", | ||
450 | bc1t_1 = "45010000B", | ||
451 | bc1t_2 = "45010000CB", | ||
452 | bc1fl_1 = "45020000B", | ||
453 | bc1fl_2 = "45020000CB", | ||
454 | bc1tl_1 = "45030000B", | ||
455 | bc1tl_2 = "45030000CB", | ||
456 | |||
457 | ["add.s_3"] = "46000000FGH", | 388 | ["add.s_3"] = "46000000FGH", |
458 | ["sub.s_3"] = "46000001FGH", | 389 | ["sub.s_3"] = "46000001FGH", |
459 | ["mul.s_3"] = "46000002FGH", | 390 | ["mul.s_3"] = "46000002FGH", |
@@ -470,51 +401,11 @@ local map_op = { | |||
470 | ["trunc.w.s_2"] = "4600000dFG", | 401 | ["trunc.w.s_2"] = "4600000dFG", |
471 | ["ceil.w.s_2"] = "4600000eFG", | 402 | ["ceil.w.s_2"] = "4600000eFG", |
472 | ["floor.w.s_2"] = "4600000fFG", | 403 | ["floor.w.s_2"] = "4600000fFG", |
473 | ["movf.s_2"] = "46000011FG", | ||
474 | ["movf.s_3"] = "46000011FGC", | ||
475 | ["movt.s_2"] = "46010011FG", | ||
476 | ["movt.s_3"] = "46010011FGC", | ||
477 | ["movz.s_3"] = "46000012FGT", | ||
478 | ["movn.s_3"] = "46000013FGT", | ||
479 | ["recip.s_2"] = "46000015FG", | 404 | ["recip.s_2"] = "46000015FG", |
480 | ["rsqrt.s_2"] = "46000016FG", | 405 | ["rsqrt.s_2"] = "46000016FG", |
481 | ["cvt.d.s_2"] = "46000021FG", | 406 | ["cvt.d.s_2"] = "46000021FG", |
482 | ["cvt.w.s_2"] = "46000024FG", | 407 | ["cvt.w.s_2"] = "46000024FG", |
483 | ["cvt.l.s_2"] = "46000025FG", | 408 | ["cvt.l.s_2"] = "46000025FG", |
484 | ["cvt.ps.s_3"] = "46000026FGH", | ||
485 | ["c.f.s_2"] = "46000030GH", | ||
486 | ["c.f.s_3"] = "46000030VGH", | ||
487 | ["c.un.s_2"] = "46000031GH", | ||
488 | ["c.un.s_3"] = "46000031VGH", | ||
489 | ["c.eq.s_2"] = "46000032GH", | ||
490 | ["c.eq.s_3"] = "46000032VGH", | ||
491 | ["c.ueq.s_2"] = "46000033GH", | ||
492 | ["c.ueq.s_3"] = "46000033VGH", | ||
493 | ["c.olt.s_2"] = "46000034GH", | ||
494 | ["c.olt.s_3"] = "46000034VGH", | ||
495 | ["c.ult.s_2"] = "46000035GH", | ||
496 | ["c.ult.s_3"] = "46000035VGH", | ||
497 | ["c.ole.s_2"] = "46000036GH", | ||
498 | ["c.ole.s_3"] = "46000036VGH", | ||
499 | ["c.ule.s_2"] = "46000037GH", | ||
500 | ["c.ule.s_3"] = "46000037VGH", | ||
501 | ["c.sf.s_2"] = "46000038GH", | ||
502 | ["c.sf.s_3"] = "46000038VGH", | ||
503 | ["c.ngle.s_2"] = "46000039GH", | ||
504 | ["c.ngle.s_3"] = "46000039VGH", | ||
505 | ["c.seq.s_2"] = "4600003aGH", | ||
506 | ["c.seq.s_3"] = "4600003aVGH", | ||
507 | ["c.ngl.s_2"] = "4600003bGH", | ||
508 | ["c.ngl.s_3"] = "4600003bVGH", | ||
509 | ["c.lt.s_2"] = "4600003cGH", | ||
510 | ["c.lt.s_3"] = "4600003cVGH", | ||
511 | ["c.nge.s_2"] = "4600003dGH", | ||
512 | ["c.nge.s_3"] = "4600003dVGH", | ||
513 | ["c.le.s_2"] = "4600003eGH", | ||
514 | ["c.le.s_3"] = "4600003eVGH", | ||
515 | ["c.ngt.s_2"] = "4600003fGH", | ||
516 | ["c.ngt.s_3"] = "4600003fVGH", | ||
517 | |||
518 | ["add.d_3"] = "46200000FGH", | 409 | ["add.d_3"] = "46200000FGH", |
519 | ["sub.d_3"] = "46200001FGH", | 410 | ["sub.d_3"] = "46200001FGH", |
520 | ["mul.d_3"] = "46200002FGH", | 411 | ["mul.d_3"] = "46200002FGH", |
@@ -531,130 +422,410 @@ local map_op = { | |||
531 | ["trunc.w.d_2"] = "4620000dFG", | 422 | ["trunc.w.d_2"] = "4620000dFG", |
532 | ["ceil.w.d_2"] = "4620000eFG", | 423 | ["ceil.w.d_2"] = "4620000eFG", |
533 | ["floor.w.d_2"] = "4620000fFG", | 424 | ["floor.w.d_2"] = "4620000fFG", |
534 | ["movf.d_2"] = "46200011FG", | ||
535 | ["movf.d_3"] = "46200011FGC", | ||
536 | ["movt.d_2"] = "46210011FG", | ||
537 | ["movt.d_3"] = "46210011FGC", | ||
538 | ["movz.d_3"] = "46200012FGT", | ||
539 | ["movn.d_3"] = "46200013FGT", | ||
540 | ["recip.d_2"] = "46200015FG", | 425 | ["recip.d_2"] = "46200015FG", |
541 | ["rsqrt.d_2"] = "46200016FG", | 426 | ["rsqrt.d_2"] = "46200016FG", |
542 | ["cvt.s.d_2"] = "46200020FG", | 427 | ["cvt.s.d_2"] = "46200020FG", |
543 | ["cvt.w.d_2"] = "46200024FG", | 428 | ["cvt.w.d_2"] = "46200024FG", |
544 | ["cvt.l.d_2"] = "46200025FG", | 429 | ["cvt.l.d_2"] = "46200025FG", |
545 | ["c.f.d_2"] = "46200030GH", | ||
546 | ["c.f.d_3"] = "46200030VGH", | ||
547 | ["c.un.d_2"] = "46200031GH", | ||
548 | ["c.un.d_3"] = "46200031VGH", | ||
549 | ["c.eq.d_2"] = "46200032GH", | ||
550 | ["c.eq.d_3"] = "46200032VGH", | ||
551 | ["c.ueq.d_2"] = "46200033GH", | ||
552 | ["c.ueq.d_3"] = "46200033VGH", | ||
553 | ["c.olt.d_2"] = "46200034GH", | ||
554 | ["c.olt.d_3"] = "46200034VGH", | ||
555 | ["c.ult.d_2"] = "46200035GH", | ||
556 | ["c.ult.d_3"] = "46200035VGH", | ||
557 | ["c.ole.d_2"] = "46200036GH", | ||
558 | ["c.ole.d_3"] = "46200036VGH", | ||
559 | ["c.ule.d_2"] = "46200037GH", | ||
560 | ["c.ule.d_3"] = "46200037VGH", | ||
561 | ["c.sf.d_2"] = "46200038GH", | ||
562 | ["c.sf.d_3"] = "46200038VGH", | ||
563 | ["c.ngle.d_2"] = "46200039GH", | ||
564 | ["c.ngle.d_3"] = "46200039VGH", | ||
565 | ["c.seq.d_2"] = "4620003aGH", | ||
566 | ["c.seq.d_3"] = "4620003aVGH", | ||
567 | ["c.ngl.d_2"] = "4620003bGH", | ||
568 | ["c.ngl.d_3"] = "4620003bVGH", | ||
569 | ["c.lt.d_2"] = "4620003cGH", | ||
570 | ["c.lt.d_3"] = "4620003cVGH", | ||
571 | ["c.nge.d_2"] = "4620003dGH", | ||
572 | ["c.nge.d_3"] = "4620003dVGH", | ||
573 | ["c.le.d_2"] = "4620003eGH", | ||
574 | ["c.le.d_3"] = "4620003eVGH", | ||
575 | ["c.ngt.d_2"] = "4620003fGH", | ||
576 | ["c.ngt.d_3"] = "4620003fVGH", | ||
577 | |||
578 | ["add.ps_3"] = "46c00000FGH", | ||
579 | ["sub.ps_3"] = "46c00001FGH", | ||
580 | ["mul.ps_3"] = "46c00002FGH", | ||
581 | ["abs.ps_2"] = "46c00005FG", | ||
582 | ["mov.ps_2"] = "46c00006FG", | ||
583 | ["neg.ps_2"] = "46c00007FG", | ||
584 | ["movf.ps_2"] = "46c00011FG", | ||
585 | ["movf.ps_3"] = "46c00011FGC", | ||
586 | ["movt.ps_2"] = "46c10011FG", | ||
587 | ["movt.ps_3"] = "46c10011FGC", | ||
588 | ["movz.ps_3"] = "46c00012FGT", | ||
589 | ["movn.ps_3"] = "46c00013FGT", | ||
590 | ["cvt.s.pu_2"] = "46c00020FG", | ||
591 | ["cvt.s.pl_2"] = "46c00028FG", | ||
592 | ["pll.ps_3"] = "46c0002cFGH", | ||
593 | ["plu.ps_3"] = "46c0002dFGH", | ||
594 | ["pul.ps_3"] = "46c0002eFGH", | ||
595 | ["puu.ps_3"] = "46c0002fFGH", | ||
596 | ["c.f.ps_2"] = "46c00030GH", | ||
597 | ["c.f.ps_3"] = "46c00030VGH", | ||
598 | ["c.un.ps_2"] = "46c00031GH", | ||
599 | ["c.un.ps_3"] = "46c00031VGH", | ||
600 | ["c.eq.ps_2"] = "46c00032GH", | ||
601 | ["c.eq.ps_3"] = "46c00032VGH", | ||
602 | ["c.ueq.ps_2"] = "46c00033GH", | ||
603 | ["c.ueq.ps_3"] = "46c00033VGH", | ||
604 | ["c.olt.ps_2"] = "46c00034GH", | ||
605 | ["c.olt.ps_3"] = "46c00034VGH", | ||
606 | ["c.ult.ps_2"] = "46c00035GH", | ||
607 | ["c.ult.ps_3"] = "46c00035VGH", | ||
608 | ["c.ole.ps_2"] = "46c00036GH", | ||
609 | ["c.ole.ps_3"] = "46c00036VGH", | ||
610 | ["c.ule.ps_2"] = "46c00037GH", | ||
611 | ["c.ule.ps_3"] = "46c00037VGH", | ||
612 | ["c.sf.ps_2"] = "46c00038GH", | ||
613 | ["c.sf.ps_3"] = "46c00038VGH", | ||
614 | ["c.ngle.ps_2"] = "46c00039GH", | ||
615 | ["c.ngle.ps_3"] = "46c00039VGH", | ||
616 | ["c.seq.ps_2"] = "46c0003aGH", | ||
617 | ["c.seq.ps_3"] = "46c0003aVGH", | ||
618 | ["c.ngl.ps_2"] = "46c0003bGH", | ||
619 | ["c.ngl.ps_3"] = "46c0003bVGH", | ||
620 | ["c.lt.ps_2"] = "46c0003cGH", | ||
621 | ["c.lt.ps_3"] = "46c0003cVGH", | ||
622 | ["c.nge.ps_2"] = "46c0003dGH", | ||
623 | ["c.nge.ps_3"] = "46c0003dVGH", | ||
624 | ["c.le.ps_2"] = "46c0003eGH", | ||
625 | ["c.le.ps_3"] = "46c0003eVGH", | ||
626 | ["c.ngt.ps_2"] = "46c0003fGH", | ||
627 | ["c.ngt.ps_3"] = "46c0003fVGH", | ||
628 | |||
629 | ["cvt.s.w_2"] = "46800020FG", | 430 | ["cvt.s.w_2"] = "46800020FG", |
630 | ["cvt.d.w_2"] = "46800021FG", | 431 | ["cvt.d.w_2"] = "46800021FG", |
631 | |||
632 | ["cvt.s.l_2"] = "46a00020FG", | 432 | ["cvt.s.l_2"] = "46a00020FG", |
633 | ["cvt.d.l_2"] = "46a00021FG", | 433 | ["cvt.d.l_2"] = "46a00021FG", |
634 | |||
635 | -- Opcode COP1X. | ||
636 | lwxc1_2 = "4c000000FX", | ||
637 | ldxc1_2 = "4c000001FX", | ||
638 | luxc1_2 = "4c000005FX", | ||
639 | swxc1_2 = "4c000008FX", | ||
640 | sdxc1_2 = "4c000009FX", | ||
641 | suxc1_2 = "4c00000dFX", | ||
642 | prefx_2 = "4c00000fMX", | ||
643 | ["alnv.ps_4"] = "4c00001eFGHS", | ||
644 | ["madd.s_4"] = "4c000020FRGH", | ||
645 | ["madd.d_4"] = "4c000021FRGH", | ||
646 | ["madd.ps_4"] = "4c000026FRGH", | ||
647 | ["msub.s_4"] = "4c000028FRGH", | ||
648 | ["msub.d_4"] = "4c000029FRGH", | ||
649 | ["msub.ps_4"] = "4c00002eFRGH", | ||
650 | ["nmadd.s_4"] = "4c000030FRGH", | ||
651 | ["nmadd.d_4"] = "4c000031FRGH", | ||
652 | ["nmadd.ps_4"] = "4c000036FRGH", | ||
653 | ["nmsub.s_4"] = "4c000038FRGH", | ||
654 | ["nmsub.d_4"] = "4c000039FRGH", | ||
655 | ["nmsub.ps_4"] = "4c00003eFRGH", | ||
656 | } | 434 | } |
657 | 435 | ||
436 | if mipsr6 then -- Instructions added with MIPSR6. | ||
437 | |||
438 | for k,v in pairs({ | ||
439 | |||
440 | -- Add immediate to upper bits. | ||
441 | aui_3 = "3c000000TSI", | ||
442 | daui_3 = mips64 and "74000000TSI", | ||
443 | dahi_2 = mips64 and "04060000SI", | ||
444 | dati_2 = mips64 and "041e0000SI", | ||
445 | |||
446 | -- TODO: addiupc, auipc, aluipc, lwpc, lwupc, ldpc. | ||
447 | |||
448 | -- Compact branches. | ||
449 | blezalc_2 = "18000000TB", -- rt != 0. | ||
450 | bgezalc_2 = "18000000T=SB", -- rt != 0. | ||
451 | bgtzalc_2 = "1c000000TB", -- rt != 0. | ||
452 | bltzalc_2 = "1c000000T=SB", -- rt != 0. | ||
453 | |||
454 | blezc_2 = "58000000TB", -- rt != 0. | ||
455 | bgezc_2 = "58000000T=SB", -- rt != 0. | ||
456 | bgec_3 = "58000000STB", -- rs != rt. | ||
457 | blec_3 = "58000000TSB", -- rt != rs. | ||
458 | |||
459 | bgtzc_2 = "5c000000TB", -- rt != 0. | ||
460 | bltzc_2 = "5c000000T=SB", -- rt != 0. | ||
461 | bltc_3 = "5c000000STB", -- rs != rt. | ||
462 | bgtc_3 = "5c000000TSB", -- rt != rs. | ||
463 | |||
464 | bgeuc_3 = "18000000STB", -- rs != rt. | ||
465 | bleuc_3 = "18000000TSB", -- rt != rs. | ||
466 | bltuc_3 = "1c000000STB", -- rs != rt. | ||
467 | bgtuc_3 = "1c000000TSB", -- rt != rs. | ||
468 | |||
469 | beqzalc_2 = "20000000TB", -- rt != 0. | ||
470 | bnezalc_2 = "60000000TB", -- rt != 0. | ||
471 | beqc_3 = "20000000STB", -- rs < rt. | ||
472 | bnec_3 = "60000000STB", -- rs < rt. | ||
473 | bovc_3 = "20000000STB", -- rs >= rt. | ||
474 | bnvc_3 = "60000000STB", -- rs >= rt. | ||
475 | |||
476 | beqzc_2 = "d8000000SK", -- rs != 0. | ||
477 | bnezc_2 = "f8000000SK", -- rs != 0. | ||
478 | jic_2 = "d8000000TI", | ||
479 | jialc_2 = "f8000000TI", | ||
480 | bc_1 = "c8000000L", | ||
481 | balc_1 = "e8000000L", | ||
482 | |||
483 | -- Opcode SPECIAL. | ||
484 | jr_1 = "00000009S", | ||
485 | sdbbp_0 = "0000000e", | ||
486 | sdbbp_1 = "0000000eY", | ||
487 | lsa_4 = "00000005DSTA", | ||
488 | dlsa_4 = mips64 and "00000015DSTA", | ||
489 | seleqz_3 = "00000035DST", | ||
490 | selnez_3 = "00000037DST", | ||
491 | clz_2 = "00000050DS", | ||
492 | clo_2 = "00000051DS", | ||
493 | dclz_2 = mips64 and "00000052DS", | ||
494 | dclo_2 = mips64 and "00000053DS", | ||
495 | mul_3 = "00000098DST", | ||
496 | muh_3 = "000000d8DST", | ||
497 | mulu_3 = "00000099DST", | ||
498 | muhu_3 = "000000d9DST", | ||
499 | div_3 = "0000009aDST", | ||
500 | mod_3 = "000000daDST", | ||
501 | divu_3 = "0000009bDST", | ||
502 | modu_3 = "000000dbDST", | ||
503 | dmul_3 = mips64 and "0000009cDST", | ||
504 | dmuh_3 = mips64 and "000000dcDST", | ||
505 | dmulu_3 = mips64 and "0000009dDST", | ||
506 | dmuhu_3 = mips64 and "000000ddDST", | ||
507 | ddiv_3 = mips64 and "0000009eDST", | ||
508 | dmod_3 = mips64 and "000000deDST", | ||
509 | ddivu_3 = mips64 and "0000009fDST", | ||
510 | dmodu_3 = mips64 and "000000dfDST", | ||
511 | |||
512 | -- Opcode SPECIAL3. | ||
513 | align_4 = "7c000220DSTA", | ||
514 | dalign_4 = mips64 and "7c000224DSTA", | ||
515 | bitswap_2 = "7c000020DT", | ||
516 | dbitswap_2 = mips64 and "7c000024DT", | ||
517 | |||
518 | -- Opcode COP1. | ||
519 | bc1eqz_2 = "45200000HB", | ||
520 | bc1nez_2 = "45a00000HB", | ||
521 | |||
522 | ["sel.s_3"] = "46000010FGH", | ||
523 | ["seleqz.s_3"] = "46000014FGH", | ||
524 | ["selnez.s_3"] = "46000017FGH", | ||
525 | ["maddf.s_3"] = "46000018FGH", | ||
526 | ["msubf.s_3"] = "46000019FGH", | ||
527 | ["rint.s_2"] = "4600001aFG", | ||
528 | ["class.s_2"] = "4600001bFG", | ||
529 | ["min.s_3"] = "4600001cFGH", | ||
530 | ["mina.s_3"] = "4600001dFGH", | ||
531 | ["max.s_3"] = "4600001eFGH", | ||
532 | ["maxa.s_3"] = "4600001fFGH", | ||
533 | ["cmp.af.s_3"] = "46800000FGH", | ||
534 | ["cmp.un.s_3"] = "46800001FGH", | ||
535 | ["cmp.or.s_3"] = "46800011FGH", | ||
536 | ["cmp.eq.s_3"] = "46800002FGH", | ||
537 | ["cmp.une.s_3"] = "46800012FGH", | ||
538 | ["cmp.ueq.s_3"] = "46800003FGH", | ||
539 | ["cmp.ne.s_3"] = "46800013FGH", | ||
540 | ["cmp.lt.s_3"] = "46800004FGH", | ||
541 | ["cmp.ult.s_3"] = "46800005FGH", | ||
542 | ["cmp.le.s_3"] = "46800006FGH", | ||
543 | ["cmp.ule.s_3"] = "46800007FGH", | ||
544 | ["cmp.saf.s_3"] = "46800008FGH", | ||
545 | ["cmp.sun.s_3"] = "46800009FGH", | ||
546 | ["cmp.sor.s_3"] = "46800019FGH", | ||
547 | ["cmp.seq.s_3"] = "4680000aFGH", | ||
548 | ["cmp.sune.s_3"] = "4680001aFGH", | ||
549 | ["cmp.sueq.s_3"] = "4680000bFGH", | ||
550 | ["cmp.sne.s_3"] = "4680001bFGH", | ||
551 | ["cmp.slt.s_3"] = "4680000cFGH", | ||
552 | ["cmp.sult.s_3"] = "4680000dFGH", | ||
553 | ["cmp.sle.s_3"] = "4680000eFGH", | ||
554 | ["cmp.sule.s_3"] = "4680000fFGH", | ||
555 | |||
556 | ["sel.d_3"] = "46200010FGH", | ||
557 | ["seleqz.d_3"] = "46200014FGH", | ||
558 | ["selnez.d_3"] = "46200017FGH", | ||
559 | ["maddf.d_3"] = "46200018FGH", | ||
560 | ["msubf.d_3"] = "46200019FGH", | ||
561 | ["rint.d_2"] = "4620001aFG", | ||
562 | ["class.d_2"] = "4620001bFG", | ||
563 | ["min.d_3"] = "4620001cFGH", | ||
564 | ["mina.d_3"] = "4620001dFGH", | ||
565 | ["max.d_3"] = "4620001eFGH", | ||
566 | ["maxa.d_3"] = "4620001fFGH", | ||
567 | ["cmp.af.d_3"] = "46a00000FGH", | ||
568 | ["cmp.un.d_3"] = "46a00001FGH", | ||
569 | ["cmp.or.d_3"] = "46a00011FGH", | ||
570 | ["cmp.eq.d_3"] = "46a00002FGH", | ||
571 | ["cmp.une.d_3"] = "46a00012FGH", | ||
572 | ["cmp.ueq.d_3"] = "46a00003FGH", | ||
573 | ["cmp.ne.d_3"] = "46a00013FGH", | ||
574 | ["cmp.lt.d_3"] = "46a00004FGH", | ||
575 | ["cmp.ult.d_3"] = "46a00005FGH", | ||
576 | ["cmp.le.d_3"] = "46a00006FGH", | ||
577 | ["cmp.ule.d_3"] = "46a00007FGH", | ||
578 | ["cmp.saf.d_3"] = "46a00008FGH", | ||
579 | ["cmp.sun.d_3"] = "46a00009FGH", | ||
580 | ["cmp.sor.d_3"] = "46a00019FGH", | ||
581 | ["cmp.seq.d_3"] = "46a0000aFGH", | ||
582 | ["cmp.sune.d_3"] = "46a0001aFGH", | ||
583 | ["cmp.sueq.d_3"] = "46a0000bFGH", | ||
584 | ["cmp.sne.d_3"] = "46a0001bFGH", | ||
585 | ["cmp.slt.d_3"] = "46a0000cFGH", | ||
586 | ["cmp.sult.d_3"] = "46a0000dFGH", | ||
587 | ["cmp.sle.d_3"] = "46a0000eFGH", | ||
588 | ["cmp.sule.d_3"] = "46a0000fFGH", | ||
589 | |||
590 | }) do map_op[k] = v end | ||
591 | |||
592 | else -- Instructions removed by MIPSR6. | ||
593 | |||
594 | for k,v in pairs({ | ||
595 | -- Traps, don't use. | ||
596 | addi_3 = "20000000TSI", | ||
597 | daddi_3 = mips64 and "60000000TSI", | ||
598 | |||
599 | -- Branch on likely, don't use. | ||
600 | beqzl_2 = "50000000SB", | ||
601 | beql_3 = "50000000STB", | ||
602 | bnezl_2 = "54000000SB", | ||
603 | bnel_3 = "54000000STB", | ||
604 | blezl_2 = "58000000SB", | ||
605 | bgtzl_2 = "5c000000SB", | ||
606 | |||
607 | lwl_2 = "88000000TO", | ||
608 | lwr_2 = "98000000TO", | ||
609 | swl_2 = "a8000000TO", | ||
610 | sdl_2 = mips64 and "b0000000TO", | ||
611 | sdr_2 = mips64 and "b1000000TO", | ||
612 | swr_2 = "b8000000TO", | ||
613 | cache_2 = "bc000000NO", | ||
614 | ll_2 = "c0000000TO", | ||
615 | pref_2 = "cc000000NO", | ||
616 | sc_2 = "e0000000TO", | ||
617 | scd_2 = mips64 and "f0000000TO", | ||
618 | |||
619 | -- Opcode SPECIAL. | ||
620 | movf_2 = "00000001DS", | ||
621 | movf_3 = "00000001DSC", | ||
622 | movt_2 = "00010001DS", | ||
623 | movt_3 = "00010001DSC", | ||
624 | jr_1 = "00000008S", | ||
625 | movz_3 = "0000000aDST", | ||
626 | movn_3 = "0000000bDST", | ||
627 | mfhi_1 = "00000010D", | ||
628 | mthi_1 = "00000011S", | ||
629 | mflo_1 = "00000012D", | ||
630 | mtlo_1 = "00000013S", | ||
631 | mult_2 = "00000018ST", | ||
632 | multu_2 = "00000019ST", | ||
633 | div_3 = "0000001aST", | ||
634 | divu_3 = "0000001bST", | ||
635 | ddiv_3 = mips64 and "0000001eST", | ||
636 | ddivu_3 = mips64 and "0000001fST", | ||
637 | dmult_2 = mips64 and "0000001cST", | ||
638 | dmultu_2 = mips64 and "0000001dST", | ||
639 | |||
640 | -- Opcode REGIMM. | ||
641 | tgei_2 = "04080000SI", | ||
642 | tgeiu_2 = "04090000SI", | ||
643 | tlti_2 = "040a0000SI", | ||
644 | tltiu_2 = "040b0000SI", | ||
645 | teqi_2 = "040c0000SI", | ||
646 | tnei_2 = "040e0000SI", | ||
647 | bltzal_2 = "04100000SB", | ||
648 | bgezal_2 = "04110000SB", | ||
649 | bltzall_2 = "04120000SB", | ||
650 | bgezall_2 = "04130000SB", | ||
651 | |||
652 | -- Opcode SPECIAL2. | ||
653 | madd_2 = "70000000ST", | ||
654 | maddu_2 = "70000001ST", | ||
655 | mul_3 = "70000002DST", | ||
656 | msub_2 = "70000004ST", | ||
657 | msubu_2 = "70000005ST", | ||
658 | clz_2 = "70000020D=TS", | ||
659 | clo_2 = "70000021D=TS", | ||
660 | dclz_2 = mips64 and "70000024D=TS", | ||
661 | dclo_2 = mips64 and "70000025D=TS", | ||
662 | sdbbp_0 = "7000003f", | ||
663 | sdbbp_1 = "7000003fY", | ||
664 | |||
665 | -- Opcode COP1. | ||
666 | bc1f_1 = "45000000B", | ||
667 | bc1f_2 = "45000000CB", | ||
668 | bc1t_1 = "45010000B", | ||
669 | bc1t_2 = "45010000CB", | ||
670 | bc1fl_1 = "45020000B", | ||
671 | bc1fl_2 = "45020000CB", | ||
672 | bc1tl_1 = "45030000B", | ||
673 | bc1tl_2 = "45030000CB", | ||
674 | |||
675 | ["movf.s_2"] = "46000011FG", | ||
676 | ["movf.s_3"] = "46000011FGC", | ||
677 | ["movt.s_2"] = "46010011FG", | ||
678 | ["movt.s_3"] = "46010011FGC", | ||
679 | ["movz.s_3"] = "46000012FGT", | ||
680 | ["movn.s_3"] = "46000013FGT", | ||
681 | ["cvt.ps.s_3"] = "46000026FGH", | ||
682 | ["c.f.s_2"] = "46000030GH", | ||
683 | ["c.f.s_3"] = "46000030VGH", | ||
684 | ["c.un.s_2"] = "46000031GH", | ||
685 | ["c.un.s_3"] = "46000031VGH", | ||
686 | ["c.eq.s_2"] = "46000032GH", | ||
687 | ["c.eq.s_3"] = "46000032VGH", | ||
688 | ["c.ueq.s_2"] = "46000033GH", | ||
689 | ["c.ueq.s_3"] = "46000033VGH", | ||
690 | ["c.olt.s_2"] = "46000034GH", | ||
691 | ["c.olt.s_3"] = "46000034VGH", | ||
692 | ["c.ult.s_2"] = "46000035GH", | ||
693 | ["c.ult.s_3"] = "46000035VGH", | ||
694 | ["c.ole.s_2"] = "46000036GH", | ||
695 | ["c.ole.s_3"] = "46000036VGH", | ||
696 | ["c.ule.s_2"] = "46000037GH", | ||
697 | ["c.ule.s_3"] = "46000037VGH", | ||
698 | ["c.sf.s_2"] = "46000038GH", | ||
699 | ["c.sf.s_3"] = "46000038VGH", | ||
700 | ["c.ngle.s_2"] = "46000039GH", | ||
701 | ["c.ngle.s_3"] = "46000039VGH", | ||
702 | ["c.seq.s_2"] = "4600003aGH", | ||
703 | ["c.seq.s_3"] = "4600003aVGH", | ||
704 | ["c.ngl.s_2"] = "4600003bGH", | ||
705 | ["c.ngl.s_3"] = "4600003bVGH", | ||
706 | ["c.lt.s_2"] = "4600003cGH", | ||
707 | ["c.lt.s_3"] = "4600003cVGH", | ||
708 | ["c.nge.s_2"] = "4600003dGH", | ||
709 | ["c.nge.s_3"] = "4600003dVGH", | ||
710 | ["c.le.s_2"] = "4600003eGH", | ||
711 | ["c.le.s_3"] = "4600003eVGH", | ||
712 | ["c.ngt.s_2"] = "4600003fGH", | ||
713 | ["c.ngt.s_3"] = "4600003fVGH", | ||
714 | ["movf.d_2"] = "46200011FG", | ||
715 | ["movf.d_3"] = "46200011FGC", | ||
716 | ["movt.d_2"] = "46210011FG", | ||
717 | ["movt.d_3"] = "46210011FGC", | ||
718 | ["movz.d_3"] = "46200012FGT", | ||
719 | ["movn.d_3"] = "46200013FGT", | ||
720 | ["c.f.d_2"] = "46200030GH", | ||
721 | ["c.f.d_3"] = "46200030VGH", | ||
722 | ["c.un.d_2"] = "46200031GH", | ||
723 | ["c.un.d_3"] = "46200031VGH", | ||
724 | ["c.eq.d_2"] = "46200032GH", | ||
725 | ["c.eq.d_3"] = "46200032VGH", | ||
726 | ["c.ueq.d_2"] = "46200033GH", | ||
727 | ["c.ueq.d_3"] = "46200033VGH", | ||
728 | ["c.olt.d_2"] = "46200034GH", | ||
729 | ["c.olt.d_3"] = "46200034VGH", | ||
730 | ["c.ult.d_2"] = "46200035GH", | ||
731 | ["c.ult.d_3"] = "46200035VGH", | ||
732 | ["c.ole.d_2"] = "46200036GH", | ||
733 | ["c.ole.d_3"] = "46200036VGH", | ||
734 | ["c.ule.d_2"] = "46200037GH", | ||
735 | ["c.ule.d_3"] = "46200037VGH", | ||
736 | ["c.sf.d_2"] = "46200038GH", | ||
737 | ["c.sf.d_3"] = "46200038VGH", | ||
738 | ["c.ngle.d_2"] = "46200039GH", | ||
739 | ["c.ngle.d_3"] = "46200039VGH", | ||
740 | ["c.seq.d_2"] = "4620003aGH", | ||
741 | ["c.seq.d_3"] = "4620003aVGH", | ||
742 | ["c.ngl.d_2"] = "4620003bGH", | ||
743 | ["c.ngl.d_3"] = "4620003bVGH", | ||
744 | ["c.lt.d_2"] = "4620003cGH", | ||
745 | ["c.lt.d_3"] = "4620003cVGH", | ||
746 | ["c.nge.d_2"] = "4620003dGH", | ||
747 | ["c.nge.d_3"] = "4620003dVGH", | ||
748 | ["c.le.d_2"] = "4620003eGH", | ||
749 | ["c.le.d_3"] = "4620003eVGH", | ||
750 | ["c.ngt.d_2"] = "4620003fGH", | ||
751 | ["c.ngt.d_3"] = "4620003fVGH", | ||
752 | ["add.ps_3"] = "46c00000FGH", | ||
753 | ["sub.ps_3"] = "46c00001FGH", | ||
754 | ["mul.ps_3"] = "46c00002FGH", | ||
755 | ["abs.ps_2"] = "46c00005FG", | ||
756 | ["mov.ps_2"] = "46c00006FG", | ||
757 | ["neg.ps_2"] = "46c00007FG", | ||
758 | ["movf.ps_2"] = "46c00011FG", | ||
759 | ["movf.ps_3"] = "46c00011FGC", | ||
760 | ["movt.ps_2"] = "46c10011FG", | ||
761 | ["movt.ps_3"] = "46c10011FGC", | ||
762 | ["movz.ps_3"] = "46c00012FGT", | ||
763 | ["movn.ps_3"] = "46c00013FGT", | ||
764 | ["cvt.s.pu_2"] = "46c00020FG", | ||
765 | ["cvt.s.pl_2"] = "46c00028FG", | ||
766 | ["pll.ps_3"] = "46c0002cFGH", | ||
767 | ["plu.ps_3"] = "46c0002dFGH", | ||
768 | ["pul.ps_3"] = "46c0002eFGH", | ||
769 | ["puu.ps_3"] = "46c0002fFGH", | ||
770 | ["c.f.ps_2"] = "46c00030GH", | ||
771 | ["c.f.ps_3"] = "46c00030VGH", | ||
772 | ["c.un.ps_2"] = "46c00031GH", | ||
773 | ["c.un.ps_3"] = "46c00031VGH", | ||
774 | ["c.eq.ps_2"] = "46c00032GH", | ||
775 | ["c.eq.ps_3"] = "46c00032VGH", | ||
776 | ["c.ueq.ps_2"] = "46c00033GH", | ||
777 | ["c.ueq.ps_3"] = "46c00033VGH", | ||
778 | ["c.olt.ps_2"] = "46c00034GH", | ||
779 | ["c.olt.ps_3"] = "46c00034VGH", | ||
780 | ["c.ult.ps_2"] = "46c00035GH", | ||
781 | ["c.ult.ps_3"] = "46c00035VGH", | ||
782 | ["c.ole.ps_2"] = "46c00036GH", | ||
783 | ["c.ole.ps_3"] = "46c00036VGH", | ||
784 | ["c.ule.ps_2"] = "46c00037GH", | ||
785 | ["c.ule.ps_3"] = "46c00037VGH", | ||
786 | ["c.sf.ps_2"] = "46c00038GH", | ||
787 | ["c.sf.ps_3"] = "46c00038VGH", | ||
788 | ["c.ngle.ps_2"] = "46c00039GH", | ||
789 | ["c.ngle.ps_3"] = "46c00039VGH", | ||
790 | ["c.seq.ps_2"] = "46c0003aGH", | ||
791 | ["c.seq.ps_3"] = "46c0003aVGH", | ||
792 | ["c.ngl.ps_2"] = "46c0003bGH", | ||
793 | ["c.ngl.ps_3"] = "46c0003bVGH", | ||
794 | ["c.lt.ps_2"] = "46c0003cGH", | ||
795 | ["c.lt.ps_3"] = "46c0003cVGH", | ||
796 | ["c.nge.ps_2"] = "46c0003dGH", | ||
797 | ["c.nge.ps_3"] = "46c0003dVGH", | ||
798 | ["c.le.ps_2"] = "46c0003eGH", | ||
799 | ["c.le.ps_3"] = "46c0003eVGH", | ||
800 | ["c.ngt.ps_2"] = "46c0003fGH", | ||
801 | ["c.ngt.ps_3"] = "46c0003fVGH", | ||
802 | |||
803 | -- Opcode COP1X. | ||
804 | lwxc1_2 = "4c000000FX", | ||
805 | ldxc1_2 = "4c000001FX", | ||
806 | luxc1_2 = "4c000005FX", | ||
807 | swxc1_2 = "4c000008FX", | ||
808 | sdxc1_2 = "4c000009FX", | ||
809 | suxc1_2 = "4c00000dFX", | ||
810 | prefx_2 = "4c00000fMX", | ||
811 | ["alnv.ps_4"] = "4c00001eFGHS", | ||
812 | ["madd.s_4"] = "4c000020FRGH", | ||
813 | ["madd.d_4"] = "4c000021FRGH", | ||
814 | ["madd.ps_4"] = "4c000026FRGH", | ||
815 | ["msub.s_4"] = "4c000028FRGH", | ||
816 | ["msub.d_4"] = "4c000029FRGH", | ||
817 | ["msub.ps_4"] = "4c00002eFRGH", | ||
818 | ["nmadd.s_4"] = "4c000030FRGH", | ||
819 | ["nmadd.d_4"] = "4c000031FRGH", | ||
820 | ["nmadd.ps_4"] = "4c000036FRGH", | ||
821 | ["nmsub.s_4"] = "4c000038FRGH", | ||
822 | ["nmsub.d_4"] = "4c000039FRGH", | ||
823 | ["nmsub.ps_4"] = "4c00003eFRGH", | ||
824 | |||
825 | }) do map_op[k] = v end | ||
826 | |||
827 | end | ||
828 | |||
658 | ------------------------------------------------------------------------------ | 829 | ------------------------------------------------------------------------------ |
659 | 830 | ||
660 | local function parse_gpr(expr) | 831 | local function parse_gpr(expr) |
@@ -808,9 +979,11 @@ map_op[".template__"] = function(params, template, nparams) | |||
808 | op = op + parse_disp(params[n]); n = n + 1 | 979 | op = op + parse_disp(params[n]); n = n + 1 |
809 | elseif p == "X" then | 980 | elseif p == "X" then |
810 | op = op + parse_index(params[n]); n = n + 1 | 981 | op = op + parse_index(params[n]); n = n + 1 |
811 | elseif p == "B" or p == "J" then | 982 | elseif p == "B" or p == "J" or p == "K" or p == "L" then |
812 | local mode, m, s = parse_label(params[n], false) | 983 | local mode, m, s = parse_label(params[n], false) |
813 | if p == "B" then m = m + 2048 end | 984 | if p == "J" then m = m + 0xa800 |
985 | elseif p == "K" then m = m + 0x5000 | ||
986 | elseif p == "L" then m = m + 0xa000 end | ||
814 | waction("REL_"..mode, m, s, 1) | 987 | waction("REL_"..mode, m, s, 1) |
815 | n = n + 1 | 988 | n = n + 1 |
816 | elseif p == "A" then | 989 | elseif p == "A" then |
@@ -833,7 +1006,7 @@ map_op[".template__"] = function(params, template, nparams) | |||
833 | elseif p == "Z" then | 1006 | elseif p == "Z" then |
834 | op = op + parse_imm(params[n], 10, 6, 0, false); n = n + 1 | 1007 | op = op + parse_imm(params[n], 10, 6, 0, false); n = n + 1 |
835 | elseif p == "=" then | 1008 | elseif p == "=" then |
836 | op = op + shl(band(op, 0xf800), 5) -- Copy D to T for clz, clo. | 1009 | n = n - 1 -- Re-use previous parameter for next template char. |
837 | else | 1010 | else |
838 | assert(false) | 1011 | assert(false) |
839 | end | 1012 | end |
diff --git a/dynasm/dynasm.lua b/dynasm/dynasm.lua index 5ec21a79..46ebfca8 100644 --- a/dynasm/dynasm.lua +++ b/dynasm/dynasm.lua | |||
@@ -630,6 +630,7 @@ end | |||
630 | -- Load architecture-specific module. | 630 | -- Load architecture-specific module. |
631 | local function loadarch(arch) | 631 | local function loadarch(arch) |
632 | if not match(arch, "^[%w_]+$") then return "bad arch name" end | 632 | if not match(arch, "^[%w_]+$") then return "bad arch name" end |
633 | _G._map_def = map_def | ||
633 | local ok, m_arch = pcall(require, "dasm_"..arch) | 634 | local ok, m_arch = pcall(require, "dasm_"..arch) |
634 | if not ok then return "cannot load module: "..m_arch end | 635 | if not ok then return "cannot load module: "..m_arch end |
635 | g_arch = m_arch | 636 | g_arch = m_arch |