aboutsummaryrefslogtreecommitdiff
path: root/dynasm
diff options
context:
space:
mode:
authorMike Pall <mike>2015-01-14 21:40:24 +0100
committerMike Pall <mike>2015-01-14 21:40:24 +0100
commit3e1703895aac84478631d7eba93f3ae4d182f18b (patch)
tree68d9be90b9610d4534dae49892a18eb61fd7ab6c /dynasm
parent3f19b3424271e5fe48136f032e57fee7825e7af4 (diff)
downloadluajit-3e1703895aac84478631d7eba93f3ae4d182f18b.tar.gz
luajit-3e1703895aac84478631d7eba93f3ae4d182f18b.tar.bz2
luajit-3e1703895aac84478631d7eba93f3ae4d182f18b.zip
DynASM/PPC: Add missing PPC64 instructions and various extensions.
Contributed by Caio Souza Oliveira.
Diffstat (limited to 'dynasm')
-rw-r--r--dynasm/dasm_ppc.h2
-rw-r--r--dynasm/dasm_ppc.lua596
2 files changed, 592 insertions, 6 deletions
diff --git a/dynasm/dasm_ppc.h b/dynasm/dasm_ppc.h
index 7df49365..2ded2580 100644
--- a/dynasm/dasm_ppc.h
+++ b/dynasm/dasm_ppc.h
@@ -1,5 +1,5 @@
1/* 1/*
2** DynASM PPC encoding engine. 2** DynASM PPC/PPC64 encoding engine.
3** Copyright (C) 2005-2015 Mike Pall. All rights reserved. 3** Copyright (C) 2005-2015 Mike Pall. All rights reserved.
4** Released under the MIT license. See dynasm.lua for full copyright notice. 4** Released under the MIT license. See dynasm.lua for full copyright notice.
5*/ 5*/
diff --git a/dynasm/dasm_ppc.lua b/dynasm/dasm_ppc.lua
index 91f4ff9a..37447072 100644
--- a/dynasm/dasm_ppc.lua
+++ b/dynasm/dasm_ppc.lua
@@ -1,8 +1,10 @@
1------------------------------------------------------------------------------ 1------------------------------------------------------------------------------
2-- DynASM PPC module. 2-- DynASM PPC/PPC64 module.
3-- 3--
4-- Copyright (C) 2005-2015 Mike Pall. All rights reserved. 4-- Copyright (C) 2005-2015 Mike Pall. All rights reserved.
5-- See dynasm.lua for full copyright notice. 5-- See dynasm.lua for full copyright notice.
6--
7-- Support for various extensions contributed by Caio Souza Oliveira.
6------------------------------------------------------------------------------ 8------------------------------------------------------------------------------
7 9
8-- Module information: 10-- Module information:
@@ -11,7 +13,7 @@ local _info = {
11 description = "DynASM PPC module", 13 description = "DynASM PPC module",
12 version = "1.3.0", 14 version = "1.3.0",
13 vernum = 10300, 15 vernum = 10300,
14 release = "2011-05-05", 16 release = "2015-01-14",
15 author = "Mike Pall", 17 author = "Mike Pall",
16 license = "MIT", 18 license = "MIT",
17} 19}
@@ -297,6 +299,223 @@ local map_op = {
297 std_2 = "f8000000RD", 299 std_2 = "f8000000RD",
298 stdu_2 = "f8000001RD", 300 stdu_2 = "f8000001RD",
299 301
302 -- Primary opcode 4:
303 mulhhwu_3 = "10000010RRR.",
304 machhwu_3 = "10000018RRR.",
305 mulhhw_3 = "10000050RRR.",
306 nmachhw_3 = "1000005cRRR.",
307 machhwsu_3 = "10000098RRR.",
308 machhws_3 = "100000d8RRR.",
309 nmachhws_3 = "100000dcRRR.",
310 mulchwu_3 = "10000110RRR.",
311 macchwu_3 = "10000118RRR.",
312 mulchw_3 = "10000150RRR.",
313 macchw_3 = "10000158RRR.",
314 nmacchw_3 = "1000015cRRR.",
315 macchwsu_3 = "10000198RRR.",
316 macchws_3 = "100001d8RRR.",
317 nmacchws_3 = "100001dcRRR.",
318 mullhw_3 = "10000350RRR.",
319 maclhw_3 = "10000358RRR.",
320 nmaclhw_3 = "1000035cRRR.",
321 maclhwsu_3 = "10000398RRR.",
322 maclhws_3 = "100003d8RRR.",
323 nmaclhws_3 = "100003dcRRR.",
324 machhwuo_3 = "10000418RRR.",
325 nmachhwo_3 = "1000045cRRR.",
326 machhwsuo_3 = "10000498RRR.",
327 machhwso_3 = "100004d8RRR.",
328 nmachhwso_3 = "100004dcRRR.",
329 macchwuo_3 = "10000518RRR.",
330 macchwo_3 = "10000558RRR.",
331 nmacchwo_3 = "1000055cRRR.",
332 macchwsuo_3 = "10000598RRR.",
333 macchwso_3 = "100005d8RRR.",
334 nmacchwso_3 = "100005dcRRR.",
335 maclhwo_3 = "10000758RRR.",
336 nmaclhwo_3 = "1000075cRRR.",
337 maclhwsuo_3 = "10000798RRR.",
338 maclhwso_3 = "100007d8RRR.",
339 nmaclhwso_3 = "100007dcRRR.",
340
341 vaddubm_3 = "10000000VVV",
342 vmaxub_3 = "10000002VVV",
343 vrlb_3 = "10000004VVV",
344 vcmpequb_3 = "10000006VVV",
345 vmuloub_3 = "10000008VVV",
346 vaddfp_3 = "1000000aVVV",
347 vmrghb_3 = "1000000cVVV",
348 vpkuhum_3 = "1000000eVVV",
349 vmhaddshs_4 = "10000020VVVV",
350 vmhraddshs_4 = "10000021VVVV",
351 vmladduhm_4 = "10000022VVVV",
352 vmsumubm_4 = "10000024VVVV",
353 vmsummbm_4 = "10000025VVVV",
354 vmsumuhm_4 = "10000026VVVV",
355 vmsumuhs_4 = "10000027VVVV",
356 vmsumshm_4 = "10000028VVVV",
357 vmsumshs_4 = "10000029VVVV",
358 vsel_4 = "1000002aVVVV",
359 vperm_4 = "1000002bVVVV",
360 vsldoi_4 = "1000002cVVVP",
361 vpermxor_4 = "1000002dVVVV",
362 vmaddfp_4 = "1000002eVVVV~",
363 vnmsubfp_4 = "1000002fVVVV~",
364 vaddeuqm_4 = "1000003cVVVV",
365 vaddecuq_4 = "1000003dVVVV",
366 vsubeuqm_4 = "1000003eVVVV",
367 vsubecuq_4 = "1000003fVVVV",
368 vadduhm_3 = "10000040VVV",
369 vmaxuh_3 = "10000042VVV",
370 vrlh_3 = "10000044VVV",
371 vcmpequh_3 = "10000046VVV",
372 vmulouh_3 = "10000048VVV",
373 vsubfp_3 = "1000004aVVV",
374 vmrghh_3 = "1000004cVVV",
375 vpkuwum_3 = "1000004eVVV",
376 vadduwm_3 = "10000080VVV",
377 vmaxuw_3 = "10000082VVV",
378 vrlw_3 = "10000084VVV",
379 vcmpequw_3 = "10000086VVV",
380 vmulouw_3 = "10000088VVV",
381 vmuluwm_3 = "10000089VVV",
382 vmrghw_3 = "1000008cVVV",
383 vpkuhus_3 = "1000008eVVV",
384 vaddudm_3 = "100000c0VVV",
385 vmaxud_3 = "100000c2VVV",
386 vrld_3 = "100000c4VVV",
387 vcmpeqfp_3 = "100000c6VVV",
388 vcmpequd_3 = "100000c7VVV",
389 vpkuwus_3 = "100000ceVVV",
390 vadduqm_3 = "10000100VVV",
391 vmaxsb_3 = "10000102VVV",
392 vslb_3 = "10000104VVV",
393 vmulosb_3 = "10000108VVV",
394 vrefp_2 = "1000010aV-V",
395 vmrglb_3 = "1000010cVVV",
396 vpkshus_3 = "1000010eVVV",
397 vaddcuq_3 = "10000140VVV",
398 vmaxsh_3 = "10000142VVV",
399 vslh_3 = "10000144VVV",
400 vmulosh_3 = "10000148VVV",
401 vrsqrtefp_2 = "1000014aV-V",
402 vmrglh_3 = "1000014cVVV",
403 vpkswus_3 = "1000014eVVV",
404 vaddcuw_3 = "10000180VVV",
405 vmaxsw_3 = "10000182VVV",
406 vslw_3 = "10000184VVV",
407 vmulosw_3 = "10000188VVV",
408 vexptefp_2 = "1000018aV-V",
409 vmrglw_3 = "1000018cVVV",
410 vpkshss_3 = "1000018eVVV",
411 vmaxsd_3 = "100001c2VVV",
412 vsl_3 = "100001c4VVV",
413 vcmpgefp_3 = "100001c6VVV",
414 vlogefp_2 = "100001caV-V",
415 vpkswss_3 = "100001ceVVV",
416 vadduhs_3 = "10000240VVV",
417 vminuh_3 = "10000242VVV",
418 vsrh_3 = "10000244VVV",
419 vcmpgtuh_3 = "10000246VVV",
420 vmuleuh_3 = "10000248VVV",
421 vrfiz_2 = "1000024aV-V",
422 vsplth_3 = "1000024cVV3",
423 vupkhsh_2 = "1000024eV-V",
424 vminuw_3 = "10000282VVV",
425 vminud_3 = "100002c2VVV",
426 vcmpgtud_3 = "100002c7VVV",
427 vrfim_2 = "100002caV-V",
428 vcmpgtsb_3 = "10000306VVV",
429 vcfux_3 = "1000030aVVA~",
430 vaddshs_3 = "10000340VVV",
431 vminsh_3 = "10000342VVV",
432 vsrah_3 = "10000344VVV",
433 vcmpgtsh_3 = "10000346VVV",
434 vmulesh_3 = "10000348VVV",
435 vcfsx_3 = "1000034aVVA~",
436 vspltish_2 = "1000034cVS",
437 vupkhpx_2 = "1000034eV-V",
438 vaddsws_3 = "10000380VVV",
439 vminsw_3 = "10000382VVV",
440 vsraw_3 = "10000384VVV",
441 vcmpgtsw_3 = "10000386VVV",
442 vmulesw_3 = "10000388VVV",
443 vctuxs_3 = "1000038aVVA~",
444 vspltisw_2 = "1000038cVS",
445 vminsd_3 = "100003c2VVV",
446 vsrad_3 = "100003c4VVV",
447 vcmpbfp_3 = "100003c6VVV",
448 vcmpgtsd_3 = "100003c7VVV",
449 vctsxs_3 = "100003caVVA~",
450 vupklpx_2 = "100003ceV-V",
451 vsububm_3 = "10000400VVV",
452 ["bcdadd._4"] = "10000401VVVy.",
453 vavgub_3 = "10000402VVV",
454 vand_3 = "10000404VVV",
455 ["vcmpequb._3"] = "10000406VVV",
456 vmaxfp_3 = "1000040aVVV",
457 vsubuhm_3 = "10000440VVV",
458 ["bcdsub._4"] = "10000441VVVy.",
459 vavguh_3 = "10000442VVV",
460 vandc_3 = "10000444VVV",
461 ["vcmpequh._3"] = "10000446VVV",
462 vminfp_3 = "1000044aVVV",
463 vpkudum_3 = "1000044eVVV",
464 vsubuwm_3 = "10000480VVV",
465 vavguw_3 = "10000482VVV",
466 vor_3 = "10000484VVV",
467 ["vcmpequw._3"] = "10000486VVV",
468 vpmsumw_3 = "10000488VVV",
469 ["vcmpeqfp._3"] = "100004c6VVV",
470 ["vcmpequd._3"] = "100004c7VVV",
471 vpkudus_3 = "100004ceVVV",
472 vavgsb_3 = "10000502VVV",
473 vavgsh_3 = "10000542VVV",
474 vorc_3 = "10000544VVV",
475 vbpermq_3 = "1000054cVVV",
476 vpksdus_3 = "1000054eVVV",
477 vavgsw_3 = "10000582VVV",
478 vsld_3 = "100005c4VVV",
479 ["vcmpgefp._3"] = "100005c6VVV",
480 vpksdss_3 = "100005ceVVV",
481 vsububs_3 = "10000600VVV",
482 mfvscr_1 = "10000604V--",
483 vsum4ubs_3 = "10000608VVV",
484 vsubuhs_3 = "10000640VVV",
485 mtvscr_1 = "10000644--V",
486 ["vcmpgtuh._3"] = "10000646VVV",
487 vsum4shs_3 = "10000648VVV",
488 vupkhsw_2 = "1000064eV-V",
489 vsubuws_3 = "10000680VVV",
490 vshasigmaw_4 = "10000682VVYp",
491 veqv_3 = "10000684VVV",
492 vsum2sws_3 = "10000688VVV",
493 vmrgow_3 = "1000068cVVV",
494 vshasigmad_4 = "100006c2VVYp",
495 vsrd_3 = "100006c4VVV",
496 ["vcmpgtud._3"] = "100006c7VVV",
497 vupklsw_2 = "100006ceV-V",
498 vupkslw_2 = "100006ceV-V",
499 vsubsbs_3 = "10000700VVV",
500 vclzb_2 = "10000702V-V",
501 vpopcntb_2 = "10000703V-V",
502 ["vcmpgtsb._3"] = "10000706VVV",
503 vsum4sbs_3 = "10000708VVV",
504 vsubshs_3 = "10000740VVV",
505 vclzh_2 = "10000742V-V",
506 vpopcnth_2 = "10000743V-V",
507 ["vcmpgtsh._3"] = "10000746VVV",
508 vsubsws_3 = "10000780VVV",
509 vclzw_2 = "10000782V-V",
510 vpopcntw_2 = "10000783V-V",
511 ["vcmpgtsw._3"] = "10000786VVV",
512 vsumsws_3 = "10000788VVV",
513 vmrgew_3 = "1000078cVVV",
514 vclzd_2 = "100007c2V-V",
515 vpopcntd_2 = "100007c3V-V",
516 ["vcmpbfp._3"] = "100007c6VVV",
517 ["vcmpgtsd._3"] = "100007c7VVV",
518
300 -- Primary opcode 19: 519 -- Primary opcode 19:
301 mcrf_2 = "4c000000XX", 520 mcrf_2 = "4c000000XX",
302 isync_0 = "4c00012c", 521 isync_0 = "4c00012c",
@@ -316,6 +535,8 @@ local map_op = {
316 bclrl_2 = "4c000021AA", 535 bclrl_2 = "4c000021AA",
317 bcctr_2 = "4c000420AA", 536 bcctr_2 = "4c000420AA",
318 bcctrl_2 = "4c000421AA", 537 bcctrl_2 = "4c000421AA",
538 bctar_2 = "4c000460AA",
539 bctarl_2 = "4c000461AA",
319 blr_0 = "4e800020", 540 blr_0 = "4e800020",
320 blrl_0 = "4e800021", 541 blrl_0 = "4e800021",
321 bctr_0 = "4e800420", 542 bctr_0 = "4e800420",
@@ -327,6 +548,7 @@ local map_op = {
327 cmpd_3 = "7c200000XRR", 548 cmpd_3 = "7c200000XRR",
328 cmpd_2 = "7c200000-RR", 549 cmpd_2 = "7c200000-RR",
329 tw_3 = "7c000008ARR", 550 tw_3 = "7c000008ARR",
551 lvsl_3 = "7c00000cVRR",
330 subfc_3 = "7c000010RRR.", 552 subfc_3 = "7c000010RRR.",
331 subc_3 = "7c000010RRR~.", 553 subc_3 = "7c000010RRR~.",
332 mulhdu_3 = "7c000012RRR.", 554 mulhdu_3 = "7c000012RRR.",
@@ -351,50 +573,68 @@ local map_op = {
351 cmplw_2 = "7c000040-RR", 573 cmplw_2 = "7c000040-RR",
352 cmpld_3 = "7c200040XRR", 574 cmpld_3 = "7c200040XRR",
353 cmpld_2 = "7c200040-RR", 575 cmpld_2 = "7c200040-RR",
576 lvsr_3 = "7c00004cVRR",
354 subf_3 = "7c000050RRR.", 577 subf_3 = "7c000050RRR.",
355 sub_3 = "7c000050RRR~.", 578 sub_3 = "7c000050RRR~.",
579 lbarx_3 = "7c000068RR0R",
356 ldux_3 = "7c00006aRR0R", 580 ldux_3 = "7c00006aRR0R",
357 dcbst_2 = "7c00006c-RR", 581 dcbst_2 = "7c00006c-RR",
358 lwzux_3 = "7c00006eRR0R", 582 lwzux_3 = "7c00006eRR0R",
359 cntlzd_2 = "7c000074RR~", 583 cntlzd_2 = "7c000074RR~",
360 andc_3 = "7c000078RR~R.", 584 andc_3 = "7c000078RR~R.",
361 td_3 = "7c000088ARR", 585 td_3 = "7c000088ARR",
586 lvewx_3 = "7c00008eVRR",
362 mulhd_3 = "7c000092RRR.", 587 mulhd_3 = "7c000092RRR.",
588 addg6s_3 = "7c000094RRR",
363 mulhw_3 = "7c000096RRR.", 589 mulhw_3 = "7c000096RRR.",
590 dlmzb_3 = "7c00009cRR~R.",
364 ldarx_3 = "7c0000a8RR0R", 591 ldarx_3 = "7c0000a8RR0R",
365 dcbf_2 = "7c0000ac-RR", 592 dcbf_2 = "7c0000ac-RR",
366 lbzx_3 = "7c0000aeRR0R", 593 lbzx_3 = "7c0000aeRR0R",
594 lvx_3 = "7c0000ceVRR",
367 neg_2 = "7c0000d0RR.", 595 neg_2 = "7c0000d0RR.",
596 lharx_3 = "7c0000e8RR0R",
368 lbzux_3 = "7c0000eeRR0R", 597 lbzux_3 = "7c0000eeRR0R",
369 popcntb_2 = "7c0000f4RR~", 598 popcntb_2 = "7c0000f4RR~",
370 not_2 = "7c0000f8RR~%.", 599 not_2 = "7c0000f8RR~%.",
371 nor_3 = "7c0000f8RR~R.", 600 nor_3 = "7c0000f8RR~R.",
601 stvebx_3 = "7c00010eVRR",
372 subfe_3 = "7c000110RRR.", 602 subfe_3 = "7c000110RRR.",
373 sube_3 = "7c000110RRR~.", 603 sube_3 = "7c000110RRR~.",
374 adde_3 = "7c000114RRR.", 604 adde_3 = "7c000114RRR.",
375 stdx_3 = "7c00012aRR0R", 605 stdx_3 = "7c00012aRR0R",
376 stwcx_3 = "7c00012cRR0R.", 606 ["stwcx._3"] = "7c00012dRR0R.",
377 stwx_3 = "7c00012eRR0R", 607 stwx_3 = "7c00012eRR0R",
378 prtyw_2 = "7c000134RR~", 608 prtyw_2 = "7c000134RR~",
609 stvehx_3 = "7c00014eVRR",
379 stdux_3 = "7c00016aRR0R", 610 stdux_3 = "7c00016aRR0R",
611 ["stqcx._3"] = "7c00016dR:R0R.",
380 stwux_3 = "7c00016eRR0R", 612 stwux_3 = "7c00016eRR0R",
381 prtyd_2 = "7c000174RR~", 613 prtyd_2 = "7c000174RR~",
614 stvewx_3 = "7c00018eVRR",
382 subfze_2 = "7c000190RR.", 615 subfze_2 = "7c000190RR.",
383 addze_2 = "7c000194RR.", 616 addze_2 = "7c000194RR.",
384 stdcx_3 = "7c0001acRR0R.", 617 ["stdcx._3"] = "7c0001adRR0R.",
385 stbx_3 = "7c0001aeRR0R", 618 stbx_3 = "7c0001aeRR0R",
619 stvx_3 = "7c0001ceVRR",
386 subfme_2 = "7c0001d0RR.", 620 subfme_2 = "7c0001d0RR.",
387 mulld_3 = "7c0001d2RRR.", 621 mulld_3 = "7c0001d2RRR.",
388 addme_2 = "7c0001d4RR.", 622 addme_2 = "7c0001d4RR.",
389 mullw_3 = "7c0001d6RRR.", 623 mullw_3 = "7c0001d6RRR.",
390 dcbtst_2 = "7c0001ec-RR", 624 dcbtst_2 = "7c0001ec-RR",
391 stbux_3 = "7c0001eeRR0R", 625 stbux_3 = "7c0001eeRR0R",
626 bpermd_3 = "7c0001f8RR~R",
627 lvepxl_3 = "7c00020eVRR",
392 add_3 = "7c000214RRR.", 628 add_3 = "7c000214RRR.",
629 lqarx_3 = "7c000228R:R0R",
393 dcbt_2 = "7c00022c-RR", 630 dcbt_2 = "7c00022c-RR",
394 lhzx_3 = "7c00022eRR0R", 631 lhzx_3 = "7c00022eRR0R",
632 cdtbcd_2 = "7c000234RR~",
395 eqv_3 = "7c000238RR~R.", 633 eqv_3 = "7c000238RR~R.",
634 lvepx_3 = "7c00024eVRR",
396 eciwx_3 = "7c00026cRR0R", 635 eciwx_3 = "7c00026cRR0R",
397 lhzux_3 = "7c00026eRR0R", 636 lhzux_3 = "7c00026eRR0R",
637 cbcdtd_2 = "7c000274RR~",
398 xor_3 = "7c000278RR~R.", 638 xor_3 = "7c000278RR~R.",
399 mfspefscr_1 = "7c0082a6R", 639 mfspefscr_1 = "7c0082a6R",
400 mfxer_1 = "7c0102a6R", 640 mfxer_1 = "7c0102a6R",
@@ -404,8 +644,12 @@ local map_op = {
404 lhax_3 = "7c0002aeRR0R", 644 lhax_3 = "7c0002aeRR0R",
405 mftb_1 = "7c0c42e6R", 645 mftb_1 = "7c0c42e6R",
406 mftbu_1 = "7c0d42e6R", 646 mftbu_1 = "7c0d42e6R",
647 lvxl_3 = "7c0002ceVRR",
407 lwaux_3 = "7c0002eaRR0R", 648 lwaux_3 = "7c0002eaRR0R",
408 lhaux_3 = "7c0002eeRR0R", 649 lhaux_3 = "7c0002eeRR0R",
650 popcntw_2 = "7c0002f4RR~",
651 divdeu_3 = "7c000312RRR.",
652 divweu_3 = "7c000316RRR.",
409 sthx_3 = "7c00032eRR0R", 653 sthx_3 = "7c00032eRR0R",
410 orc_3 = "7c000338RR~R.", 654 orc_3 = "7c000338RR~R.",
411 ecowx_3 = "7c00036cRR0R", 655 ecowx_3 = "7c00036cRR0R",
@@ -420,10 +664,14 @@ local map_op = {
420 mtctr_1 = "7c0903a6R", 664 mtctr_1 = "7c0903a6R",
421 dcbi_2 = "7c0003ac-RR", 665 dcbi_2 = "7c0003ac-RR",
422 nand_3 = "7c0003b8RR~R.", 666 nand_3 = "7c0003b8RR~R.",
667 dsn_2 = "7c0003c6-RR",
668 stvxl_3 = "7c0003ceVRR",
423 divd_3 = "7c0003d2RRR.", 669 divd_3 = "7c0003d2RRR.",
424 divw_3 = "7c0003d6RRR.", 670 divw_3 = "7c0003d6RRR.",
671 popcntd_2 = "7c0003f4RR~",
425 cmpb_3 = "7c0003f8RR~R.", 672 cmpb_3 = "7c0003f8RR~R.",
426 mcrxr_1 = "7c000400X", 673 mcrxr_1 = "7c000400X",
674 lbdx_3 = "7c000406RRR",
427 subfco_3 = "7c000410RRR.", 675 subfco_3 = "7c000410RRR.",
428 subco_3 = "7c000410RRR~.", 676 subco_3 = "7c000410RRR~.",
429 addco_3 = "7c000414RRR.", 677 addco_3 = "7c000414RRR.",
@@ -433,16 +681,20 @@ local map_op = {
433 lfsx_3 = "7c00042eFR0R", 681 lfsx_3 = "7c00042eFR0R",
434 srw_3 = "7c000430RR~R.", 682 srw_3 = "7c000430RR~R.",
435 srd_3 = "7c000436RR~R.", 683 srd_3 = "7c000436RR~R.",
684 lhdx_3 = "7c000446RRR",
436 subfo_3 = "7c000450RRR.", 685 subfo_3 = "7c000450RRR.",
437 subo_3 = "7c000450RRR~.", 686 subo_3 = "7c000450RRR~.",
438 lfsux_3 = "7c00046eFR0R", 687 lfsux_3 = "7c00046eFR0R",
688 lwdx_3 = "7c000486RRR",
439 lswi_3 = "7c0004aaRR0A", 689 lswi_3 = "7c0004aaRR0A",
440 sync_0 = "7c0004ac", 690 sync_0 = "7c0004ac",
441 lwsync_0 = "7c2004ac", 691 lwsync_0 = "7c2004ac",
442 ptesync_0 = "7c4004ac", 692 ptesync_0 = "7c4004ac",
443 lfdx_3 = "7c0004aeFR0R", 693 lfdx_3 = "7c0004aeFR0R",
694 lddx_3 = "7c0004c6RRR",
444 nego_2 = "7c0004d0RR.", 695 nego_2 = "7c0004d0RR.",
445 lfdux_3 = "7c0004eeFR0R", 696 lfdux_3 = "7c0004eeFR0R",
697 stbdx_3 = "7c000506RRR",
446 subfeo_3 = "7c000510RRR.", 698 subfeo_3 = "7c000510RRR.",
447 subeo_3 = "7c000510RRR~.", 699 subeo_3 = "7c000510RRR~.",
448 addeo_3 = "7c000514RRR.", 700 addeo_3 = "7c000514RRR.",
@@ -450,27 +702,42 @@ local map_op = {
450 stswx_3 = "7c00052aRR0R", 702 stswx_3 = "7c00052aRR0R",
451 stwbrx_3 = "7c00052cRR0R", 703 stwbrx_3 = "7c00052cRR0R",
452 stfsx_3 = "7c00052eFR0R", 704 stfsx_3 = "7c00052eFR0R",
705 sthdx_3 = "7c000546RRR",
706 ["stbcx._3"] = "7c00056dRRR",
453 stfsux_3 = "7c00056eFR0R", 707 stfsux_3 = "7c00056eFR0R",
708 stwdx_3 = "7c000586RRR",
454 subfzeo_2 = "7c000590RR.", 709 subfzeo_2 = "7c000590RR.",
455 addzeo_2 = "7c000594RR.", 710 addzeo_2 = "7c000594RR.",
456 stswi_3 = "7c0005aaRR0A", 711 stswi_3 = "7c0005aaRR0A",
712 ["sthcx._3"] = "7c0005adRRR",
457 stfdx_3 = "7c0005aeFR0R", 713 stfdx_3 = "7c0005aeFR0R",
714 stddx_3 = "7c0005c6RRR",
458 subfmeo_2 = "7c0005d0RR.", 715 subfmeo_2 = "7c0005d0RR.",
459 mulldo_3 = "7c0005d2RRR.", 716 mulldo_3 = "7c0005d2RRR.",
460 addmeo_2 = "7c0005d4RR.", 717 addmeo_2 = "7c0005d4RR.",
461 mullwo_3 = "7c0005d6RRR.", 718 mullwo_3 = "7c0005d6RRR.",
462 dcba_2 = "7c0005ec-RR", 719 dcba_2 = "7c0005ec-RR",
463 stfdux_3 = "7c0005eeFR0R", 720 stfdux_3 = "7c0005eeFR0R",
721 stvepxl_3 = "7c00060eVRR",
464 addo_3 = "7c000614RRR.", 722 addo_3 = "7c000614RRR.",
465 lhbrx_3 = "7c00062cRR0R", 723 lhbrx_3 = "7c00062cRR0R",
724 lfdpx_3 = "7c00062eF:RR",
466 sraw_3 = "7c000630RR~R.", 725 sraw_3 = "7c000630RR~R.",
467 srad_3 = "7c000634RR~R.", 726 srad_3 = "7c000634RR~R.",
727 lfddx_3 = "7c000646FRR",
728 stvepx_3 = "7c00064eVRR",
468 srawi_3 = "7c000670RR~A.", 729 srawi_3 = "7c000670RR~A.",
469 sradi_3 = "7c000674RR~H.", 730 sradi_3 = "7c000674RR~H.",
470 eieio_0 = "7c0006ac", 731 eieio_0 = "7c0006ac",
471 lfiwax_3 = "7c0006aeFR0R", 732 lfiwax_3 = "7c0006aeFR0R",
733 divdeuo_3 = "7c000712RRR.",
734 divweuo_3 = "7c000716RRR.",
472 sthbrx_3 = "7c00072cRR0R", 735 sthbrx_3 = "7c00072cRR0R",
736 stfdpx_3 = "7c00072eF:RR",
473 extsh_2 = "7c000734RR~.", 737 extsh_2 = "7c000734RR~.",
738 stfddx_3 = "7c000746FRR",
739 divdeo_3 = "7c000752RRR.",
740 divweo_3 = "7c000756RRR.",
474 extsb_2 = "7c000774RR~.", 741 extsb_2 = "7c000774RR~.",
475 divduo_3 = "7c000792RRR.", 742 divduo_3 = "7c000792RRR.",
476 divwou_3 = "7c000796RRR.", 743 divwou_3 = "7c000796RRR.",
@@ -481,6 +748,40 @@ local map_op = {
481 divwo_3 = "7c0007d6RRR.", 748 divwo_3 = "7c0007d6RRR.",
482 dcbz_2 = "7c0007ec-RR", 749 dcbz_2 = "7c0007ec-RR",
483 750
751 ["tbegin._1"] = "7c00051d1",
752 ["tbegin._0"] = "7c00051d",
753 ["tend._1"] = "7c00055dY",
754 ["tend._0"] = "7c00055d",
755 ["tendall._0"] = "7e00055d",
756 tcheck_1 = "7c00059cX",
757 ["tsr._1"] = "7c0005dd1",
758 ["tsuspend._0"] = "7c0005dd",
759 ["tresume._0"] = "7c2005dd",
760 ["tabortwc._3"] = "7c00061dARR",
761 ["tabortdc._3"] = "7c00065dARR",
762 ["tabortwci._3"] = "7c00069dARS",
763 ["tabortdci._3"] = "7c0006ddARS",
764 ["tabort._1"] = "7c00071d-R-",
765 ["treclaim._1"] = "7c00075d-R",
766 ["trechkpt._0"] = "7c0007dd",
767
768 lxsiwzx_3 = "7c000018QRR",
769 lxsiwax_3 = "7c000098QRR",
770 mfvsrd_2 = "7c000066-Rq",
771 mfvsrwz_2 = "7c0000e6-Rq",
772 stxsiwx_3 = "7c000118QRR",
773 mtvsrd_2 = "7c000166QR",
774 mtvsrwa_2 = "7c0001a6QR",
775 lxvdsx_3 = "7c000298QRR",
776 lxsspx_3 = "7c000418QRR",
777 lxsdx_3 = "7c000498QRR",
778 stxsspx_3 = "7c000518QRR",
779 stxsdx_3 = "7c000598QRR",
780 lxvw4x_3 = "7c000618QRR",
781 lxvd2x_3 = "7c000698QRR",
782 stxvw4x_3 = "7c000718QRR",
783 stxvd2x_3 = "7c000798QRR",
784
484 -- Primary opcode 30: 785 -- Primary opcode 30:
485 rldicl_4 = "78000000RR~HM.", 786 rldicl_4 = "78000000RR~HM.",
486 rldicr_4 = "78000004RR~HM.", 787 rldicr_4 = "78000004RR~HM.",
@@ -489,6 +790,12 @@ local map_op = {
489 rldcl_4 = "78000010RR~RM.", 790 rldcl_4 = "78000010RR~RM.",
490 rldcr_4 = "78000012RR~RM.", 791 rldcr_4 = "78000012RR~RM.",
491 792
793 -- Primary opcode 56:
794 lq_2 = "e0000000R:D", -- NYI: displacement must be divisible by 8.
795
796 -- Primary opcode 57:
797 lfdp_2 = "e4000000F:D", -- NYI: displacement must be divisible by 4.
798
492 -- Primary opcode 59: 799 -- Primary opcode 59:
493 fdivs_3 = "ec000024FFF.", 800 fdivs_3 = "ec000024FFF.",
494 fsubs_3 = "ec000028FFF.", 801 fsubs_3 = "ec000028FFF.",
@@ -501,6 +808,200 @@ local map_op = {
501 fmadds_4 = "ec00003aFFFF~.", 808 fmadds_4 = "ec00003aFFFF~.",
502 fnmsubs_4 = "ec00003cFFFF~.", 809 fnmsubs_4 = "ec00003cFFFF~.",
503 fnmadds_4 = "ec00003eFFFF~.", 810 fnmadds_4 = "ec00003eFFFF~.",
811 fcfids_2 = "ec00069cF-F.",
812 fcfidus_2 = "ec00079cF-F.",
813
814 dadd_3 = "ec000004FFF.",
815 dqua_4 = "ec000006FFFZ.",
816 dmul_3 = "ec000044FFF.",
817 drrnd_4 = "ec000046FFFZ.",
818 dscli_3 = "ec000084FF6.",
819 dquai_4 = "ec000086SF~FZ.",
820 dscri_3 = "ec0000c4FF6.",
821 drintx_4 = "ec0000c61F~FZ.",
822 dcmpo_3 = "ec000104XFF",
823 dtstex_3 = "ec000144XFF",
824 dtstdc_3 = "ec000184XF6",
825 dtstdg_3 = "ec0001c4XF6",
826 drintn_4 = "ec0001c61F~FZ.",
827 dctdp_2 = "ec000204F-F.",
828 dctfix_2 = "ec000244F-F.",
829 ddedpd_3 = "ec000284ZF~F.",
830 dxex_2 = "ec0002c4F-F.",
831 dsub_3 = "ec000404FFF.",
832 ddiv_3 = "ec000444FFF.",
833 dcmpu_3 = "ec000504XFF",
834 dtstsf_3 = "ec000544XFF",
835 drsp_2 = "ec000604F-F.",
836 dcffix_2 = "ec000644F-F.",
837 denbcd_3 = "ec000684YF~F.",
838 diex_3 = "ec0006c4FFF.",
839
840 -- Primary opcode 60:
841 xsaddsp_3 = "f0000000QQQ",
842 xsmaddasp_3 = "f0000008QQQ",
843 xxsldwi_4 = "f0000010QQQz",
844 xsrsqrtesp_2 = "f0000028Q-Q",
845 xssqrtsp_2 = "f000002cQ-Q",
846 xxsel_4 = "f0000030QQQQ",
847 xssubsp_3 = "f0000040QQQ",
848 xsmaddmsp_3 = "f0000048QQQ",
849 xxpermdi_4 = "f0000050QQQz",
850 xsresp_2 = "f0000068Q-Q",
851 xsmulsp_3 = "f0000080QQQ",
852 xsmsubasp_3 = "f0000088QQQ",
853 xxmrghw_3 = "f0000090QQQ",
854 xsdivsp_3 = "f00000c0QQQ",
855 xsmsubmsp_3 = "f00000c8QQQ",
856 xsadddp_3 = "f0000100QQQ",
857 xsmaddadp_3 = "f0000108QQQ",
858 xscmpudp_3 = "f0000118XQQ",
859 xscvdpuxws_2 = "f0000120Q-Q",
860 xsrdpi_2 = "f0000124Q-Q",
861 xsrsqrtedp_2 = "f0000128Q-Q",
862 xssqrtdp_2 = "f000012cQ-Q",
863 xssubdp_3 = "f0000140QQQ",
864 xsmaddmdp_3 = "f0000148QQQ",
865 xscmpodp_3 = "f0000158XQQ",
866 xscvdpsxws_2 = "f0000160Q-Q",
867 xsrdpiz_2 = "f0000164Q-Q",
868 xsredp_2 = "f0000168Q-Q",
869 xsmuldp_3 = "f0000180QQQ",
870 xsmsubadp_3 = "f0000188QQQ",
871 xxmrglw_3 = "f0000190QQQ",
872 xsrdpip_2 = "f00001a4Q-Q",
873 xstsqrtdp_2 = "f00001a8X-Q",
874 xsrdpic_2 = "f00001acQ-Q",
875 xsdivdp_3 = "f00001c0QQQ",
876 xsmsubmdp_3 = "f00001c8QQQ",
877 xsrdpim_2 = "f00001e4Q-Q",
878 xstdivdp_3 = "f00001e8XQQ",
879 xvaddsp_3 = "f0000200QQQ",
880 xvmaddasp_3 = "f0000208QQQ",
881 xvcmpeqsp_3 = "f0000218QQQ",
882 xvcvspuxws_2 = "f0000220Q-Q",
883 xvrspi_2 = "f0000224Q-Q",
884 xvrsqrtesp_2 = "f0000228Q-Q",
885 xvsqrtsp_2 = "f000022cQ-Q",
886 xvsubsp_3 = "f0000240QQQ",
887 xvmaddmsp_3 = "f0000248QQQ",
888 xvcmpgtsp_3 = "f0000258QQQ",
889 xvcvspsxws_2 = "f0000260Q-Q",
890 xvrspiz_2 = "f0000264Q-Q",
891 xvresp_2 = "f0000268Q-Q",
892 xvmulsp_3 = "f0000280QQQ",
893 xvmsubasp_3 = "f0000288QQQ",
894 xxspltw_3 = "f0000290QQg~",
895 xvcmpgesp_3 = "f0000298QQQ",
896 xvcvuxwsp_2 = "f00002a0Q-Q",
897 xvrspip_2 = "f00002a4Q-Q",
898 xvtsqrtsp_2 = "f00002a8X-Q",
899 xvrspic_2 = "f00002acQ-Q",
900 xvdivsp_3 = "f00002c0QQQ",
901 xvmsubmsp_3 = "f00002c8QQQ",
902 xvcvsxwsp_2 = "f00002e0Q-Q",
903 xvrspim_2 = "f00002e4Q-Q",
904 xvtdivsp_3 = "f00002e8XQQ",
905 xvadddp_3 = "f0000300QQQ",
906 xvmaddadp_3 = "f0000308QQQ",
907 xvcmpeqdp_3 = "f0000318QQQ",
908 xvcvdpuxws_2 = "f0000320Q-Q",
909 xvrdpi_2 = "f0000324Q-Q",
910 xvrsqrtedp_2 = "f0000328Q-Q",
911 xvsqrtdp_2 = "f000032cQ-Q",
912 xvsubdp_3 = "f0000340QQQ",
913 xvmaddmdp_3 = "f0000348QQQ",
914 xvcmpgtdp_3 = "f0000358QQQ",
915 xvcvdpsxws_2 = "f0000360Q-Q",
916 xvrdpiz_2 = "f0000364Q-Q",
917 xvredp_2 = "f0000368Q-Q",
918 xvmuldp_3 = "f0000380QQQ",
919 xvmsubadp_3 = "f0000388QQQ",
920 xvcmpgedp_3 = "f0000398QQQ",
921 xvcvuxwdp_2 = "f00003a0Q-Q",
922 xvrdpip_2 = "f00003a4Q-Q",
923 xvtsqrtdp_2 = "f00003a8X-Q",
924 xvrdpic_2 = "f00003acQ-Q",
925 xvdivdp_3 = "f00003c0QQQ",
926 xvmsubmdp_3 = "f00003c8QQQ",
927 xvcvsxwdp_2 = "f00003e0Q-Q",
928 xvrdpim_2 = "f00003e4Q-Q",
929 xvtdivdp_3 = "f00003e8XQQ",
930 xsnmaddasp_3 = "f0000408QQQ",
931 xxland_3 = "f0000410QQQ",
932 xscvdpsp_2 = "f0000424Q-Q",
933 xscvdpspn_2 = "f000042cQ-Q",
934 xsnmaddmsp_3 = "f0000448QQQ",
935 xxlandc_3 = "f0000450QQQ",
936 xsrsp_2 = "f0000464Q-Q",
937 xsnmsubasp_3 = "f0000488QQQ",
938 xxlor_3 = "f0000490QQQ",
939 xscvuxdsp_2 = "f00004a0Q-Q",
940 xsnmsubmsp_3 = "f00004c8QQQ",
941 xxlxor_3 = "f00004d0QQQ",
942 xscvsxdsp_2 = "f00004e0Q-Q",
943 xsmaxdp_3 = "f0000500QQQ",
944 xsnmaddadp_3 = "f0000508QQQ",
945 xxlnor_3 = "f0000510QQQ",
946 xscvdpuxds_2 = "f0000520Q-Q",
947 xscvspdp_2 = "f0000524Q-Q",
948 xscvspdpn_2 = "f000052cQ-Q",
949 xsmindp_3 = "f0000540QQQ",
950 xsnmaddmdp_3 = "f0000548QQQ",
951 xxlorc_3 = "f0000550QQQ",
952 xscvdpsxds_2 = "f0000560Q-Q",
953 xsabsdp_2 = "f0000564Q-Q",
954 xscpsgndp_3 = "f0000580QQQ",
955 xsnmsubadp_3 = "f0000588QQQ",
956 xxlnand_3 = "f0000590QQQ",
957 xscvuxddp_2 = "f00005a0Q-Q",
958 xsnabsdp_2 = "f00005a4Q-Q",
959 xsnmsubmdp_3 = "f00005c8QQQ",
960 xxleqv_3 = "f00005d0QQQ",
961 xscvsxddp_2 = "f00005e0Q-Q",
962 xsnegdp_2 = "f00005e4Q-Q",
963 xvmaxsp_3 = "f0000600QQQ",
964 xvnmaddasp_3 = "f0000608QQQ",
965 ["xvcmpeqsp._3"] = "f0000618QQQ",
966 xvcvspuxds_2 = "f0000620Q-Q",
967 xvcvdpsp_2 = "f0000624Q-Q",
968 xvminsp_3 = "f0000640QQQ",
969 xvnmaddmsp_3 = "f0000648QQQ",
970 ["xvcmpgtsp._3"] = "f0000658QQQ",
971 xvcvspsxds_2 = "f0000660Q-Q",
972 xvabssp_2 = "f0000664Q-Q",
973 xvcpsgnsp_3 = "f0000680QQQ",
974 xvnmsubasp_3 = "f0000688QQQ",
975 ["xvcmpgesp._3"] = "f0000698QQQ",
976 xvcvuxdsp_2 = "f00006a0Q-Q",
977 xvnabssp_2 = "f00006a4Q-Q",
978 xvnmsubmsp_3 = "f00006c8QQQ",
979 xvcvsxdsp_2 = "f00006e0Q-Q",
980 xvnegsp_2 = "f00006e4Q-Q",
981 xvmaxdp_3 = "f0000700QQQ",
982 xvnmaddadp_3 = "f0000708QQQ",
983 ["xvcmpeqdp._3"] = "f0000718QQQ",
984 xvcvdpuxds_2 = "f0000720Q-Q",
985 xvcvspdp_2 = "f0000724Q-Q",
986 xvmindp_3 = "f0000740QQQ",
987 xvnmaddmdp_3 = "f0000748QQQ",
988 ["xvcmpgtdp._3"] = "f0000758QQQ",
989 xvcvdpsxds_2 = "f0000760Q-Q",
990 xvabsdp_2 = "f0000764Q-Q",
991 xvcpsgndp_3 = "f0000780QQQ",
992 xvnmsubadp_3 = "f0000788QQQ",
993 ["xvcmpgedp._3"] = "f0000798QQQ",
994 xvcvuxddp_2 = "f00007a0Q-Q",
995 xvnabsdp_2 = "f00007a4Q-Q",
996 xvnmsubmdp_3 = "f00007c8QQQ",
997 xvcvsxddp_2 = "f00007e0Q-Q",
998 xvnegdp_2 = "f00007e4Q-Q",
999
1000 -- Primary opcode 61:
1001 stfdp_2 = "f4000000F:D", -- NYI: displacement must be divisible by 4.
1002
1003 -- Primary opcode 62:
1004 stq_2 = "f8000002R:D", -- NYI: displacement must be divisible by 8.
504 1005
505 -- Primary opcode 63: 1006 -- Primary opcode 63:
506 fdiv_3 = "fc000024FFF.", 1007 fdiv_3 = "fc000024FFF.",
@@ -526,8 +1027,12 @@ local map_op = {
526 frsp_2 = "fc000018F-F.", 1027 frsp_2 = "fc000018F-F.",
527 fctiw_2 = "fc00001cF-F.", 1028 fctiw_2 = "fc00001cF-F.",
528 fctiwz_2 = "fc00001eF-F.", 1029 fctiwz_2 = "fc00001eF-F.",
1030 ftdiv_2 = "fc000100X-F.",
1031 fctiwu_2 = "fc00011cF-F.",
1032 fctiwuz_2 = "fc00011eF-F.",
529 mtfsfi_2 = "fc00010cAA", -- NYI: upshift. 1033 mtfsfi_2 = "fc00010cAA", -- NYI: upshift.
530 fnabs_2 = "fc000110F-F.", 1034 fnabs_2 = "fc000110F-F.",
1035 ftsqrt_2 = "fc000140X-F.",
531 fabs_2 = "fc000210F-F.", 1036 fabs_2 = "fc000210F-F.",
532 frin_2 = "fc000310F-F.", 1037 frin_2 = "fc000310F-F.",
533 friz_2 = "fc000350F-F.", 1038 friz_2 = "fc000350F-F.",
@@ -537,7 +1042,38 @@ local map_op = {
537 -- NYI: mtfsf, mtfsb0, mtfsb1. 1042 -- NYI: mtfsf, mtfsb0, mtfsb1.
538 fctid_2 = "fc00065cF-F.", 1043 fctid_2 = "fc00065cF-F.",
539 fctidz_2 = "fc00065eF-F.", 1044 fctidz_2 = "fc00065eF-F.",
1045 fmrgow_3 = "fc00068cFFF",
540 fcfid_2 = "fc00069cF-F.", 1046 fcfid_2 = "fc00069cF-F.",
1047 fctidu_2 = "fc00075cF-F.",
1048 fctiduz_2 = "fc00075eF-F.",
1049 fmrgew_3 = "fc00078cFFF",
1050 fcfidu_2 = "fc00079cF-F.",
1051
1052 daddq_3 = "fc000004F:F:F:.",
1053 dquaq_4 = "fc000006F:F:F:Z.",
1054 dmulq_3 = "fc000044F:F:F:.",
1055 drrndq_4 = "fc000046F:F:F:Z.",
1056 dscliq_3 = "fc000084F:F:6.",
1057 dquaiq_4 = "fc000086SF:~F:Z.",
1058 dscriq_3 = "fc0000c4F:F:6.",
1059 drintxq_4 = "fc0000c61F:~F:Z.",
1060 dcmpoq_3 = "fc000104XF:F:",
1061 dtstexq_3 = "fc000144XF:F:",
1062 dtstdcq_3 = "fc000184XF:6",
1063 dtstdgq_3 = "fc0001c4XF:6",
1064 drintnq_4 = "fc0001c61F:~F:Z.",
1065 dctqpq_2 = "fc000204F:-F:.",
1066 dctfixq_2 = "fc000244F:-F:.",
1067 ddedpdq_3 = "fc000284ZF:~F:.",
1068 dxexq_2 = "fc0002c4F:-F:.",
1069 dsubq_3 = "fc000404F:F:F:.",
1070 ddivq_3 = "fc000444F:F:F:.",
1071 dcmpuq_3 = "fc000504XF:F:",
1072 dtstsfq_3 = "fc000544XF:F:",
1073 drdpq_2 = "fc000604F:-F:.",
1074 dcffixq_2 = "fc000644F:-F:.",
1075 denbcdq_3 = "fc000684YF:~F:.",
1076 diexq_3 = "fc0006c4F:FF:.",
541 1077
542 -- Primary opcode 4, SPE APU extension: 1078 -- Primary opcode 4, SPE APU extension:
543 evaddw_3 = "10000200RRR", 1079 evaddw_3 = "10000200RRR",
@@ -884,6 +1420,24 @@ local function parse_fpr(expr)
884 werror("bad register name `"..expr.."'") 1420 werror("bad register name `"..expr.."'")
885end 1421end
886 1422
1423local function parse_vr(expr)
1424 local r = match(expr, "^v([1-3]?[0-9])$")
1425 if r then
1426 r = tonumber(r)
1427 if r <= 31 then return r end
1428 end
1429 werror("bad register name `"..expr.."'")
1430end
1431
1432local function parse_vs(expr)
1433 local r = match(expr, "^vs([1-6]?[0-9])$")
1434 if r then
1435 r = tonumber(r)
1436 if r <= 63 then return r end
1437 end
1438 werror("bad register name `"..expr.."'")
1439end
1440
887local function parse_cr(expr) 1441local function parse_cr(expr)
888 local r = match(expr, "^cr([0-7])$") 1442 local r = match(expr, "^cr([0-7])$")
889 if r then return tonumber(r) end 1443 if r then return tonumber(r) end
@@ -914,7 +1468,8 @@ local function parse_imm(imm, bits, shift, scale, signed)
914 end 1468 end
915 end 1469 end
916 werror("out of range immediate `"..imm.."'") 1470 werror("out of range immediate `"..imm.."'")
917 elseif match(imm, "^r([1-3]?[0-9])$") or 1471 elseif match(imm, "^[rfv]([1-3]?[0-9])$") or
1472 match(imm, "^vs([1-6]?[0-9])$") or
918 match(imm, "^([%w_]+):(r[1-3]?[0-9])$") then 1473 match(imm, "^([%w_]+):(r[1-3]?[0-9])$") then
919 werror("expected immediate operand, got register") 1474 werror("expected immediate operand, got register")
920 else 1475 else
@@ -1027,6 +1582,15 @@ map_op[".template__"] = function(params, template, nparams)
1027 rs = rs - 5; op = op + shl(parse_gpr(params[n]), rs); n = n + 1 1582 rs = rs - 5; op = op + shl(parse_gpr(params[n]), rs); n = n + 1
1028 elseif p == "F" then 1583 elseif p == "F" then
1029 rs = rs - 5; op = op + shl(parse_fpr(params[n]), rs); n = n + 1 1584 rs = rs - 5; op = op + shl(parse_fpr(params[n]), rs); n = n + 1
1585 elseif p == "V" then
1586 rs = rs - 5; op = op + shl(parse_vr(params[n]), rs); n = n + 1
1587 elseif p == "Q" then
1588 local vs = parse_vs(params[n]); n = n + 1; rs = rs - 5
1589 local sh = rs == 6 and 2 or 3 + band(shr(rs, 1), 3)
1590 op = op + shl(band(vs, 31), rs) + shr(band(vs, 32), sh)
1591 elseif p == "q" then
1592 local vs = parse_vs(params[n]); n = n + 1
1593 op = op + shl(band(vs, 31), 21) + shr(band(vs, 32), 5)
1030 elseif p == "A" then 1594 elseif p == "A" then
1031 rs = rs - 5; op = op + parse_imm(params[n], 5, rs, 0, false); n = n + 1 1595 rs = rs - 5; op = op + parse_imm(params[n], 5, rs, 0, false); n = n + 1
1032 elseif p == "S" then 1596 elseif p == "S" then
@@ -1047,6 +1611,26 @@ map_op[".template__"] = function(params, template, nparams)
1047 rs = rs - 5; op = op + shl(parse_cond(params[n]), rs); n = n + 1 1611 rs = rs - 5; op = op + shl(parse_cond(params[n]), rs); n = n + 1
1048 elseif p == "X" then 1612 elseif p == "X" then
1049 rs = rs - 5; op = op + shl(parse_cr(params[n]), rs+2); n = n + 1 1613 rs = rs - 5; op = op + shl(parse_cr(params[n]), rs+2); n = n + 1
1614 elseif p == "1" then
1615 rs = rs - 5; op = op + parse_imm(params[n], 1, rs, 0, false); n = n + 1
1616 elseif p == "g" then
1617 rs = rs - 5; op = op + parse_imm(params[n], 2, rs, 0, false); n = n + 1
1618 elseif p == "3" then
1619 rs = rs - 5; op = op + parse_imm(params[n], 3, rs, 0, false); n = n + 1
1620 elseif p == "P" then
1621 rs = rs - 5; op = op + parse_imm(params[n], 4, rs, 0, false); n = n + 1
1622 elseif p == "p" then
1623 op = op + parse_imm(params[n], 4, rs, 0, false); n = n + 1
1624 elseif p == "6" then
1625 rs = rs - 6; op = op + parse_imm(params[n], 6, rs, 0, false); n = n + 1
1626 elseif p == "Y" then
1627 rs = rs - 5; op = op + parse_imm(params[n], 1, rs+4, 0, false); n = n + 1
1628 elseif p == "y" then
1629 rs = rs - 5; op = op + parse_imm(params[n], 1, rs+3, 0, false); n = n + 1
1630 elseif p == "Z" then
1631 rs = rs - 5; op = op + parse_imm(params[n], 2, rs+3, 0, false); n = n + 1
1632 elseif p == "z" then
1633 rs = rs - 5; op = op + parse_imm(params[n], 2, rs+2, 0, false); n = n + 1
1050 elseif p == "W" then 1634 elseif p == "W" then
1051 op = op + parse_cr(params[n]); n = n + 1 1635 op = op + parse_cr(params[n]); n = n + 1
1052 elseif p == "G" then 1636 elseif p == "G" then
@@ -1071,6 +1655,8 @@ map_op[".template__"] = function(params, template, nparams)
1071 local lo = band(op, mm) 1655 local lo = band(op, mm)
1072 local hi = band(op, shl(mm, 5)) 1656 local hi = band(op, shl(mm, 5))
1073 op = op - lo - hi + shl(lo, 5) + shr(hi, 5) 1657 op = op - lo - hi + shl(lo, 5) + shr(hi, 5)
1658 elseif p == ":" then
1659 if band(shr(op, rs), 1) ~= 0 then werror("register pair expected") end
1074 elseif p == "-" then 1660 elseif p == "-" then
1075 rs = rs - 5 1661 rs = rs - 5
1076 elseif p == "." then 1662 elseif p == "." then