diff options
author | Mike Pall <mike> | 2010-09-13 21:11:51 +0200 |
---|---|---|
committer | Mike Pall <mike> | 2010-09-13 21:11:51 +0200 |
commit | cd6a45760aa977968b4196c60d2d50952d34eb2a (patch) | |
tree | fb60bc86fbc95ec991bc5622c521cd84778db6a1 | |
parent | 32bfececc59a962a0803a620572294bcefec37e4 (diff) | |
download | luajit-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.lua | 136 |
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 |