Last active
January 18, 2017 21:26
-
-
Save kernigh/4e05d2a84a34c676237a7bad6259171a to your computer and use it in GitHub Desktop.
ack: PowerPC extended mnemonics, incomplete diff
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
diff --git a/mach/powerpc/as/mach2.c b/mach/powerpc/as/mach2.c | |
index 480c5fa..47ef18c 100644 | |
--- a/mach/powerpc/as/mach2.c | |
+++ b/mach/powerpc/as/mach2.c | |
@@ -10,18 +10,32 @@ | |
%token <y_word> C | |
%token <y_word> OP | |
+%token <y_word> OP_BDA | |
+%token <y_word> OP_BDL | |
%token <y_word> OP_BF | |
%token <y_word> OP_BF_BFA | |
%token <y_word> OP_BF_FRA_FRB | |
%token <y_word> OP_BF_L_RA_RB | |
%token <y_word> OP_BF_L_RA_SI | |
%token <y_word> OP_BF_L_RA_UI | |
+%token <y_word> OP_BF_RA_RB | |
+%token <y_word> OP_BF_RA_SI | |
+%token <y_word> OP_BF_RA_UI | |
%token <y_word> OP_BF_U_C | |
+%token <y_word> OP_BH | |
+%token <y_word> OP_BI_BDA | |
+%token <y_word> OP_BI_BDL | |
+%token <y_word> OP_BI_BH | |
+%token <y_word> OP_BICR_BDA | |
+%token <y_word> OP_BICR_BDL | |
+%token <y_word> OP_BICR_BH | |
%token <y_word> OP_BO_BI_BDA | |
%token <y_word> OP_BO_BI_BDL | |
%token <y_word> OP_BO_BI_BH | |
%token <y_word> OP_BT_C | |
+%token <y_word> OP_BT_BA_BA | |
%token <y_word> OP_BT_BA_BB | |
+%token <y_word> OP_BT_BT_BT | |
%token <y_word> OP_FLM_FRB_C | |
%token <y_word> OP_FRS_RA_D | |
%token <y_word> OP_FRS_RA_RB | |
@@ -38,7 +52,7 @@ | |
%token <y_word> OP_LIL | |
%token <y_word> OP_L_RB | |
%token <y_word> OP_RA_RB | |
-%token <y_word> OP_RB | |
+%token <y_word> OP_RA_SI | |
%token <y_word> OP_RS | |
%token <y_word> OP_RS_FXM | |
%token <y_word> OP_RS_L | |
@@ -57,6 +71,7 @@ | |
%token <y_word> OP_RS_RA_SH_MB6_SH_C | |
%token <y_word> OP_RS_RA_SH_ME6_SH_C | |
%token <y_word> OP_RS_RA_SH5_C | |
+%token <y_word> OP_RS_RA_SH5R_C | |
%token <y_word> OP_RS_RA_SH6_C | |
%token <y_word> OP_RS_RA_UI | |
%token <y_word> OP_RS_RA_UI_CC | |
@@ -73,7 +88,10 @@ | |
%token <y_word> OP_RT_RA_RB_C | |
%token <y_word> OP_RT_RA_SI | |
%token <y_word> OP_RT_RA_SI_addic | |
+%token <y_word> OP_RT_RA_SI_subi | |
+%token <y_word> OP_RT_RA_SI_subic | |
%token <y_word> OP_RT_RB | |
+%token <y_word> OP_RT_RB_RA_C | |
%token <y_word> OP_RT_SPR | |
%token <y_word> OP_RT_SR | |
%token <y_word> OP_RT_TBR | |
@@ -84,8 +102,12 @@ | |
%token <y_word> OP_LA | |
%token <y_word> OP_LI32 | |
+/* rlwimi, rlwinm, rlwnm simplified */ | |
+%token <y_word> OP_CLRLSLWI OP_CLRLWI OP_CLRRWI OP_EXTLWI OP_EXTRWI | |
+%token <y_word> OP_INSLWI OP_INSRWI OP_SLWI OP_SRWI | |
+ | |
/* Other token types */ | |
%type <y_word> c | |
-%type <y_word> e16 u8 u7 u6 u5 u4 u2 u1 | |
-%type <y_word> nb ds bda bdl lia lil spr_num | |
+%type <y_word> e16 neg16 u8 u7 u6 u5 u4 u2 u1 | |
+%type <y_word> opt_bh nb ds bda bdl lia lil spr_num | |
diff --git a/mach/powerpc/as/mach3.c b/mach/powerpc/as/mach3.c | |
index 0f0bfda..f50e30c 100644 | |
--- a/mach/powerpc/as/mach3.c | |
+++ b/mach/powerpc/as/mach3.c | |
@@ -123,11 +123,173 @@ | |
0, OP_BT_BA_BB, 19<<26 | 193<<1, "crxor", | |
0, OP_BT_BA_BB, 19<<26 | 225<<1, "crnand", | |
0, OP_BT_BA_BB, 19<<26 | 33<<1, "crnor", | |
-0, OP_BT_BA_BB, 19<<26 | 289<<1, "crneqv", | |
+0, OP_BT_BA_BB, 19<<26 | 289<<1, "creqv", | |
0, OP_BT_BA_BB, 19<<26 | 129<<1, "crandc", | |
0, OP_BT_BA_BB, 19<<26 | 417<<1, "crorc", | |
0, OP_BF_BFA, 19<<26 | 0<<1, "mcrf", | |
+/* extended mnemonics for bc, bcctr, bclr */ | |
+0, OP_BH, 19<<26 | 20<<21 | 528<<1 | 0<<0, "bctr", | |
+0, OP_BH, 19<<26 | 20<<21 | 528<<1 | 1<<0, "bctrl", | |
+0, OP_BDL, 16<<26 | 16<<21 | 0<<1 | 0<<0, "bdnz", | |
+0, OP_BDA, 16<<26 | 16<<21 | 1<<1 | 0<<0, "bdnza", | |
+0, OP_BH, 19<<26 | 16<<21 | 16<<1 | 0<<0, "bdnzlr", | |
+0, OP_BDL, 16<<26 | 16<<21 | 0<<1 | 1<<0, "bdnzl", | |
+0, OP_BDA, 16<<26 | 16<<21 | 1<<1 | 1<<0, "bdnzla", | |
+0, OP_BH, 19<<26 | 16<<21 | 16<<1 | 1<<0, "bdnzlrl", | |
+0, OP_BI_BDL, 16<<26 | 0<<21 | 0<<1 | 0<<0, "bdnzf", | |
+0, OP_BI_BDA, 16<<26 | 0<<21 | 1<<1 | 0<<0, "bdnzfa", | |
+0, OP_BI_BH, 19<<26 | 0<<21 | 16<<1 | 0<<0, "bdnzflr", | |
+0, OP_BI_BDL, 16<<26 | 0<<21 | 0<<1 | 1<<0, "bdnzfl", | |
+0, OP_BI_BDA, 16<<26 | 0<<21 | 1<<1 | 1<<0, "bdnzfla", | |
+0, OP_BI_BH, 19<<26 | 0<<21 | 16<<1 | 1<<0, "bdnzflrl", | |
+0, OP_BI_BDL, 16<<26 | 8<<21 | 0<<1 | 0<<0, "bdnzt", | |
+0, OP_BI_BDA, 16<<26 | 8<<21 | 1<<1 | 0<<0, "bdnzta", | |
+0, OP_BI_BH, 19<<26 | 8<<21 | 16<<1 | 0<<0, "bdnztlr", | |
+0, OP_BI_BDL, 16<<26 | 8<<21 | 0<<1 | 1<<0, "bdnztl", | |
+0, OP_BI_BDA, 16<<26 | 8<<21 | 1<<1 | 1<<0, "bdnztla", | |
+0, OP_BI_BH, 19<<26 | 8<<21 | 16<<1 | 1<<0, "bdnztlrl", | |
+0, OP_BDL, 16<<26 | 18<<21 | 0<<1 | 0<<0, "bdz", | |
+0, OP_BDA, 16<<26 | 18<<21 | 1<<1 | 0<<0, "bdza", | |
+0, OP_BH, 19<<26 | 18<<21 | 16<<1 | 0<<0, "bdzlr", | |
+0, OP_BDL, 16<<26 | 18<<21 | 0<<1 | 1<<0, "bdzl", | |
+0, OP_BDA, 16<<26 | 18<<21 | 1<<1 | 1<<0, "bdzla", | |
+0, OP_BH, 19<<26 | 18<<21 | 16<<1 | 1<<0, "bdzlrl", | |
+0, OP_BI_BDL, 16<<26 | 2<<21 | 0<<1 | 0<<0, "bdzf", | |
+0, OP_BI_BDA, 16<<26 | 2<<21 | 1<<1 | 0<<0, "bdzfa", | |
+0, OP_BI_BH, 19<<26 | 2<<21 | 16<<1 | 0<<0, "bdzflr", | |
+0, OP_BI_BDL, 16<<26 | 2<<21 | 0<<1 | 1<<0, "bdzfl", | |
+0, OP_BI_BDA, 16<<26 | 2<<21 | 1<<1 | 1<<0, "bdzfla", | |
+0, OP_BI_BH, 19<<26 | 2<<21 | 16<<1 | 1<<0, "bdzflrl", | |
+0, OP_BI_BDL, 16<<26 | 10<<21 | 0<<1 | 0<<0, "bdzt", | |
+0, OP_BI_BDA, 16<<26 | 10<<21 | 1<<1 | 0<<0, "bdzta", | |
+0, OP_BI_BH, 19<<26 | 10<<21 | 16<<1 | 0<<0, "bdztlr", | |
+0, OP_BI_BDL, 16<<26 | 10<<21 | 0<<1 | 1<<0, "bdztl", | |
+0, OP_BI_BDA, 16<<26 | 10<<21 | 1<<1 | 1<<0, "bdztla", | |
+0, OP_BI_BH, 19<<26 | 10<<21 | 16<<1 | 1<<0, "bdztlrl", | |
+0, OP_BI_BDL, 16<<26 | 4<<21 | 0<<1 | 0<<0, "bf", | |
+0, OP_BI_BDA, 16<<26 | 4<<21 | 1<<1 | 0<<0, "bfa", | |
+0, OP_BI_BH, 19<<26 | 4<<21 | 528<<1 | 0<<0, "bfctr", | |
+0, OP_BI_BH, 19<<26 | 4<<21 | 528<<1 | 1<<0, "bfctrl", | |
+0, OP_BI_BDL, 16<<26 | 4<<21 | 0<<1 | 1<<0, "bfl", | |
+0, OP_BI_BDA, 16<<26 | 4<<21 | 0<<1 | 1<<0, "bfla", | |
+0, OP_BI_BH, 19<<26 | 4<<21 | 16<<1 | 0<<0, "bflr", | |
+0, OP_BI_BH, 19<<26 | 4<<21 | 16<<1 | 1<<0, "bflrl", | |
+0, OP_BH, 19<<26 | 20<<21 | 16<<1 | 0<<0, "blr", | |
+0, OP_BH, 19<<26 | 20<<21 | 16<<1 | 1<<0, "blrl", | |
+0, OP_BI_BDL, 16<<26 | 12<<21 | 0<<1 | 0<<0, "bt", | |
+0, OP_BI_BDA, 16<<26 | 12<<21 | 1<<1 | 0<<0, "bta", | |
+0, OP_BI_BH, 19<<26 | 12<<21 | 528<<1 | 0<<0, "btctr", | |
+0, OP_BI_BH, 19<<26 | 12<<21 | 528<<1 | 1<<0, "btctrl", | |
+0, OP_BI_BDL, 16<<26 | 12<<21 | 0<<1 | 1<<0, "btl", | |
+0, OP_BI_BDA, 16<<26 | 12<<21 | 0<<1 | 1<<0, "btla", | |
+0, OP_BI_BH, 19<<26 | 12<<21 | 16<<1 | 0<<0, "btlr", | |
+0, OP_BI_BH, 19<<26 | 12<<21 | 16<<1 | 1<<0, "btlrl", | |
+ | |
+/* extended m with condition in BI */ | |
+0, OP_BICR_BDL, 16<<26 | 12<<21 | 2<<16 | 0<<1 | 0<<0, "beq", | |
+0, OP_BICR_BDA, 16<<26 | 12<<21 | 2<<16 | 1<<1 | 0<<0, "beqa", | |
+0, OP_BICR_BH, 19<<26 | 12<<21 | 2<<16 | 528<<1 | 0<<0, "beqctr", | |
+0, OP_BICR_BH, 19<<26 | 12<<21 | 2<<16 | 528<<1 | 1<<0, "beqctrl", | |
+0, OP_BICR_BDL, 16<<26 | 12<<21 | 2<<16 | 0<<1 | 1<<0, "beql", | |
+0, OP_BICR_BDA, 16<<26 | 12<<21 | 2<<16 | 1<<1 | 1<<0, "beqla", | |
+0, OP_BICR_BH, 19<<26 | 12<<21 | 2<<16 | 16<<1 | 0<<0, "beqlr", | |
+0, OP_BICR_BH, 19<<26 | 12<<21 | 2<<16 | 16<<1 | 1<<0, "beqlrl", | |
+0, OP_BICR_BDL, 16<<26 | 4<<21 | 0<<16 | 0<<1 | 0<<0, "bge", | |
+0, OP_BICR_BDA, 16<<26 | 4<<21 | 0<<16 | 1<<1 | 0<<0, "bgea", | |
+0, OP_BICR_BH, 19<<26 | 4<<21 | 0<<16 | 528<<1 | 0<<0, "bgectr", | |
+0, OP_BICR_BH, 19<<26 | 4<<21 | 0<<16 | 528<<1 | 1<<0, "bgectrl", | |
+0, OP_BICR_BDL, 16<<26 | 4<<21 | 0<<16 | 0<<1 | 1<<0, "bgel", | |
+0, OP_BICR_BDA, 16<<26 | 4<<21 | 0<<16 | 1<<1 | 1<<0, "bgela", | |
+0, OP_BICR_BH, 19<<26 | 4<<21 | 0<<16 | 16<<1 | 0<<0, "bgelr", | |
+0, OP_BICR_BH, 19<<26 | 4<<21 | 0<<16 | 16<<1 | 1<<0, "bgelrl", | |
+0, OP_BICR_BDL, 16<<26 | 12<<21 | 1<<16 | 0<<1 | 0<<0, "bgt", | |
+0, OP_BICR_BDA, 16<<26 | 12<<21 | 1<<16 | 1<<1 | 0<<0, "bgta", | |
+0, OP_BICR_BH, 19<<26 | 12<<21 | 1<<16 | 528<<1 | 0<<0, "bgtctr", | |
+0, OP_BICR_BH, 19<<26 | 12<<21 | 1<<16 | 528<<1 | 1<<0, "bgtctrl", | |
+0, OP_BICR_BDL, 16<<26 | 12<<21 | 1<<16 | 0<<1 | 1<<0, "bgtl", | |
+0, OP_BICR_BDA, 16<<26 | 12<<21 | 1<<16 | 1<<1 | 1<<0, "bgtla", | |
+0, OP_BICR_BH, 19<<26 | 12<<21 | 1<<16 | 16<<1 | 0<<0, "bgtlr", | |
+0, OP_BICR_BH, 19<<26 | 12<<21 | 1<<16 | 16<<1 | 1<<0, "bgtlrl", | |
+0, OP_BICR_BDL, 16<<26 | 4<<21 | 1<<16 | 0<<1 | 0<<0, "ble", | |
+0, OP_BICR_BDA, 16<<26 | 4<<21 | 1<<16 | 1<<1 | 0<<0, "blea", | |
+0, OP_BICR_BH, 19<<26 | 4<<21 | 1<<16 | 528<<1 | 0<<0, "blectr", | |
+0, OP_BICR_BH, 19<<26 | 4<<21 | 1<<16 | 528<<1 | 1<<0, "blectrl", | |
+0, OP_BICR_BDL, 16<<26 | 4<<21 | 1<<16 | 0<<1 | 1<<0, "blel", | |
+0, OP_BICR_BDA, 16<<26 | 4<<21 | 1<<16 | 1<<1 | 1<<0, "blela", | |
+0, OP_BICR_BH, 19<<26 | 4<<21 | 1<<16 | 16<<1 | 0<<0, "blelr", | |
+0, OP_BICR_BH, 19<<26 | 4<<21 | 1<<16 | 16<<1 | 1<<0, "blelrl", | |
+0, OP_BICR_BDL, 16<<26 | 12<<21 | 0<<16 | 0<<1 | 0<<0, "blt", | |
+0, OP_BICR_BDA, 16<<26 | 12<<21 | 0<<16 | 1<<1 | 0<<0, "blta", | |
+0, OP_BICR_BH, 19<<26 | 12<<21 | 0<<16 | 528<<1 | 0<<0, "bltctr", | |
+0, OP_BICR_BH, 19<<26 | 12<<21 | 0<<16 | 528<<1 | 1<<0, "bltctrl", | |
+0, OP_BICR_BDL, 16<<26 | 12<<21 | 0<<16 | 0<<1 | 1<<0, "bltl", | |
+0, OP_BICR_BDA, 16<<26 | 12<<21 | 0<<16 | 1<<1 | 1<<0, "bltla", | |
+0, OP_BICR_BH, 19<<26 | 12<<21 | 0<<16 | 16<<1 | 0<<0, "bltlr", | |
+0, OP_BICR_BH, 19<<26 | 12<<21 | 0<<16 | 16<<1 | 1<<0, "bltlrl", | |
+0, OP_BICR_BDL, 16<<26 | 4<<21 | 2<<16 | 0<<1 | 0<<0, "bne", | |
+0, OP_BICR_BDA, 16<<26 | 4<<21 | 2<<16 | 1<<1 | 0<<0, "bnea", | |
+0, OP_BICR_BH, 19<<26 | 4<<21 | 2<<16 | 528<<1 | 0<<0, "bnectr", | |
+0, OP_BICR_BH, 19<<26 | 4<<21 | 2<<16 | 528<<1 | 1<<0, "bnectrl", | |
+0, OP_BICR_BDL, 16<<26 | 4<<21 | 2<<16 | 0<<1 | 1<<0, "bnel", | |
+0, OP_BICR_BDA, 16<<26 | 4<<21 | 2<<16 | 1<<1 | 1<<0, "bnela", | |
+0, OP_BICR_BH, 19<<26 | 4<<21 | 2<<16 | 16<<1 | 0<<0, "bnelr", | |
+0, OP_BICR_BH, 19<<26 | 4<<21 | 2<<16 | 16<<1 | 1<<0, "bnelrl", | |
+0, OP_BICR_BDL, 16<<26 | 4<<21 | 1<<16 | 0<<1 | 0<<0, "bng", | |
+0, OP_BICR_BDA, 16<<26 | 4<<21 | 1<<16 | 1<<1 | 0<<0, "bnga", | |
+0, OP_BICR_BH, 19<<26 | 4<<21 | 1<<16 | 528<<1 | 0<<0, "bngctr", | |
+0, OP_BICR_BH, 19<<26 | 4<<21 | 1<<16 | 528<<1 | 1<<0, "bngctrl", | |
+0, OP_BICR_BDL, 16<<26 | 4<<21 | 1<<16 | 0<<1 | 1<<0, "bngl", | |
+0, OP_BICR_BDA, 16<<26 | 4<<21 | 1<<16 | 1<<1 | 1<<0, "bngla", | |
+0, OP_BICR_BH, 19<<26 | 4<<21 | 1<<16 | 16<<1 | 0<<0, "bnglr", | |
+0, OP_BICR_BH, 19<<26 | 4<<21 | 1<<16 | 16<<1 | 1<<0, "bnglrl", | |
+0, OP_BICR_BDL, 16<<26 | 4<<21 | 0<<16 | 0<<1 | 0<<0, "bnl", | |
+0, OP_BICR_BDA, 16<<26 | 4<<21 | 0<<16 | 1<<1 | 0<<0, "bnla", | |
+0, OP_BICR_BH, 19<<26 | 4<<21 | 0<<16 | 528<<1 | 0<<0, "bnlctr", | |
+0, OP_BICR_BH, 19<<26 | 4<<21 | 0<<16 | 528<<1 | 1<<0, "bnlctrl", | |
+0, OP_BICR_BDL, 16<<26 | 4<<21 | 0<<16 | 0<<1 | 1<<0, "bnll", | |
+0, OP_BICR_BDA, 16<<26 | 4<<21 | 0<<16 | 1<<1 | 1<<0, "bnlla", | |
+0, OP_BICR_BH, 19<<26 | 4<<21 | 0<<16 | 16<<1 | 0<<0, "bnllr", | |
+0, OP_BICR_BH, 19<<26 | 4<<21 | 0<<16 | 16<<1 | 1<<0, "bnllrl", | |
+0, OP_BICR_BDL, 16<<26 | 4<<21 | 3<<16 | 0<<1 | 0<<0, "bns", | |
+0, OP_BICR_BDA, 16<<26 | 4<<21 | 3<<16 | 1<<1 | 0<<0, "bnsa", | |
+0, OP_BICR_BH, 19<<26 | 4<<21 | 3<<16 | 528<<1 | 0<<0, "bnsctr", | |
+0, OP_BICR_BH, 19<<26 | 4<<21 | 3<<16 | 528<<1 | 1<<0, "bnsctrl", | |
+0, OP_BICR_BDL, 16<<26 | 4<<21 | 3<<16 | 0<<1 | 1<<0, "bnsl", | |
+0, OP_BICR_BDA, 16<<26 | 4<<21 | 3<<16 | 1<<1 | 1<<0, "bnsla", | |
+0, OP_BICR_BH, 19<<26 | 4<<21 | 3<<16 | 16<<1 | 0<<0, "bnslr", | |
+0, OP_BICR_BH, 19<<26 | 4<<21 | 3<<16 | 16<<1 | 1<<0, "bnslrl", | |
+0, OP_BICR_BDL, 16<<26 | 4<<21 | 3<<16 | 0<<1 | 0<<0, "bnu", | |
+0, OP_BICR_BDA, 16<<26 | 4<<21 | 3<<16 | 1<<1 | 0<<0, "bnua", | |
+0, OP_BICR_BH, 19<<26 | 4<<21 | 3<<16 | 528<<1 | 0<<0, "bnuctr", | |
+0, OP_BICR_BH, 19<<26 | 4<<21 | 3<<16 | 528<<1 | 1<<0, "bnuctrl", | |
+0, OP_BICR_BDL, 16<<26 | 4<<21 | 3<<16 | 0<<1 | 1<<0, "bnul", | |
+0, OP_BICR_BDA, 16<<26 | 4<<21 | 3<<16 | 1<<1 | 1<<0, "bnula", | |
+0, OP_BICR_BH, 19<<26 | 4<<21 | 3<<16 | 16<<1 | 0<<0, "bnulr", | |
+0, OP_BICR_BH, 19<<26 | 4<<21 | 3<<16 | 16<<1 | 1<<0, "bnulrl", | |
+0, OP_BICR_BDL, 16<<26 | 12<<21 | 3<<16 | 0<<1 | 0<<0, "bso", | |
+0, OP_BICR_BDA, 16<<26 | 12<<21 | 3<<16 | 1<<1 | 0<<0, "bsoa", | |
+0, OP_BICR_BH, 19<<26 | 12<<21 | 3<<16 | 528<<1 | 0<<0, "bsoctr", | |
+0, OP_BICR_BH, 19<<26 | 12<<21 | 3<<16 | 528<<1 | 1<<0, "bsoctrl", | |
+0, OP_BICR_BDL, 16<<26 | 12<<21 | 3<<16 | 0<<1 | 1<<0, "bsol", | |
+0, OP_BICR_BDA, 16<<26 | 12<<21 | 3<<16 | 1<<1 | 1<<0, "bsola", | |
+0, OP_BICR_BH, 19<<26 | 12<<21 | 3<<16 | 16<<1 | 0<<0, "bsolr", | |
+0, OP_BICR_BH, 19<<26 | 12<<21 | 3<<16 | 16<<1 | 1<<0, "bsolrl", | |
+0, OP_BICR_BDL, 16<<26 | 12<<21 | 3<<16 | 0<<1 | 0<<0, "bun", | |
+0, OP_BICR_BDA, 16<<26 | 12<<21 | 3<<16 | 1<<1 | 0<<0, "buna", | |
+0, OP_BICR_BH, 19<<26 | 12<<21 | 3<<16 | 528<<1 | 0<<0, "bunctr", | |
+0, OP_BICR_BH, 19<<26 | 12<<21 | 3<<16 | 528<<1 | 1<<0, "bunctrl", | |
+0, OP_BICR_BDL, 16<<26 | 12<<21 | 3<<16 | 0<<1 | 1<<0, "bunl", | |
+0, OP_BICR_BDA, 16<<26 | 12<<21 | 3<<16 | 1<<1 | 1<<0, "bunla", | |
+0, OP_BICR_BH, 19<<26 | 12<<21 | 3<<16 | 16<<1 | 0<<0, "bunlr", | |
+0, OP_BICR_BH, 19<<26 | 12<<21 | 3<<16 | 16<<1 | 1<<0, "bunlrl", | |
+ | |
+/* extended m for cr logic */ | |
+0, OP_BT_BT_BT, 19<<26 | 289<<1, "crset", | |
+0, OP_BT_BT_BT, 19<<26 | 193<<1, "crclr", | |
+0, OP_BT_BA_BA, 19<<26 | 449<<1, "crmove", | |
+0, OP_BT_BA_BA, 19<<26 | 33<<1, "crnot", | |
+ | |
/* Fixed point instructions (page 29) */ | |
0, OP_RT_RA_D, 34<<26, "lbz", | |
@@ -196,6 +358,10 @@ | |
0, OP_RT_RA_RB_C, 31<<26 | 1<<10 | 40<<1, "subfo", | |
0, OP_RT_RA_SI_addic, 12<<26, "addic", /* special case C */ | |
0, OP_RT_RA_SI, 8<<26, "subfic", | |
+0, OP_RT_RA_RB_C, 31<<26 | 0<<10 | 10<<1, "addc", | |
+0, OP_RT_RA_RB_C, 31<<26 | 1<<10 | 10<<1, "addco", | |
+0, OP_RT_RA_RB_C, 31<<26 | 0<<10 | 8<<1, "subfc", | |
+0, OP_RT_RA_RB_C, 31<<26 | 1<<10 | 8<<1, "subfco", | |
0, OP_RT_RA_RB_C, 31<<26 | 0<<10 | 138<<1, "adde", | |
0, OP_RT_RA_RB_C, 31<<26 | 1<<10 | 138<<1, "addeo", | |
0, OP_RT_RA_RB_C, 31<<26 | 0<<10 | 136<<1, "subfe", | |
@@ -211,6 +377,15 @@ | |
0, OP_RT_RA_C, 31<<26 | 0<<10 | 104<<1, "neg", | |
0, OP_RT_RA_C, 31<<26 | 1<<10 | 104<<1, "nego", | |
+/* extended m for subtraction */ | |
+0, OP_RT_RB_RA_C, 31<<26 | 0<<10 | 40<<1, "sub", | |
+0, OP_RT_RB_RA_C, 31<<26 | 1<<10 | 40<<1, "subo", | |
+0, OP_RT_RB_RA_C, 31<<26 | 0<<10 | 8<<1, "subc", | |
+0, OP_RT_RB_RA_C, 31<<26 | 0<<10 | 8<<1, "subco", | |
+0, OP_RT_RA_SI_subi, 14<<26, "subi", | |
+0, OP_RT_RA_SI_subi, 15<<26, "subis", | |
+0, OP_RT_RA_SI_subic, 12<<26, "subic", | |
+ | |
/* page 54 */ | |
0, OP_RT_RA_SI, 7<<26, "mulli", | |
0, OP_RT_RA_RB_C, 31<<26 | 0<<10 | 233<<1, "mulld", | |
@@ -238,12 +413,85 @@ | |
0, OP_BF_L_RA_UI, 10<<26, "cmpli", | |
0, OP_BF_L_RA_RB, 31<<26 | 32<<1, "cmpl", | |
+/* extended m for comparison */ | |
+0, OP_BF_RA_SI, 11<<26 | 1<<21, "cmpdi", | |
+0, OP_BF_RA_RB, 31<<26 | 1<<21 | 0<<1, "cmpd", | |
+0, OP_BF_RA_UI, 10<<26 | 1<<21, "cmpldi", | |
+0, OP_BF_RA_RB, 31<<26 | 1<<21 | 32<<1, "cmpld", | |
+0, OP_BF_RA_SI, 11<<26 | 0<<21, "cmpwi", | |
+0, OP_BF_RA_RB, 31<<26 | 0<<21 | 0<<1, "cmpw", | |
+0, OP_BF_RA_UI, 10<<26 | 0<<21, "cmplwi", | |
+0, OP_BF_RA_RB, 31<<26 | 0<<21 | 32<<1, "cmplw", | |
+ | |
/* page 60 */ | |
0, OP_TO_RA_SI, 2<<26, "tdi", | |
0, OP_TO_RA_SI, 3<<26, "twi", | |
0, OP_TO_RA_RB, 31<<26 | 68<<1, "td", | |
0, OP_TO_RA_RB, 31<<26 | 4<<1, "tw", | |
+/* extended m for traps */ | |
+0, OP_RA_RB, 31<<26 | 4<<21 | 68<<1, "tdeq", | |
+0, OP_RA_SI, 2<<26 | 4<<21, "tdeqi", | |
+0, OP_RA_RB, 31<<26 | 12<<21 | 68<<1, "tdge", | |
+0, OP_RA_SI, 2<<26 | 12<<21, "tdgei", | |
+0, OP_RA_RB, 31<<26 | 8<<21 | 68<<1, "tdgt", | |
+0, OP_RA_SI, 2<<26 | 8<<21, "tdgti", | |
+0, OP_RA_RB, 31<<26 | 20<<21 | 68<<1, "tdle", | |
+0, OP_RA_SI, 2<<26 | 20<<21, "tdlei", | |
+0, OP_RA_RB, 31<<26 | 5<<21 | 68<<1, "tdlge", | |
+0, OP_RA_SI, 2<<26 | 5<<21, "tdlgei", | |
+0, OP_RA_RB, 31<<26 | 1<<21 | 68<<1, "tdlgt", | |
+0, OP_RA_SI, 2<<26 | 1<<21, "tdlgti", | |
+0, OP_RA_RB, 31<<26 | 6<<21 | 68<<1, "tdlle", | |
+0, OP_RA_SI, 2<<26 | 6<<21, "tdllei", | |
+0, OP_RA_RB, 31<<26 | 2<<21 | 68<<1, "tdllt", | |
+0, OP_RA_SI, 2<<26 | 2<<21, "tdllti", | |
+0, OP_RA_RB, 31<<26 | 6<<21 | 68<<1, "tdlng", | |
+0, OP_RA_SI, 2<<26 | 6<<21, "tdlngi", | |
+0, OP_RA_RB, 31<<26 | 5<<21 | 68<<1, "tdlnl", | |
+0, OP_RA_SI, 2<<26 | 5<<21, "tdlnli", | |
+0, OP_RA_RB, 31<<26 | 16<<21 | 68<<1, "tdlt", | |
+0, OP_RA_SI, 2<<26 | 16<<21, "tdlti", | |
+0, OP_RA_RB, 31<<26 | 24<<21 | 68<<1, "tdne", | |
+0, OP_RA_SI, 2<<26 | 24<<21, "tdnei", | |
+0, OP_RA_RB, 31<<26 | 20<<21 | 68<<1, "tdng", | |
+0, OP_RA_SI, 2<<26 | 20<<21, "tdngi", | |
+0, OP_RA_RB, 31<<26 | 12<<21 | 68<<1, "tdnl", | |
+0, OP_RA_SI, 2<<26 | 12<<21, "tdnli", | |
+0, OP_RA_RB, 31<<26 | 31<<21 | 68<<1, "tdu", | |
+0, OP_RA_SI, 2<<26 | 31<<21, "tdui", | |
+0, OP, 31<<26 | 31<<21 | 4<<1, "trap", | |
+0, OP_RA_RB, 31<<26 | 4<<21 | 4<<1, "tweq", | |
+0, OP_RA_SI, 3<<26 | 4<<21, "tweqi", | |
+0, OP_RA_RB, 31<<26 | 12<<21 | 4<<1, "twge", | |
+0, OP_RA_SI, 3<<26 | 12<<21, "twgei", | |
+0, OP_RA_RB, 31<<26 | 8<<21 | 4<<1, "twgt", | |
+0, OP_RA_SI, 3<<26 | 8<<21, "twgti", | |
+0, OP_RA_RB, 31<<26 | 20<<21 | 4<<1, "twle", | |
+0, OP_RA_SI, 3<<26 | 20<<21, "twlei", | |
+0, OP_RA_RB, 31<<26 | 5<<21 | 4<<1, "twlge", | |
+0, OP_RA_SI, 3<<26 | 5<<21, "twlgei", | |
+0, OP_RA_RB, 31<<26 | 1<<21 | 4<<1, "twlgt", | |
+0, OP_RA_SI, 3<<26 | 1<<21, "twlgti", | |
+0, OP_RA_RB, 31<<26 | 6<<21 | 4<<1, "twlle", | |
+0, OP_RA_SI, 3<<26 | 6<<21, "twllei", | |
+0, OP_RA_RB, 31<<26 | 2<<21 | 4<<1, "twllt", | |
+0, OP_RA_SI, 3<<26 | 2<<21, "twllti", | |
+0, OP_RA_RB, 31<<26 | 6<<21 | 4<<1, "twlng", | |
+0, OP_RA_SI, 3<<26 | 6<<21, "twlngi", | |
+0, OP_RA_RB, 31<<26 | 5<<21 | 4<<1, "twlnl", | |
+0, OP_RA_SI, 3<<26 | 5<<21, "twlnli", | |
+0, OP_RA_RB, 31<<26 | 16<<21 | 4<<1, "twlt", | |
+0, OP_RA_SI, 3<<26 | 16<<21, "twlti", | |
+0, OP_RA_RB, 31<<26 | 24<<21 | 4<<1, "twne", | |
+0, OP_RA_SI, 3<<26 | 24<<21, "twnei", | |
+0, OP_RA_RB, 31<<26 | 20<<21 | 4<<1, "twng", | |
+0, OP_RA_SI, 3<<26 | 20<<21, "twngi", | |
+0, OP_RA_RB, 31<<26 | 12<<21 | 4<<1, "twnl", | |
+0, OP_RA_SI, 3<<26 | 12<<21, "twnli", | |
+0, OP_RA_RB, 31<<26 | 31<<21 | 4<<1, "twu", | |
+0, OP_RA_SI, 3<<26 | 31<<21, "twui", | |
+ | |
/* page 62 */ | |
0, OP_RS_RA_UI_CC, 28<<26, "andi", /* C compulsory */ | |
0, OP_RS_RA_UI_CC, 29<<26, "andis", /* C compulsory */ | |
@@ -276,6 +524,20 @@ | |
0, OP_RS_RA_SH_MB6_SH_C, 30<<26 | 3<<2, "rldimi", | |
0, OP_RS_RA_SH_MB5_ME5_C, 20<<26, "rlwimi", | |
+/* extended mnemonics for rotation */ | |
+0, OP_CLRLSLWI, 21<<26, "clrlslwi", | |
+0, OP_CLRLWI, 21<<26, "clrlwi", | |
+0, OP_CLRRWI, 21<<26, "clrrwi", | |
+0, OP_EXTLWI, 21<<26, "extlwi", | |
+0, OP_EXTRWI, 21<<26, "extrwi", | |
+0, OP_INSLWI, 20<<26, "inslwi", | |
+0, OP_INSRWI, 20<<26, "insrwi", | |
+0, OP_RS_RA_SH5_C, 21<<26 | 31<<1, "rotlwi", | |
+0, OP_RS_RA_SH5R_C, 21<<26 | 31<<1, "rotrwi", | |
+0, OP_RS_RA_RB_C, 23<<26 | 31<<1, "rotlw", | |
+0, OP_SLWI, 21<<26, "slwi", | |
+0, OP_SRWI, 21<<26, "srwi", | |
+ | |
/* page 74 */ | |
0, OP_RS_RA_RB_C, 31<<26 | 27<<1, "sld", | |
0, OP_RS_RA_RB_C, 31<<26 | 24<<1, "slw", | |
diff --git a/mach/powerpc/as/mach4.c b/mach/powerpc/as/mach4.c | |
index e1fb3fd..25066e9 100644 | |
--- a/mach/powerpc/as/mach4.c | |
+++ b/mach/powerpc/as/mach4.c | |
@@ -4,16 +4,32 @@ | |
*/ | |
operation | |
- : OP_BF_BFA CR ',' CR { emit4($1 | ($2<<23) | ($4<<18)); } | |
+ : OP { emit4($1); } | |
+ | OP_BDA bda { emit4($1 | $2); } | |
+ | OP_BDL bdl { emit4($1 | $2); } | |
+ | OP_BF_BFA CR ',' CR { emit4($1 | ($2<<23) | ($4<<18)); } | |
| OP_BF_FRA_FRB CR ',' FPR ',' FPR { emit4($1 | ($2<<23) | ($4<<16) | ($6<<11)); } | |
| OP_BF_L_RA_RB CR ',' u1 ',' GPR ',' GPR { emit4($1 | ($2<<23) | ($4<<21) | ($6<<16) | ($8<<11)); } | |
| OP_BF_L_RA_SI CR ',' u1 ',' GPR ',' e16 { emit4($1 | ($2<<23) | ($4<<21) | ($6<<16) | $8); } | |
| OP_BF_L_RA_UI CR ',' u1 ',' GPR ',' e16 { emit4($1 | ($2<<23) | ($4<<21) | ($6<<16) | $8); } | |
+ | OP_BF_RA_RB CR ',' GPR ',' GPR { emit4($1 | ($2<<23) | ($4<<16) | ($6<<11)); } | |
+ | OP_BF_RA_SI CR ',' GPR ',' e16 { emit4($1 | ($2<<23) | ($4<<16) | $6); } | |
+ | OP_BF_RA_UI CR ',' GPR ',' e16 { emit4($1 | ($2<<23) | ($4<<16) | $6); } | |
| OP_BF_U_C c CR ',' u4 { emit4($1 | $2 | ($3<<23) | ($5<<12)); } | |
+ | OP_BH { emit4($1); } | |
+ | OP_BH u2 { emit4($1 | ($2<<11)); } | |
+ | OP_BI_BDA u5 ',' bda { emit4($1 | ($2<<16) | $4); } | |
+ | OP_BI_BDL u5 ',' bdl { emit4($1 | ($2<<16) | $4); } | |
+ | OP_BI_BH u5 opt_bh { emit4($1 | ($2<<16) | $3); } | |
+ | OP_BICR_BDA CR ',' bda { emit4($1 | ($2<<18) | $4); } | |
+ | OP_BICR_BDL CR ',' bdl { emit4($1 | ($2<<18) | $4); } | |
+ | OP_BICR_BH CR opt_bh { emit4($1 | ($2<<18) | $3); } | |
| OP_BO_BI_BDA u5 ',' u5 ',' bda { emit4($1 | ($2<<21) | ($4<<16) | $6); } | |
| OP_BO_BI_BDL u5 ',' u5 ',' bdl { emit4($1 | ($2<<21) | ($4<<16) | $6); } | |
- | OP_BO_BI_BH u5 ',' u5 ',' u2 { emit4($1 | ($2<<21) | ($4<<16) | ($6<<11)); } | |
+ | OP_BO_BI_BH u5 ',' u5 opt_bh { emit4($1 | ($2<<21) | ($4<<16) | $5); } | |
+ | OP_BT_BA_BA u5 ',' u5 { emit4($1 | ($2<<21) | ($4<<16) | ($4<<11)); } | |
| OP_BT_BA_BB u5 ',' u5 ',' u5 { emit4($1 | ($2<<21) | ($4<<16) | ($6<<11)); } | |
+ | OP_BT_BT_BT u5 { emit4($1 | ($2<<21) | ($2<<16) | ($2<<11)); } | |
| OP_BT_C c u5 { emit4($1 | $2 | ($3<<21)); } | |
| OP_FLM_FRB_C c u8 ',' FPR { emit4($1 | $2 | ($3<<17) | ($5<<11)); } | |
| OP_FRS_RA_D FPR ',' e16 '(' GPR ')' { emit4($1 | ($2<<21) | ($6<<16) | $4); } | |
@@ -25,15 +41,20 @@ operation | |
| OP_FRT_RA_D FPR ',' e16 '(' GPR ')' { emit4($1 | ($2<<21) | ($6<<16) | $4); } | |
| OP_FRT_RA_RB FPR ',' GPR ',' GPR { emit4($1 | ($2<<21) | ($4<<16) | ($6<<11)); } | |
| OP_FRT_C c FPR { emit4($1 | $2 | ($3<<21)); } | |
+ | OP_RA_RB GPR ',' GPR { emit4($1 | ($2<<16) | ($4<<11)); } | |
+ | OP_RA_SI GPR ',' e16 { emit4($1 | ($2<<16) | $4); } | |
| OP_RT GPR { emit4($1 | ($2<<21)); } | |
| OP_RT_RA_C c GPR ',' GPR { emit4($1 | $2 | ($3<<21) | ($5<<16)); } | |
| OP_RT_RA_D GPR ',' e16 '(' GPR ')' { emit4($1 | ($2<<21) | ($6<<16) | $4); } | |
| OP_RT_RA_DS GPR ',' ds '(' GPR ')' { emit4($1 | ($2<<21) | ($6<<16) | $4); } | |
| OP_RT_RA_NB GPR ',' GPR ',' nb { emit4($1 | ($2<<21) | ($4<<16) | ($6<<11)); } | |
| OP_RT_RA_RB GPR ',' GPR ',' GPR { emit4($1 | ($2<<21) | ($4<<16) | ($6<<11)); } | |
- | OP_RT_RA_RB_C c GPR ',' GPR ',' GPR { emit4($1 | $2 | ($3<<21) | ($5<<16) | ($7<<11)); } | |
+ | OP_RT_RA_RB_C c GPR ',' GPR ',' GPR { emit4($1 | $2 | ($3<<21) | ($5<<16) | ($7<<11)); } | |
| OP_RT_RA_SI GPR ',' GPR ',' e16 { emit4($1 | ($2<<21) | ($4<<16) | $6); } | |
| OP_RT_RA_SI_addic c GPR ',' GPR ',' e16 { emit4($1 | ($2<<26) | ($3<<21) | ($5<<16) | $7); } | |
+ | OP_RT_RA_SI_subi GPR ',' GPR ',' neg16 { emit4($1 | ($2<<21) | ($4<<16) | $6); } | |
+ | OP_RT_RA_SI_subic c GPR ',' GPR ',' neg16 { emit4($1 | ($2<<26) | ($3<<21) | ($5<<16) | $7); } | |
+ | OP_RT_RB_RA_C c GPR ',' GPR ',' GPR { emit4($1 | $2 | ($3<<21) | ($7<<16) | ($5<<11)); } | |
| OP_RT_SPR GPR ',' spr_num { emit4($1 | ($2<<21) | ($4<<11)); } | |
| OP_RS_FXM u7 ',' GPR { emit4($1 | ($4<<21) | ($2<<12)); } | |
| OP_RS_RA_C c GPR ',' GPR { emit4($1 | $2 | ($5<<21) | ($3<<16)); } | |
@@ -52,14 +73,43 @@ operation | |
| OP_RS_RA_SH_MB6_SH_C c GPR ',' GPR ',' u6 ',' u6 { emit4($1 | $2 | ($5<<21) | ($3<<16) | (($7&0x1F)<<11) | ($9<<6) | (($7&0x20)>>4)); } | |
| OP_RS_RA_SH_ME6_SH_C c GPR ',' GPR ',' u6 ',' u6 { emit4($1 | $2 | ($5<<21) | ($3<<16) | (($7&0x1F)<<11) | ($9<<6) | (($7&0x20)>>4)); } | |
| OP_RS_RA_SH5_C c GPR ',' GPR ',' u5 { emit4($1 | $2 | ($5<<21) | ($3<<16) | ($7<<11)); } | |
+ | OP_RS_RA_SH5R_C c GPR ',' GPR ',' u5 { emit4($1 | $2 | ($5<<21) | ($3<<16) | ((32-$7)<<11)); } | |
| OP_RS_RA_SH6_C c GPR ',' GPR ',' u6 { emit4($1 | $2 | ($5<<21) | ($3<<16) | (($7&0x1F)<<11) | (($7&0x20)>>4)); } | |
| OP_RS_SPR spr_num ',' GPR { emit4($1 | ($4<<21) | ($2<<11)); } | |
| OP_TO_RA_RB u5 ',' GPR ',' GPR { emit4($1 | ($2<<21) | ($4<<16) | ($6<<11)); } | |
| OP_TO_RA_SI u5 ',' GPR ',' e16 { emit4($1 | ($2<<21) | ($4<<16) | $6); } | |
+ | OP_LEV { emit4($1); } | |
| OP_LEV u7 { emit4($1 | ($2<<5)); } | |
| OP_LIA lia { emit4($1 | $2); } | |
| OP_LIL lil { emit4($1 | $2); } | |
| OP_LI32 li32 /* emitted in subrule */ | |
+ | OP_CLRLSLWI c GPR ',' GPR ',' u5 ',' u5 | |
+ { emit4($1 | $2 | ($5<<21) | ($3<<16) | | |
+ ($9<<11) | (($7-$9)<<6) | ((31-$9)<<1)); } | |
+ | OP_CLRLWI c GPR ',' GPR ',' u5 | |
+ { emit4($1 | $2 | ($5<<21) | ($3<<16) | | |
+ ($7<<6) | (31<<1)); } | |
+ | OP_CLRRWI c GPR ',' GPR ',' u5 | |
+ { emit4($1 | $2 | ($5<<21) | ($3<<16) | | |
+ ((31-$7)<<1)); } | |
+ | OP_EXTLWI c GPR ',' GPR ',' u5 ',' u5 | |
+ { emit4($1 | $2 | ($5<<21) | ($3<<16) | | |
+ ($9<<11) | (($7-1)<<1)); } | |
+ | OP_EXTRWI c GPR ',' GPR ',' u5 ',' u5 | |
+ { emit4($1 | $2 | ($5<<21) | ($3<<16) | | |
+ (($9+$7)<<11) | ((32-$7)<<6) | (31<<1)); } | |
+ | OP_INSLWI c GPR ',' GPR ',' u5 ',' u5 | |
+ { emit4($1 | $2 | ($5<<21) | ($3<<16) | | |
+ ((32-$9)<<11) | ($9<<6) | (($9+$7-1)<<1)); } | |
+ | OP_INSRWI c GPR ',' GPR ',' u5 ',' u5 | |
+ { emit4($1 | $2 | ($5<<21) | ($3<<16) | | |
+ ((32-$9-$7)<<11) | ($9<<6) | (($9+$7-1)<<1)); } | |
+ | OP_SLWI c GPR ',' GPR ',' u5 | |
+ { emit4($1 | $2 | ($5<<21) | ($3<<16) | | |
+ ($7<<11) | ((31-$7)<<1)); } | |
+ | OP_SRWI c GPR ',' GPR ',' u5 | |
+ { emit4($1 | $2 | ($5<<21) | ($3<<16) | | |
+ ((32-$7)<<11) | ($7<<6) | (31<<1)); } | |
; | |
c | |
@@ -76,7 +126,17 @@ e16 | |
$$ = (uint16_t) $1; | |
} | |
; | |
- | |
+ | |
+neg16 | |
+ : absexp | |
+ { | |
+ /* To encode subi, we negate the immediate value, then | |
+ * it must fit as signed 16-bit. */ | |
+ $$ = -$1; | |
+ fit(fitx($$, 16)); | |
+ } | |
+ ; | |
+ | |
u8 | |
: absexp | |
{ | |
@@ -139,7 +199,12 @@ u2 | |
$$ = $1; | |
} | |
; | |
- | |
+ | |
+/* optional comma, branch hint */ | |
+opt_bh | |
+ : /* nothing */ { $$ = 0; } | |
+ | ',' u2 { $$ = ($2<<11); } | |
+ | |
ds | |
: e16 | |
{ | |
@@ -161,7 +226,7 @@ nb | |
$$ = $1; | |
} | |
; | |
- | |
+ | |
bdl | |
: expr | |
{ |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment