470 |
470 |
471 // Vector-Scalar (VSX) instruction support. |
471 // Vector-Scalar (VSX) instruction support. |
472 LXVD2X_OPCODE = (31u << OPCODE_SHIFT | 844u << 1), |
472 LXVD2X_OPCODE = (31u << OPCODE_SHIFT | 844u << 1), |
473 STXVD2X_OPCODE = (31u << OPCODE_SHIFT | 972u << 1), |
473 STXVD2X_OPCODE = (31u << OPCODE_SHIFT | 972u << 1), |
474 MTVSRD_OPCODE = (31u << OPCODE_SHIFT | 179u << 1), |
474 MTVSRD_OPCODE = (31u << OPCODE_SHIFT | 179u << 1), |
|
475 MTVSRWZ_OPCODE = (31u << OPCODE_SHIFT | 243u << 1), |
475 MFVSRD_OPCODE = (31u << OPCODE_SHIFT | 51u << 1), |
476 MFVSRD_OPCODE = (31u << OPCODE_SHIFT | 51u << 1), |
|
477 MFVSRWZ_OPCODE = (31u << OPCODE_SHIFT | 115u << 1), |
|
478 XXPERMDI_OPCODE= (60u << OPCODE_SHIFT | 10u << 3), |
|
479 XXMRGHW_OPCODE = (60u << OPCODE_SHIFT | 18u << 3), |
|
480 XXMRGLW_OPCODE = (60u << OPCODE_SHIFT | 50u << 3), |
476 |
481 |
477 // Vector Permute and Formatting |
482 // Vector Permute and Formatting |
478 VPKPX_OPCODE = (4u << OPCODE_SHIFT | 782u ), |
483 VPKPX_OPCODE = (4u << OPCODE_SHIFT | 782u ), |
479 VPKSHSS_OPCODE = (4u << OPCODE_SHIFT | 398u ), |
484 VPKSHSS_OPCODE = (4u << OPCODE_SHIFT | 398u ), |
480 VPKSWSS_OPCODE = (4u << OPCODE_SHIFT | 462u ), |
485 VPKSWSS_OPCODE = (4u << OPCODE_SHIFT | 462u ), |
520 VADDSBS_OPCODE = (4u << OPCODE_SHIFT | 768u ), |
525 VADDSBS_OPCODE = (4u << OPCODE_SHIFT | 768u ), |
521 VADDSWS_OPCODE = (4u << OPCODE_SHIFT | 896u ), |
526 VADDSWS_OPCODE = (4u << OPCODE_SHIFT | 896u ), |
522 VADDUBM_OPCODE = (4u << OPCODE_SHIFT | 0u ), |
527 VADDUBM_OPCODE = (4u << OPCODE_SHIFT | 0u ), |
523 VADDUWM_OPCODE = (4u << OPCODE_SHIFT | 128u ), |
528 VADDUWM_OPCODE = (4u << OPCODE_SHIFT | 128u ), |
524 VADDUHM_OPCODE = (4u << OPCODE_SHIFT | 64u ), |
529 VADDUHM_OPCODE = (4u << OPCODE_SHIFT | 64u ), |
|
530 VADDUDM_OPCODE = (4u << OPCODE_SHIFT | 192u ), |
525 VADDUBS_OPCODE = (4u << OPCODE_SHIFT | 512u ), |
531 VADDUBS_OPCODE = (4u << OPCODE_SHIFT | 512u ), |
526 VADDUWS_OPCODE = (4u << OPCODE_SHIFT | 640u ), |
532 VADDUWS_OPCODE = (4u << OPCODE_SHIFT | 640u ), |
527 VADDUHS_OPCODE = (4u << OPCODE_SHIFT | 576u ), |
533 VADDUHS_OPCODE = (4u << OPCODE_SHIFT | 576u ), |
528 VSUBCUW_OPCODE = (4u << OPCODE_SHIFT | 1408u ), |
534 VSUBCUW_OPCODE = (4u << OPCODE_SHIFT | 1408u ), |
529 VSUBSHS_OPCODE = (4u << OPCODE_SHIFT | 1856u ), |
535 VSUBSHS_OPCODE = (4u << OPCODE_SHIFT | 1856u ), |
1054 static int vrb( VectorRegister r) { return vrb(r->encoding());} |
1060 static int vrb( VectorRegister r) { return vrb(r->encoding());} |
1055 static int vrc( VectorRegister r) { return vrc(r->encoding());} |
1061 static int vrc( VectorRegister r) { return vrc(r->encoding());} |
1056 static int vrs( VectorRegister r) { return vrs(r->encoding());} |
1062 static int vrs( VectorRegister r) { return vrs(r->encoding());} |
1057 static int vrt( VectorRegister r) { return vrt(r->encoding());} |
1063 static int vrt( VectorRegister r) { return vrt(r->encoding());} |
1058 |
1064 |
|
1065 // Only used on SHA sigma instructions (VX-form) |
|
1066 static int vst( int x) { return opp_u_field(x, 16, 16); } |
|
1067 static int vsix( int x) { return opp_u_field(x, 20, 17); } |
|
1068 |
1059 // Support Vector-Scalar (VSX) instructions. |
1069 // Support Vector-Scalar (VSX) instructions. |
1060 static int vsra( int x) { return opp_u_field(x, 15, 11); } |
1070 static int vsra( int x) { return opp_u_field(x & 0x1F, 15, 11) | opp_u_field((x & 0x20) >> 5, 29, 29); } |
1061 static int vsrb( int x) { return opp_u_field(x, 20, 16); } |
1071 static int vsrb( int x) { return opp_u_field(x & 0x1F, 20, 16) | opp_u_field((x & 0x20) >> 5, 30, 30); } |
1062 static int vsrc( int x) { return opp_u_field(x, 25, 21); } |
1072 static int vsrs( int x) { return opp_u_field(x & 0x1F, 10, 6) | opp_u_field((x & 0x20) >> 5, 31, 31); } |
1063 static int vsrs( int x) { return opp_u_field(x, 10, 6); } |
1073 static int vsrt( int x) { return vsrs(x); } |
1064 static int vsrt( int x) { return opp_u_field(x, 10, 6); } |
1074 static int vsdm( int x) { return opp_u_field(x, 23, 22); } |
1065 |
1075 |
1066 static int vsra( VectorSRegister r) { return vsra(r->encoding());} |
1076 static int vsra( VectorSRegister r) { return vsra(r->encoding());} |
1067 static int vsrb( VectorSRegister r) { return vsrb(r->encoding());} |
1077 static int vsrb( VectorSRegister r) { return vsrb(r->encoding());} |
1068 static int vsrc( VectorSRegister r) { return vsrc(r->encoding());} |
|
1069 static int vsrs( VectorSRegister r) { return vsrs(r->encoding());} |
1078 static int vsrs( VectorSRegister r) { return vsrs(r->encoding());} |
1070 static int vsrt( VectorSRegister r) { return vsrt(r->encoding());} |
1079 static int vsrt( VectorSRegister r) { return vsrt(r->encoding());} |
1071 |
1080 |
1072 static int vsplt_uim( int x) { return opp_u_field(x, 15, 12); } // for vsplt* instructions |
1081 static int vsplt_uim( int x) { return opp_u_field(x, 15, 12); } // for vsplt* instructions |
1073 static int vsplti_sim(int x) { return opp_u_field(x, 15, 11); } // for vsplti* instructions |
1082 static int vsplti_sim(int x) { return opp_u_field(x, 15, 11); } // for vsplti* instructions |
1867 inline void vaddsbs( VectorRegister d, VectorRegister a, VectorRegister b); |
1876 inline void vaddsbs( VectorRegister d, VectorRegister a, VectorRegister b); |
1868 inline void vaddsws( VectorRegister d, VectorRegister a, VectorRegister b); |
1877 inline void vaddsws( VectorRegister d, VectorRegister a, VectorRegister b); |
1869 inline void vaddubm( VectorRegister d, VectorRegister a, VectorRegister b); |
1878 inline void vaddubm( VectorRegister d, VectorRegister a, VectorRegister b); |
1870 inline void vadduwm( VectorRegister d, VectorRegister a, VectorRegister b); |
1879 inline void vadduwm( VectorRegister d, VectorRegister a, VectorRegister b); |
1871 inline void vadduhm( VectorRegister d, VectorRegister a, VectorRegister b); |
1880 inline void vadduhm( VectorRegister d, VectorRegister a, VectorRegister b); |
|
1881 inline void vaddudm( VectorRegister d, VectorRegister a, VectorRegister b); |
1872 inline void vaddubs( VectorRegister d, VectorRegister a, VectorRegister b); |
1882 inline void vaddubs( VectorRegister d, VectorRegister a, VectorRegister b); |
1873 inline void vadduws( VectorRegister d, VectorRegister a, VectorRegister b); |
1883 inline void vadduws( VectorRegister d, VectorRegister a, VectorRegister b); |
1874 inline void vadduhs( VectorRegister d, VectorRegister a, VectorRegister b); |
1884 inline void vadduhs( VectorRegister d, VectorRegister a, VectorRegister b); |
1875 inline void vsubcuw( VectorRegister d, VectorRegister a, VectorRegister b); |
1885 inline void vsubcuw( VectorRegister d, VectorRegister a, VectorRegister b); |
1876 inline void vsubshs( VectorRegister d, VectorRegister a, VectorRegister b); |
1886 inline void vsubshs( VectorRegister d, VectorRegister a, VectorRegister b); |
1942 inline void vcmpgtuw_(VectorRegister d, VectorRegister a, VectorRegister b); |
1952 inline void vcmpgtuw_(VectorRegister d, VectorRegister a, VectorRegister b); |
1943 inline void vand( VectorRegister d, VectorRegister a, VectorRegister b); |
1953 inline void vand( VectorRegister d, VectorRegister a, VectorRegister b); |
1944 inline void vandc( VectorRegister d, VectorRegister a, VectorRegister b); |
1954 inline void vandc( VectorRegister d, VectorRegister a, VectorRegister b); |
1945 inline void vnor( VectorRegister d, VectorRegister a, VectorRegister b); |
1955 inline void vnor( VectorRegister d, VectorRegister a, VectorRegister b); |
1946 inline void vor( VectorRegister d, VectorRegister a, VectorRegister b); |
1956 inline void vor( VectorRegister d, VectorRegister a, VectorRegister b); |
|
1957 inline void vmr( VectorRegister d, VectorRegister a); |
1947 inline void vxor( VectorRegister d, VectorRegister a, VectorRegister b); |
1958 inline void vxor( VectorRegister d, VectorRegister a, VectorRegister b); |
1948 inline void vrld( VectorRegister d, VectorRegister a, VectorRegister b); |
1959 inline void vrld( VectorRegister d, VectorRegister a, VectorRegister b); |
1949 inline void vrlb( VectorRegister d, VectorRegister a, VectorRegister b); |
1960 inline void vrlb( VectorRegister d, VectorRegister a, VectorRegister b); |
1950 inline void vrlw( VectorRegister d, VectorRegister a, VectorRegister b); |
1961 inline void vrlw( VectorRegister d, VectorRegister a, VectorRegister b); |
1951 inline void vrlh( VectorRegister d, VectorRegister a, VectorRegister b); |
1962 inline void vrlh( VectorRegister d, VectorRegister a, VectorRegister b); |
1965 // Vector-Scalar (VSX) instructions. |
1976 // Vector-Scalar (VSX) instructions. |
1966 inline void lxvd2x( VectorSRegister d, Register a); |
1977 inline void lxvd2x( VectorSRegister d, Register a); |
1967 inline void lxvd2x( VectorSRegister d, Register a, Register b); |
1978 inline void lxvd2x( VectorSRegister d, Register a, Register b); |
1968 inline void stxvd2x( VectorSRegister d, Register a); |
1979 inline void stxvd2x( VectorSRegister d, Register a); |
1969 inline void stxvd2x( VectorSRegister d, Register a, Register b); |
1980 inline void stxvd2x( VectorSRegister d, Register a, Register b); |
|
1981 inline void mtvrwz( VectorRegister d, Register a); |
|
1982 inline void mfvrwz( Register a, VectorRegister d); |
1970 inline void mtvrd( VectorRegister d, Register a); |
1983 inline void mtvrd( VectorRegister d, Register a); |
1971 inline void mfvrd( Register a, VectorRegister d); |
1984 inline void mfvrd( Register a, VectorRegister d); |
|
1985 inline void xxpermdi( VectorSRegister d, VectorSRegister a, VectorSRegister b, int dm); |
|
1986 inline void xxmrghw( VectorSRegister d, VectorSRegister a, VectorSRegister b); |
|
1987 inline void xxmrglw( VectorSRegister d, VectorSRegister a, VectorSRegister b); |
|
1988 |
|
1989 // VSX Extended Mnemonics |
|
1990 inline void xxspltd( VectorSRegister d, VectorSRegister a, int x); |
|
1991 inline void xxmrghd( VectorSRegister d, VectorSRegister a, VectorSRegister b); |
|
1992 inline void xxmrgld( VectorSRegister d, VectorSRegister a, VectorSRegister b); |
|
1993 inline void xxswapd( VectorSRegister d, VectorSRegister a); |
1972 |
1994 |
1973 // AES (introduced with Power 8) |
1995 // AES (introduced with Power 8) |
1974 inline void vcipher( VectorRegister d, VectorRegister a, VectorRegister b); |
1996 inline void vcipher( VectorRegister d, VectorRegister a, VectorRegister b); |
1975 inline void vcipherlast( VectorRegister d, VectorRegister a, VectorRegister b); |
1997 inline void vcipherlast( VectorRegister d, VectorRegister a, VectorRegister b); |
1976 inline void vncipher( VectorRegister d, VectorRegister a, VectorRegister b); |
1998 inline void vncipher( VectorRegister d, VectorRegister a, VectorRegister b); |