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 |
