Skip to content

Commit 345e0f3

Browse files
committed
Merge branch 'homegrown_powerpc_pairedsingle' into homegrown_powerpc
2 parents 32c8eb0 + 7c02e72 commit 345e0f3

File tree

5 files changed

+459
-4
lines changed

5 files changed

+459
-4
lines changed

arch/powerpc/decode/decode.c

Lines changed: 211 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2063,6 +2063,203 @@ static InstructionId DecodeSpe0x04(uint32_t word32, uint32_t decodeFlags)
20632063
}
20642064
}
20652065

2066+
static InstructionId DecodePairedSingle0x04(uint32_t word32, uint32_t decodeFlags)
2067+
{
2068+
uint32_t a = GetA(word32);
2069+
uint32_t b = GetB(word32);
2070+
uint32_t c = GetC(word32);
2071+
uint32_t d = GetD(word32);
2072+
2073+
// see IBM Broadway RISC Microprocessor User's Manual,
2074+
// Tables A-30, A-31, and A-32
2075+
uint32_t subop = (word32 >> 1) & 0x1f;
2076+
switch (subop)
2077+
{
2078+
case 10:
2079+
return PPC_ID_PAIREDSINGLE_PS_SUM0x;
2080+
2081+
case 11:
2082+
return PPC_ID_PAIREDSINGLE_PS_SUM1x;
2083+
2084+
case 12:
2085+
if (b != 0)
2086+
return PPC_ID_INVALID;
2087+
2088+
return PPC_ID_PAIREDSINGLE_PS_MULS0x;
2089+
2090+
case 13:
2091+
if (b != 0)
2092+
return PPC_ID_INVALID;
2093+
2094+
return PPC_ID_PAIREDSINGLE_PS_MULS1x;
2095+
2096+
case 14:
2097+
return PPC_ID_PAIREDSINGLE_PS_MADDS0x;
2098+
2099+
case 15:
2100+
return PPC_ID_PAIREDSINGLE_PS_MADDS1x;
2101+
2102+
case 18:
2103+
if (c != 0)
2104+
return PPC_ID_INVALID;
2105+
2106+
return PPC_ID_PAIREDSINGLE_PS_DIVx;
2107+
2108+
case 20:
2109+
if (c != 0)
2110+
return PPC_ID_INVALID;
2111+
2112+
return PPC_ID_PAIREDSINGLE_PS_SUBx;
2113+
2114+
case 21:
2115+
if (c != 0)
2116+
return PPC_ID_INVALID;
2117+
2118+
return PPC_ID_PAIREDSINGLE_PS_ADDx;
2119+
2120+
case 23:
2121+
return PPC_ID_PAIREDSINGLE_PS_SELx;
2122+
2123+
case 24:
2124+
if ((a != 0) || (c != 0))
2125+
return PPC_ID_INVALID;
2126+
2127+
return PPC_ID_PAIREDSINGLE_PS_RESx;
2128+
2129+
case 25:
2130+
if (b != 0)
2131+
return PPC_ID_INVALID;
2132+
2133+
return PPC_ID_PAIREDSINGLE_PS_MULx;
2134+
2135+
case 26:
2136+
if ((a != 0) || (c != 0))
2137+
return PPC_ID_INVALID;
2138+
2139+
return PPC_ID_PAIREDSINGLE_PS_RSQRTEx;
2140+
2141+
case 28:
2142+
return PPC_ID_PAIREDSINGLE_PS_MSUBx;
2143+
2144+
case 29:
2145+
return PPC_ID_PAIREDSINGLE_PS_MADDx;
2146+
2147+
case 30:
2148+
return PPC_ID_PAIREDSINGLE_PS_NMSUBx;
2149+
2150+
case 31:
2151+
return PPC_ID_PAIREDSINGLE_PS_NMADDx;
2152+
2153+
default:
2154+
;
2155+
}
2156+
2157+
subop = (word32 >> 1) & 0x3f;
2158+
switch (subop)
2159+
{
2160+
case 6:
2161+
if ((word32 & 0x1) != 0)
2162+
return PPC_ID_INVALID;
2163+
2164+
return PPC_ID_PAIREDSINGLE_PSQ_LX;
2165+
2166+
case 7:
2167+
if ((word32 & 0x1) != 0)
2168+
return PPC_ID_INVALID;
2169+
2170+
return PPC_ID_PAIREDSINGLE_PSQ_STX;
2171+
2172+
case 38:
2173+
if ((word32 & 0x1) != 0)
2174+
return PPC_ID_INVALID;
2175+
2176+
return PPC_ID_PAIREDSINGLE_PSQ_LUX;
2177+
2178+
case 39:
2179+
if ((word32 & 0x1) != 0)
2180+
return PPC_ID_INVALID;
2181+
2182+
return PPC_ID_PAIREDSINGLE_PSQ_STUX;
2183+
2184+
default:
2185+
;
2186+
}
2187+
2188+
subop = (word32 >> 1) & 0x3ff;
2189+
switch (subop)
2190+
{
2191+
case 0:
2192+
if ((word32 & 0x00600001) != 0)
2193+
return PPC_ID_INVALID;
2194+
2195+
return PPC_ID_PAIREDSINGLE_PS_CMPU0;
2196+
2197+
case 32:
2198+
if ((word32 & 0x00600001) != 0)
2199+
return PPC_ID_INVALID;
2200+
2201+
return PPC_ID_PAIREDSINGLE_PS_CMPO0;
2202+
2203+
case 40:
2204+
if (a != 0)
2205+
return PPC_ID_INVALID;
2206+
2207+
return PPC_ID_PAIREDSINGLE_PS_NEGx;
2208+
2209+
case 64:
2210+
if ((word32 & 0x00600001) != 0)
2211+
return PPC_ID_INVALID;
2212+
2213+
return PPC_ID_PAIREDSINGLE_PS_CMPU1;
2214+
2215+
case 72:
2216+
if (a != 0)
2217+
return PPC_ID_INVALID;
2218+
2219+
return PPC_ID_PAIREDSINGLE_PS_MRx;
2220+
2221+
case 96:
2222+
if ((word32 & 0x00600001) != 0)
2223+
return PPC_ID_INVALID;
2224+
2225+
return PPC_ID_PAIREDSINGLE_PS_CMPO1;
2226+
2227+
case 136:
2228+
if (a != 0)
2229+
return PPC_ID_INVALID;
2230+
2231+
return PPC_ID_PAIREDSINGLE_PS_NABSx;
2232+
2233+
case 264:
2234+
if (a != 0)
2235+
return PPC_ID_INVALID;
2236+
2237+
return PPC_ID_PAIREDSINGLE_PS_ABSx;
2238+
2239+
case 528:
2240+
return PPC_ID_PAIREDSINGLE_PS_MERGE00x;
2241+
2242+
case 560:
2243+
return PPC_ID_PAIREDSINGLE_PS_MERGE01x;
2244+
2245+
case 592:
2246+
return PPC_ID_PAIREDSINGLE_PS_MERGE10x;
2247+
2248+
case 624:
2249+
return PPC_ID_PAIREDSINGLE_PS_MERGE11x;
2250+
2251+
case 1014:
2252+
if ((d != 0) || ((word32 & 0x1) != 0))
2253+
return PPC_ID_INVALID;
2254+
2255+
return PPC_ID_PAIREDSINGLE_DCBZ_L;
2256+
2257+
default:
2258+
return PPC_ID_INVALID;
2259+
}
2260+
2261+
}
2262+
20662263
static InstructionId Decode0x13(uint32_t word32, uint32_t decodeFlags)
20672264
{
20682265
uint32_t a = GetA(word32);
@@ -5537,6 +5734,8 @@ static InstructionId Decode32(uint32_t word32, uint32_t decodeFlags)
55375734
return DecodeAltivec0x04(word32, decodeFlags);
55385735
else if ((decodeFlags & DECODE_FLAGS_SPE))
55395736
return DecodeSpe0x04(word32, decodeFlags);
5737+
else if ((decodeFlags & DECODE_FLAGS_PS))
5738+
return DecodePairedSingle0x04(word32, decodeFlags);
55405739
else
55415740
return PPC_ID_INVALID;
55425741
}
@@ -5757,9 +5956,17 @@ static InstructionId Decode32(uint32_t word32, uint32_t decodeFlags)
57575956
case 0x37:
57585957
return PPC_ID_STFDU;
57595958

5959+
case 0x38:
5960+
if ((decodeFlags & DECODE_FLAGS_PS) != 0)
5961+
return PPC_ID_PAIREDSINGLE_PSQ_L;
5962+
else
5963+
return PPC_ID_INVALID;
5964+
57605965
case 0x39:
57615966
if ((decodeFlags & DECODE_FLAGS_VSX) != 0)
57625967
return DecodeVsx0x39(word32, decodeFlags);
5968+
else if ((decodeFlags & DECODE_FLAGS_PS) != 0)
5969+
return PPC_ID_PAIREDSINGLE_PSQ_LU;
57635970
else
57645971
return PPC_ID_INVALID;
57655972

@@ -5781,12 +5988,16 @@ static InstructionId Decode32(uint32_t word32, uint32_t decodeFlags)
57815988
case 0x3c:
57825989
if ((decodeFlags & DECODE_FLAGS_VSX) != 0)
57835990
return DecodeVsx0x3C(word32, decodeFlags);
5991+
else if ((decodeFlags & DECODE_FLAGS_PS) != 0)
5992+
return PPC_ID_PAIREDSINGLE_PSQ_ST;
57845993
else
57855994
return PPC_ID_INVALID;
57865995

57875996
case 0x3d:
57885997
if ((decodeFlags & DECODE_FLAGS_VSX) != 0)
57895998
return DecodeVsx0x3D(word32, decodeFlags);
5999+
else if ((decodeFlags & DECODE_FLAGS_PS) != 0)
6000+
return PPC_ID_PAIREDSINGLE_PSQ_STU;
57906001
else
57916002
return PPC_ID_INVALID;
57926003

arch/powerpc/decode/decode.h

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1369,6 +1369,46 @@ extern "C" {
13691369
PPC_ID_PSQ_STUX,
13701370
PPC_ID_PSQ_STX,
13711371

1372+
// Paired-single
1373+
PPC_ID_PAIREDSINGLE_DCBZ_L,
1374+
PPC_ID_PAIREDSINGLE_PS_ABSx,
1375+
PPC_ID_PAIREDSINGLE_PS_ADDx,
1376+
PPC_ID_PAIREDSINGLE_PS_CMPO0,
1377+
PPC_ID_PAIREDSINGLE_PS_CMPO1,
1378+
PPC_ID_PAIREDSINGLE_PS_CMPU0,
1379+
PPC_ID_PAIREDSINGLE_PS_CMPU1,
1380+
PPC_ID_PAIREDSINGLE_PS_DIVx,
1381+
PPC_ID_PAIREDSINGLE_PS_MADDx,
1382+
PPC_ID_PAIREDSINGLE_PS_MADDS0x,
1383+
PPC_ID_PAIREDSINGLE_PS_MADDS1x,
1384+
PPC_ID_PAIREDSINGLE_PS_MERGE00x,
1385+
PPC_ID_PAIREDSINGLE_PS_MERGE01x,
1386+
PPC_ID_PAIREDSINGLE_PS_MERGE10x,
1387+
PPC_ID_PAIREDSINGLE_PS_MERGE11x,
1388+
PPC_ID_PAIREDSINGLE_PS_MRx,
1389+
PPC_ID_PAIREDSINGLE_PS_MSUBx,
1390+
PPC_ID_PAIREDSINGLE_PS_MULx,
1391+
PPC_ID_PAIREDSINGLE_PS_MULS0x,
1392+
PPC_ID_PAIREDSINGLE_PS_MULS1x,
1393+
PPC_ID_PAIREDSINGLE_PS_NABSx,
1394+
PPC_ID_PAIREDSINGLE_PS_NEGx,
1395+
PPC_ID_PAIREDSINGLE_PS_NMADDx,
1396+
PPC_ID_PAIREDSINGLE_PS_NMSUBx,
1397+
PPC_ID_PAIREDSINGLE_PS_RESx,
1398+
PPC_ID_PAIREDSINGLE_PS_RSQRTEx,
1399+
PPC_ID_PAIREDSINGLE_PS_SELx,
1400+
PPC_ID_PAIREDSINGLE_PS_SUBx,
1401+
PPC_ID_PAIREDSINGLE_PS_SUM0x,
1402+
PPC_ID_PAIREDSINGLE_PS_SUM1x,
1403+
PPC_ID_PAIREDSINGLE_PSQ_L,
1404+
PPC_ID_PAIREDSINGLE_PSQ_LU,
1405+
PPC_ID_PAIREDSINGLE_PSQ_LUX,
1406+
PPC_ID_PAIREDSINGLE_PSQ_LX,
1407+
PPC_ID_PAIREDSINGLE_PSQ_ST,
1408+
PPC_ID_PAIREDSINGLE_PSQ_STU,
1409+
PPC_ID_PAIREDSINGLE_PSQ_STUX,
1410+
PPC_ID_PAIREDSINGLE_PSQ_STX,
1411+
13721412
// SPE (Signal Processing Engine) instructions
13731413
PPC_ID_SPE_BRINC,
13741414
PPC_ID_SPE_EFDABS,

arch/powerpc/decode/mnemonic.c

Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -301,6 +301,33 @@ DEFINE_SUBMNEM_ROUND2ODD(SubMnemXSSQRTQPx, "xssqrtqp");
301301
DEFINE_SUBMNEM_ROUND2ODD(SubMnemXSSUBQPx, "xssubqp");
302302
DEFINE_SUBMNEM_INEXACT(SubMnemXSRQPIx, "xsrqpi");
303303

304+
// PAIREDSINGLE MNEMONICS
305+
DEFINE_SUBMNEM_RC(SubMnemPS_ABSx, "ps_abs");
306+
DEFINE_SUBMNEM_RC(SubMnemPS_ADDx, "ps_add");
307+
DEFINE_SUBMNEM_RC(SubMnemPS_DIVx, "ps_div");
308+
DEFINE_SUBMNEM_RC(SubMnemPS_MADDx, "ps_madd");
309+
DEFINE_SUBMNEM_RC(SubMnemPS_MADDS0x, "ps_madds0");
310+
DEFINE_SUBMNEM_RC(SubMnemPS_MADDS1x, "ps_madds1");
311+
DEFINE_SUBMNEM_RC(SubMnemPS_MERGE00x, "ps_merge00");
312+
DEFINE_SUBMNEM_RC(SubMnemPS_MERGE01x, "ps_merge01");
313+
DEFINE_SUBMNEM_RC(SubMnemPS_MERGE10x, "ps_merge10");
314+
DEFINE_SUBMNEM_RC(SubMnemPS_MERGE11x, "ps_merge11");
315+
DEFINE_SUBMNEM_RC(SubMnemPS_MRx, "ps_mr");
316+
DEFINE_SUBMNEM_RC(SubMnemPS_MSUBx, "ps_msub");
317+
DEFINE_SUBMNEM_RC(SubMnemPS_MULx, "ps_mul");
318+
DEFINE_SUBMNEM_RC(SubMnemPS_MULS0x, "ps_muls0");
319+
DEFINE_SUBMNEM_RC(SubMnemPS_MULS1x, "ps_muls1");
320+
DEFINE_SUBMNEM_RC(SubMnemPS_NABSx, "ps_nabs");
321+
DEFINE_SUBMNEM_RC(SubMnemPS_NEGx, "ps_neg");
322+
DEFINE_SUBMNEM_RC(SubMnemPS_NMADDx, "ps_nmadd");
323+
DEFINE_SUBMNEM_RC(SubMnemPS_NMSUBx, "ps_nmsub");
324+
DEFINE_SUBMNEM_RC(SubMnemPS_RESx, "ps_res");
325+
DEFINE_SUBMNEM_RC(SubMnemPS_RSQRTEx, "ps_rsqrte");
326+
DEFINE_SUBMNEM_RC(SubMnemPS_SELx, "ps_sel");
327+
DEFINE_SUBMNEM_RC(SubMnemPS_SUBx, "ps_sub");
328+
DEFINE_SUBMNEM_RC(SubMnemPS_SUM0x, "ps_sum0");
329+
DEFINE_SUBMNEM_RC(SubMnemPS_SUM1x, "ps_sum1");
330+
304331
static const char* RcMnemonic(const Instruction* instruction, const char* names[2])
305332
{
306333
return names[instruction->flags.rc];
@@ -1598,6 +1625,45 @@ const char* GetMnemonic(const Instruction* instruction)
15981625
case PPC_ID_PSQ_STUX: return "psq_stux";
15991626
case PPC_ID_PSQ_STX: return "psq_stx";
16001627

1628+
case PPC_ID_PAIREDSINGLE_DCBZ_L: return "dcbz_l";
1629+
case PPC_ID_PAIREDSINGLE_PS_ABSx: return RcMnemonic(instruction, SubMnemPS_ABSx);
1630+
case PPC_ID_PAIREDSINGLE_PS_ADDx: return RcMnemonic(instruction, SubMnemPS_ADDx);
1631+
case PPC_ID_PAIREDSINGLE_PS_CMPO0: return "ps_cmpo0";
1632+
case PPC_ID_PAIREDSINGLE_PS_CMPO1: return "ps_cmpo1";
1633+
case PPC_ID_PAIREDSINGLE_PS_CMPU0: return "ps_cmpu0";
1634+
case PPC_ID_PAIREDSINGLE_PS_CMPU1: return "ps_cmpu1";
1635+
case PPC_ID_PAIREDSINGLE_PS_DIVx: return RcMnemonic(instruction, SubMnemPS_DIVx);
1636+
case PPC_ID_PAIREDSINGLE_PS_MADDx: return RcMnemonic(instruction, SubMnemPS_MADDx);
1637+
case PPC_ID_PAIREDSINGLE_PS_MADDS0x: return RcMnemonic(instruction, SubMnemPS_MADDS0x);
1638+
case PPC_ID_PAIREDSINGLE_PS_MADDS1x: return RcMnemonic(instruction, SubMnemPS_MADDS1x);
1639+
case PPC_ID_PAIREDSINGLE_PS_MERGE00x: return RcMnemonic(instruction, SubMnemPS_MERGE00x);
1640+
case PPC_ID_PAIREDSINGLE_PS_MERGE01x: return RcMnemonic(instruction, SubMnemPS_MERGE01x);
1641+
case PPC_ID_PAIREDSINGLE_PS_MERGE10x: return RcMnemonic(instruction, SubMnemPS_MERGE10x);
1642+
case PPC_ID_PAIREDSINGLE_PS_MERGE11x: return RcMnemonic(instruction, SubMnemPS_MERGE11x);
1643+
case PPC_ID_PAIREDSINGLE_PS_MRx: return RcMnemonic(instruction, SubMnemPS_MRx);
1644+
case PPC_ID_PAIREDSINGLE_PS_MSUBx: return RcMnemonic(instruction, SubMnemPS_MSUBx);
1645+
case PPC_ID_PAIREDSINGLE_PS_MULx: return RcMnemonic(instruction, SubMnemPS_MULx);
1646+
case PPC_ID_PAIREDSINGLE_PS_MULS0x: return RcMnemonic(instruction, SubMnemPS_MULS0x);
1647+
case PPC_ID_PAIREDSINGLE_PS_MULS1x: return RcMnemonic(instruction, SubMnemPS_MULS1x);
1648+
case PPC_ID_PAIREDSINGLE_PS_NABSx: return RcMnemonic(instruction, SubMnemPS_NABSx);
1649+
case PPC_ID_PAIREDSINGLE_PS_NEGx: return RcMnemonic(instruction, SubMnemPS_NEGx);
1650+
case PPC_ID_PAIREDSINGLE_PS_NMADDx: return RcMnemonic(instruction, SubMnemPS_NMADDx);
1651+
case PPC_ID_PAIREDSINGLE_PS_NMSUBx: return RcMnemonic(instruction, SubMnemPS_NMSUBx);
1652+
case PPC_ID_PAIREDSINGLE_PS_RESx: return RcMnemonic(instruction, SubMnemPS_RESx);
1653+
case PPC_ID_PAIREDSINGLE_PS_RSQRTEx: return RcMnemonic(instruction, SubMnemPS_RSQRTEx);
1654+
case PPC_ID_PAIREDSINGLE_PS_SELx: return RcMnemonic(instruction, SubMnemPS_SELx);
1655+
case PPC_ID_PAIREDSINGLE_PS_SUBx: return RcMnemonic(instruction, SubMnemPS_SUBx);
1656+
case PPC_ID_PAIREDSINGLE_PS_SUM0x: return RcMnemonic(instruction, SubMnemPS_SUM0x);
1657+
case PPC_ID_PAIREDSINGLE_PS_SUM1x: return RcMnemonic(instruction, SubMnemPS_SUM1x);
1658+
case PPC_ID_PAIREDSINGLE_PSQ_L: return "psq_l";
1659+
case PPC_ID_PAIREDSINGLE_PSQ_LU: return "psq_lu";
1660+
case PPC_ID_PAIREDSINGLE_PSQ_LUX: return "psq_lux";
1661+
case PPC_ID_PAIREDSINGLE_PSQ_LX: return "psq_lx";
1662+
case PPC_ID_PAIREDSINGLE_PSQ_ST: return "psq_st";
1663+
case PPC_ID_PAIREDSINGLE_PSQ_STU: return "psq_stu";
1664+
case PPC_ID_PAIREDSINGLE_PSQ_STUX: return "psq_stux";
1665+
case PPC_ID_PAIREDSINGLE_PSQ_STX: return "psq_stx";
1666+
16011667
case PPC_ID_SPE_BRINC: return "brinc";
16021668
case PPC_ID_SPE_EFDABS: return "efdabs";
16031669
case PPC_ID_SPE_EFDADD: return "efdadd";

0 commit comments

Comments
 (0)