aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMike Pall <mike>2010-09-13 21:11:51 +0200
committerMike Pall <mike>2010-09-13 21:11:51 +0200
commitcd6a45760aa977968b4196c60d2d50952d34eb2a (patch)
treefb60bc86fbc95ec991bc5622c521cd84778db6a1
parent32bfececc59a962a0803a620572294bcefec37e4 (diff)
downloadluajit-cd6a45760aa977968b4196c60d2d50952d34eb2a.tar.gz
luajit-cd6a45760aa977968b4196c60d2d50952d34eb2a.tar.bz2
luajit-cd6a45760aa977968b4196c60d2d50952d34eb2a.zip
PPC: Teach DynASM to reject r0 for some operands.
-rw-r--r--dynasm/dasm_ppc.lua136
1 files changed, 70 insertions, 66 deletions
diff --git a/dynasm/dasm_ppc.lua b/dynasm/dasm_ppc.lua
index dccf91f9..0511a4b5 100644
--- a/dynasm/dasm_ppc.lua
+++ b/dynasm/dasm_ppc.lua
@@ -246,10 +246,10 @@ local map_op = {
246 cmpdi_2 = "2c200000-RI", 246 cmpdi_2 = "2c200000-RI",
247 addic_3 = "30000000RRI", 247 addic_3 = "30000000RRI",
248 ["addic._3"] = "34000000RRI", 248 ["addic._3"] = "34000000RRI",
249 addi_3 = "38000000RRI", 249 addi_3 = "38000000RR0I",
250 li_2 = "38000000RI", 250 li_2 = "38000000RI",
251 la_2 = "38000000RD", 251 la_2 = "38000000RD",
252 addis_3 = "3c000000RRI", 252 addis_3 = "3c000000RR0I",
253 lis_2 = "3c000000RI", 253 lis_2 = "3c000000RI",
254 lus_2 = "3c000000RU", 254 lus_2 = "3c000000RU",
255 bc_3 = "40000000AAK", 255 bc_3 = "40000000AAK",
@@ -340,9 +340,9 @@ local map_op = {
340 iseleq_3 = "7c00009eRRR", 340 iseleq_3 = "7c00009eRRR",
341 mfcr_1 = "7c000026R", 341 mfcr_1 = "7c000026R",
342 -- NYI: mtcrf, mtocrf, mfocrf 342 -- NYI: mtcrf, mtocrf, mfocrf
343 lwarx_3 = "7c000028RRR", 343 lwarx_3 = "7c000028RR0R",
344 ldx_3 = "7c00002aRRR", 344 ldx_3 = "7c00002aRR0R",
345 lwzx_3 = "7c00002eRRR", 345 lwzx_3 = "7c00002eRR0R",
346 slw_3 = "7c000030RR~R.", 346 slw_3 = "7c000030RR~R.",
347 cntlzw_2 = "7c000034RR~", 347 cntlzw_2 = "7c000034RR~",
348 sld_3 = "7c000036RR~R.", 348 sld_3 = "7c000036RR~R.",
@@ -353,63 +353,63 @@ local map_op = {
353 cmpld_2 = "7c200040-RR", 353 cmpld_2 = "7c200040-RR",
354 subf_3 = "7c000050RRR.", 354 subf_3 = "7c000050RRR.",
355 sub_3 = "7c000050RRR~.", 355 sub_3 = "7c000050RRR~.",
356 ldux_3 = "7c00006aRRR", 356 ldux_3 = "7c00006aRR0R",
357 dcbst_2 = "7c00006c-RR", 357 dcbst_2 = "7c00006c-RR",
358 lwzux_3 = "7c00006eRRR", 358 lwzux_3 = "7c00006eRR0R",
359 cntlzd_2 = "7c000074RR~", 359 cntlzd_2 = "7c000074RR~",
360 andc_3 = "7c000078RR~R.", 360 andc_3 = "7c000078RR~R.",
361 td_3 = "7c000088ARR", 361 td_3 = "7c000088ARR",
362 mulhd_3 = "7c000092RRR.", 362 mulhd_3 = "7c000092RRR.",
363 mulhw_3 = "7c000096RRR.", 363 mulhw_3 = "7c000096RRR.",
364 ldarx_3 = "7c0000a8RRR", 364 ldarx_3 = "7c0000a8RR0R",
365 dcbf_2 = "7c0000ac-RR", 365 dcbf_2 = "7c0000ac-RR",
366 lbzx_3 = "7c0000aeRRR", 366 lbzx_3 = "7c0000aeRR0R",
367 neg_2 = "7c0000d0RR.", 367 neg_2 = "7c0000d0RR.",
368 lbzux_3 = "7c0000eeRRR", 368 lbzux_3 = "7c0000eeRR0R",
369 popcntb_2 = "7c0000f4RR~", 369 popcntb_2 = "7c0000f4RR~",
370 not_2 = "7c0000f8RR~%.", 370 not_2 = "7c0000f8RR~%.",
371 nor_3 = "7c0000f8RR~R.", 371 nor_3 = "7c0000f8RR~R.",
372 subfe_3 = "7c000110RRR.", 372 subfe_3 = "7c000110RRR.",
373 sube_3 = "7c000110RRR~.", 373 sube_3 = "7c000110RRR~.",
374 adde_3 = "7c000114RRR.", 374 adde_3 = "7c000114RRR.",
375 stdx_3 = "7c00012aRRR", 375 stdx_3 = "7c00012aRR0R",
376 stwcx_3 = "7c00012cRRR.", 376 stwcx_3 = "7c00012cRR0R.",
377 stwx_3 = "7c00012eRRR", 377 stwx_3 = "7c00012eRR0R",
378 prtyw_2 = "7c000134RR~", 378 prtyw_2 = "7c000134RR~",
379 stdux_3 = "7c00016aRRR", 379 stdux_3 = "7c00016aRR0R",
380 stwux_3 = "7c00016eRRR", 380 stwux_3 = "7c00016eRR0R",
381 prtyd_2 = "7c000174RR~", 381 prtyd_2 = "7c000174RR~",
382 subfze_2 = "7c000190RR.", 382 subfze_2 = "7c000190RR.",
383 addze_2 = "7c000194RR.", 383 addze_2 = "7c000194RR.",
384 stdcx_3 = "7c0001acRRR.", 384 stdcx_3 = "7c0001acRR0R.",
385 stbx_3 = "7c0001aeRRR", 385 stbx_3 = "7c0001aeRR0R",
386 subfme_2 = "7c0001d0RR.", 386 subfme_2 = "7c0001d0RR.",
387 mulld_3 = "7c0001d2RRR.", 387 mulld_3 = "7c0001d2RRR.",
388 addme_2 = "7c0001d4RR.", 388 addme_2 = "7c0001d4RR.",
389 mullw_3 = "7c0001d6RRR.", 389 mullw_3 = "7c0001d6RRR.",
390 dcbtst_2 = "7c0001ec-RR", 390 dcbtst_2 = "7c0001ec-RR",
391 stbux_3 = "7c0001eeRRR", 391 stbux_3 = "7c0001eeRR0R",
392 add_3 = "7c000214RRR.", 392 add_3 = "7c000214RRR.",
393 dcbt_2 = "7c00022c-RR", 393 dcbt_2 = "7c00022c-RR",
394 lhzx_3 = "7c00022eRRR", 394 lhzx_3 = "7c00022eRR0R",
395 eqv_3 = "7c000238RR~R.", 395 eqv_3 = "7c000238RR~R.",
396 eciwx_3 = "7c00026cRRR", 396 eciwx_3 = "7c00026cRR0R",
397 lhzux_3 = "7c00026eRRR", 397 lhzux_3 = "7c00026eRR0R",
398 xor_3 = "7c000278RR~R.", 398 xor_3 = "7c000278RR~R.",
399 mfspefscr_1 = "7c0082a6R", 399 mfspefscr_1 = "7c0082a6R",
400 mfxer_1 = "7c0102a6R", 400 mfxer_1 = "7c0102a6R",
401 mflr_1 = "7c0802a6R", 401 mflr_1 = "7c0802a6R",
402 mfctr_1 = "7c0902a6R", 402 mfctr_1 = "7c0902a6R",
403 lwax_3 = "7c0002aaRRR", 403 lwax_3 = "7c0002aaRR0R",
404 lhax_3 = "7c0002aeRRR", 404 lhax_3 = "7c0002aeRR0R",
405 mftb_1 = "7c0c42e6R", 405 mftb_1 = "7c0c42e6R",
406 mftbu_1 = "7c0d42e6R", 406 mftbu_1 = "7c0d42e6R",
407 lwaux_3 = "7c0002eaRRR", 407 lwaux_3 = "7c0002eaRR0R",
408 lhaux_3 = "7c0002eeRRR", 408 lhaux_3 = "7c0002eeRR0R",
409 sthx_3 = "7c00032eRRR", 409 sthx_3 = "7c00032eRR0R",
410 orc_3 = "7c000338RR~R.", 410 orc_3 = "7c000338RR~R.",
411 ecowx_3 = "7c00036cRRR", 411 ecowx_3 = "7c00036cRR0R",
412 sthux_3 = "7c00036eRRR", 412 sthux_3 = "7c00036eRR0R",
413 or_3 = "7c000378RR~R.", 413 or_3 = "7c000378RR~R.",
414 mr_2 = "7c000378RR~%.", 414 mr_2 = "7c000378RR~%.",
415 divdu_3 = "7c000392RRR.", 415 divdu_3 = "7c000392RRR.",
@@ -427,54 +427,54 @@ local map_op = {
427 subfco_3 = "7c000410RRR.", 427 subfco_3 = "7c000410RRR.",
428 subco_3 = "7c000410RRR~.", 428 subco_3 = "7c000410RRR~.",
429 addco_3 = "7c000414RRR.", 429 addco_3 = "7c000414RRR.",
430 ldbrx_3 = "7c000428RRR", 430 ldbrx_3 = "7c000428RR0R",
431 lswx_3 = "7c00042aRRR", 431 lswx_3 = "7c00042aRR0R",
432 lwbrx_3 = "7c00042cRRR", 432 lwbrx_3 = "7c00042cRR0R",
433 lfsx_3 = "7c00042eFRR", 433 lfsx_3 = "7c00042eFR0R",
434 srw_3 = "7c000430RR~R.", 434 srw_3 = "7c000430RR~R.",
435 srd_3 = "7c000436RR~R.", 435 srd_3 = "7c000436RR~R.",
436 subfo_3 = "7c000450RRR.", 436 subfo_3 = "7c000450RRR.",
437 subo_3 = "7c000450RRR~.", 437 subo_3 = "7c000450RRR~.",
438 lfsux_3 = "7c00046eFRR", 438 lfsux_3 = "7c00046eFR0R",
439 lswi_3 = "7c0004aaRRA", 439 lswi_3 = "7c0004aaRR0A",
440 sync_0 = "7c0004ac", 440 sync_0 = "7c0004ac",
441 lwsync_0 = "7c2004ac", 441 lwsync_0 = "7c2004ac",
442 ptesync_0 = "7c4004ac", 442 ptesync_0 = "7c4004ac",
443 lfdx_3 = "7c0004aeFRR", 443 lfdx_3 = "7c0004aeFR0R",
444 nego_2 = "7c0004d0RR.", 444 nego_2 = "7c0004d0RR.",
445 lfdux_3 = "7c0004eeFRR", 445 lfdux_3 = "7c0004eeFR0R",
446 subfeo_3 = "7c000510RRR.", 446 subfeo_3 = "7c000510RRR.",
447 subeo_3 = "7c000510RRR~.", 447 subeo_3 = "7c000510RRR~.",
448 addeo_3 = "7c000514RRR.", 448 addeo_3 = "7c000514RRR.",
449 stdbrx_3 = "7c000528RRR", 449 stdbrx_3 = "7c000528RR0R",
450 stswx_3 = "7c00052aRRR", 450 stswx_3 = "7c00052aRR0R",
451 stwbrx_3 = "7c00052cRRR", 451 stwbrx_3 = "7c00052cRR0R",
452 stfsx_3 = "7c00052eFRR", 452 stfsx_3 = "7c00052eFR0R",
453 stfsux_3 = "7c00056eFRR", 453 stfsux_3 = "7c00056eFR0R",
454 subfzeo_2 = "7c000590RR.", 454 subfzeo_2 = "7c000590RR.",
455 addzeo_2 = "7c000594RR.", 455 addzeo_2 = "7c000594RR.",
456 stswi_3 = "7c0005aaRRA", 456 stswi_3 = "7c0005aaRR0A",
457 stfdx_3 = "7c0005aeFRR", 457 stfdx_3 = "7c0005aeFR0R",
458 subfmeo_2 = "7c0005d0RR.", 458 subfmeo_2 = "7c0005d0RR.",
459 mulldo_3 = "7c0005d2RRR.", 459 mulldo_3 = "7c0005d2RRR.",
460 addmeo_2 = "7c0005d4RR.", 460 addmeo_2 = "7c0005d4RR.",
461 mullwo_3 = "7c0005d6RRR.", 461 mullwo_3 = "7c0005d6RRR.",
462 dcba_2 = "7c0005ec-RR", 462 dcba_2 = "7c0005ec-RR",
463 stfdux_3 = "7c0005eeFRR", 463 stfdux_3 = "7c0005eeFR0R",
464 addo_3 = "7c000614RRR.", 464 addo_3 = "7c000614RRR.",
465 lhbrx_3 = "7c00062cRRR", 465 lhbrx_3 = "7c00062cRR0R",
466 sraw_3 = "7c000630RR~R.", 466 sraw_3 = "7c000630RR~R.",
467 srad_3 = "7c000634RR~R.", 467 srad_3 = "7c000634RR~R.",
468 srawi_3 = "7c000670RR~A.", 468 srawi_3 = "7c000670RR~A.",
469 eieio_0 = "7c0006ac", 469 eieio_0 = "7c0006ac",
470 lfiwax_3 = "7c0006aeFRR", 470 lfiwax_3 = "7c0006aeFR0R",
471 sthbrx_3 = "7c00072cRRR", 471 sthbrx_3 = "7c00072cRR0R",
472 extsh_2 = "7c000734RR~.", 472 extsh_2 = "7c000734RR~.",
473 extsb_2 = "7c000774RR~.", 473 extsb_2 = "7c000774RR~.",
474 divduo_3 = "7c000792RRR.", 474 divduo_3 = "7c000792RRR.",
475 divwou_3 = "7c000796RRR.", 475 divwou_3 = "7c000796RRR.",
476 icbi_2 = "7c0007ac-RR", 476 icbi_2 = "7c0007ac-RR",
477 stfiwx_3 = "7c0007aeFRR", 477 stfiwx_3 = "7c0007aeFR0R",
478 extsw_2 = "7c0007b4RR~.", 478 extsw_2 = "7c0007b4RR~.",
479 divdo_3 = "7c0007d2RRR.", 479 divdo_3 = "7c0007d2RRR.",
480 divwo_3 = "7c0007d6RRR.", 480 divwo_3 = "7c0007d6RRR.",
@@ -670,31 +670,31 @@ local map_op = {
670 efdtstlt_2 = "100002fd-RR", 670 efdtstlt_2 = "100002fd-RR",
671 efdtsteq_3 = "100002feXRR", 671 efdtsteq_3 = "100002feXRR",
672 efdtsteq_2 = "100002fe-RR", 672 efdtsteq_2 = "100002fe-RR",
673 evlddx_3 = "10000300RRR", 673 evlddx_3 = "10000300RR0R",
674 evldd_2 = "10000301R8", 674 evldd_2 = "10000301R8",
675 evldwx_3 = "10000302RRR", 675 evldwx_3 = "10000302RR0R",
676 evldw_2 = "10000303R8", 676 evldw_2 = "10000303R8",
677 evldhx_3 = "10000304RRR", 677 evldhx_3 = "10000304RR0R",
678 evldh_2 = "10000305R8", 678 evldh_2 = "10000305R8",
679 evlwhex_3 = "10000310RRR", 679 evlwhex_3 = "10000310RR0R",
680 evlwhe_2 = "10000311R4", 680 evlwhe_2 = "10000311R4",
681 evlwhoux_3 = "10000314RRR", 681 evlwhoux_3 = "10000314RR0R",
682 evlwhou_2 = "10000315R4", 682 evlwhou_2 = "10000315R4",
683 evlwhosx_3 = "10000316RRR", 683 evlwhosx_3 = "10000316RR0R",
684 evlwhos_2 = "10000317R4", 684 evlwhos_2 = "10000317R4",
685 evstddx_3 = "10000320RRR", 685 evstddx_3 = "10000320RR0R",
686 evstdd_2 = "10000321R8", 686 evstdd_2 = "10000321R8",
687 evstdwx_3 = "10000322RRR", 687 evstdwx_3 = "10000322RR0R",
688 evstdw_2 = "10000323R8", 688 evstdw_2 = "10000323R8",
689 evstdhx_3 = "10000324RRR", 689 evstdhx_3 = "10000324RR0R",
690 evstdh_2 = "10000325R8", 690 evstdh_2 = "10000325R8",
691 evstwhex_3 = "10000330RRR", 691 evstwhex_3 = "10000330RR0R",
692 evstwhe_2 = "10000331R4", 692 evstwhe_2 = "10000331R4",
693 evstwhox_3 = "10000334RRR", 693 evstwhox_3 = "10000334RR0R",
694 evstwho_2 = "10000335R4", 694 evstwho_2 = "10000335R4",
695 evstwwex_3 = "10000338RRR", 695 evstwwex_3 = "10000338RR0R",
696 evstwwe_2 = "10000339R4", 696 evstwwe_2 = "10000339R4",
697 evstwwox_3 = "1000033cRRR", 697 evstwwox_3 = "1000033cRR0R",
698 evstwwo_2 = "1000033dR4", 698 evstwwo_2 = "1000033dR4",
699 evmhessf_3 = "10000403RRR", 699 evmhessf_3 = "10000403RRR",
700 evmhossf_3 = "10000407RRR", 700 evmhossf_3 = "10000407RRR",
@@ -743,15 +743,15 @@ local map_op = {
743 evmwsmfan_3 = "100005dbRRR", 743 evmwsmfan_3 = "100005dbRRR",
744 evmergehilo_3 = "1000022eRRR", 744 evmergehilo_3 = "1000022eRRR",
745 evmergelohi_3 = "1000022fRRR", 745 evmergelohi_3 = "1000022fRRR",
746 evlhhesplatx_3 = "10000308RRR", 746 evlhhesplatx_3 = "10000308RR0R",
747 evlhhesplat_2 = "10000309R2", 747 evlhhesplat_2 = "10000309R2",
748 evlhhousplatx_3 = "1000030cRRR", 748 evlhhousplatx_3 = "1000030cRR0R",
749 evlhhousplat_2 = "1000030dR2", 749 evlhhousplat_2 = "1000030dR2",
750 evlhhossplatx_3 = "1000030eRRR", 750 evlhhossplatx_3 = "1000030eRR0R",
751 evlhhossplat_2 = "1000030fR2", 751 evlhhossplat_2 = "1000030fR2",
752 evlwwsplatx_3 = "10000318RRR", 752 evlwwsplatx_3 = "10000318RR0R",
753 evlwwsplat_2 = "10000319R4", 753 evlwwsplat_2 = "10000319R4",
754 evlwhsplatx_3 = "1000031cRRR", 754 evlwhsplatx_3 = "1000031cRR0R",
755 evlwhsplat_2 = "1000031dR4", 755 evlwhsplat_2 = "1000031dR4",
756 evaddusiaaw_2 = "100004c0RR", 756 evaddusiaaw_2 = "100004c0RR",
757 evaddssiaaw_2 = "100004c1RR", 757 evaddssiaaw_2 = "100004c1RR",
@@ -1027,6 +1027,10 @@ map_op[".template__"] = function(params, template, nparams)
1027 if p == "K" then n = n + 2048 end 1027 if p == "K" then n = n + 2048 end
1028 waction("REL_"..mode, n, s, 1) 1028 waction("REL_"..mode, n, s, 1)
1029 n = n + 1 1029 n = n + 1
1030 elseif p == "0" then
1031 local mm = 2^rs
1032 local t = op % mm
1033 if ((op - t) / mm) % 32 == 0 then werror("cannot use r0") end
1030 elseif p == "=" or p == "%" then 1034 elseif p == "=" or p == "%" then
1031 local mm = 2^(rs + (p == "%" and 5 or 0)) 1035 local mm = 2^(rs + (p == "%" and 5 or 0))
1032 local t = ((op - op % mm) / mm) % 32 1036 local t = ((op - op % mm) / mm) % 32