@@ -338,6 +338,7 @@ class Assembler : public AbstractAssembler {
338
338
MTCRF_OPCODE = (31u << OPCODE_SHIFT | 144u << 1 ),
339
339
MFCR_OPCODE = (31u << OPCODE_SHIFT | 19u << 1 ),
340
340
MCRF_OPCODE = (19u << OPCODE_SHIFT | 0u << 1 ),
341
+ MCRXRX_OPCODE = (31u << OPCODE_SHIFT | 576u << 1 ),
341
342
SETB_OPCODE = (31u << OPCODE_SHIFT | 128u << 1 ),
342
343
343
344
// condition register logic instructions
@@ -519,6 +520,8 @@ class Assembler : public AbstractAssembler {
519
520
LVSR_OPCODE = (31u << OPCODE_SHIFT | 38u << 1 ),
520
521
521
522
// Vector-Scalar (VSX) instruction support.
523
+ LXV_OPCODE = (61u << OPCODE_SHIFT | 1u ),
524
+ STXV_OPCODE = (61u << OPCODE_SHIFT | 5u ),
522
525
LXVD2X_OPCODE = (31u << OPCODE_SHIFT | 844u << 1 ),
523
526
STXVD2X_OPCODE = (31u << OPCODE_SHIFT | 972u << 1 ),
524
527
MTVSRD_OPCODE = (31u << OPCODE_SHIFT | 179u << 1 ),
@@ -530,12 +533,16 @@ class Assembler : public AbstractAssembler {
530
533
XXMRGHW_OPCODE = (60u << OPCODE_SHIFT | 18u << 3 ),
531
534
XXMRGLW_OPCODE = (60u << OPCODE_SHIFT | 50u << 3 ),
532
535
XXSPLTW_OPCODE = (60u << OPCODE_SHIFT | 164u << 2 ),
536
+ XXLAND_OPCODE = (60u << OPCODE_SHIFT | 130u << 3 ),
533
537
XXLOR_OPCODE = (60u << OPCODE_SHIFT | 146u << 3 ),
534
538
XXLXOR_OPCODE = (60u << OPCODE_SHIFT | 154u << 3 ),
535
539
XXLEQV_OPCODE = (60u << OPCODE_SHIFT | 186u << 3 ),
536
540
XVDIVSP_OPCODE = (60u << OPCODE_SHIFT | 88u << 3 ),
537
541
XXBRD_OPCODE = (60u << OPCODE_SHIFT | 475u << 2 | 23u << 16 ), // XX2-FORM
538
542
XXBRW_OPCODE = (60u << OPCODE_SHIFT | 475u << 2 | 15u << 16 ), // XX2-FORM
543
+ XXPERM_OPCODE = (60u << OPCODE_SHIFT | 26u << 3 ),
544
+ XXSEL_OPCODE = (60u << OPCODE_SHIFT | 3u << 4 ),
545
+ XXSPLTIB_OPCODE= (60u << OPCODE_SHIFT | 360u << 1 ),
539
546
XVDIVDP_OPCODE = (60u << OPCODE_SHIFT | 120u << 3 ),
540
547
XVABSSP_OPCODE = (60u << OPCODE_SHIFT | 409u << 2 ),
541
548
XVABSDP_OPCODE = (60u << OPCODE_SHIFT | 473u << 2 ),
@@ -592,6 +599,7 @@ class Assembler : public AbstractAssembler {
592
599
VSPLTISH_OPCODE= (4u << OPCODE_SHIFT | 844u ),
593
600
VSPLTISW_OPCODE= (4u << OPCODE_SHIFT | 908u ),
594
601
602
+ VPEXTD_OPCODE = (4u << OPCODE_SHIFT | 1421u ),
595
603
VPERM_OPCODE = (4u << OPCODE_SHIFT | 43u ),
596
604
VSEL_OPCODE = (4u << OPCODE_SHIFT | 42u ),
597
605
@@ -1099,6 +1107,7 @@ class Assembler : public AbstractAssembler {
1099
1107
static int frs ( int x) { return opp_u_field (x, 10 , 6 ); }
1100
1108
static int frt ( int x) { return opp_u_field (x, 10 , 6 ); }
1101
1109
static int fxm ( int x) { return opp_u_field (x, 19 , 12 ); }
1110
+ static int imm8 ( int x) { return opp_u_field (uimm (x, 8 ), 20 , 13 ); }
1102
1111
static int l10 ( int x) { assert (x == 0 || x == 1 , " must be 0 or 1" ); return opp_u_field (x, 10 , 10 ); }
1103
1112
static int l14 ( int x) { return opp_u_field (x, 15 , 14 ); }
1104
1113
static int l15 ( int x) { return opp_u_field (x, 15 , 15 ); }
@@ -1165,14 +1174,20 @@ class Assembler : public AbstractAssembler {
1165
1174
// Support Vector-Scalar (VSX) instructions.
1166
1175
static int vsra ( int x) { return opp_u_field (x & 0x1F , 15 , 11 ) | opp_u_field ((x & 0x20 ) >> 5 , 29 , 29 ); }
1167
1176
static int vsrb ( int x) { return opp_u_field (x & 0x1F , 20 , 16 ) | opp_u_field ((x & 0x20 ) >> 5 , 30 , 30 ); }
1177
+ static int vsrc ( int x) { return opp_u_field (x & 0x1F , 25 , 21 ) | opp_u_field ((x & 0x20 ) >> 5 , 28 , 28 ); }
1168
1178
static int vsrs ( int x) { return opp_u_field (x & 0x1F , 10 , 6 ) | opp_u_field ((x & 0x20 ) >> 5 , 31 , 31 ); }
1169
1179
static int vsrt ( int x) { return vsrs (x); }
1170
1180
static int vsdm ( int x) { return opp_u_field (x, 23 , 22 ); }
1181
+ static int vsrs_dq ( int x) { return opp_u_field (x & 0x1F , 10 , 6 ) | opp_u_field ((x & 0x20 ) >> 5 , 28 , 28 ); }
1182
+ static int vsrt_dq ( int x) { return vsrs_dq (x); }
1171
1183
1172
1184
static int vsra ( VectorSRegister r) { return vsra (r->encoding ());}
1173
1185
static int vsrb ( VectorSRegister r) { return vsrb (r->encoding ());}
1186
+ static int vsrc ( VectorSRegister r) { return vsrc (r->encoding ());}
1174
1187
static int vsrs ( VectorSRegister r) { return vsrs (r->encoding ());}
1175
1188
static int vsrt ( VectorSRegister r) { return vsrt (r->encoding ());}
1189
+ static int vsrs_dq (VectorSRegister r) { return vsrs_dq (r->encoding ());}
1190
+ static int vsrt_dq (VectorSRegister r) { return vsrt_dq (r->encoding ());}
1176
1191
1177
1192
static int vsplt_uim ( int x) { return opp_u_field (x, 15 , 12 ); } // for vsplt* instructions
1178
1193
static int vsplti_sim (int x) { return opp_u_field (x, 15 , 11 ); } // for vsplti* instructions
@@ -1675,6 +1690,7 @@ class Assembler : public AbstractAssembler {
1675
1690
inline void mcrf ( ConditionRegister crd, ConditionRegister cra);
1676
1691
inline void mtcr ( Register s);
1677
1692
// >= Power9
1693
+ inline void mcrxrx (ConditionRegister cra);
1678
1694
inline void setb ( Register d, ConditionRegister cra);
1679
1695
1680
1696
// Special purpose registers
@@ -2119,6 +2135,7 @@ class Assembler : public AbstractAssembler {
2119
2135
inline void vspltish ( VectorRegister d, int si5);
2120
2136
inline void vspltisw ( VectorRegister d, int si5);
2121
2137
inline void vperm ( VectorRegister d, VectorRegister a, VectorRegister b, VectorRegister c);
2138
+ inline void vpextd ( VectorRegister d, VectorRegister a, VectorRegister b);
2122
2139
inline void vsel ( VectorRegister d, VectorRegister a, VectorRegister b, VectorRegister c);
2123
2140
inline void vsl ( VectorRegister d, VectorRegister a, VectorRegister b);
2124
2141
inline void vsldoi ( VectorRegister d, VectorRegister a, VectorRegister b, int ui4);
@@ -2235,6 +2252,8 @@ class Assembler : public AbstractAssembler {
2235
2252
inline void mfvscr ( VectorRegister d);
2236
2253
2237
2254
// Vector-Scalar (VSX) instructions.
2255
+ inline void lxv ( VectorSRegister d, int si16, Register a);
2256
+ inline void stxv ( VectorSRegister d, int si16, Register a);
2238
2257
inline void lxvd2x ( VectorSRegister d, Register a);
2239
2258
inline void lxvd2x ( VectorSRegister d, Register a, Register b);
2240
2259
inline void stxvd2x ( VectorSRegister d, Register a);
@@ -2243,6 +2262,7 @@ class Assembler : public AbstractAssembler {
2243
2262
inline void mfvrwz ( Register a, VectorRegister d);
2244
2263
inline void mtvrd ( VectorRegister d, Register a);
2245
2264
inline void mfvrd ( Register a, VectorRegister d);
2265
+ inline void xxperm ( VectorSRegister d, VectorSRegister a, VectorSRegister b);
2246
2266
inline void xxpermdi ( VectorSRegister d, VectorSRegister a, VectorSRegister b, int dm);
2247
2267
inline void xxmrghw ( VectorSRegister d, VectorSRegister a, VectorSRegister b);
2248
2268
inline void xxmrglw ( VectorSRegister d, VectorSRegister a, VectorSRegister b);
@@ -2256,6 +2276,9 @@ class Assembler : public AbstractAssembler {
2256
2276
inline void xxleqv ( VectorSRegister d, VectorSRegister a, VectorSRegister b);
2257
2277
inline void xxbrd ( VectorSRegister d, VectorSRegister b);
2258
2278
inline void xxbrw ( VectorSRegister d, VectorSRegister b);
2279
+ inline void xxland ( VectorSRegister d, VectorSRegister a, VectorSRegister b);
2280
+ inline void xxsel ( VectorSRegister d, VectorSRegister a, VectorSRegister b, VectorSRegister c);
2281
+ inline void xxspltib ( VectorSRegister d, int ui8);
2259
2282
inline void xvdivsp ( VectorSRegister d, VectorSRegister a, VectorSRegister b);
2260
2283
inline void xvdivdp ( VectorSRegister d, VectorSRegister a, VectorSRegister b);
2261
2284
inline void xvabssp ( VectorSRegister d, VectorSRegister b);
0 commit comments