| // Copyright 2014 the V8 project authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #ifndef V8_CODEGEN_PPC_CONSTANTS_PPC_H_ |
| #define V8_CODEGEN_PPC_CONSTANTS_PPC_H_ |
| |
| #include <stdint.h> |
| |
| #include "src/base/logging.h" |
| #include "src/base/macros.h" |
| #include "src/common/globals.h" |
| |
| // UNIMPLEMENTED_ macro for PPC. |
| #ifdef DEBUG |
| #define UNIMPLEMENTED_PPC() \ |
| v8::internal::PrintF("%s, \tline %d: \tfunction %s not implemented. \n", \ |
| __FILE__, __LINE__, __func__) |
| #else |
| #define UNIMPLEMENTED_PPC() |
| #endif |
| |
| #if (V8_HOST_ARCH_PPC || V8_HOST_ARCH_PPC64) && \ |
| (V8_OS_AIX || (V8_TARGET_ARCH_PPC64 && V8_TARGET_BIG_ENDIAN && \ |
| (!defined(_CALL_ELF) || _CALL_ELF == 1))) |
| #define ABI_USES_FUNCTION_DESCRIPTORS 1 |
| #else |
| #define ABI_USES_FUNCTION_DESCRIPTORS 0 |
| #endif |
| |
| #if !(V8_HOST_ARCH_PPC || V8_HOST_ARCH_PPC64) || V8_OS_AIX || \ |
| V8_TARGET_ARCH_PPC64 |
| #define ABI_PASSES_HANDLES_IN_REGS 1 |
| #else |
| #define ABI_PASSES_HANDLES_IN_REGS 0 |
| #endif |
| |
| #if !(V8_HOST_ARCH_PPC || V8_HOST_ARCH_PPC64) || !V8_TARGET_ARCH_PPC64 || \ |
| V8_TARGET_LITTLE_ENDIAN || (defined(_CALL_ELF) && _CALL_ELF == 2) |
| #define ABI_RETURNS_OBJECT_PAIRS_IN_REGS 1 |
| #else |
| #define ABI_RETURNS_OBJECT_PAIRS_IN_REGS 0 |
| #endif |
| |
| #if !(V8_HOST_ARCH_PPC || V8_HOST_ARCH_PPC64) || \ |
| (V8_TARGET_ARCH_PPC64 && \ |
| (V8_TARGET_LITTLE_ENDIAN || (defined(_CALL_ELF) && _CALL_ELF == 2))) |
| #define ABI_CALL_VIA_IP 1 |
| #else |
| #define ABI_CALL_VIA_IP 0 |
| #endif |
| |
| #if !(V8_HOST_ARCH_PPC || V8_HOST_ARCH_PPC64) || V8_OS_AIX || \ |
| V8_TARGET_ARCH_PPC64 |
| #define ABI_TOC_REGISTER 2 |
| #else |
| #define ABI_TOC_REGISTER 13 |
| #endif |
| namespace v8 { |
| namespace internal { |
| |
| // TODO(sigurds): Change this value once we use relative jumps. |
| constexpr size_t kMaxPCRelativeCodeRangeInMB = 0; |
| |
| // Used to encode a boolean value when emitting 32 bit |
| // opcodes which will indicate the presence of function descriptors |
| constexpr int kHasFunctionDescriptorBitShift = 9; |
| constexpr int kHasFunctionDescriptorBitMask = 1 |
| << kHasFunctionDescriptorBitShift; |
| |
| // Number of registers |
| const int kNumRegisters = 32; |
| |
| // FP support. |
| const int kNumDoubleRegisters = 32; |
| |
| const int kNoRegister = -1; |
| |
| // Used in embedded constant pool builder - max reach in bits for |
| // various load instructions (one less due to unsigned) |
| const int kLoadPtrMaxReachBits = 15; |
| const int kLoadDoubleMaxReachBits = 15; |
| |
| // Actual value of root register is offset from the root array's start |
| // to take advantage of negative displacement values. |
| // TODO(sigurds): Choose best value. |
| constexpr int kRootRegisterBias = 128; |
| |
| // sign-extend the least significant 16-bits of value <imm> |
| #define SIGN_EXT_IMM16(imm) ((static_cast<int>(imm) << 16) >> 16) |
| |
| // sign-extend the least significant 22-bits of value <imm> |
| #define SIGN_EXT_IMM22(imm) ((static_cast<int>(imm) << 10) >> 10) |
| |
| // sign-extend the least significant 26-bits of value <imm> |
| #define SIGN_EXT_IMM26(imm) ((static_cast<int>(imm) << 6) >> 6) |
| |
| // ----------------------------------------------------------------------------- |
| // Conditions. |
| |
| // Defines constants and accessor classes to assemble, disassemble and |
| // simulate PPC instructions. |
| // |
| // Section references in the code refer to the "PowerPC Microprocessor |
| // Family: The Programmer.s Reference Guide" from 10/95 |
| // https://www-01.ibm.com/chips/techlib/techlib.nsf/techdocs/852569B20050FF778525699600741775/$file/prg.pdf |
| // |
| |
| // Constants for specific fields are defined in their respective named enums. |
| // General constants are in an anonymous enum in class Instr. |
| enum Condition { |
| kNoCondition = -1, |
| eq = 0, // Equal. |
| ne = 1, // Not equal. |
| ge = 2, // Greater or equal. |
| lt = 3, // Less than. |
| gt = 4, // Greater than. |
| le = 5, // Less then or equal |
| unordered = 6, // Floating-point unordered |
| ordered = 7, |
| overflow = 8, // Summary overflow |
| nooverflow = 9, |
| al = 10 // Always. |
| }; |
| |
| inline Condition NegateCondition(Condition cond) { |
| DCHECK(cond != al); |
| return static_cast<Condition>(cond ^ ne); |
| } |
| |
| // ----------------------------------------------------------------------------- |
| // Instructions encoding. |
| |
| // Instr is merely used by the Assembler to distinguish 32bit integers |
| // representing instructions from usual 32 bit values. |
| // Instruction objects are pointers to 32bit values, and provide methods to |
| // access the various ISA fields. |
| using Instr = uint32_t; |
| |
| #define PPC_XX3_OPCODE_LIST(V) \ |
| /* VSX Scalar Add Double-Precision */ \ |
| V(xsadddp, XSADDDP, 0xF0000100) \ |
| /* VSX Scalar Add Single-Precision */ \ |
| V(xsaddsp, XSADDSP, 0xF0000000) \ |
| /* VSX Scalar Compare Ordered Double-Precision */ \ |
| V(xscmpodp, XSCMPODP, 0xF0000158) \ |
| /* VSX Scalar Compare Unordered Double-Precision */ \ |
| V(xscmpudp, XSCMPUDP, 0xF0000118) \ |
| /* VSX Scalar Copy Sign Double-Precision */ \ |
| V(xscpsgndp, XSCPSGNDP, 0xF0000580) \ |
| /* VSX Scalar Divide Double-Precision */ \ |
| V(xsdivdp, XSDIVDP, 0xF00001C0) \ |
| /* VSX Scalar Divide Single-Precision */ \ |
| V(xsdivsp, XSDIVSP, 0xF00000C0) \ |
| /* VSX Scalar Multiply-Add Type-A Double-Precision */ \ |
| V(xsmaddadp, XSMADDADP, 0xF0000108) \ |
| /* VSX Scalar Multiply-Add Type-A Single-Precision */ \ |
| V(xsmaddasp, XSMADDASP, 0xF0000008) \ |
| /* VSX Scalar Multiply-Add Type-M Double-Precision */ \ |
| V(xsmaddmdp, XSMADDMDP, 0xF0000148) \ |
| /* VSX Scalar Multiply-Add Type-M Single-Precision */ \ |
| V(xsmaddmsp, XSMADDMSP, 0xF0000048) \ |
| /* VSX Scalar Maximum Double-Precision */ \ |
| V(xsmaxdp, XSMAXDP, 0xF0000500) \ |
| /* VSX Scalar Minimum Double-Precision */ \ |
| V(xsmindp, XSMINDP, 0xF0000540) \ |
| /* VSX Scalar Multiply-Subtract Type-A Double-Precision */ \ |
| V(xsmsubadp, XSMSUBADP, 0xF0000188) \ |
| /* VSX Scalar Multiply-Subtract Type-A Single-Precision */ \ |
| V(xsmsubasp, XSMSUBASP, 0xF0000088) \ |
| /* VSX Scalar Multiply-Subtract Type-M Double-Precision */ \ |
| V(xsmsubmdp, XSMSUBMDP, 0xF00001C8) \ |
| /* VSX Scalar Multiply-Subtract Type-M Single-Precision */ \ |
| V(xsmsubmsp, XSMSUBMSP, 0xF00000C8) \ |
| /* VSX Scalar Multiply Double-Precision */ \ |
| V(xsmuldp, XSMULDP, 0xF0000180) \ |
| /* VSX Scalar Multiply Single-Precision */ \ |
| V(xsmulsp, XSMULSP, 0xF0000080) \ |
| /* VSX Scalar Negative Multiply-Add Type-A Double-Precision */ \ |
| V(xsnmaddadp, XSNMADDADP, 0xF0000508) \ |
| /* VSX Scalar Negative Multiply-Add Type-A Single-Precision */ \ |
| V(xsnmaddasp, XSNMADDASP, 0xF0000408) \ |
| /* VSX Scalar Negative Multiply-Add Type-M Double-Precision */ \ |
| V(xsnmaddmdp, XSNMADDMDP, 0xF0000548) \ |
| /* VSX Scalar Negative Multiply-Add Type-M Single-Precision */ \ |
| V(xsnmaddmsp, XSNMADDMSP, 0xF0000448) \ |
| /* VSX Scalar Negative Multiply-Subtract Type-A Double-Precision */ \ |
| V(xsnmsubadp, XSNMSUBADP, 0xF0000588) \ |
| /* VSX Scalar Negative Multiply-Subtract Type-A Single-Precision */ \ |
| V(xsnmsubasp, XSNMSUBASP, 0xF0000488) \ |
| /* VSX Scalar Negative Multiply-Subtract Type-M Double-Precision */ \ |
| V(xsnmsubmdp, XSNMSUBMDP, 0xF00005C8) \ |
| /* VSX Scalar Negative Multiply-Subtract Type-M Single-Precision */ \ |
| V(xsnmsubmsp, XSNMSUBMSP, 0xF00004C8) \ |
| /* VSX Scalar Reciprocal Estimate Double-Precision */ \ |
| V(xsredp, XSREDP, 0xF0000168) \ |
| /* VSX Scalar Subtract Double-Precision */ \ |
| V(xssubdp, XSSUBDP, 0xF0000140) \ |
| /* VSX Scalar Subtract Single-Precision */ \ |
| V(xssubsp, XSSUBSP, 0xF0000040) \ |
| /* VSX Scalar Test for software Divide Double-Precision */ \ |
| V(xstdivdp, XSTDIVDP, 0xF00001E8) \ |
| /* VSX Vector Add Double-Precision */ \ |
| V(xvadddp, XVADDDP, 0xF0000300) \ |
| /* VSX Vector Add Single-Precision */ \ |
| V(xvaddsp, XVADDSP, 0xF0000200) \ |
| /* VSX Vector Compare Equal To Double-Precision */ \ |
| V(xvcmpeqdp, XVCMPEQDP, 0xF0000318) \ |
| /* VSX Vector Compare Equal To Double-Precision & record CR6 */ \ |
| V(xvcmpeqdpx, XVCMPEQDPx, 0xF0000718) \ |
| /* VSX Vector Compare Equal To Single-Precision */ \ |
| V(xvcmpeqsp, XVCMPEQSP, 0xF0000218) \ |
| /* VSX Vector Compare Equal To Single-Precision & record CR6 */ \ |
| V(xvcmpeqspx, XVCMPEQSPx, 0xF0000618) \ |
| /* VSX Vector Compare Greater Than or Equal To Double-Precision */ \ |
| V(xvcmpgedp, XVCMPGEDP, 0xF0000398) \ |
| /* VSX Vector Compare Greater Than or Equal To Double-Precision & record */ \ |
| /* CR6 */ \ |
| V(xvcmpgedpx, XVCMPGEDPx, 0xF0000798) \ |
| /* VSX Vector Compare Greater Than or Equal To Single-Precision */ \ |
| V(xvcmpgesp, XVCMPGESP, 0xF0000298) \ |
| /* VSX Vector Compare Greater Than or Equal To Single-Precision & record */ \ |
| /* CR6 */ \ |
| V(xvcmpgespx, XVCMPGESPx, 0xF0000698) \ |
| /* VSX Vector Compare Greater Than Double-Precision */ \ |
| V(xvcmpgtdp, XVCMPGTDP, 0xF0000358) \ |
| /* VSX Vector Compare Greater Than Double-Precision & record CR6 */ \ |
| V(xvcmpgtdpx, XVCMPGTDPx, 0xF0000758) \ |
| /* VSX Vector Compare Greater Than Single-Precision */ \ |
| V(xvcmpgtsp, XVCMPGTSP, 0xF0000258) \ |
| /* VSX Vector Compare Greater Than Single-Precision & record CR6 */ \ |
| V(xvcmpgtspx, XVCMPGTSPx, 0xF0000658) \ |
| /* VSX Vector Copy Sign Double-Precision */ \ |
| V(xvcpsgndp, XVCPSGNDP, 0xF0000780) \ |
| /* VSX Vector Copy Sign Single-Precision */ \ |
| V(xvcpsgnsp, XVCPSGNSP, 0xF0000680) \ |
| /* VSX Vector Divide Double-Precision */ \ |
| V(xvdivdp, XVDIVDP, 0xF00003C0) \ |
| /* VSX Vector Divide Single-Precision */ \ |
| V(xvdivsp, XVDIVSP, 0xF00002C0) \ |
| /* VSX Vector Multiply-Add Type-A Double-Precision */ \ |
| V(xvmaddadp, XVMADDADP, 0xF0000308) \ |
| /* VSX Vector Multiply-Add Type-A Single-Precision */ \ |
| V(xvmaddasp, XVMADDASP, 0xF0000208) \ |
| /* VSX Vector Multiply-Add Type-M Double-Precision */ \ |
| V(xvmaddmdp, XVMADDMDP, 0xF0000348) \ |
| /* VSX Vector Multiply-Add Type-M Single-Precision */ \ |
| V(xvmaddmsp, XVMADDMSP, 0xF0000248) \ |
| /* VSX Vector Maximum Double-Precision */ \ |
| V(xvmaxdp, XVMAXDP, 0xF0000700) \ |
| /* VSX Vector Maximum Single-Precision */ \ |
| V(xvmaxsp, XVMAXSP, 0xF0000600) \ |
| /* VSX Vector Minimum Double-Precision */ \ |
| V(xvmindp, XVMINDP, 0xF0000740) \ |
| /* VSX Vector Minimum Single-Precision */ \ |
| V(xvminsp, XVMINSP, 0xF0000640) \ |
| /* VSX Vector Multiply-Subtract Type-A Double-Precision */ \ |
| V(xvmsubadp, XVMSUBADP, 0xF0000388) \ |
| /* VSX Vector Multiply-Subtract Type-A Single-Precision */ \ |
| V(xvmsubasp, XVMSUBASP, 0xF0000288) \ |
| /* VSX Vector Multiply-Subtract Type-M Double-Precision */ \ |
| V(xvmsubmdp, XVMSUBMDP, 0xF00003C8) \ |
| /* VSX Vector Multiply-Subtract Type-M Single-Precision */ \ |
| V(xvmsubmsp, XVMSUBMSP, 0xF00002C8) \ |
| /* VSX Vector Multiply Double-Precision */ \ |
| V(xvmuldp, XVMULDP, 0xF0000380) \ |
| /* VSX Vector Multiply Single-Precision */ \ |
| V(xvmulsp, XVMULSP, 0xF0000280) \ |
| /* VSX Vector Negative Multiply-Add Type-A Double-Precision */ \ |
| V(xvnmaddadp, XVNMADDADP, 0xF0000708) \ |
| /* VSX Vector Negative Multiply-Add Type-A Single-Precision */ \ |
| V(xvnmaddasp, XVNMADDASP, 0xF0000608) \ |
| /* VSX Vector Negative Multiply-Add Type-M Double-Precision */ \ |
| V(xvnmaddmdp, XVNMADDMDP, 0xF0000748) \ |
| /* VSX Vector Negative Multiply-Add Type-M Single-Precision */ \ |
| V(xvnmaddmsp, XVNMADDMSP, 0xF0000648) \ |
| /* VSX Vector Negative Multiply-Subtract Type-A Double-Precision */ \ |
| V(xvnmsubadp, XVNMSUBADP, 0xF0000788) \ |
| /* VSX Vector Negative Multiply-Subtract Type-A Single-Precision */ \ |
| V(xvnmsubasp, XVNMSUBASP, 0xF0000688) \ |
| /* VSX Vector Negative Multiply-Subtract Type-M Double-Precision */ \ |
| V(xvnmsubmdp, XVNMSUBMDP, 0xF00007C8) \ |
| /* VSX Vector Negative Multiply-Subtract Type-M Single-Precision */ \ |
| V(xvnmsubmsp, XVNMSUBMSP, 0xF00006C8) \ |
| /* VSX Vector Reciprocal Estimate Double-Precision */ \ |
| V(xvredp, XVREDP, 0xF0000368) \ |
| /* VSX Vector Subtract Double-Precision */ \ |
| V(xvsubdp, XVSUBDP, 0xF0000340) \ |
| /* VSX Vector Subtract Single-Precision */ \ |
| V(xvsubsp, XVSUBSP, 0xF0000240) \ |
| /* VSX Vector Test for software Divide Double-Precision */ \ |
| V(xvtdivdp, XVTDIVDP, 0xF00003E8) \ |
| /* VSX Vector Test for software Divide Single-Precision */ \ |
| V(xvtdivsp, XVTDIVSP, 0xF00002E8) \ |
| /* VSX Logical AND */ \ |
| V(xxland, XXLAND, 0xF0000410) \ |
| /* VSX Logical AND with Complement */ \ |
| V(xxlandc, XXLANDC, 0xF0000450) \ |
| /* VSX Logical Equivalence */ \ |
| V(xxleqv, XXLEQV, 0xF00005D0) \ |
| /* VSX Logical NAND */ \ |
| V(xxlnand, XXLNAND, 0xF0000590) \ |
| /* VSX Logical NOR */ \ |
| V(xxlnor, XXLNOR, 0xF0000510) \ |
| /* VSX Logical OR */ \ |
| V(xxlor, XXLOR, 0xF0000490) \ |
| /* VSX Logical OR with Complement */ \ |
| V(xxlorc, XXLORC, 0xF0000550) \ |
| /* VSX Logical XOR */ \ |
| V(xxlxor, XXLXOR, 0xF00004D0) \ |
| /* VSX Merge High Word */ \ |
| V(xxmrghw, XXMRGHW, 0xF0000090) \ |
| /* VSX Merge Low Word */ \ |
| V(xxmrglw, XXMRGLW, 0xF0000190) \ |
| /* VSX Permute Doubleword Immediate */ \ |
| V(xxpermdi, XXPERMDI, 0xF0000050) \ |
| /* VSX Shift Left Double by Word Immediate */ \ |
| V(xxsldwi, XXSLDWI, 0xF0000010) \ |
| /* VSX Splat Word */ \ |
| V(xxspltw, XXSPLTW, 0xF0000290) |
| |
| #define PPC_Z23_OPCODE_LIST(V) \ |
| /* Decimal Quantize */ \ |
| V(dqua, DQUA, 0xEC000006) \ |
| /* Decimal Quantize Immediate */ \ |
| V(dquai, DQUAI, 0xEC000086) \ |
| /* Decimal Quantize Immediate Quad */ \ |
| V(dquaiq, DQUAIQ, 0xFC000086) \ |
| /* Decimal Quantize Quad */ \ |
| V(dquaq, DQUAQ, 0xFC000006) \ |
| /* Decimal Floating Round To FP Integer Without Inexact */ \ |
| V(drintn, DRINTN, 0xEC0001C6) \ |
| /* Decimal Floating Round To FP Integer Without Inexact Quad */ \ |
| V(drintnq, DRINTNQ, 0xFC0001C6) \ |
| /* Decimal Floating Round To FP Integer With Inexact */ \ |
| V(drintx, DRINTX, 0xEC0000C6) \ |
| /* Decimal Floating Round To FP Integer With Inexact Quad */ \ |
| V(drintxq, DRINTXQ, 0xFC0000C6) \ |
| /* Decimal Floating Reround */ \ |
| V(drrnd, DRRND, 0xEC000046) \ |
| /* Decimal Floating Reround Quad */ \ |
| V(drrndq, DRRNDQ, 0xFC000046) |
| |
| #define PPC_Z22_OPCODE_LIST(V) \ |
| /* Decimal Floating Shift Coefficient Left Immediate */ \ |
| V(dscli, DSCLI, 0xEC000084) \ |
| /* Decimal Floating Shift Coefficient Left Immediate Quad */ \ |
| V(dscliq, DSCLIQ, 0xFC000084) \ |
| /* Decimal Floating Shift Coefficient Right Immediate */ \ |
| V(dscri, DSCRI, 0xEC0000C4) \ |
| /* Decimal Floating Shift Coefficient Right Immediate Quad */ \ |
| V(dscriq, DSCRIQ, 0xFC0000C4) \ |
| /* Decimal Floating Test Data Class */ \ |
| V(dtstdc, DTSTDC, 0xEC000184) \ |
| /* Decimal Floating Test Data Class Quad */ \ |
| V(dtstdcq, DTSTDCQ, 0xFC000184) \ |
| /* Decimal Floating Test Data Group */ \ |
| V(dtstdg, DTSTDG, 0xEC0001C4) \ |
| /* Decimal Floating Test Data Group Quad */ \ |
| V(dtstdgq, DTSTDGQ, 0xFC0001C4) |
| |
| #define PPC_XX2_OPCODE_A_FORM_LIST(V) \ |
| /* VSX Vector Absolute Value Double-Precision */ \ |
| V(xvabsdp, XVABSDP, 0xF0000764) \ |
| /* VSX Vector Negate Double-Precision */ \ |
| V(xvnegdp, XVNEGDP, 0xF00007E4) \ |
| /* VSX Vector Square Root Double-Precision */ \ |
| V(xvsqrtdp, XVSQRTDP, 0xF000032C) \ |
| /* VSX Vector Absolute Value Single-Precision */ \ |
| V(xvabssp, XVABSSP, 0xF0000664) \ |
| /* VSX Vector Negate Single-Precision */ \ |
| V(xvnegsp, XVNEGSP, 0xF00006E4) \ |
| /* VSX Vector Reciprocal Estimate Single-Precision */ \ |
| V(xvresp, XVRESP, 0xF0000268) \ |
| /* VSX Vector Reciprocal Square Root Estimate Single-Precision */ \ |
| V(xvrsqrtesp, XVRSQRTESP, 0xF0000228) \ |
| /* VSX Vector Square Root Single-Precision */ \ |
| V(xvsqrtsp, XVSQRTSP, 0xF000022C) \ |
| /* VSX Vector Convert Single-Precision to Signed Fixed-Point Word */ \ |
| /* Saturate */ \ |
| V(xvcvspsxws, XVCVSPSXWS, 0xF0000260) \ |
| /* VSX Vector Convert Single-Precision to Unsigned Fixed-Point Word */ \ |
| /* Saturate */ \ |
| V(xvcvspuxws, XVCVSPUXWS, 0xF0000220) \ |
| /* VSX Vector Convert Signed Fixed-Point Word to Single-Precision */ \ |
| V(xvcvsxwsp, XVCVSXWSP, 0xF00002E0) \ |
| /* VSX Vector Convert Unsigned Fixed-Point Word to Single-Precision */ \ |
| V(xvcvuxwsp, XVCVUXWSP, 0xF00002A0) \ |
| /* VSX Vector Round to Double-Precision Integer toward +Infinity */ \ |
| V(xvrdpip, XVRDPIP, 0xF00003A4) \ |
| /* VSX Vector Round to Double-Precision Integer toward -Infinity */ \ |
| V(xvrdpim, XVRDPIM, 0xF00003E4) \ |
| /* VSX Vector Round to Double-Precision Integer toward Zero */ \ |
| V(xvrdpiz, XVRDPIZ, 0xF0000364) \ |
| /* VSX Vector Round to Double-Precision Integer */ \ |
| V(xvrdpi, XVRDPI, 0xF0000324) \ |
| /* VSX Vector Round to Single-Precision Integer toward +Infinity */ \ |
| V(xvrspip, XVRSPIP, 0xF00002A4) \ |
| /* VSX Vector Round to Single-Precision Integer toward -Infinity */ \ |
| V(xvrspim, XVRSPIM, 0xF00002E4) \ |
| /* VSX Vector Round to Single-Precision Integer toward Zero */ \ |
| V(xvrspiz, XVRSPIZ, 0xF0000264) \ |
| /* VSX Vector Round to Single-Precision Integer */ \ |
| V(xvrspi, XVRSPI, 0xF0000224) |
| |
| #define PPC_XX2_OPCODE_UNUSED_LIST(V) \ |
| /* VSX Scalar Square Root Double-Precision */ \ |
| V(xssqrtdp, XSSQRTDP, 0xF000012C) \ |
| /* VSX Scalar Reciprocal Estimate Single-Precision */ \ |
| V(xsresp, XSRESP, 0xF0000068) \ |
| /* VSX Scalar Reciprocal Square Root Estimate Single-Precision */ \ |
| V(xsrsqrtesp, XSRSQRTESP, 0xF0000028) \ |
| /* VSX Scalar Square Root Single-Precision */ \ |
| V(xssqrtsp, XSSQRTSP, 0xF000002C) \ |
| /* Move To VSR Doubleword */ \ |
| V(mtvsrd, MTVSRD, 0x7C000166) \ |
| /* Move To VSR Double Doubleword */ \ |
| V(mtvsrdd, MTVSRDD, 0x7C000366) \ |
| /* Move To VSR Word Algebraic */ \ |
| V(mtvsrwa, MTVSRWA, 0x7C0001A6) \ |
| /* Move To VSR Word and Zero */ \ |
| V(mtvsrwz, MTVSRWZ, 0x7C0001E6) \ |
| /* VSX Scalar Absolute Value Double-Precision */ \ |
| V(xsabsdp, XSABSDP, 0xF0000564) \ |
| /* VSX Scalar Convert Double-Precision to Single-Precision */ \ |
| V(xscvdpsp, XSCVDPSP, 0xF0000424) \ |
| /* VSX Scalar Convert Double-Precision to Single-Precision format Non- */ \ |
| /* signalling */ \ |
| V(xscvdpspn, XSCVDPSPN, 0xF000042C) \ |
| /* VSX Scalar Convert Double-Precision to Signed Fixed-Point Doubleword */ \ |
| /* Saturate */ \ |
| V(xscvdpsxds, XSCVDPSXDS, 0xF0000560) \ |
| /* VSX Scalar Convert Double-Precision to Signed Fixed-Point Word */ \ |
| /* Saturate */ \ |
| V(xscvdpsxws, XSCVDPSXWS, 0xF0000160) \ |
| /* VSX Scalar Convert Double-Precision to Unsigned Fixed-Point */ \ |
| /* Doubleword Saturate */ \ |
| V(xscvdpuxds, XSCVDPUXDS, 0xF0000520) \ |
| /* VSX Scalar Convert Double-Precision to Unsigned Fixed-Point Word */ \ |
| /* Saturate */ \ |
| V(xscvdpuxws, XSCVDPUXWS, 0xF0000120) \ |
| /* VSX Scalar Convert Single-Precision to Double-Precision (p=1) */ \ |
| V(xscvspdp, XSCVSPDP, 0xF0000524) \ |
| /* Scalar Convert Single-Precision to Double-Precision format Non- */ \ |
| /* signalling */ \ |
| V(xscvspdpn, XSCVSPDPN, 0xF000052C) \ |
| /* VSX Scalar Convert Signed Fixed-Point Doubleword to Double-Precision */ \ |
| V(xscvsxddp, XSCVSXDDP, 0xF00005E0) \ |
| /* VSX Scalar Convert Signed Fixed-Point Doubleword to Single-Precision */ \ |
| V(xscvsxdsp, XSCVSXDSP, 0xF00004E0) \ |
| /* VSX Scalar Convert Unsigned Fixed-Point Doubleword to Double- */ \ |
| /* Precision */ \ |
| V(xscvuxddp, XSCVUXDDP, 0xF00005A0) \ |
| /* VSX Scalar Convert Unsigned Fixed-Point Doubleword to Single- */ \ |
| /* Precision */ \ |
| V(xscvuxdsp, XSCVUXDSP, 0xF00004A0) \ |
| /* VSX Scalar Negative Absolute Value Double-Precision */ \ |
| V(xsnabsdp, XSNABSDP, 0xF00005A4) \ |
| /* VSX Scalar Negate Double-Precision */ \ |
| V(xsnegdp, XSNEGDP, 0xF00005E4) \ |
| /* VSX Scalar Round to Double-Precision Integer */ \ |
| V(xsrdpi, XSRDPI, 0xF0000124) \ |
| /* VSX Scalar Round to Double-Precision Integer using Current rounding */ \ |
| /* mode */ \ |
| V(xsrdpic, XSRDPIC, 0xF00001AC) \ |
| /* VSX Scalar Round to Double-Precision Integer toward -Infinity */ \ |
| V(xsrdpim, XSRDPIM, 0xF00001E4) \ |
| /* VSX Scalar Round to Double-Precision Integer toward +Infinity */ \ |
| V(xsrdpip, XSRDPIP, 0xF00001A4) \ |
| /* VSX Scalar Round to Double-Precision Integer toward Zero */ \ |
| V(xsrdpiz, XSRDPIZ, 0xF0000164) \ |
| /* VSX Scalar Round to Single-Precision */ \ |
| V(xsrsp, XSRSP, 0xF0000464) \ |
| /* VSX Scalar Reciprocal Square Root Estimate Double-Precision */ \ |
| V(xsrsqrtedp, XSRSQRTEDP, 0xF0000128) \ |
| /* VSX Scalar Test for software Square Root Double-Precision */ \ |
| V(xstsqrtdp, XSTSQRTDP, 0xF00001A8) \ |
| /* VSX Vector Convert Double-Precision to Single-Precision */ \ |
| V(xvcvdpsp, XVCVDPSP, 0xF0000624) \ |
| /* VSX Vector Convert Double-Precision to Signed Fixed-Point Doubleword */ \ |
| /* Saturate */ \ |
| V(xvcvdpsxds, XVCVDPSXDS, 0xF0000760) \ |
| /* VSX Vector Convert Double-Precision to Signed Fixed-Point Word */ \ |
| /* Saturate */ \ |
| V(xvcvdpsxws, XVCVDPSXWS, 0xF0000360) \ |
| /* VSX Vector Convert Double-Precision to Unsigned Fixed-Point */ \ |
| /* Doubleword Saturate */ \ |
| V(xvcvdpuxds, XVCVDPUXDS, 0xF0000720) \ |
| /* VSX Vector Convert Double-Precision to Unsigned Fixed-Point Word */ \ |
| /* Saturate */ \ |
| V(xvcvdpuxws, XVCVDPUXWS, 0xF0000320) \ |
| /* VSX Vector Convert Single-Precision to Double-Precision */ \ |
| V(xvcvspdp, XVCVSPDP, 0xF0000724) \ |
| /* VSX Vector Convert Single-Precision to Signed Fixed-Point Doubleword */ \ |
| /* Saturate */ \ |
| V(xvcvspsxds, XVCVSPSXDS, 0xF0000660) \ |
| /* VSX Vector Convert Single-Precision to Unsigned Fixed-Point */ \ |
| /* Doubleword Saturate */ \ |
| V(xvcvspuxds, XVCVSPUXDS, 0xF0000620) \ |
| /* VSX Vector Convert Signed Fixed-Point Doubleword to Double-Precision */ \ |
| V(xvcvsxddp, XVCVSXDDP, 0xF00007E0) \ |
| /* VSX Vector Convert Signed Fixed-Point Doubleword to Single-Precision */ \ |
| V(xvcvsxdsp, XVCVSXDSP, 0xF00006E0) \ |
| /* VSX Vector Convert Signed Fixed-Point Word to Double-Precision */ \ |
| V(xvcvsxwdp, XVCVSXWDP, 0xF00003E0) \ |
| /* VSX Vector Convert Unsigned Fixed-Point Doubleword to Double- */ \ |
| /* Precision */ \ |
| V(xvcvuxddp, XVCVUXDDP, 0xF00007A0) \ |
| /* VSX Vector Convert Unsigned Fixed-Point Doubleword to Single- */ \ |
| /* Precision */ \ |
| V(xvcvuxdsp, XVCVUXDSP, 0xF00006A0) \ |
| /* VSX Vector Convert Unsigned Fixed-Point Word to Double-Precision */ \ |
| V(xvcvuxwdp, XVCVUXWDP, 0xF00003A0) \ |
| /* VSX Vector Negative Absolute Value Double-Precision */ \ |
| V(xvnabsdp, XVNABSDP, 0xF00007A4) \ |
| /* VSX Vector Negative Absolute Value Single-Precision */ \ |
| V(xvnabssp, XVNABSSP, 0xF00006A4) \ |
| /* VSX Vector Round to Double-Precision Integer using Current rounding */ \ |
| /* mode */ \ |
| V(xvrdpic, XVRDPIC, 0xF00003AC) \ |
| /* VSX Vector Round to Single-Precision Integer using Current rounding */ \ |
| /* mode */ \ |
| V(xvrspic, XVRSPIC, 0xF00002AC) \ |
| /* VSX Vector Reciprocal Square Root Estimate Double-Precision */ \ |
| V(xvrsqrtedp, XVRSQRTEDP, 0xF0000328) \ |
| /* VSX Vector Test for software Square Root Double-Precision */ \ |
| V(xvtsqrtdp, XVTSQRTDP, 0xF00003A8) \ |
| /* VSX Vector Test for software Square Root Single-Precision */ \ |
| V(xvtsqrtsp, XVTSQRTSP, 0xF00002A8) |
| |
| #define PPC_XX2_OPCODE_LIST(V) \ |
| PPC_XX2_OPCODE_A_FORM_LIST(V) \ |
| PPC_XX2_OPCODE_UNUSED_LIST(V) |
| |
| #define PPC_EVX_OPCODE_LIST(V) \ |
| /* Vector Load Double Word into Double Word by External PID Indexed */ \ |
| V(evlddepx, EVLDDEPX, 0x7C00063E) \ |
| /* Vector Store Double of Double by External PID Indexed */ \ |
| V(evstddepx, EVSTDDEPX, 0x7C00073E) \ |
| /* Bit Reversed Increment */ \ |
| V(brinc, BRINC, 0x1000020F) \ |
| /* Vector Absolute Value */ \ |
| V(evabs, EVABS, 0x10000208) \ |
| /* Vector Add Immediate Word */ \ |
| V(evaddiw, EVADDIW, 0x10000202) \ |
| /* Vector Add Signed, Modulo, Integer to Accumulator Word */ \ |
| V(evaddsmiaaw, EVADDSMIAAW, 0x100004C9) \ |
| /* Vector Add Signed, Saturate, Integer to Accumulator Word */ \ |
| V(evaddssiaaw, EVADDSSIAAW, 0x100004C1) \ |
| /* Vector Add Unsigned, Modulo, Integer to Accumulator Word */ \ |
| V(evaddumiaaw, EVADDUMIAAW, 0x100004C8) \ |
| /* Vector Add Unsigned, Saturate, Integer to Accumulator Word */ \ |
| V(evaddusiaaw, EVADDUSIAAW, 0x100004C0) \ |
| /* Vector Add Word */ \ |
| V(evaddw, EVADDW, 0x10000200) \ |
| /* Vector AND */ \ |
| V(evand, EVAND, 0x10000211) \ |
| /* Vector AND with Complement */ \ |
| V(evandc, EVANDC, 0x10000212) \ |
| /* Vector Compare Equal */ \ |
| V(evcmpeq, EVCMPEQ, 0x10000234) \ |
| /* Vector Compare Greater Than Signed */ \ |
| V(evcmpgts, EVCMPGTS, 0x10000231) \ |
| /* Vector Compare Greater Than Unsigned */ \ |
| V(evcmpgtu, EVCMPGTU, 0x10000230) \ |
| /* Vector Compare Less Than Signed */ \ |
| V(evcmplts, EVCMPLTS, 0x10000233) \ |
| /* Vector Compare Less Than Unsigned */ \ |
| V(evcmpltu, EVCMPLTU, 0x10000232) \ |
| /* Vector Count Leading Signed Bits Word */ \ |
| V(evcntlsw, EVCNTLSW, 0x1000020E) \ |
| /* Vector Count Leading Zeros Word */ \ |
| V(evcntlzw, EVCNTLZW, 0x1000020D) \ |
| /* Vector Divide Word Signed */ \ |
| V(evdivws, EVDIVWS, 0x100004C6) \ |
| /* Vector Divide Word Unsigned */ \ |
| V(evdivwu, EVDIVWU, 0x100004C7) \ |
| /* Vector Equivalent */ \ |
| V(eveqv, EVEQV, 0x10000219) \ |
| /* Vector Extend Sign Byte */ \ |
| V(evextsb, EVEXTSB, 0x1000020A) \ |
| /* Vector Extend Sign Half Word */ \ |
| V(evextsh, EVEXTSH, 0x1000020B) \ |
| /* Vector Load Double Word into Double Word */ \ |
| V(evldd, EVLDD, 0x10000301) \ |
| /* Vector Load Double Word into Double Word Indexed */ \ |
| V(evlddx, EVLDDX, 0x10000300) \ |
| /* Vector Load Double into Four Half Words */ \ |
| V(evldh, EVLDH, 0x10000305) \ |
| /* Vector Load Double into Four Half Words Indexed */ \ |
| V(evldhx, EVLDHX, 0x10000304) \ |
| /* Vector Load Double into Two Words */ \ |
| V(evldw, EVLDW, 0x10000303) \ |
| /* Vector Load Double into Two Words Indexed */ \ |
| V(evldwx, EVLDWX, 0x10000302) \ |
| /* Vector Load Half Word into Half Words Even and Splat */ \ |
| V(evlhhesplat, EVLHHESPLAT, 0x10000309) \ |
| /* Vector Load Half Word into Half Words Even and Splat Indexed */ \ |
| V(evlhhesplatx, EVLHHESPLATX, 0x10000308) \ |
| /* Vector Load Half Word into Half Word Odd Signed and Splat */ \ |
| V(evlhhossplat, EVLHHOSSPLAT, 0x1000030F) \ |
| /* Vector Load Half Word into Half Word Odd Signed and Splat Indexed */ \ |
| V(evlhhossplatx, EVLHHOSSPLATX, 0x1000030E) \ |
| /* Vector Load Half Word into Half Word Odd Unsigned and Splat */ \ |
| V(evlhhousplat, EVLHHOUSPLAT, 0x1000030D) \ |
| /* Vector Load Half Word into Half Word Odd Unsigned and Splat Indexed */ \ |
| V(evlhhousplatx, EVLHHOUSPLATX, 0x1000030C) \ |
| /* Vector Load Word into Two Half Words Even */ \ |
| V(evlwhe, EVLWHE, 0x10000311) \ |
| /* Vector Load Word into Two Half Words Odd Signed (with sign extension) */ \ |
| V(evlwhos, EVLWHOS, 0x10000317) \ |
| /* Vector Load Word into Two Half Words Odd Signed Indexed (with sign */ \ |
| /* extension) */ \ |
| V(evlwhosx, EVLWHOSX, 0x10000316) \ |
| /* Vector Load Word into Two Half Words Odd Unsigned (zero-extended) */ \ |
| V(evlwhou, EVLWHOU, 0x10000315) \ |
| /* Vector Load Word into Two Half Words Odd Unsigned Indexed (zero- */ \ |
| /* extended) */ \ |
| V(evlwhoux, EVLWHOUX, 0x10000314) \ |
| /* Vector Load Word into Two Half Words and Splat */ \ |
| V(evlwhsplat, EVLWHSPLAT, 0x1000031D) \ |
| /* Vector Load Word into Two Half Words and Splat Indexed */ \ |
| V(evlwhsplatx, EVLWHSPLATX, 0x1000031C) \ |
| /* Vector Load Word into Word and Splat */ \ |
| V(evlwwsplat, EVLWWSPLAT, 0x10000319) \ |
| /* Vector Load Word into Word and Splat Indexed */ \ |
| V(evlwwsplatx, EVLWWSPLATX, 0x10000318) \ |
| /* Vector Merge High */ \ |
| V(evmergehi, EVMERGEHI, 0x1000022C) \ |
| /* Vector Merge High/Low */ \ |
| V(evmergehilo, EVMERGEHILO, 0x1000022E) \ |
| /* Vector Merge Low */ \ |
| V(evmergelo, EVMERGELO, 0x1000022D) \ |
| /* Vector Merge Low/High */ \ |
| V(evmergelohi, EVMERGELOHI, 0x1000022F) \ |
| /* Vector Multiply Half Words, Even, Guarded, Signed, Modulo, Fractional */ \ |
| /* and Accumulate */ \ |
| V(evmhegsmfaa, EVMHEGSMFAA, 0x1000052B) \ |
| /* Vector Multiply Half Words, Even, Guarded, Signed, Modulo, Fractional */ \ |
| /* and Accumulate Negative */ \ |
| V(evmhegsmfan, EVMHEGSMFAN, 0x100005AB) \ |
| /* Vector Multiply Half Words, Even, Guarded, Signed, Modulo, Integer */ \ |
| /* and Accumulate */ \ |
| V(evmhegsmiaa, EVMHEGSMIAA, 0x10000529) \ |
| /* Vector Multiply Half Words, Even, Guarded, Signed, Modulo, Integer */ \ |
| /* and Accumulate Negative */ \ |
| V(evmhegsmian, EVMHEGSMIAN, 0x100005A9) \ |
| /* Vector Multiply Half Words, Even, Guarded, Unsigned, Modulo, Integer */ \ |
| /* and Accumulate */ \ |
| V(evmhegumiaa, EVMHEGUMIAA, 0x10000528) \ |
| /* Vector Multiply Half Words, Even, Guarded, Unsigned, Modulo, Integer */ \ |
| /* and Accumulate Negative */ \ |
| V(evmhegumian, EVMHEGUMIAN, 0x100005A8) \ |
| /* Vector Multiply Half Words, Even, Signed, Modulo, Fractional */ \ |
| V(evmhesmf, EVMHESMF, 0x1000040B) \ |
| /* Vector Multiply Half Words, Even, Signed, Modulo, Fractional to */ \ |
| /* Accumulator */ \ |
| V(evmhesmfa, EVMHESMFA, 0x1000042B) \ |
| /* Vector Multiply Half Words, Even, Signed, Modulo, Fractional and */ \ |
| /* Accumulate into Words */ \ |
| V(evmhesmfaaw, EVMHESMFAAW, 0x1000050B) \ |
| /* Vector Multiply Half Words, Even, Signed, Modulo, Fractional and */ \ |
| /* Accumulate Negative into Words */ \ |
| V(evmhesmfanw, EVMHESMFANW, 0x1000058B) \ |
| /* Vector Multiply Half Words, Even, Signed, Modulo, Integer */ \ |
| V(evmhesmi, EVMHESMI, 0x10000409) \ |
| /* Vector Multiply Half Words, Even, Signed, Modulo, Integer to */ \ |
| /* Accumulator */ \ |
| V(evmhesmia, EVMHESMIA, 0x10000429) \ |
| /* Vector Multiply Half Words, Even, Signed, Modulo, Integer and */ \ |
| /* Accumulate into Words */ \ |
| V(evmhesmiaaw, EVMHESMIAAW, 0x10000509) \ |
| /* Vector Multiply Half Words, Even, Signed, Modulo, Integer and */ \ |
| /* Accumulate Negative into Words */ \ |
| V(evmhesmianw, EVMHESMIANW, 0x10000589) \ |
| /* Vector Multiply Half Words, Even, Signed, Saturate, Fractional */ \ |
| V(evmhessf, EVMHESSF, 0x10000403) \ |
| /* Vector Multiply Half Words, Even, Signed, Saturate, Fractional to */ \ |
| /* Accumulator */ \ |
| V(evmhessfa, EVMHESSFA, 0x10000423) \ |
| /* Vector Multiply Half Words, Even, Signed, Saturate, Fractional and */ \ |
| /* Accumulate into Words */ \ |
| V(evmhessfaaw, EVMHESSFAAW, 0x10000503) \ |
| /* Vector Multiply Half Words, Even, Signed, Saturate, Fractional and */ \ |
| /* Accumulate Negative into Words */ \ |
| V(evmhessfanw, EVMHESSFANW, 0x10000583) \ |
| /* Vector Multiply Half Words, Even, Signed, Saturate, Integer and */ \ |
| /* Accumulate into Words */ \ |
| V(evmhessiaaw, EVMHESSIAAW, 0x10000501) \ |
| /* Vector Multiply Half Words, Even, Signed, Saturate, Integer and */ \ |
| /* Accumulate Negative into Words */ \ |
| V(evmhessianw, EVMHESSIANW, 0x10000581) \ |
| /* Vector Multiply Half Words, Even, Unsigned, Modulo, Integer */ \ |
| V(evmheumi, EVMHEUMI, 0x10000408) \ |
| /* Vector Multiply Half Words, Even, Unsigned, Modulo, Integer to */ \ |
| /* Accumulator */ \ |
| V(evmheumia, EVMHEUMIA, 0x10000428) \ |
| /* Vector Multiply Half Words, Even, Unsigned, Modulo, Integer and */ \ |
| /* Accumulate into Words */ \ |
| V(evmheumiaaw, EVMHEUMIAAW, 0x10000508) \ |
| /* Vector Multiply Half Words, Even, Unsigned, Modulo, Integer and */ \ |
| /* Accumulate Negative into Words */ \ |
| V(evmheumianw, EVMHEUMIANW, 0x10000588) \ |
| /* Vector Multiply Half Words, Even, Unsigned, Saturate, Integer and */ \ |
| /* Accumulate into Words */ \ |
| V(evmheusiaaw, EVMHEUSIAAW, 0x10000500) \ |
| /* Vector Multiply Half Words, Even, Unsigned, Saturate, Integer and */ \ |
| /* Accumulate Negative into Words */ \ |
| V(evmheusianw, EVMHEUSIANW, 0x10000580) \ |
| /* Vector Multiply Half Words, Odd, Guarded, Signed, Modulo, Fractional */ \ |
| /* and Accumulate */ \ |
| V(evmhogsmfaa, EVMHOGSMFAA, 0x1000052F) \ |
| /* Vector Multiply Half Words, Odd, Guarded, Signed, Modulo, Fractional */ \ |
| /* and Accumulate Negative */ \ |
| V(evmhogsmfan, EVMHOGSMFAN, 0x100005AF) \ |
| /* Vector Multiply Half Words, Odd, Guarded, Signed, Modulo, Integer, */ \ |
| /* and Accumulate */ \ |
| V(evmhogsmiaa, EVMHOGSMIAA, 0x1000052D) \ |
| /* Vector Multiply Half Words, Odd, Guarded, Signed, Modulo, Integer and */ \ |
| /* Accumulate Negative */ \ |
| V(evmhogsmian, EVMHOGSMIAN, 0x100005AD) \ |
| /* Vector Multiply Half Words, Odd, Guarded, Unsigned, Modulo, Integer */ \ |
| /* and Accumulate */ \ |
| V(evmhogumiaa, EVMHOGUMIAA, 0x1000052C) \ |
| /* Vector Multiply Half Words, Odd, Guarded, Unsigned, Modulo, Integer */ \ |
| /* and Accumulate Negative */ \ |
| V(evmhogumian, EVMHOGUMIAN, 0x100005AC) \ |
| /* Vector Multiply Half Words, Odd, Signed, Modulo, Fractional */ \ |
| V(evmhosmf, EVMHOSMF, 0x1000040F) \ |
| /* Vector Multiply Half Words, Odd, Signed, Modulo, Fractional to */ \ |
| /* Accumulator */ \ |
| V(evmhosmfa, EVMHOSMFA, 0x1000042F) \ |
| /* Vector Multiply Half Words, Odd, Signed, Modulo, Fractional and */ \ |
| /* Accumulate into Words */ \ |
| V(evmhosmfaaw, EVMHOSMFAAW, 0x1000050F) \ |
| /* Vector Multiply Half Words, Odd, Signed, Modulo, Fractional and */ \ |
| /* Accumulate Negative into Words */ \ |
| V(evmhosmfanw, EVMHOSMFANW, 0x1000058F) \ |
| /* Vector Multiply Half Words, Odd, Signed, Modulo, Integer */ \ |
| V(evmhosmi, EVMHOSMI, 0x1000040D) \ |
| /* Vector Multiply Half Words, Odd, Signed, Modulo, Integer to */ \ |
| /* Accumulator */ \ |
| V(evmhosmia, EVMHOSMIA, 0x1000042D) \ |
| /* Vector Multiply Half Words, Odd, Signed, Modulo, Integer and */ \ |
| /* Accumulate into Words */ \ |
| V(evmhosmiaaw, EVMHOSMIAAW, 0x1000050D) \ |
| /* Vector Multiply Half Words, Odd, Signed, Modulo, Integer and */ \ |
| /* Accumulate Negative into Words */ \ |
| V(evmhosmianw, EVMHOSMIANW, 0x1000058D) \ |
| /* Vector Multiply Half Words, Odd, Signed, Saturate, Fractional */ \ |
| V(evmhossf, EVMHOSSF, 0x10000407) \ |
| /* Vector Multiply Half Words, Odd, Signed, Saturate, Fractional to */ \ |
| /* Accumulator */ \ |
| V(evmhossfa, EVMHOSSFA, 0x10000427) \ |
| /* Vector Multiply Half Words, Odd, Signed, Saturate, Fractional and */ \ |
| /* Accumulate into Words */ \ |
| V(evmhossfaaw, EVMHOSSFAAW, 0x10000507) \ |
| /* Vector Multiply Half Words, Odd, Signed, Saturate, Fractional and */ \ |
| /* Accumulate Negative into Words */ \ |
| V(evmhossfanw, EVMHOSSFANW, 0x10000587) \ |
| /* Vector Multiply Half Words, Odd, Signed, Saturate, Integer and */ \ |
| /* Accumulate into Words */ \ |
| V(evmhossiaaw, EVMHOSSIAAW, 0x10000505) \ |
| /* Vector Multiply Half Words, Odd, Signed, Saturate, Integer and */ \ |
| /* Accumulate Negative into Words */ \ |
| V(evmhossianw, EVMHOSSIANW, 0x10000585) \ |
| /* Vector Multiply Half Words, Odd, Unsigned, Modulo, Integer */ \ |
| V(evmhoumi, EVMHOUMI, 0x1000040C) \ |
| /* Vector Multiply Half Words, Odd, Unsigned, Modulo, Integer to */ \ |
| /* Accumulator */ \ |
| V(evmhoumia, EVMHOUMIA, 0x1000042C) \ |
| /* Vector Multiply Half Words, Odd, Unsigned, Modulo, Integer and */ \ |
| /* Accumulate into Words */ \ |
| V(evmhoumiaaw, EVMHOUMIAAW, 0x1000050C) \ |
| /* Vector Multiply Half Words, Odd, Unsigned, Modulo, Integer and */ \ |
| /* Accumulate Negative into Words */ \ |
| V(evmhoumianw, EVMHOUMIANW, 0x1000058C) \ |
| /* Vector Multiply Half Words, Odd, Unsigned, Saturate, Integer and */ \ |
| /* Accumulate into Words */ \ |
| V(evmhousiaaw, EVMHOUSIAAW, 0x10000504) \ |
| /* Vector Multiply Half Words, Odd, Unsigned, Saturate, Integer and */ \ |
| /* Accumulate Negative into Words */ \ |
| V(evmhousianw, EVMHOUSIANW, 0x10000584) \ |
| /* Initialize Accumulator */ \ |
| V(evmra, EVMRA, 0x100004C4) \ |
| /* Vector Multiply Word High Signed, Modulo, Fractional */ \ |
| V(evmwhsmf, EVMWHSMF, 0x1000044F) \ |
| /* Vector Multiply Word High Signed, Modulo, Fractional to Accumulator */ \ |
| V(evmwhsmfa, EVMWHSMFA, 0x1000046F) \ |
| /* Vector Multiply Word High Signed, Modulo, Integer */ \ |
| V(evmwhsmi, EVMWHSMI, 0x1000044D) \ |
| /* Vector Multiply Word High Signed, Modulo, Integer to Accumulator */ \ |
| V(evmwhsmia, EVMWHSMIA, 0x1000046D) \ |
| /* Vector Multiply Word High Signed, Saturate, Fractional */ \ |
| V(evmwhssf, EVMWHSSF, 0x10000447) \ |
| /* Vector Multiply Word High Signed, Saturate, Fractional to Accumulator */ \ |
| V(evmwhssfa, EVMWHSSFA, 0x10000467) \ |
| /* Vector Multiply Word High Unsigned, Modulo, Integer */ \ |
| V(evmwhumi, EVMWHUMI, 0x1000044C) \ |
| /* Vector Multiply Word High Unsigned, Modulo, Integer to Accumulator */ \ |
| V(evmwhumia, EVMWHUMIA, 0x1000046C) \ |
| /* Vector Multiply Word Low Signed, Modulo, Integer and Accumulate in */ \ |
| /* Words */ \ |
| V(evmwlsmiaaw, EVMWLSMIAAW, 0x10000549) \ |
| /* Vector Multiply Word Low Signed, Modulo, Integer and Accumulate */ \ |
| /* Negative in Words */ \ |
| V(evmwlsmianw, EVMWLSMIANW, 0x100005C9) \ |
| /* Vector Multiply Word Low Signed, Saturate, Integer and Accumulate in */ \ |
| /* Words */ \ |
| V(evmwlssiaaw, EVMWLSSIAAW, 0x10000541) \ |
| /* Vector Multiply Word Low Signed, Saturate, Integer and Accumulate */ \ |
| /* Negative in Words */ \ |
| V(evmwlssianw, EVMWLSSIANW, 0x100005C1) \ |
| /* Vector Multiply Word Low Unsigned, Modulo, Integer */ \ |
| V(evmwlumi, EVMWLUMI, 0x10000448) \ |
| /* Vector Multiply Word Low Unsigned, Modulo, Integer to Accumulator */ \ |
| V(evmwlumia, EVMWLUMIA, 0x10000468) \ |
| /* Vector Multiply Word Low Unsigned, Modulo, Integer and Accumulate in */ \ |
| /* Words */ \ |
| V(evmwlumiaaw, EVMWLUMIAAW, 0x10000548) \ |
| /* Vector Multiply Word Low Unsigned, Modulo, Integer and Accumulate */ \ |
| /* Negative in Words */ \ |
| V(evmwlumianw, EVMWLUMIANW, 0x100005C8) \ |
| /* Vector Multiply Word Low Unsigned, Saturate, Integer and Accumulate */ \ |
| /* in Words */ \ |
| V(evmwlusiaaw, EVMWLUSIAAW, 0x10000540) \ |
| /* Vector Multiply Word Low Unsigned, Saturate, Integer and Accumulate */ \ |
| /* Negative in Words */ \ |
| V(evmwlusianw, EVMWLUSIANW, 0x100005C0) \ |
| /* Vector Multiply Word Signed, Modulo, Fractional */ \ |
| V(evmwsmf, EVMWSMF, 0x1000045B) \ |
| /* Vector Multiply Word Signed, Modulo, Fractional to Accumulator */ \ |
| V(evmwsmfa, EVMWSMFA, 0x1000047B) \ |
| /* Vector Multiply Word Signed, Modulo, Fractional and Accumulate */ \ |
| V(evmwsmfaa, EVMWSMFAA, 0x1000055B) \ |
| /* Vector Multiply Word Signed, Modulo, Fractional and Accumulate */ \ |
| /* Negative */ \ |
| V(evmwsmfan, EVMWSMFAN, 0x100005DB) \ |
| /* Vector Multiply Word Signed, Modulo, Integer */ \ |
| V(evmwsmi, EVMWSMI, 0x10000459) \ |
| /* Vector Multiply Word Signed, Modulo, Integer to Accumulator */ \ |
| V(evmwsmia, EVMWSMIA, 0x10000479) \ |
| /* Vector Multiply Word Signed, Modulo, Integer and Accumulate */ \ |
| V(evmwsmiaa, EVMWSMIAA, 0x10000559) \ |
| /* Vector Multiply Word Signed, Modulo, Integer and Accumulate Negative */ \ |
| V(evmwsmian, EVMWSMIAN, 0x100005D9) \ |
| /* Vector Multiply Word Signed, Saturate, Fractional */ \ |
| V(evmwssf, EVMWSSF, 0x10000453) \ |
| /* Vector Multiply Word Signed, Saturate, Fractional to Accumulator */ \ |
| V(evmwssfa, EVMWSSFA, 0x10000473) \ |
| /* Vector Multiply Word Signed, Saturate, Fractional and Accumulate */ \ |
| V(evmwssfaa, EVMWSSFAA, 0x10000553) \ |
| /* Vector Multiply Word Signed, Saturate, Fractional and Accumulate */ \ |
| /* Negative */ \ |
| V(evmwssfan, EVMWSSFAN, 0x100005D3) \ |
| /* Vector Multiply Word Unsigned, Modulo, Integer */ \ |
| V(evmwumi, EVMWUMI, 0x10000458) \ |
| /* Vector Multiply Word Unsigned, Modulo, Integer to Accumulator */ \ |
| V(evmwumia, EVMWUMIA, 0x10000478) \ |
| /* Vector Multiply Word Unsigned, Modulo, Integer and Accumulate */ \ |
| V(evmwumiaa, EVMWUMIAA, 0x10000558) \ |
| /* Vector Multiply Word Unsigned, Modulo, Integer and Accumulate */ \ |
| /* Negative */ \ |
| V(evmwumian, EVMWUMIAN, 0x100005D8) \ |
| /* Vector NAND */ \ |
| V(evnand, EVNAND, 0x1000021E) \ |
| /* Vector Negate */ \ |
| V(evneg, EVNEG, 0x10000209) \ |
| /* Vector NOR */ \ |
| V(evnor, EVNOR, 0x10000218) \ |
| /* Vector OR */ \ |
| V(evor, EVOR, 0x10000217) \ |
| /* Vector OR with Complement */ \ |
| V(evorc, EVORC, 0x1000021B) \ |
| /* Vector Rotate Left Word */ \ |
| V(evrlw, EVRLW, 0x10000228) \ |
| /* Vector Rotate Left Word Immediate */ \ |
| V(evrlwi, EVRLWI, 0x1000022A) \ |
| /* Vector Round Word */ \ |
| V(evrndw, EVRNDW, 0x1000020C) \ |
| /* Vector Shift Left Word */ \ |
| V(evslw, EVSLW, 0x10000224) \ |
| /* Vector Shift Left Word Immediate */ \ |
| V(evslwi, EVSLWI, 0x10000226) \ |
| /* Vector Splat Fractional Immediate */ \ |
| V(evsplatfi, EVSPLATFI, 0x1000022B) \ |
| /* Vector Splat Immediate */ \ |
| V(evsplati, EVSPLATI, 0x10000229) \ |
| /* Vector Shift Right Word Immediate Signed */ \ |
| V(evsrwis, EVSRWIS, 0x10000223) \ |
| /* Vector Shift Right Word Immediate Unsigned */ \ |
| V(evsrwiu, EVSRWIU, 0x10000222) \ |
| /* Vector Shift Right Word Signed */ \ |
| V(evsrws, EVSRWS, 0x10000221) \ |
| /* Vector Shift Right Word Unsigned */ \ |
| V(evsrwu, EVSRWU, 0x10000220) \ |
| /* Vector Store Double of Double */ \ |
| V(evstdd, EVSTDD, 0x10000321) \ |
| /* Vector Store Double of Double Indexed */ \ |
| V(evstddx, EVSTDDX, 0x10000320) \ |
| /* Vector Store Double of Four Half Words */ \ |
| V(evstdh, EVSTDH, 0x10000325) \ |
| /* Vector Store Double of Four Half Words Indexed */ \ |
| V(evstdhx, EVSTDHX, 0x10000324) \ |
| /* Vector Store Double of Two Words */ \ |
| V(evstdw, EVSTDW, 0x10000323) \ |
| /* Vector Store Double of Two Words Indexed */ \ |
| V(evstdwx, EVSTDWX, 0x10000322) \ |
| /* Vector Store Word of Two Half Words from Even */ \ |
| V(evstwhe, EVSTWHE, 0x10000331) \ |
| /* Vector Store Word of Two Half Words from Even Indexed */ \ |
| V(evstwhex, EVSTWHEX, 0x10000330) \ |
| /* Vector Store Word of Two Half Words from Odd */ \ |
| V(evstwho, EVSTWHO, 0x10000335) \ |
| /* Vector Store Word of Two Half Words from Odd Indexed */ \ |
| V(evstwhox, EVSTWHOX, 0x10000334) \ |
| /* Vector Store Word of Word from Even */ \ |
| V(evstwwe, EVSTWWE, 0x10000339) \ |
| /* Vector Store Word of Word from Even Indexed */ \ |
| V(evstwwex, EVSTWWEX, 0x10000338) \ |
| /* Vector Store Word of Word from Odd */ \ |
| V(evstwwo, EVSTWWO, 0x1000033D) \ |
| /* Vector Store Word of Word from Odd Indexed */ \ |
| V(evstwwox, EVSTWWOX, 0x1000033C) \ |
| /* Vector Subtract Signed, Modulo, Integer to Accumulator Word */ \ |
| V(evsubfsmiaaw, EVSUBFSMIAAW, 0x100004CB) \ |
| /* Vector Subtract Signed, Saturate, Integer to Accumulator Word */ \ |
| V(evsubfssiaaw, EVSUBFSSIAAW, 0x100004C3) \ |
| /* Vector Subtract Unsigned, Modulo, Integer to Accumulator Word */ \ |
| V(evsubfumiaaw, EVSUBFUMIAAW, 0x100004CA) \ |
| /* Vector Subtract Unsigned, Saturate, Integer to Accumulator Word */ \ |
| V(evsubfusiaaw, EVSUBFUSIAAW, 0x100004C2) \ |
| /* Vector Subtract from Word */ \ |
| V(evsubfw, EVSUBFW, 0x10000204) \ |
| /* Vector Subtract Immediate from Word */ \ |
| V(evsubifw, EVSUBIFW, 0x10000206) \ |
| /* Vector XOR */ \ |
| V(evxor, EVXOR, 0x10000216) \ |
| /* Floating-Point Double-Precision Absolute Value */ \ |
| V(efdabs, EFDABS, 0x100002E4) \ |
| /* Floating-Point Double-Precision Add */ \ |
| V(efdadd, EFDADD, 0x100002E0) \ |
| /* Floating-Point Double-Precision Convert from Single-Precision */ \ |
| V(efdcfs, EFDCFS, 0x100002EF) \ |
| /* Convert Floating-Point Double-Precision from Signed Fraction */ \ |
| V(efdcfsf, EFDCFSF, 0x100002F3) \ |
| /* Convert Floating-Point Double-Precision from Signed Integer */ \ |
| V(efdcfsi, EFDCFSI, 0x100002F1) \ |
| /* Convert Floating-Point Double-Precision from Signed Integer */ \ |
| /* Doubleword */ \ |
| V(efdcfsid, EFDCFSID, 0x100002E3) \ |
| /* Convert Floating-Point Double-Precision from Unsigned Fraction */ \ |
| V(efdcfuf, EFDCFUF, 0x100002F2) \ |
| /* Convert Floating-Point Double-Precision from Unsigned Integer */ \ |
| V(efdcfui, EFDCFUI, 0x100002F0) \ |
| /* Convert Floating-Point Double-Precision fromUnsigned Integer */ \ |
| /* Doubleword */ \ |
| V(efdcfuid, EFDCFUID, 0x100002E2) \ |
| /* Floating-Point Double-Precision Compare Equal */ \ |
| V(efdcmpeq, EFDCMPEQ, 0x100002EE) \ |
| /* Floating-Point Double-Precision Compare Greater Than */ \ |
| V(efdcmpgt, EFDCMPGT, 0x100002EC) \ |
| /* Floating-Point Double-Precision Compare Less Than */ \ |
| V(efdcmplt, EFDCMPLT, 0x100002ED) \ |
| /* Convert Floating-Point Double-Precision to Signed Fraction */ \ |
| V(efdctsf, EFDCTSF, 0x100002F7) \ |
| /* Convert Floating-Point Double-Precision to Signed Integer */ \ |
| V(efdctsi, EFDCTSI, 0x100002F5) \ |
| /* Convert Floating-Point Double-Precision to Signed Integer Doubleword */ \ |
| /* with Round toward Zero */ \ |
| V(efdctsidz, EFDCTSIDZ, 0x100002EB) \ |
| /* Convert Floating-Point Double-Precision to Signed Integer with Round */ \ |
| /* toward Zero */ \ |
| V(efdctsiz, EFDCTSIZ, 0x100002FA) \ |
| /* Convert Floating-Point Double-Precision to Unsigned Fraction */ \ |
| V(efdctuf, EFDCTUF, 0x100002F6) \ |
| /* Convert Floating-Point Double-Precision to Unsigned Integer */ \ |
| V(efdctui, EFDCTUI, 0x100002F4) \ |
| /* Convert Floating-Point Double-Precision to Unsigned Integer */ \ |
| /* Doubleword with Round toward Zero */ \ |
| V(efdctuidz, EFDCTUIDZ, 0x100002EA) \ |
| /* Convert Floating-Point Double-Precision to Unsigned Integer with */ \ |
| /* Round toward Zero */ \ |
| V(efdctuiz, EFDCTUIZ, 0x100002F8) \ |
| /* Floating-Point Double-Precision Divide */ \ |
| V(efddiv, EFDDIV, 0x100002E9) \ |
| /* Floating-Point Double-Precision Multiply */ \ |
| V(efdmul, EFDMUL, 0x100002E8) \ |
| /* Floating-Point Double-Precision Negative Absolute Value */ \ |
| V(efdnabs, EFDNABS, 0x100002E5) \ |
| /* Floating-Point Double-Precision Negate */ \ |
| V(efdneg, EFDNEG, 0x100002E6) \ |
| /* Floating-Point Double-Precision Subtract */ \ |
| V(efdsub, EFDSUB, 0x100002E1) \ |
| /* Floating-Point Double-Precision Test Equal */ \ |
| V(efdtsteq, EFDTSTEQ, 0x100002FE) \ |
| /* Floating-Point Double-Precision Test Greater Than */ \ |
| V(efdtstgt, EFDTSTGT, 0x100002FC) \ |
| /* Floating-Point Double-Precision Test Less Than */ \ |
| V(efdtstlt, EFDTSTLT, 0x100002FD) \ |
| /* Floating-Point Single-Precision Convert from Double-Precision */ \ |
| V(efscfd, EFSCFD, 0x100002CF) \ |
| /* Floating-Point Absolute Value */ \ |
| V(efsabs, EFSABS, 0x100002C4) \ |
| /* Floating-Point Add */ \ |
| V(efsadd, EFSADD, 0x100002C0) \ |
| /* Convert Floating-Point from Signed Fraction */ \ |
| V(efscfsf, EFSCFSF, 0x100002D3) \ |
| /* Convert Floating-Point from Signed Integer */ \ |
| V(efscfsi, EFSCFSI, 0x100002D1) \ |
| /* Convert Floating-Point from Unsigned Fraction */ \ |
| V(efscfuf, EFSCFUF, 0x100002D2) \ |
| /* Convert Floating-Point from Unsigned Integer */ \ |
| V(efscfui, EFSCFUI, 0x100002D0) \ |
| /* Floating-Point Compare Equal */ \ |
| V(efscmpeq, EFSCMPEQ, 0x100002CE) \ |
| /* Floating-Point Compare Greater Than */ \ |
| V(efscmpgt, EFSCMPGT, 0x100002CC) \ |
| /* Floating-Point Compare Less Than */ \ |
| V(efscmplt, EFSCMPLT, 0x100002CD) \ |
| /* Convert Floating-Point to Signed Fraction */ \ |
| V(efsctsf, EFSCTSF, 0x100002D7) \ |
| /* Convert Floating-Point to Signed Integer */ \ |
| V(efsctsi, EFSCTSI, 0x100002D5) \ |
| /* Convert Floating-Point to Signed Integer with Round toward Zero */ \ |
| V(efsctsiz, EFSCTSIZ, 0x100002DA) \ |
| /* Convert Floating-Point to Unsigned Fraction */ \ |
| V(efsctuf, EFSCTUF, 0x100002D6) \ |
| /* Convert Floating-Point to Unsigned Integer */ \ |
| V(efsctui, EFSCTUI, 0x100002D4) \ |
| /* Convert Floating-Point to Unsigned Integer with Round toward Zero */ \ |
| V(efsctuiz, EFSCTUIZ, 0x100002D8) \ |
| /* Floating-Point Divide */ \ |
| V(efsdiv, EFSDIV, 0x100002C9) \ |
| /* Floating-Point Multiply */ \ |
| V(efsmul, EFSMUL, 0x100002C8) \ |
| /* Floating-Point Negative Absolute Value */ \ |
| V(efsnabs, EFSNABS, 0x100002C5) \ |
| /* Floating-Point Negate */ \ |
| V(efsneg, EFSNEG, 0x100002C6) \ |
| /* Floating-Point Subtract */ \ |
| V(efssub, EFSSUB, 0x100002C1) \ |
| /* Floating-Point Test Equal */ \ |
| V(efststeq, EFSTSTEQ, 0x100002DE) \ |
| /* Floating-Point Test Greater Than */ \ |
| V(efststgt, EFSTSTGT, 0x100002DC) \ |
| /* Floating-Point Test Less Than */ \ |
| V(efststlt, EFSTSTLT, 0x100002DD) \ |
| /* Vector Floating-Point Absolute Value */ \ |
| V(evfsabs, EVFSABS, 0x10000284) \ |
| /* Vector Floating-Point Add */ \ |
| V(evfsadd, EVFSADD, 0x10000280) \ |
| /* Vector Convert Floating-Point from Signed Fraction */ \ |
| V(evfscfsf, EVFSCFSF, 0x10000293) \ |
| /* Vector Convert Floating-Point from Signed Integer */ \ |
| V(evfscfsi, EVFSCFSI, 0x10000291) \ |
| /* Vector Convert Floating-Point from Unsigned Fraction */ \ |
| V(evfscfuf, EVFSCFUF, 0x10000292) \ |
| /* Vector Convert Floating-Point from Unsigned Integer */ \ |
| V(evfscfui, EVFSCFUI, 0x10000290) \ |
| /* Vector Floating-Point Compare Equal */ \ |
| V(evfscmpeq, EVFSCMPEQ, 0x1000028E) \ |
| /* Vector Floating-Point Compare Greater Than */ \ |
| V(evfscmpgt, EVFSCMPGT, 0x1000028C) \ |
| /* Vector Floating-Point Compare Less Than */ \ |
| V(evfscmplt, EVFSCMPLT, 0x1000028D) \ |
| /* Vector Convert Floating-Point to Signed Fraction */ \ |
| V(evfsctsf, EVFSCTSF, 0x10000297) \ |
| /* Vector Convert Floating-Point to Signed Integer */ \ |
| V(evfsctsi, EVFSCTSI, 0x10000295) \ |
| /* Vector Convert Floating-Point to Signed Integer with Round toward */ \ |
| /* Zero */ \ |
| V(evfsctsiz, EVFSCTSIZ, 0x1000029A) \ |
| /* Vector Convert Floating-Point to Unsigned Fraction */ \ |
| V(evfsctuf, EVFSCTUF, 0x10000296) \ |
| /* Vector Convert Floating-Point to Unsigned Integer */ \ |
| V(evfsctui, EVFSCTUI, 0x10000294) \ |
| /* Vector Convert Floating-Point to Unsigned Integer with Round toward */ \ |
| /* Zero */ \ |
| V(evfsctuiz, EVFSCTUIZ, 0x10000298) \ |
| /* Vector Floating-Point Divide */ \ |
| V(evfsdiv, EVFSDIV, 0x10000289) \ |
| /* Vector Floating-Point Multiply */ \ |
| V(evfsmul, EVFSMUL, 0x10000288) \ |
| /* Vector Floating-Point Negative Absolute Value */ \ |
| V(evfsnabs, EVFSNABS, 0x10000285) \ |
| /* Vector Floating-Point Negate */ \ |
| V(evfsneg, EVFSNEG, 0x10000286) \ |
| /* Vector Floating-Point Subtract */ \ |
| V(evfssub, EVFSSUB, 0x10000281) \ |
| /* Vector Floating-Point Test Equal */ \ |
| V(evfststeq, EVFSTSTEQ, 0x1000029E) \ |
| /* Vector Floating-Point Test Greater Than */ \ |
| V(evfststgt, EVFSTSTGT, 0x1000029C) \ |
| /* Vector Floating-Point Test Less Than */ \ |
| V(evfststlt, EVFSTSTLT, 0x1000029D) |
| |
| #define PPC_VC_OPCODE_LIST(V) \ |
| /* Vector Compare Bounds Single-Precision */ \ |
| V(vcmpbfp, VCMPBFP, 0x100003C6) \ |
| /* Vector Compare Equal To Single-Precision */ \ |
| V(vcmpeqfp, VCMPEQFP, 0x100000C6) \ |
| /* Vector Compare Equal To Unsigned Byte */ \ |
| V(vcmpequb, VCMPEQUB, 0x10000006) \ |
| /* Vector Compare Equal To Unsigned Doubleword */ \ |
| V(vcmpequd, VCMPEQUD, 0x100000C7) \ |
| /* Vector Compare Equal To Unsigned Halfword */ \ |
| V(vcmpequh, VCMPEQUH, 0x10000046) \ |
| /* Vector Compare Equal To Unsigned Word */ \ |
| V(vcmpequw, VCMPEQUW, 0x10000086) \ |
| /* Vector Compare Greater Than or Equal To Single-Precision */ \ |
| V(vcmpgefp, VCMPGEFP, 0x100001C6) \ |
| /* Vector Compare Greater Than Single-Precision */ \ |
| V(vcmpgtfp, VCMPGTFP, 0x100002C6) \ |
| /* Vector Compare Greater Than Signed Byte */ \ |
| V(vcmpgtsb, VCMPGTSB, 0x10000306) \ |
| /* Vector Compare Greater Than Signed Doubleword */ \ |
| V(vcmpgtsd, VCMPGTSD, 0x100003C7) \ |
| /* Vector Compare Greater Than Signed Halfword */ \ |
| V(vcmpgtsh, VCMPGTSH, 0x10000346) \ |
| /* Vector Compare Greater Than Signed Word */ \ |
| V(vcmpgtsw, VCMPGTSW, 0x10000386) \ |
| /* Vector Compare Greater Than Unsigned Byte */ \ |
| V(vcmpgtub, VCMPGTUB, 0x10000206) \ |
| /* Vector Compare Greater Than Unsigned Doubleword */ \ |
| V(vcmpgtud, VCMPGTUD, 0x100002C7) \ |
| /* Vector Compare Greater Than Unsigned Halfword */ \ |
| V(vcmpgtuh, VCMPGTUH, 0x10000246) \ |
| /* Vector Compare Greater Than Unsigned Word */ \ |
| V(vcmpgtuw, VCMPGTUW, 0x10000286) |
| |
| #define PPC_X_OPCODE_A_FORM_LIST(V) \ |
| /* Modulo Signed Dword */ \ |
| V(modsd, MODSD, 0x7C000612) \ |
| /* Modulo Unsigned Dword */ \ |
| V(modud, MODUD, 0x7C000212) \ |
| /* Modulo Signed Word */ \ |
| V(modsw, MODSW, 0x7C000616) \ |
| /* Modulo Unsigned Word */ \ |
| V(moduw, MODUW, 0x7C000216) |
| |
| #define PPC_X_OPCODE_B_FORM_LIST(V) \ |
| /* XOR */ \ |
| V(xor_, XORX, 0x7C000278) \ |
| /* AND */ \ |
| V(and_, ANDX, 0x7C000038) \ |
| /* AND with Complement */ \ |
| V(andc, ANDCX, 0x7C000078) \ |
| /* OR */ \ |
| V(orx, ORX, 0x7C000378) \ |
| /* OR with Complement */ \ |
| V(orc, ORC, 0x7C000338) \ |
| /* NOR */ \ |
| V(nor, NORX, 0x7C0000F8) \ |
| /* Shift Right Word */ \ |
| V(srw, SRWX, 0x7C000430) \ |
| /* Shift Left Word */ \ |
| V(slw, SLWX, 0x7C000030) \ |
| /* Shift Right Algebraic Word */ \ |
| V(sraw, SRAW, 0x7C000630) \ |
| /* Shift Left Doubleword */ \ |
| V(sld, SLDX, 0x7C000036) \ |
| /* Shift Right Algebraic Doubleword */ \ |
| V(srad, SRAD, 0x7C000634) \ |
| /* Shift Right Doubleword */ \ |
| V(srd, SRDX, 0x7C000436) |
| |
| #define PPC_X_OPCODE_C_FORM_LIST(V) \ |
| /* Count Leading Zeros Word */ \ |
| V(cntlzw, CNTLZWX, 0x7C000034) \ |
| /* Count Leading Zeros Doubleword */ \ |
| V(cntlzd, CNTLZDX, 0x7C000074) \ |
| /* Population Count Byte-wise */ \ |
| V(popcntb, POPCNTB, 0x7C0000F4) \ |
| /* Population Count Words */ \ |
| V(popcntw, POPCNTW, 0x7C0002F4) \ |
| /* Population Count Doubleword */ \ |
| V(popcntd, POPCNTD, 0x7C0003F4) \ |
| /* Extend Sign Byte */ \ |
| V(extsb, EXTSB, 0x7C000774) \ |
| /* Extend Sign Halfword */ \ |
| V(extsh, EXTSH, 0x7C000734) |
| |
| #define PPC_X_OPCODE_D_FORM_LIST(V) \ |
| /* Load Halfword Byte-Reverse Indexed */ \ |
| V(lhbrx, LHBRX, 0x7C00062C) \ |
| /* Load Word Byte-Reverse Indexed */ \ |
| V(lwbrx, LWBRX, 0x7C00042C) \ |
| /* Load Doubleword Byte-Reverse Indexed */ \ |
| V(ldbrx, LDBRX, 0x7C000428) \ |
| /* Load Byte and Zero Indexed */ \ |
| V(lbzx, LBZX, 0x7C0000AE) \ |
| /* Load Byte and Zero with Update Indexed */ \ |
| V(lbzux, LBZUX, 0x7C0000EE) \ |
| /* Load Halfword and Zero Indexed */ \ |
| V(lhzx, LHZX, 0x7C00022E) \ |
| /* Load Halfword and Zero with Update Indexed */ \ |
| V(lhzux, LHZUX, 0x7C00026E) \ |
| /* Load Halfword Algebraic Indexed */ \ |
| V(lhax, LHAX, 0x7C0002AE) \ |
| /* Load Word and Zero Indexed */ \ |
| V(lwzx, LWZX, 0x7C00002E) \ |
| /* Load Word and Zero with Update Indexed */ \ |
| V(lwzux, LWZUX, 0x7C00006E) \ |
| /* Load Doubleword Indexed */ \ |
| V(ldx, LDX, 0x7C00002A) \ |
| /* Load Doubleword with Update Indexed */ \ |
| V(ldux, LDUX, 0x7C00006A) \ |
| /* Load Floating-Point Double Indexed */ \ |
| V(lfdx, LFDX, 0x7C0004AE) \ |
| /* Load Floating-Point Single Indexed */ \ |
| V(lfsx, LFSX, 0x7C00042E) \ |
| /* Load Floating-Point Double with Update Indexed */ \ |
| V(lfdux, LFDUX, 0x7C0004EE) \ |
| /* Load Floating-Point Single with Update Indexed */ \ |
| V(lfsux, LFSUX, 0x7C00046E) \ |
| /* Store Byte with Update Indexed */ \ |
| V(stbux, STBUX, 0x7C0001EE) \ |
| /* Store Byte Indexed */ \ |
| V(stbx, STBX, 0x7C0001AE) \ |
| /* Store Halfword with Update Indexed */ \ |
| V(sthux, STHUX, 0x7C00036E) \ |
| /* Store Halfword Indexed */ \ |
| V(sthx, STHX, 0x7C00032E) \ |
| /* Store Word with Update Indexed */ \ |
| V(stwux, STWUX, 0x7C00016E) \ |
| /* Store Word Indexed */ \ |
| V(stwx, STWX, 0x7C00012E) \ |
| /* Store Doubleword with Update Indexed */ \ |
| V(stdux, STDUX, 0x7C00016A) \ |
| /* Store Doubleword Indexed */ \ |
| V(stdx, STDX, 0x7C00012A) \ |
| /* Store Floating-Point Double with Update Indexed */ \ |
| V(stfdux, STFDUX, 0x7C0005EE) \ |
| /* Store Floating-Point Double Indexed */ \ |
| V(stfdx, STFDX, 0x7C0005AE) \ |
| /* Store Floating-Point Single with Update Indexed */ \ |
| V(stfsux, STFSUX, 0x7C00056E) \ |
| /* Store Floating-Point Single Indexed */ \ |
| V(stfsx, STFSX, 0x7C00052E) \ |
| /* Load Vector Indexed */ \ |
| V(lvx, LVX, 0x7C0000CE) \ |
| /* Store Vector Indexed */ \ |
| V(stvx, STVX, 0x7C0001CE) |
| |
| #define PPC_X_OPCODE_E_FORM_LIST(V) \ |
| /* Shift Right Algebraic Word Immediate */ \ |
| V(srawi, SRAWIX, 0x7C000670) |
| |
| #define PPC_X_OPCODE_F_FORM_LIST(V) \ |
| /* Compare */ \ |
| V(cmp, CMP, 0x7C000000) \ |
| /* Compare Logical */ \ |
| V(cmpl, CMPL, 0x7C000040) |
| |
| #define PPC_X_OPCODE_EH_S_FORM_LIST(V) \ |
| /* Store Byte Conditional Indexed */ \ |
| V(stbcx, STBCX, 0x7C00056D) \ |
| /* Store Halfword Conditional Indexed Xform */ \ |
| V(sthcx, STHCX, 0x7C0005AD) \ |
| /* Store Word Conditional Indexed & record CR0 */ \ |
| V(stwcx, STWCX, 0x7C00012D) \ |
| /* Store Doubleword Conditional Indexed & record CR0 */ \ |
| V(stdcx, STDCX, 0x7C0001AD) |
| |
| #define PPC_X_OPCODE_EH_L_FORM_LIST(V) \ |
| /* Load Byte And Reserve Indexed */ \ |
| V(lbarx, LBARX, 0x7C000068) \ |
| /* Load Halfword And Reserve Indexed Xform */ \ |
| V(lharx, LHARX, 0x7C0000E8) \ |
| /* Load Word and Reserve Indexed */ \ |
| V(lwarx, LWARX, 0x7C000028) \ |
| /* Load Doubleword And Reserve Indexed */ \ |
| V(ldarx, LDARX, 0x7C0000A8) |
| |
| #define PPC_X_OPCODE_UNUSED_LIST(V) \ |
| /* Bit Permute Doubleword */ \ |
| V(bpermd, BPERMD, 0x7C0001F8) \ |
| /* Extend Sign Word */ \ |
| V(extsw, EXTSW, 0x7C0007B4) \ |
| /* Load Word Algebraic with Update Indexed */ \ |
| V(lwaux, LWAUX, 0x7C0002EA) \ |
| /* Load Word Algebraic Indexed */ \ |
| V(lwax, LWAX, 0x7C0002AA) \ |
| /* Parity Doubleword */ \ |
| V(prtyd, PRTYD, 0x7C000174) \ |
| /* Store Doubleword Byte-Reverse Indexed */ \ |
| V(stdbrx, STDBRX, 0x7C000528) \ |
| /* Trap Doubleword */ \ |
| V(td, TD, 0x7C000088) \ |
| /* Branch Conditional to Branch Target Address Register */ \ |
| V(bctar, BCTAR, 0x4C000460) \ |
| /* Compare Byte */ \ |
| V(cmpb, CMPB, 0x7C0003F8) \ |
| /* Data Cache Block Flush */ \ |
| V(dcbf, DCBF, 0x7C0000AC) \ |
| /* Data Cache Block Store */ \ |
| V(dcbst, DCBST, 0x7C00006C) \ |
| /* Data Cache Block Touch */ \ |
| V(dcbt, DCBT, 0x7C00022C) \ |
| /* Data Cache Block Touch for Store */ \ |
| V(dcbtst, DCBTST, 0x7C0001EC) \ |
| /* Data Cache Block Zero */ \ |
| V(dcbz, DCBZ, 0x7C0007EC) \ |
| /* Equivalent */ \ |
| V(eqv, EQV, 0x7C000238) \ |
| /* Instruction Cache Block Invalidate */ \ |
| V(icbi, ICBI, 0x7C0007AC) \ |
| /* NAND */ \ |
| V(nand, NAND, 0x7C0003B8) \ |
| /* Parity Word */ \ |
| V(prtyw, PRTYW, 0x7C000134) \ |
| /* Store Halfword Byte-Reverse Indexed */ \ |
| V(sthbrx, STHBRX, 0x7C00072C) \ |
| /* Store Word Byte-Reverse Indexed */ \ |
| V(stwbrx, STWBRX, 0x7C00052C) \ |
| /* Synchronize */ \ |
| V(sync, SYNC, 0x7C0004AC) \ |
| /* Trap Word */ \ |
| V(tw, TW, 0x7C000008) \ |
| /* ExecuExecuted No Operation */ \ |
| V(xnop, XNOP, 0x68000000) \ |
| /* Convert Binary Coded Decimal To Declets */ \ |
| V(cbcdtd, CBCDTD, 0x7C000274) \ |
| /* Convert Declets To Binary Coded Decimal */ \ |
| V(cdtbcd, CDTBCD, 0x7C000234) \ |
| /* Decimal Floating Add */ \ |
| V(dadd, DADD, 0xEC000004) \ |
| /* Decimal Floating Add Quad */ \ |
| V(daddq, DADDQ, 0xFC000004) \ |
| /* Decimal Floating Convert From Fixed */ \ |
| V(dcffix, DCFFIX, 0xEC000644) \ |
| /* Decimal Floating Convert From Fixed Quad */ \ |
| V(dcffixq, DCFFIXQ, 0xFC000644) \ |
| /* Decimal Floating Compare Ordered */ \ |
| V(dcmpo, DCMPO, 0xEC000104) \ |
| /* Decimal Floating Compare Ordered Quad */ \ |
| V(dcmpoq, DCMPOQ, 0xFC000104) \ |
| /* Decimal Floating Compare Unordered */ \ |
| V(dcmpu, DCMPU, 0xEC000504) \ |
| /* Decimal Floating Compare Unordered Quad */ \ |
| V(dcmpuq, DCMPUQ, 0xFC000504) \ |
| /* Decimal Floating Convert To DFP Long */ \ |
| V(dctdp, DCTDP, 0xEC000204) \ |
| /* Decimal Floating Convert To Fixed */ \ |
| V(dctfix, DCTFIX, 0xEC000244) \ |
| /* Decimal Floating Convert To Fixed Quad */ \ |
| V(dctfixq, DCTFIXQ, 0xFC000244) \ |
| /* Decimal Floating Convert To DFP Extended */ \ |
| V(dctqpq, DCTQPQ, 0xFC000204) \ |
| /* Decimal Floating Decode DPD To BCD */ \ |
| V(ddedpd, DDEDPD, 0xEC000284) \ |
| /* Decimal Floating Decode DPD To BCD Quad */ \ |
| V(ddedpdq, DDEDPDQ, 0xFC000284) \ |
| /* Decimal Floating Divide */ \ |
| V(ddiv, DDIV, 0xEC000444) \ |
| /* Decimal Floating Divide Quad */ \ |
| V(ddivq, DDIVQ, 0xFC000444) \ |
| /* Decimal Floating Encode BCD To DPD */ \ |
| V(denbcd, DENBCD, 0xEC000684) \ |
| /* Decimal Floating Encode BCD To DPD Quad */ \ |
| V(denbcdq, DENBCDQ, 0xFC000684) \ |
| /* Decimal Floating Insert Exponent */ \ |
| V(diex, DIEX, 0xEC0006C4) \ |
| /* Decimal Floating Insert Exponent Quad */ \ |
| V(diexq, DIEXQ, 0xFC0006C4) \ |
| /* Decimal Floating Multiply */ \ |
| V(dmul, DMUL, 0xEC000044) \ |
| /* Decimal Floating Multiply Quad */ \ |
| V(dmulq, DMULQ, 0xFC000044) \ |
| /* Decimal Floating Round To DFP Long */ \ |
| V(drdpq, DRDPQ, 0xFC000604) \ |
| /* Decimal Floating Round To DFP Short */ \ |
| V(drsp, DRSP, 0xEC000604) \ |
| /* Decimal Floating Subtract */ \ |
| V(dsub, DSUB, 0xEC000404) \ |
| /* Decimal Floating Subtract Quad */ \ |
| V(dsubq, DSUBQ, 0xFC000404) \ |
| /* Decimal Floating Test Exponent */ \ |
| V(dtstex, DTSTEX, 0xEC000144) \ |
| /* Decimal Floating Test Exponent Quad */ \ |
| V(dtstexq, DTSTEXQ, 0xFC000144) \ |
| /* Decimal Floating Test Significance */ \ |
| V(dtstsf, DTSTSF, 0xEC000544) \ |
| /* Decimal Floating Test Significance Quad */ \ |
| V(dtstsfq, DTSTSFQ, 0xFC000544) \ |
| /* Decimal Floating Extract Exponent */ \ |
| V(dxex, DXEX, 0xEC0002C4) \ |
| /* Decimal Floating Extract Exponent Quad */ \ |
| V(dxexq, DXEXQ, 0xFC0002C4) \ |
| /* Decorated Storage Notify */ \ |
| V(dsn, DSN, 0x7C0003C6) \ |
| /* Load Byte with Decoration Indexed */ \ |
| V(lbdx, LBDX, 0x7C000406) \ |
| /* Load Doubleword with Decoration Indexed */ \ |
| V(lddx, LDDX, 0x7C0004C6) \ |
| /* Load Floating Doubleword with Decoration Indexed */ \ |
| V(lfddx, LFDDX, 0x7C000646) \ |
| /* Load Halfword with Decoration Indexed */ \ |
| V(lhdx, LHDX, 0x7C000446) \ |
| /* Load Word with Decoration Indexed */ \ |
| V(lwdx, LWDX, 0x7C000486) \ |
| /* Store Byte with Decoration Indexed */ \ |
| V(stbdx, STBDX, 0x7C000506) \ |
| /* Store Doubleword with Decoration Indexed */ \ |
| V(stddx, STDDX, 0x7C0005C6) \ |
| /* Store Floating Doubleword with Decoration Indexed */ \ |
| V(stfddx, STFDDX, 0x7C000746) \ |
| /* Store Halfword with Decoration Indexed */ \ |
| V(sthdx, STHDX, 0x7C000546) \ |
| /* Store Word with Decoration Indexed */ \ |
| V(stwdx, STWDX, 0x7C000586) \ |
| /* Data Cache Block Allocate */ \ |
| V(dcba, DCBA, 0x7C0005EC) \ |
| /* Data Cache Block Invalidate */ \ |
| V(dcbi, DCBI, 0x7C0003AC) \ |
| /* Instruction Cache Block Touch */ \ |
| V(icbt, ICBT, 0x7C00002C) \ |
| /* Move to Condition Register from XER */ \ |
| V(mcrxr, MCRXR, 0x7C000400) \ |
| /* TLB Invalidate Local Indexed */ \ |
| V(tlbilx, TLBILX, 0x7C000024) \ |
| /* TLB Invalidate Virtual Address Indexed */ \ |
| V(tlbivax, TLBIVAX, 0x7C000624) \ |
| /* TLB Read Entry */ \ |
| V(tlbre, TLBRE, 0x7C000764) \ |
| /* TLB Search Indexed */ \ |
| V(tlbsx, TLBSX, 0x7C000724) \ |
| /* TLB Write Entry */ \ |
| V(tlbwe, TLBWE, 0x7C0007A4) \ |
| /* Write External Enable */ \ |
| V(wrtee, WRTEE, 0x7C000106) \ |
| /* Write External Enable Immediate */ \ |
| V(wrteei, WRTEEI, 0x7C000146) \ |
| /* Data Cache Read */ \ |
| V(dcread, DCREAD, 0x7C00028C) \ |
| /* Instruction Cache Read */ \ |
| V(icread, ICREAD, 0x7C0007CC) \ |
| /* Data Cache Invalidate */ \ |
| V(dci, DCI, 0x7C00038C) \ |
| /* Instruction Cache Invalidate */ \ |
| V(ici, ICI, 0x7C00078C) \ |
| /* Move From Device Control Register User Mode Indexed */ \ |
| V(mfdcrux, MFDCRUX, 0x7C000246) \ |
| /* Move From Device Control Register Indexed */ \ |
| V(mfdcrx, MFDCRX, 0x7C000206) \ |
| /* Move To Device Control Register User Mode Indexed */ \ |
| V(mtdcrux, MTDCRUX, 0x7C000346) \ |
| /* Move To Device Control Register Indexed */ \ |
| V(mtdcrx, MTDCRX, 0x7C000306) \ |
| /* Return From Debug Interrupt */ \ |
| V(rfdi, RFDI, 0x4C00004E) \ |
| /* Data Cache Block Flush by External PID */ \ |
| V(dcbfep, DCBFEP, 0x7C0000FE) \ |
| /* Data Cache Block Store by External PID */ \ |
| V(dcbstep, DCBSTEP, 0x7C00007E) \ |
| /* Data Cache Block Touch by External PID */ \ |
| V(dcbtep, DCBTEP, 0x7C00027E) \ |
| /* Data Cache Block Touch for Store by External PID */ \ |
| V(dcbtstep, DCBTSTEP, 0x7C0001FE) \ |
| /* Data Cache Block Zero by External PID */ \ |
| V(dcbzep, DCBZEP, 0x7C0007FE) \ |
| /* Instruction Cache Block Invalidate by External PID */ \ |
| V(icbiep, ICBIEP, 0x7C0007BE) \ |
| /* Load Byte and Zero by External PID Indexed */ \ |
| V(lbepx, LBEPX, 0x7C0000BE) \ |
| /* Load Floating-Point Double by External PID Indexed */ \ |
| V(lfdepx, LFDEPX, 0x7C0004BE) \ |
| /* Load Halfword and Zero by External PID Indexed */ \ |
| V(lhepx, LHEPX, 0x7C00023E) \ |
| /* Load Vector by External PID Indexed */ \ |
| V(lvepx, LVEPX, 0x7C00024E) \ |
| /* Load Vector by External PID Indexed Last */ \ |
| V(lvepxl, LVEPXL, 0x7C00020E) \ |
| /* Load Word and Zero by External PID Indexed */ \ |
| V(lwepx, LWEPX, 0x7C00003E) \ |
| /* Store Byte by External PID Indexed */ \ |
| V(stbepx, STBEPX, 0x7C0001BE) \ |
| /* Store Floating-Point Double by External PID Indexed */ \ |
| V(stfdepx, STFDEPX, 0x7C0005BE) \ |
| /* Store Halfword by External PID Indexed */ \ |
| V(sthepx, STHEPX, 0x7C00033E) \ |
| /* Store Vector by External PID Indexed */ \ |
| V(stvepx, STVEPX, 0x7C00064E) \ |
| /* Store Vector by External PID Indexed Last */ \ |
| V(stvepxl, STVEPXL, 0x7C00060E) \ |
| /* Store Word by External PID Indexed */ \ |
| V(stwepx, STWEPX, 0x7C00013E) \ |
| /* Load Doubleword by External PID Indexed */ \ |
| V(ldepx, LDEPX, 0x7C00003A) \ |
| /* Store Doubleword by External PID Indexed */ \ |
| V(stdepx, STDEPX, 0x7C00013A) \ |
| /* TLB Search and Reserve Indexed */ \ |
| V(tlbsrx, TLBSRX, 0x7C0006A5) \ |
| /* External Control In Word Indexed */ \ |
| V(eciwx, ECIWX, 0x7C00026C) \ |
| /* External Control Out Word Indexed */ \ |
| V(ecowx, ECOWX, 0x7C00036C) \ |
| /* Data Cache Block Lock Clear */ \ |
| V(dcblc, DCBLC, 0x7C00030C) \ |
| /* Data Cache Block Lock Query */ \ |
| V(dcblq, DCBLQ, 0x7C00034D) \ |
| /* Data Cache Block Touch and Lock Set */ \ |
| V(dcbtls, DCBTLS, 0x7C00014C) \ |
| /* Data Cache Block Touch for Store and Lock Set */ \ |
| V(dcbtstls, DCBTSTLS, 0x7C00010C) \ |
| /* Instruction Cache Block Lock Clear */ \ |
| V(icblc, ICBLC, 0x7C0001CC) \ |
| /* Instruction Cache Block Lock Query */ \ |
| V(icblq, ICBLQ, 0x7C00018D) \ |
| /* Instruction Cache Block Touch and Lock Set */ \ |
| V(icbtls, ICBTLS, 0x7C0003CC) \ |
| /* Floating Compare Ordered */ \ |
| V(fcmpo, FCMPO, 0xFC000040) \ |
| /* Floating Compare Unordered */ \ |
| V(fcmpu, FCMPU, 0xFC000000) \ |
| /* Floating Test for software Divide */ \ |
| V(ftdiv, FTDIV, 0xFC000100) \ |
| /* Floating Test for software Square Root */ \ |
| V(ftsqrt, FTSQRT, 0xFC000140) \ |
| /* Load Floating-Point as Integer Word Algebraic Indexed */ \ |
| V(lfiwax, LFIWAX, 0x7C0006AE) \ |
| /* Load Floating-Point as Integer Word and Zero Indexed */ \ |
| V(lfiwzx, LFIWZX, 0x7C0006EE) \ |
| /* Move To Condition Register from FPSCR */ \ |
| V(mcrfs, MCRFS, 0xFC000080) \ |
| /* Store Floating-Point as Integer Word Indexed */ \ |
| V(stfiwx, STFIWX, 0x7C0007AE) \ |
| /* Load Floating-Point Double Pair Indexed */ \ |
| V(lfdpx, LFDPX, 0x7C00062E) \ |
| /* Store Floating-Point Double Pair Indexed */ \ |
| V(stfdpx, STFDPX, 0x7C00072E) \ |
| /* Floating Absolute Value */ \ |
| V(fabs, FABS, 0xFC000210) \ |
| /* Floating Convert From Integer Doubleword */ \ |
| V(fcfid, FCFID, 0xFC00069C) \ |
| /* Floating Convert From Integer Doubleword Single */ \ |
| V(fcfids, FCFIDS, 0xEC00069C) \ |
| /* Floating Convert From Integer Doubleword Unsigned */ \ |
| V(fcfidu, FCFIDU, 0xFC00079C) \ |
| /* Floating Convert From Integer Doubleword Unsigned Single */ \ |
| V(fcfidus, FCFIDUS, 0xEC00079C) \ |
| /* Floating Copy Sign */ \ |
| V(fcpsgn, FCPSGN, 0xFC000010) \ |
| /* Floating Convert To Integer Doubleword */ \ |
| V(fctid, FCTID, 0xFC00065C) \ |
| /* Floating Convert To Integer Doubleword Unsigned */ \ |
| V(fctidu, FCTIDU, 0xFC00075C) \ |
| /* Floating Convert To Integer Doubleword Unsigned with round toward */ \ |
| /* Zero */ \ |
| V(fctiduz, FCTIDUZ, 0xFC00075E) \ |
| /* Floating Convert To Integer Doubleword with round toward Zero */ \ |
| V(fctidz, FCTIDZ, 0xFC00065E) \ |
| /* Floating Convert To Integer Word */ \ |
| V(fctiw, FCTIW, 0xFC00001C) \ |
| /* Floating Convert To Integer Word Unsigned */ \ |
| V(fctiwu, FCTIWU, 0xFC00011C) \ |
| /* Floating Convert To Integer Word Unsigned with round toward Zero */ \ |
| V(fctiwuz, FCTIWUZ, 0xFC00011E) \ |
| /* Floating Convert To Integer Word with round to Zero */ \ |
| V(fctiwz, FCTIWZ, 0xFC00001E) \ |
| /* Floating Move Register */ \ |
| V(fmr, FMR, 0xFC000090) \ |
| /* Floating Negative Absolute Value */ \ |
| V(fnabs, FNABS, 0xFC000110) \ |
| /* Floating Negate */ \ |
| V(fneg, FNEG, 0xFC000050) \ |
| /* Floating Round to Single-Precision */ \ |
| V(frsp, FRSP, 0xFC000018) \ |
| /* Move From FPSCR */ \ |
| V(mffs, MFFS, 0xFC00048E) \ |
| /* Move To FPSCR Bit 0 */ \ |
| V(mtfsb0, MTFSB0, 0xFC00008C) \ |
| /* Move To FPSCR Bit 1 */ \ |
| V(mtfsb1, MTFSB1, 0xFC00004C) \ |
| /* Move To FPSCR Field Immediate */ \ |
| V(mtfsfi, MTFSFI, 0xFC00010C) \ |
| /* Floating Round To Integer Minus */ \ |
| V(frim, FRIM, 0xFC0003D0) \ |
| /* Floating Round To Integer Nearest */ \ |
| V(frin, FRIN, 0xFC000310) \ |
| /* Floating Round To Integer Plus */ \ |
| V(frip, FRIP, 0xFC000390) \ |
| /* Floating Round To Integer toward Zero */ \ |
| V(friz, FRIZ, 0xFC000350) \ |
| /* Multiply Cross Halfword to Word Signed */ \ |
| V(mulchw, MULCHW, 0x10000150) \ |
| /* Multiply Cross Halfword to Word Unsigned */ \ |
| V(mulchwu, MULCHWU, 0x10000110) \ |
| /* Multiply High Halfword to Word Signed */ \ |
| V(mulhhw, MULHHW, 0x10000050) \ |
| /* Multiply High Halfword to Word Unsigned */ \ |
| V(mulhhwu, MULHHWU, 0x10000010) \ |
| /* Multiply Low Halfword to Word Signed */ \ |
| V(mullhw, MULLHW, 0x10000350) \ |
| /* Multiply Low Halfword to Word Unsigned */ \ |
| V(mullhwu, MULLHWU, 0x10000310) \ |
| /* Determine Leftmost Zero Byte DQ 56 E0000000 P 58 LSQ lq Load Quadword */ \ |
| V(dlmzb, DLMZB, 0x7C00009C) \ |
| /* Load Quadword And Reserve Indexed */ \ |
| V(lqarx, LQARX, 0x7C000228) \ |
| /* Store Quadword Conditional Indexed and record CR0 */ \ |
| V(stqcx, STQCX, 0x7C00016D) \ |
| /* Load String Word Immediate */ \ |
| V(lswi, LSWI, 0x7C0004AA) \ |
| /* Load String Word Indexed */ \ |
| V(lswx, LSWX, 0x7C00042A) \ |
| /* Store String Word Immediate */ \ |
| V(stswi, STSWI, 0x7C0005AA) \ |
| /* Store String Word Indexed */ \ |
| V(stswx, STSWX, 0x7C00052A) \ |
| /* Clear BHRB */ \ |
| V(clrbhrb, CLRBHRB, 0x7C00035C) \ |
| /* Enforce In-order Execution of I/O */ \ |
| V(eieio, EIEIO, 0x7C0006AC) \ |
| /* Load Byte and Zero Caching Inhibited Indexed */ \ |
| V(lbzcix, LBZCIX, 0x7C0006AA) \ |
| /* Load Doubleword Caching Inhibited Indexed */ \ |
| V(ldcix, LDCIX, 0x7C0006EA) \ |
| /* Load Halfword and Zero Caching Inhibited Indexed */ \ |
| V(lhzcix, LHZCIX, 0x7C00066A) \ |
| /* Load Word and Zero Caching Inhibited Indexed */ \ |
| V(lwzcix, LWZCIX, 0x7C00062A) \ |
| /* Move From Segment Register */ \ |
| V(mfsr, MFSR, 0x7C0004A6) \ |
| /* Move From Segment Register Indirect */ \ |
| V(mfsrin, MFSRIN, 0x7C000526) \ |
| /* Move To Machine State Register Doubleword */ \ |
| V(mtmsrd, MTMSRD, 0x7C000164) \ |
| /* Move To Split Little Endian */ \ |
| V(mtsle, MTSLE, 0x7C000126) \ |
| /* Move To Segment Register */ \ |
| V(mtsr, MTSR, 0x7C0001A4) \ |
| /* Move To Segment Register Indirect */ \ |
| V(mtsrin, MTSRIN, 0x7C0001E4) \ |
| /* SLB Find Entry ESID */ \ |
| V(slbfee, SLBFEE, 0x7C0007A7) \ |
| /* SLB Invalidate All */ \ |
| V(slbia, SLBIA, 0x7C0003E4) \ |
| /* SLB Invalidate Entry */ \ |
| V(slbie, SLBIE, 0x7C000364) \ |
| /* SLB Move From Entry ESID */ \ |
| V(slbmfee, SLBMFEE, 0x7C000726) \ |
| /* SLB Move From Entry VSID */ \ |
| V(slbmfev, SLBMFEV, 0x7C0006A6) \ |
| /* SLB Move To Entry */ \ |
| V(slbmte, SLBMTE, 0x7C000324) \ |
| /* Store Byte Caching Inhibited Indexed */ \ |
| V(stbcix, STBCIX, 0x7C0007AA) \ |
| /* Store Doubleword Caching Inhibited Indexed */ \ |
| V(stdcix, STDCIX, 0x7C0007EA) \ |
| /* Store Halfword and Zero Caching Inhibited Indexed */ \ |
| V(sthcix, STHCIX, 0x7C00076A) \ |
| /* Store Word and Zero Caching Inhibited Indexed */ \ |
| V(stwcix, STWCIX, 0x7C00072A) \ |
| /* TLB Invalidate All */ \ |
| V(tlbia, TLBIA, 0x7C0002E4) \ |
| /* TLB Invalidate Entry */ \ |
| V(tlbie, TLBIE, 0x7C000264) \ |
| /* TLB Invalidate Entry Local */ \ |
| V(tlbiel, TLBIEL, 0x7C000224) \ |
| /* Message Clear Privileged */ \ |
| V(msgclrp, MSGCLRP, 0x7C00015C) \ |
| /* Message Send Privileged */ \ |
| V(msgsndp, MSGSNDP, 0x7C00011C) \ |
| /* Message Clear */ \ |
| V(msgclr, MSGCLR, 0x7C0001DC) \ |
| /* Message Send */ \ |
| V(msgsnd, MSGSND, 0x7C00019C) \ |
| /* Move From Machine State Register */ \ |
| V(mfmsr, MFMSR, 0x7C0000A6) \ |
| /* Move To Machine State Register */ \ |
| V(mtmsr, MTMSR, 0x7C000124) \ |
| /* TLB Synchronize */ \ |
| V(tlbsync, TLBSYNC, 0x7C00046C) \ |
| /* Transaction Abort */ \ |
| V(tabort, TABORT, 0x7C00071D) \ |
| /* Transaction Abort Doubleword Conditional */ \ |
| V(tabortdc, TABORTDC, 0x7C00065D) \ |
| /* Transaction Abort Doubleword Conditional Immediate */ \ |
| V(tabortdci, TABORTDCI, 0x7C0006DD) \ |
| /* Transaction Abort Word Conditional */ \ |
| V(tabortwc, TABORTWC, 0x7C00061D) \ |
| /* Transaction Abort Word Conditional Immediate */ \ |
| V(tabortwci, TABORTWCI, 0x7C00069D) \ |
| /* Transaction Begin */ \ |
| V(tbegin, TBEGIN, 0x7C00051D) \ |
| /* Transaction Check */ \ |
| V(tcheck, TCHECK, 0x7C00059C) \ |
| /* Transaction End */ \ |
| V(tend, TEND, 0x7C00055C) \ |
| /* Transaction Recheckpoint */ \ |
| V(trechkpt, TRECHKPT, 0x7C0007DD) \ |
| /* Transaction Reclaim */ \ |
| V(treclaim, TRECLAIM, 0x7C00075D) \ |
| /* Transaction Suspend or Resume */ \ |
| V(tsr, TSR, 0x7C0005DC) \ |
| /* Load Vector Element Byte Indexed */ \ |
| V(lvebx, LVEBX, 0x7C00000E) \ |
| /* Load Vector Element Halfword Indexed */ \ |
| V(lvehx, LVEHX, 0x7C00004E) \ |
| /* Load Vector Element Word Indexed */ \ |
| V(lvewx, LVEWX, 0x7C00008E) \ |
| /* Load Vector for Shift Left */ \ |
| V(lvsl, LVSL, 0x7C00000C) \ |
| /* Load Vector for Shift Right */ \ |
| V(lvsr, LVSR, 0x7C00004C) \ |
| /* Load Vector Indexed Last */ \ |
| V(lvxl, LVXL, 0x7C0002CE) \ |
| /* Store Vector Element Byte Indexed */ \ |
| V(stvebx, STVEBX, 0x7C00010E) \ |
| /* Store Vector Element Halfword Indexed */ \ |
| V(stvehx, STVEHX, 0x7C00014E) \ |
| /* Store Vector Element Word Indexed */ \ |
| V(stvewx, STVEWX, 0x7C00018E) \ |
| /* Store Vector Indexed Last */ \ |
| V(stvxl, STVXL, 0x7C0003CE) \ |
| /* Floating Merge Even Word */ \ |
| V(fmrgew, FMRGEW, 0xFC00078C) \ |
| /* Floating Merge Odd Word */ \ |
| V(fmrgow, FMRGOW, 0xFC00068C) \ |
| /* Wait for Interrupt */ \ |
| V(wait, WAIT, 0x7C00007C) |
| |
| #define PPC_X_OPCODE_LIST(V) \ |
| PPC_X_OPCODE_A_FORM_LIST(V) \ |
| PPC_X_OPCODE_B_FORM_LIST(V) \ |
| PPC_X_OPCODE_C_FORM_LIST(V) \ |
| PPC_X_OPCODE_D_FORM_LIST(V) \ |
| PPC_X_OPCODE_E_FORM_LIST(V) \ |
| PPC_X_OPCODE_F_FORM_LIST(V) \ |
| PPC_X_OPCODE_EH_L_FORM_LIST(V) \ |
| PPC_X_OPCODE_UNUSED_LIST(V) |
| |
| #define PPC_EVS_OPCODE_LIST(V) \ |
| /* Vector Select */ \ |
| V(evsel, EVSEL, 0x10000278) |
| |
| #define PPC_DS_OPCODE_LIST(V) \ |
| /* Load Doubleword */ \ |
| V(ld, LD, 0xE8000000) \ |
| /* Load Doubleword with Update */ \ |
| V(ldu, LDU, 0xE8000001) \ |
| /* Load Word Algebraic */ \ |
| V(lwa, LWA, 0xE8000002) \ |
| /* Store Doubleword */ \ |
| V(std, STD, 0xF8000000) \ |
| /* Store Doubleword with Update */ \ |
| V(stdu, STDU, 0xF8000001) \ |
| /* Load Floating-Point Double Pair */ \ |
| V(lfdp, LFDP, 0xE4000000) \ |
| /* Store Floating-Point Double Pair */ \ |
| V(stfdp, STFDP, 0xF4000000) \ |
| /* Store Quadword */ \ |
| V(stq, STQ, 0xF8000002) |
| |
| #define PPC_DQ_OPCODE_LIST(V) V(lsq, LSQ, 0xE0000000) |
| |
| #define PPC_D_OPCODE_LIST(V) \ |
| /* Trap Doubleword Immediate */ \ |
| V(tdi, TDI, 0x08000000) \ |
| /* Add Immediate */ \ |
| V(addi, ADDI, 0x38000000) \ |
| /* Add Immediate Carrying */ \ |
| V(addic, ADDIC, 0x30000000) \ |
| /* Add Immediate Carrying & record CR0 */ \ |
| V(addicx, ADDICx, 0x34000000) \ |
| /* Add Immediate Shifted */ \ |
| V(addis, ADDIS, 0x3C000000) \ |
| /* AND Immediate & record CR0 */ \ |
| V(andix, ANDIx, 0x70000000) \ |
| /* AND Immediate Shifted & record CR0 */ \ |
| V(andisx, ANDISx, 0x74000000) \ |
| /* Compare Immediate */ \ |
| V(cmpi, CMPI, 0x2C000000) \ |
| /* Compare Logical Immediate */ \ |
| V(cmpli, CMPLI, 0x28000000) \ |
| /* Load Byte and Zero */ \ |
| V(lbz, LBZ, 0x88000000) \ |
| /* Load Byte and Zero with Update */ \ |
| V(lbzu, LBZU, 0x8C000000) \ |
| /* Load Halfword Algebraic */ \ |
| V(lha, LHA, 0xA8000000) \ |
| /* Load Halfword Algebraic with Update */ \ |
| V(lhau, LHAU, 0xAC000000) \ |
| /* Load Halfword and Zero */ \ |
| V(lhz, LHZ, 0xA0000000) \ |
| /* Load Halfword and Zero with Update */ \ |
| V(lhzu, LHZU, 0xA4000000) \ |
| /* Load Multiple Word */ \ |
| V(lmw, LMW, 0xB8000000) \ |
| /* Load Word and Zero */ \ |
| V(lwz, LWZ, 0x80000000) \ |
| /* Load Word and Zero with Update */ \ |
| V(lwzu, LWZU, 0x84000000) \ |
| /* Multiply Low Immediate */ \ |
| V(mulli, MULLI, 0x1C000000) \ |
| /* OR Immediate */ \ |
| V(ori, ORI, 0x60000000) \ |
| /* OR Immediate Shifted */ \ |
| V(oris, ORIS, 0x64000000) \ |
| /* Store Byte */ \ |
| V(stb, STB, 0x98000000) \ |
| /* Store Byte with Update */ \ |
| V(stbu, STBU, 0x9C000000) \ |
| /* Store Halfword */ \ |
| V(sth, STH, 0xB0000000) \ |
| /* Store Halfword with Update */ \ |
| V(sthu, STHU, 0xB4000000) \ |
| /* Store Multiple Word */ \ |
| V(stmw, STMW, 0xBC000000) \ |
| /* Store Word */ \ |
| V(stw, STW, 0x90000000) \ |
| /* Store Word with Update */ \ |
| V(stwu, STWU, 0x94000000) \ |
| /* Subtract From Immediate Carrying */ \ |
| V(subfic, SUBFIC, 0x20000000) \ |
| /* Trap Word Immediate */ \ |
| V(twi, TWI, 0x0C000000) \ |
| /* XOR Immediate */ \ |
| V(xori, XORI, 0x68000000) \ |
| /* XOR Immediate Shifted */ \ |
| V(xoris, XORIS, 0x6C000000) \ |
| /* Load Floating-Point Double */ \ |
| V(lfd, LFD, 0xC8000000) \ |
| /* Load Floating-Point Double with Update */ \ |
| V(lfdu, LFDU, 0xCC000000) \ |
| /* Load Floating-Point Single */ \ |
| V(lfs, LFS, 0xC0000000) \ |
| /* Load Floating-Point Single with Update */ \ |
| V(lfsu, LFSU, 0xC4000000) \ |
| /* Store Floating-Point Double */ \ |
| V(stfd, STFD, 0xD8000000) \ |
| /* Store Floating-Point Double with Update */ \ |
| V(stfdu, STFDU, 0xDC000000) \ |
| /* Store Floating-Point Single */ \ |
| V(stfs, STFS, 0xD0000000) \ |
| /* Store Floating-Point Single with Update */ \ |
| V(stfsu, STFSU, 0xD4000000) |
| |
| #define PPC_XFL_OPCODE_LIST(V) \ |
| /* Move To FPSCR Fields */ \ |
| V(mtfsf, MTFSF, 0xFC00058E) |
| |
| #define PPC_XFX_OPCODE_LIST(V) \ |
| /* Move From Condition Register */ \ |
| V(mfcr, MFCR, 0x7C000026) \ |
| /* Move From One Condition Register Field */ \ |
| V(mfocrf, MFOCRF, 0x7C100026) \ |
| /* Move From Special Purpose Register */ \ |
| V(mfspr, MFSPR, 0x7C0002A6) \ |
| /* Move To Condition Register Fields */ \ |
| V(mtcrf, MTCRF, 0x7C000120) \ |
| /* Move To One Condition Register Field */ \ |
| V(mtocrf, MTOCRF, 0x7C100120) \ |
| /* Move To Special Purpose Register */ \ |
| V(mtspr, MTSPR, 0x7C0003A6) \ |
| /* Debugger Notify Halt */ \ |
| V(dnh, DNH, 0x4C00018C) \ |
| /* Move From Device Control Register */ \ |
| V(mfdcr, MFDCR, 0x7C000286) \ |
| /* Move To Device Control Register */ \ |
| V(mtdcr, MTDCR, 0x7C000386) \ |
| /* Move from Performance Monitor Register */ \ |
| V(mfpmr, MFPMR, 0x7C00029C) \ |
| /* Move To Performance Monitor Register */ \ |
| V(mtpmr, MTPMR, 0x7C00039C) \ |
| /* Move From Branch History Rolling Buffer */ \ |
| V(mfbhrbe, MFBHRBE, 0x7C00025C) \ |
| /* Move From Time Base */ \ |
| V(mftb, MFTB, 0x7C0002E6) |
| |
| #define PPC_MDS_OPCODE_LIST(V) \ |
| /* Rotate Left Doubleword then Clear Left */ \ |
| V(rldcl, RLDCL, 0x78000010) \ |
| /* Rotate Left Doubleword then Clear Right */ \ |
| V(rldcr, RLDCR, 0x78000012) |
| |
| #define PPC_A_OPCODE_LIST(V) \ |
| /* Integer Select */ \ |
| V(isel, ISEL, 0x7C00001E) \ |
| /* Floating Add */ \ |
| V(fadd, FADD, 0xFC00002A) \ |
| /* Floating Add Single */ \ |
| V(fadds, FADDS, 0xEC00002A) \ |
| /* Floating Divide */ \ |
| V(fdiv, FDIV, 0xFC000024) \ |
| /* Floating Divide Single */ \ |
| V(fdivs, FDIVS, 0xEC000024) \ |
| /* Floating Multiply-Add */ \ |
| V(fmadd, FMADD, 0xFC00003A) \ |
| /* Floating Multiply-Add Single */ \ |
| V(fmadds, FMADDS, 0xEC00003A) \ |
| /* Floating Multiply-Subtract */ \ |
| V(fmsub, FMSUB, 0xFC000038) \ |
| /* Floating Multiply-Subtract Single */ \ |
| V(fmsubs, FMSUBS, 0xEC000038) \ |
| /* Floating Multiply */ \ |
| V(fmul, FMUL, 0xFC000032) \ |
| /* Floating Multiply Single */ \ |
| V(fmuls, FMULS, 0xEC000032) \ |
| /* Floating Negative Multiply-Add */ \ |
| V(fnmadd, FNMADD, 0xFC00003E) \ |
| /* Floating Negative Multiply-Add Single */ \ |
| V(fnmadds, FNMADDS, 0xEC00003E) \ |
| /* Floating Negative Multiply-Subtract */ \ |
| V(fnmsub, FNMSUB, 0xFC00003C) \ |
| /* Floating Negative Multiply-Subtract Single */ \ |
| V(fnmsubs, FNMSUBS, 0xEC00003C) \ |
| /* Floating Reciprocal Estimate Single */ \ |
| V(fres, FRES, 0xEC000030) \ |
| /* Floating Reciprocal Square Root Estimate */ \ |
| V(frsqrte, FRSQRTE, 0xFC000034) \ |
| /* Floating Select */ \ |
| V(fsel, FSEL, 0xFC00002E) \ |
| /* Floating Square Root */ \ |
| V(fsqrt, FSQRT, 0xFC00002C) \ |
| /* Floating Square Root Single */ \ |
| V(fsqrts, FSQRTS, 0xEC00002C) \ |
| /* Floating Subtract */ \ |
| V(fsub, FSUB, 0xFC000028) \ |
| /* Floating Subtract Single */ \ |
| V(fsubs, FSUBS, 0xEC000028) \ |
| /* Floating Reciprocal Estimate */ \ |
| V(fre, FRE, 0xFC000030) \ |
| /* Floating Reciprocal Square Root Estimate Single */ \ |
| V(frsqrtes, FRSQRTES, 0xEC000034) |
| |
| #define PPC_VA_OPCODE_A_FORM_LIST(V) \ |
| /* Vector Permute */ \ |
| V(vperm, VPERM, 0x1000002B) \ |
| /* Vector Multiply-Low-Add Unsigned Halfword Modulo */ \ |
| V(vmladduhm, VMLADDUHM, 0x10000022) \ |
| /* Vector Select */ \ |
| V(vsel, VSEL, 0x1000002A) \ |
| /* Vector Multiply-Sum Signed Halfword Modulo */ \ |
| V(vmsumshm, VMSUMSHM, 0x10000028) |
| |
| #define PPC_VA_OPCODE_UNUSED_LIST(V) \ |
| /* Vector Add Extended & write Carry Unsigned Quadword */ \ |
| V(vaddecuq, VADDECUQ, 0x1000003D) \ |
| /* Vector Add Extended Unsigned Quadword Modulo */ \ |
| V(vaddeuqm, VADDEUQM, 0x1000003C) \ |
| /* Vector Multiply-Add Single-Precision */ \ |
| V(vmaddfp, VMADDFP, 0x1000002E) \ |
| /* Vector Multiply-High-Add Signed Halfword Saturate */ \ |
| V(vmhaddshs, VMHADDSHS, 0x10000020) \ |
| /* Vector Multiply-High-Round-Add Signed Halfword Saturate */ \ |
| V(vmhraddshs, VMHRADDSHS, 0x10000021) \ |
| /* Vector Multiply-Sum Mixed Byte Modulo */ \ |
| V(vmsummbm, VMSUMMBM, 0x10000025) \ |
| /* Vector Multiply-Sum Signed Halfword Saturate */ \ |
| V(vmsumshs, VMSUMSHS, 0x10000029) \ |
| /* Vector Multiply-Sum Unsigned Byte Modulo */ \ |
| V(vmsumubm, VMSUMUBM, 0x10000024) \ |
| /* Vector Multiply-Sum Unsigned Halfword Modulo */ \ |
| V(vmsumuhm, VMSUMUHM, 0x10000026) \ |
| /* Vector Multiply-Sum Unsigned Halfword Saturate */ \ |
| V(vmsumuhs, VMSUMUHS, 0x10000027) \ |
| /* Vector Negative Multiply-Subtract Single-Precision */ \ |
| V(vnmsubfp, VNMSUBFP, 0x1000002F) \ |
| /* Vector Shift Left Double by Octet Immediate */ \ |
| V(vsldoi, VSLDOI, 0x1000002C) \ |
| /* Vector Subtract Extended & write Carry Unsigned Quadword */ \ |
| V(vsubecuq, VSUBECUQ, 0x1000003F) \ |
| /* Vector Subtract Extended Unsigned Quadword Modulo */ \ |
| V(vsubeuqm, VSUBEUQM, 0x1000003E) \ |
| /* Vector Permute and Exclusive-OR */ \ |
| V(vpermxor, VPERMXOR, 0x1000002D) |
| |
| #define PPC_VA_OPCODE_LIST(V) \ |
| PPC_VA_OPCODE_A_FORM_LIST(V) \ |
| PPC_VA_OPCODE_UNUSED_LIST(V) |
| |
| #define PPC_XX1_OPCODE_LIST(V) \ |
| /* Load VSR Scalar Doubleword Indexed */ \ |
| V(lxsdx, LXSDX, 0x7C000498) \ |
| /* Load VSX Scalar as Integer Word Algebraic Indexed */ \ |
| V(lxsiwax, LXSIWAX, 0x7C000098) \ |
| /* Load VSX Scalar as Integer Word and Zero Indexed */ \ |
| V(lxsiwzx, LXSIWZX, 0x7C000018) \ |
| /* Load VSX Scalar Single-Precision Indexed */ \ |
| V(lxsspx, LXSSPX, 0x7C000418) \ |
| /* Load VSR Vector Doubleword*2 Indexed */ \ |
| V(lxvd, LXVD, 0x7C000698) \ |
| /* Load VSR Vector Doubleword & Splat Indexed */ \ |
| V(lxvdsx, LXVDSX, 0x7C000298) \ |
| /* Load VSR Vector Word*4 Indexed */ \ |
| V(lxvw, LXVW, 0x7C000618) \ |
| /* Move From VSR Doubleword */ \ |
| V(mfvsrd, MFVSRD, 0x7C000066) \ |
| /* Move From VSR Word and Zero */ \ |
| V(mfvsrwz, MFVSRWZ, 0x7C0000E6) \ |
| /* Store VSR Scalar Doubleword Indexed */ \ |
| V(stxsdx, STXSDX, 0x7C000598) \ |
| /* Store VSX Scalar as Integer Word Indexed */ \ |
| V(stxsiwx, STXSIWX, 0x7C000118) \ |
| /* Store VSR Scalar Word Indexed */ \ |
| V(stxsspx, STXSSPX, 0x7C000518) \ |
| /* Store VSR Vector Doubleword*2 Indexed */ \ |
| V(stxvd, STXVD, 0x7C000798) \ |
| /* Store VSR Vector Word*4 Indexed */ \ |
| V(stxvw, STXVW, 0x7C000718) \ |
| /* Vector Splat Immediate Byte */ \ |
| V(xxspltib, XXSPLTIB, 0xF00002D1) |
| |
| #define PPC_B_OPCODE_LIST(V) \ |
| /* Branch Conditional */ \ |
| V(bc, BCX, 0x40000000) |
| |
| #define PPC_XO_OPCODE_LIST(V) \ |
| /* Divide Doubleword */ \ |
| V(divd, DIVD, 0x7C0003D2) \ |
| /* Divide Doubleword Extended */ \ |
| V(divde, DIVDE, 0x7C000352) \ |
| /* Divide Doubleword Extended & record OV */ \ |
| V(divdeo, DIVDEO, 0x7C000752) \ |
| /* Divide Doubleword Extended Unsigned */ \ |
| V(divdeu, DIVDEU, 0x7C000312) \ |
| /* Divide Doubleword Extended Unsigned & record OV */ \ |
| V(divdeuo, DIVDEUO, 0x7C000712) \ |
| /* Divide Doubleword & record OV */ \ |
| V(divdo, DIVDO, 0x7C0007D2) \ |
| /* Divide Doubleword Unsigned */ \ |
| V(divdu, DIVDU, 0x7C000392) \ |
| /* Divide Doubleword Unsigned & record OV */ \ |
| V(divduo, DIVDUO, 0x7C000792) \ |
| /* Multiply High Doubleword */ \ |
| V(mulhd, MULHD, 0x7C000092) \ |
| /* Multiply High Doubleword Unsigned */ \ |
| V(mulhdu, MULHDU, 0x7C000012) \ |
| /* Multiply Low Doubleword */ \ |
| V(mulld, MULLD, 0x7C0001D2) \ |
| /* Multiply Low Doubleword & record OV */ \ |
| V(mulldo, MULLDO, 0x7C0005D2) \ |
| /* Add */ \ |
| V(add, ADDX, 0x7C000214) \ |
| /* Add Carrying */ \ |
| V(addc, ADDCX, 0x7C000014) \ |
| /* Add Carrying & record OV */ \ |
| V(addco, ADDCO, 0x7C000414) \ |
| /* Add Extended */ \ |
| V(adde, ADDEX, 0x7C000114) \ |
| /* Add Extended & record OV & record OV */ \ |
| V(addeo, ADDEO, 0x7C000514) \ |
| /* Add to Minus One Extended */ \ |
| V(addme, ADDME, 0x7C0001D4) \ |
| /* Add to Minus One Extended & record OV */ \ |
| V(addmeo, ADDMEO, 0x7C0005D4) \ |
| /* Add & record OV */ \ |
| V(addo, ADDO, 0x7C000614) \ |
| /* Add to Zero Extended */ \ |
| V(addze, ADDZEX, 0x7C000194) \ |
| /* Add to Zero Extended & record OV */ \ |
| V(addzeo, ADDZEO, 0x7C000594) \ |
| /* Divide Word Format */ \ |
| V(divw, DIVW, 0x7C0003D6) \ |
| /* Divide Word Extended */ \ |
| V(divwe, DIVWE, 0x7C000356) \ |
| /* Divide Word Extended & record OV */ \ |
| V(divweo, DIVWEO, 0x7C000756) \ |
| /* Divide Word Extended Unsigned */ \ |
| V(divweu, DIVWEU, 0x7C000316) \ |
| /* Divide Word Extended Unsigned & record OV */ \ |
| V(divweuo, DIVWEUO, 0x7C000716) \ |
| /* Divide Word & record OV */ \ |
| V(divwo, DIVWO, 0x7C0007D6) \ |
| /* Divide Word Unsigned */ \ |
| V(divwu, DIVWU, 0x7C000396) \ |
| /* Divide Word Unsigned & record OV */ \ |
| V(divwuo, DIVWUO, 0x7C000796) \ |
| /* Multiply High Word */ \ |
| V(mulhw, MULHWX, 0x7C000096) \ |
| /* Multiply High Word Unsigned */ \ |
| V(mulhwu, MULHWUX, 0x7C000016) \ |
| /* Multiply Low Word */ \ |
| V(mullw, MULLW, 0x7C0001D6) \ |
| /* Multiply Low Word & record OV */ \ |
| V(mullwo, MULLWO, 0x7C0005D6) \ |
| /* Negate */ \ |
| V(neg, NEGX, 0x7C0000D0) \ |
| /* Negate & record OV */ \ |
| V(nego, NEGO, 0x7C0004D0) \ |
| /* Subtract From */ \ |
| V(subf, SUBFX, 0x7C000050) \ |
| /* Subtract From Carrying */ \ |
| V(subfc, SUBFCX, 0x7C000010) \ |
| /* Subtract From Carrying & record OV */ \ |
| V(subfco, SUBFCO, 0x7C000410) \ |
| /* Subtract From Extended */ \ |
| V(subfe, SUBFEX, 0x7C000110) \ |
| /* Subtract From Extended & record OV */ \ |
| V(subfeo, SUBFEO, 0x7C000510) \ |
| /* Subtract From Minus One Extended */ \ |
| V(subfme, SUBFME, 0x7C0001D0) \ |
| /* Subtract From Minus One Extended & record OV */ \ |
| V(subfmeo, SUBFMEO, 0x7C0005D0) \ |
| /* Subtract From & record OV */ \ |
| V(subfo, SUBFO, 0x7C000450) \ |
| /* Subtract From Zero Extended */ \ |
| V(subfze, SUBFZE, 0x7C000190) \ |
| /* Subtract From Zero Extended & record OV */ \ |
| V(subfzeo, SUBFZEO, 0x7C000590) \ |
| /* Add and Generate Sixes */ \ |
| V(addg, ADDG, 0x7C000094) \ |
| /* Multiply Accumulate Cross Halfword to Word Modulo Signed */ \ |
| V(macchw, MACCHW, 0x10000158) \ |
| /* Multiply Accumulate Cross Halfword to Word Saturate Signed */ \ |
| V(macchws, MACCHWS, 0x100001D8) \ |
| /* Multiply Accumulate Cross Halfword to Word Saturate Unsigned */ \ |
| V(macchwsu, MACCHWSU, 0x10000198) \ |
| /* Multiply Accumulate Cross Halfword to Word Modulo Unsigned */ \ |
| V(macchwu, MACCHWU, 0x10000118) \ |
| /* Multiply Accumulate High Halfword to Word Modulo Signed */ \ |
| V(machhw, MACHHW, 0x10000058) \ |
| /* Multiply Accumulate High Halfword to Word Saturate Signed */ \ |
| V(machhws, MACHHWS, 0x100000D8) \ |
| /* Multiply Accumulate High Halfword to Word Saturate Unsigned */ \ |
| V(machhwsu, MACHHWSU, 0x10000098) \ |
| /* Multiply Accumulate High Halfword to Word Modulo Unsigned */ \ |
| V(machhwu, MACHHWU, 0x10000018) \ |
| /* Multiply Accumulate Low Halfword to Word Modulo Signed */ \ |
| V(maclhw, MACLHW, 0x10000358) \ |
| /* Multiply Accumulate Low Halfword to Word Saturate Signed */ \ |
| V(maclhws, MACLHWS, 0x100003D8) \ |
| /* Multiply Accumulate Low Halfword to Word Saturate Unsigned */ \ |
| V(maclhwsu, MACLHWSU, 0x10000398) \ |
| /* Multiply Accumulate Low Halfword to Word Modulo Unsigned */ \ |
| V(maclhwu, MACLHWU, 0x10000318) \ |
| /* Negative Multiply Accumulate Cross Halfword to Word Modulo Signed */ \ |
| V(nmacchw, NMACCHW, 0x1000015C) \ |
| /* Negative Multiply Accumulate Cross Halfword to Word Saturate Signed */ \ |
| V(nmacchws, NMACCHWS, 0x100001DC) \ |
| /* Negative Multiply Accumulate High Halfword to Word Modulo Signed */ \ |
| V(nmachhw, NMACHHW, 0x1000005C) \ |
| /* Negative Multiply Accumulate High Halfword to Word Saturate Signed */ \ |
| V(nmachhws, NMACHHWS, 0x100000DC) \ |
| /* Negative Multiply Accumulate Low Halfword to Word Modulo Signed */ \ |
| V(nmaclhw, NMACLHW, 0x1000035C) \ |
| /* Negative Multiply Accumulate Low Halfword to Word Saturate Signed */ \ |
| V(nmaclhws, NMACLHWS, 0x100003DC) |
| |
| #define PPC_XL_OPCODE_LIST(V) \ |
| /* Branch Conditional to Count Register */ \ |
| V(bcctr, BCCTRX, 0x4C000420) \ |
| /* Branch Conditional to Link Register */ \ |
| V(bclr, BCLRX, 0x4C000020) \ |
| /* Condition Register AND */ \ |
| V(crand, CRAND, 0x4C000202) \ |
| /* Condition Register AND with Complement */ \ |
| V(crandc, CRANDC, 0x4C000102) \ |
| /* Condition Register Equivalent */ \ |
| V(creqv, CREQV, 0x4C000242) \ |
| /* Condition Register NAND */ \ |
| V(crnand, CRNAND, 0x4C0001C2) \ |
| /* Condition Register NOR */ \ |
| V(crnor, CRNOR, 0x4C000042) \ |
| /* Condition Register OR */ \ |
| V(cror, CROR, 0x4C000382) \ |
| /* Condition Register OR with Complement */ \ |
| V(crorc, CRORC, 0x4C000342) \ |
| /* Condition Register XOR */ \ |
| V(crxor, CRXOR, 0x4C000182) \ |
| /* Instruction Synchronize */ \ |
| V(isync, ISYNC, 0x4C00012C) \ |
| /* Move Condition Register Field */ \ |
| V(mcrf, MCRF, 0x4C000000) \ |
| /* Return From Critical Interrupt */ \ |
| V(rfci, RFCI, 0x4C000066) \ |
| /* Return From Interrupt */ \ |
| V(rfi, RFI, 0x4C000064) \ |
| /* Return From Machine Check Interrupt */ \ |
| V(rfmci, RFMCI, 0x4C00004C) \ |
| /* Embedded Hypervisor Privilege */ \ |
| V(ehpriv, EHPRIV, 0x7C00021C) \ |
| /* Return From Guest Interrupt */ \ |
| V(rfgi, RFGI, 0x4C0000CC) \ |
| /* Doze */ \ |
| V(doze, DOZE, 0x4C000324) \ |
| /* Return From Interrupt Doubleword Hypervisor */ \ |
| V(hrfid, HRFID, 0x4C000224) \ |
| /* Nap */ \ |
| V(nap, NAP, 0x4C000364) \ |
| /* Return from Event Based Branch */ \ |
| V(rfebb, RFEBB, 0x4C000124) \ |
| /* Return from Interrupt Doubleword */ \ |
| V(rfid, RFID, 0x4C000024) \ |
| /* Rip Van Winkle */ \ |
| V(rvwinkle, RVWINKLE, 0x4C0003E4) \ |
| /* Sleep */ \ |
| V(sleep, SLEEP, 0x4C0003A4) |
| |
| #define PPC_XX4_OPCODE_LIST(V) \ |
| /* VSX Select */ \ |
| V(xxsel, XXSEL, 0xF0000030) |
| |
| #define PPC_I_OPCODE_LIST(V) \ |
| /* Branch */ \ |
| V(b, BX, 0x48000000) |
| |
| #define PPC_M_OPCODE_LIST(V) \ |
| /* Rotate Left Word Immediate then Mask Insert */ \ |
| V(rlwimi, RLWIMIX, 0x50000000) \ |
| /* Rotate Left Word Immediate then AND with Mask */ \ |
| V(rlwinm, RLWINMX, 0x54000000) \ |
| /* Rotate Left Word then AND with Mask */ \ |
| V(rlwnm, RLWNMX, 0x5C000000) |
| |
| #define PPC_VX_OPCODE_A_FORM_LIST(V) \ |
| /* Vector Splat Byte */ \ |
| V(vspltb, VSPLTB, 0x1000020C) \ |
| /* Vector Splat Word */ \ |
| V(vspltw, VSPLTW, 0x1000028C) \ |
| /* Vector Splat Halfword */ \ |
| V(vsplth, VSPLTH, 0x1000024C) \ |
| /* Vector Extract Unsigned Byte */ \ |
| V(vextractub, VEXTRACTUB, 0x1000020D) \ |
| /* Vector Extract Unsigned Halfword */ \ |
| V(vextractuh, VEXTRACTUH, 0x1000024D) \ |
| /* Vector Extract Unsigned Word */ \ |
| V(vextractuw, VEXTRACTUW, 0x1000028D) \ |
| /* Vector Extract Doubleword */ \ |
| V(vextractd, VEXTRACTD, 0x100002CD) \ |
| /* Vector Insert Byte */ \ |
| V(vinsertb, VINSERTB, 0x1000030D) \ |
| /* Vector Insert Halfword */ \ |
| V(vinserth, VINSERTH, 0x1000034D) \ |
| /* Vector Insert Word */ \ |
| V(vinsertw, VINSERTW, 0x1000038D) \ |
| /* Vector Insert Doubleword */ \ |
| V(vinsertd, VINSERTD, 0x100003CD) |
| |
| #define PPC_VX_OPCODE_B_FORM_LIST(V) \ |
| /* Vector Logical OR */ \ |
| V(vor, VOR, 0x10000484) \ |
| /* Vector Logical XOR */ \ |
| V(vxor, VXOR, 0x100004C4) \ |
| /* Vector Logical NOR */ \ |
| V(vnor, VNOR, 0x10000504) \ |
| /* Vector Shift Right by Octet */ \ |
| V(vsro, VSRO, 0x1000044C) \ |
| /* Vector Shift Left by Octet */ \ |
| V(vslo, VSLO, 0x1000040C) \ |
| /* Vector Add Unsigned Doubleword Modulo */ \ |
| V(vaddudm, VADDUDM, 0x100000C0) \ |
| /* Vector Add Unsigned Word Modulo */ \ |
| V(vadduwm, VADDUWM, 0x10000080) \ |
| /* Vector Add Unsigned Halfword Modulo */ \ |
| V(vadduhm, VADDUHM, 0x10000040) \ |
| /* Vector Add Unsigned Byte Modulo */ \ |
| V(vaddubm, VADDUBM, 0x10000000) \ |
| /* Vector Add Single-Precision */ \ |
| V(vaddfp, VADDFP, 0x1000000A) \ |
| /* Vector Subtract Single-Precision */ \ |
| V(vsubfp, VSUBFP, 0x1000004A) \ |
| /* Vector Subtract Unsigned Doubleword Modulo */ \ |
| V(vsubudm, VSUBUDM, 0x100004C0) \ |
| /* Vector Subtract Unsigned Word Modulo */ \ |
| V(vsubuwm, VSUBUWM, 0x10000480) \ |
| /* Vector Subtract Unsigned Halfword Modulo */ \ |
| V(vsubuhm, VSUBUHM, 0x10000440) \ |
| /* Vector Subtract Unsigned Byte Modulo */ \ |
| V(vsububm, VSUBUBM, 0x10000400) \ |
| /* Vector Multiply Unsigned Word Modulo */ \ |
| V(vmuluwm, VMULUWM, 0x10000089) \ |
| /* Vector Pack Unsigned Halfword Unsigned Modulo */ \ |
| V(vpkuhum, VPKUHUM, 0x1000000E) \ |
| /* Vector Multiply Even Unsigned Byte */ \ |
| V(vmuleub, VMULEUB, 0x10000208) \ |
| /* Vector Multiply Odd Unsigned Byte */ \ |
| V(vmuloub, VMULOUB, 0x10000008) \ |
| /* Vector Sum across Quarter Signed Halfword Saturate */ \ |
| V(vsum4shs, VSUM4SHS, 0x10000648) \ |
| /* Vector Pack Unsigned Word Unsigned Saturate */ \ |
| V(vpkuwus, VPKUWUS, 0x100000CE) \ |
| /* Vector Sum across Half Signed Word Saturate */ \ |
| V(vsum2sws, VSUM2SWS, 0x10000688) \ |
| /* Vector Pack Unsigned Doubleword Unsigned Modulo */ \ |
| V(vpkudum, VPKUDUM, 0x1000044E) \ |
| /* Vector Maximum Signed Byte */ \ |
| V(vmaxsb, VMAXSB, 0x10000102) \ |
| /* Vector Maximum Unsigned Byte */ \ |
| V(vmaxub, VMAXUB, 0x10000002) \ |
| /* Vector Maximum Signed Doubleword */ \ |
| V(vmaxsd, VMAXSD, 0x100001C2) \ |
| /* Vector Maximum Unsigned Doubleword */ \ |
| V(vmaxud, VMAXUD, 0x100000C2) \ |
| /* Vector Maximum Signed Halfword */ \ |
| V(vmaxsh, VMAXSH, 0x10000142) \ |
| /* Vector Maximum Unsigned Halfword */ \ |
| V(vmaxuh, VMAXUH, 0x10000042) \ |
| /* Vector Maximum Signed Word */ \ |
| V(vmaxsw, VMAXSW, 0x10000182) \ |
| /* Vector Maximum Unsigned Word */ \ |
| V(vmaxuw, VMAXUW, 0x10000082) \ |
| /* Vector Minimum Signed Byte */ \ |
| V(vminsb, VMINSB, 0x10000302) \ |
| /* Vector Minimum Unsigned Byte */ \ |
| V(vminub, VMINUB, 0x10000202) \ |
| /* Vector Minimum Signed Doubleword */ \ |
| V(vminsd, VMINSD, 0x100003C2) \ |
| /* Vector Minimum Unsigned Doubleword */ \ |
| V(vminud, VMINUD, 0x100002C2) \ |
| /* Vector Minimum Signed Halfword */ \ |
| V(vminsh, VMINSH, 0x10000342) \ |
| /* Vector Minimum Unsigned Halfword */ \ |
| V(vminuh, VMINUH, 0x10000242) \ |
| /* Vector Minimum Signed Word */ \ |
| V(vminsw, VMINSW, 0x10000382) \ |
| /* Vector Minimum Unsigned Word */ \ |
| V(vminuw, VMINUW, 0x10000282) \ |
| /* Vector Shift Left Byte */ \ |
| V(vslb, VSLB, 0x10000104) \ |
| /* Vector Shift Left Word */ \ |
| V(vslw, VSLW, 0x10000184) \ |
| /* Vector Shift Left Halfword */ \ |
| V(vslh, VSLH, 0x10000144) \ |
| /* Vector Shift Left Doubleword */ \ |
| V(vsld, VSLD, 0x100005C4) \ |
| /* Vector Shift Right Byte */ \ |
| V(vsrb, VSRB, 0x10000204) \ |
| /* Vector Shift Right Word */ \ |
| V(vsrw, VSRW, 0x10000284) \ |
| /* Vector Shift Right Halfword */ \ |
| V(vsrh, VSRH, 0x10000244) \ |
| /* Vector Shift Right Doubleword */ \ |
| V(vsrd, VSRD, 0x100006C4) \ |
| /* Vector Shift Right Algebraic Byte */ \ |
| V(vsrab, VSRAB, 0x10000304) \ |
| /* Vector Shift Right Algebraic Word */ \ |
| V(vsraw, VSRAW, 0x10000384) \ |
| /* Vector Shift Right Algebraic Halfword */ \ |
| V(vsrah, VSRAH, 0x10000344) \ |
| /* Vector Shift Right Algebraic Doubleword */ \ |
| V(vsrad, VSRAD, 0x100003C4) \ |
| /* Vector Logical AND */ \ |
| V(vand, VAND, 0x10000404) \ |
| /* Vector Pack Signed Word Signed Saturate */ \ |
| V(vpkswss, VPKSWSS, 0x100001CE) \ |
| /* Vector Pack Signed Word Unsigned Saturate */ \ |
| V(vpkswus, VPKSWUS, 0x1000014E) \ |
| /* Vector Pack Signed Halfword Signed Saturate */ \ |
| V(vpkshss, VPKSHSS, 0x1000018E) \ |
| /* Vector Pack Signed Halfword Unsigned Saturate */ \ |
| V(vpkshus, VPKSHUS, 0x1000010E) \ |
| /* Vector Add Signed Halfword Saturate */ \ |
| V(vaddshs, VADDSHS, 0x10000340) \ |
| /* Vector Subtract Signed Halfword Saturate */ \ |
| V(vsubshs, VSUBSHS, 0x10000740) \ |
| /* Vector Add Unsigned Halfword Saturate */ \ |
| V(vadduhs, VADDUHS, 0x10000240) \ |
| /* Vector Subtract Unsigned Halfword Saturate */ \ |
| V(vsubuhs, VSUBUHS, 0x10000640) \ |
| /* Vector Add Signed Byte Saturate */ \ |
| V(vaddsbs, VADDSBS, 0x10000300) \ |
| /* Vector Subtract Signed Byte Saturate */ \ |
| V(vsubsbs, VSUBSBS, 0x10000700) \ |
| /* Vector Add Unsigned Byte Saturate */ \ |
| V(vaddubs, VADDUBS, 0x10000200) \ |
| /* Vector Subtract Unsigned Byte Saturate */ \ |
| V(vsububs, VSUBUBS, 0x10000600) \ |
| /* Vector Average Unsigned Byte */ \ |
| V(vavgub, VAVGUB, 0x10000402) \ |
| /* Vector Average Unsigned Halfword */ \ |
| V(vavguh, VAVGUH, 0x10000442) \ |
| /* Vector Logical AND with Complement */ \ |
| V(vandc, VANDC, 0x10000444) \ |
| /* Vector Minimum Single-Precision */ \ |
| V(vminfp, VMINFP, 0x1000044A) \ |
| /* Vector Maximum Single-Precision */ \ |
| V(vmaxfp, VMAXFP, 0x1000040A) \ |
| /* Vector Bit Permute Quadword */ \ |
| V(vbpermq, VBPERMQ, 0x1000054C) |
| |
| #define PPC_VX_OPCODE_C_FORM_LIST(V) \ |
| /* Vector Unpack Low Signed Halfword */ \ |
| V(vupklsh, VUPKLSH, 0x100002CE) \ |
| /* Vector Unpack High Signed Halfword */ \ |
| V(vupkhsh, VUPKHSH, 0x1000024E) \ |
| /* Vector Unpack Low Signed Byte */ \ |
| V(vupklsb, VUPKLSB, 0x1000028E) \ |
| /* Vector Unpack High Signed Byte */ \ |
| V(vupkhsb, VUPKHSB, 0x1000020E) |
| |
| #define PPC_VX_OPCODE_UNUSED_LIST(V) \ |
| /* Decimal Add Modulo */ \ |
| V(bcdadd, BCDADD, 0xF0000400) \ |
| /* Decimal Subtract Modulo */ \ |
| V(bcdsub, BCDSUB, 0xF0000440) \ |
| /* Move From Vector Status and Control Register */ \ |
| V(mfvscr, MFVSCR, 0x10000604) \ |
| /* Move To Vector Status and Control Register */ \ |
| V(mtvscr, MTVSCR, 0x10000644) \ |
| /* Vector Add & write Carry Unsigned Quadword */ \ |
| V(vaddcuq, VADDCUQ, 0x10000140) \ |
| /* Vector Add and Write Carry-Out Unsigned Word */ \ |
| V(vaddcuw, VADDCUW, 0x10000180) \ |
| /* Vector Add Signed Word Saturate */ \ |
| V(vaddsws, VADDSWS, 0x10000380) \ |
| /* Vector Add Unsigned Quadword Modulo */ \ |
| V(vadduqm, VADDUQM, 0x10000100) \ |
| /* Vector Add Unsigned Word Saturate */ \ |
| V(vadduws, VADDUWS, 0x10000280) \ |
| /* Vector Average Signed Byte */ \ |
| V(vavgsb, VAVGSB, 0x10000502) \ |
| /* Vector Average Signed Halfword */ \ |
| V(vavgsh, VAVGSH, 0x10000542) \ |
| /* Vector Average Signed Word */ \ |
| V(vavgsw, VAVGSW, 0x10000582) \ |
| /* Vector Average Unsigned Word */ \ |
| V(vavguw, VAVGUW, 0x10000482) \ |
| /* Vector Convert From Signed Fixed-Point Word To Single-Precision */ \ |
| V(vcfsx, VCFSX, 0x1000034A) \ |
| /* Vector Convert From Unsigned Fixed-Point Word To Single-Precision */ \ |
| V(vcfux, VCFUX, 0x1000030A) \ |
| /* Vector Count Leading Zeros Byte */ \ |
| V(vclzb, VCLZB, 0x10000702) \ |
| /* Vector Count Leading Zeros Doubleword */ \ |
| V(vclzd, VCLZD, 0x100007C2) \ |
| /* Vector Count Leading Zeros Halfword */ \ |
| V(vclzh, VCLZH, 0x10000742) \ |
| /* Vector Count Leading Zeros Word */ \ |
| V(vclzw, VCLZW, 0x10000782) \ |
| /* Vector Convert From Single-Precision To Signed Fixed-Point Word */ \ |
| /* Saturate */ \ |
| V(vctsxs, VCTSXS, 0x100003CA) \ |
| /* Vector Convert From Single-Precision To Unsigned Fixed-Point Word */ \ |
| /* Saturate */ \ |
| V(vctuxs, VCTUXS, 0x1000038A) \ |
| /* Vector Equivalence */ \ |
| V(veqv, VEQV, 0x10000684) \ |
| /* Vector 2 Raised to the Exponent Estimate Single-Precision */ \ |
| V(vexptefp, VEXPTEFP, 0x1000018A) \ |
| /* Vector Gather Bits by Byte by Doubleword */ \ |
| V(vgbbd, VGBBD, 0x1000050C) \ |
| /* Vector Log Base 2 Estimate Single-Precision */ \ |
| V(vlogefp, VLOGEFP, 0x100001CA) \ |
| /* Vector Merge High Byte */ \ |
| V(vmrghb, VMRGHB, 0x1000000C) \ |
| /* Vector Merge High Halfword */ \ |
| V(vmrghh, VMRGHH, 0x1000004C) \ |
| /* Vector Merge High Word */ \ |
| V(vmrghw, VMRGHW, 0x1000008C) \ |
| /* Vector Merge Low Byte */ \ |
| V(vmrglb, VMRGLB, 0x1000010C) \ |
| /* Vector Merge Low Halfword */ \ |
| V(vmrglh, VMRGLH, 0x1000014C) \ |
| /* Vector Merge Low Word */ \ |
| V(vmrglw, VMRGLW, 0x1000018C) \ |
| /* Vector Multiply Even Signed Byte */ \ |
| V(vmulesb, VMULESB, 0x10000308) \ |
| /* Vector Multiply Even Signed Halfword */ \ |
| V(vmulesh, VMULESH, 0x10000348) \ |
| /* Vector Multiply Even Signed Word */ \ |
| V(vmulesw, VMULESW, 0x10000388) \ |
| /* Vector Multiply Even Unsigned Halfword */ \ |
| V(vmuleuh, VMULEUH, 0x10000248) \ |
| /* Vector Multiply Even Unsigned Word */ \ |
| V(vmuleuw, VMULEUW, 0x10000288) \ |
| /* Vector Multiply Odd Signed Byte */ \ |
| V(vmulosb, VMULOSB, 0x10000108) \ |
| /* Vector Multiply Odd Signed Halfword */ \ |
| V(vmulosh, VMULOSH, 0x10000148) \ |
| /* Vector Multiply Odd Signed Word */ \ |
| V(vmulosw, VMULOSW, 0x10000188) \ |
| /* Vector Multiply Odd Unsigned Halfword */ \ |
| V(vmulouh, VMULOUH, 0x10000048) \ |
| /* Vector Multiply Odd Unsigned Word */ \ |
| V(vmulouw, VMULOUW, 0x10000088) \ |
| /* Vector NAND */ \ |
| V(vnand, VNAND, 0x10000584) \ |
| /* Vector OR with Complement */ \ |
| V(vorc, VORC, 0x10000544) \ |
| /* Vector Pack Pixel */ \ |
| V(vpkpx, VPKPX, 0x1000030E) \ |
| /* Vector Pack Signed Doubleword Signed Saturate */ \ |
| V(vpksdss, VPKSDSS, 0x100005CE) \ |
| /* Vector Pack Signed Doubleword Unsigned Saturate */ \ |
| V(vpksdus, VPKSDUS, 0x1000054E) \ |
| /* Vector Pack Unsigned Doubleword Unsigned Saturate */ \ |
| V(vpkudus, VPKUDUS, 0x100004CE) \ |
| /* Vector Pack Unsigned Halfword Unsigned Saturate */ \ |
| V(vpkuhus, VPKUHUS, 0x1000008E) \ |
| /* Vector Pack Unsigned Word Unsigned Modulo */ \ |
| V(vpkuwum, VPKUWUM, 0x1000004E) \ |
| /* Vector Polynomial Multiply-Sum Byte */ \ |
| V(vpmsumb, VPMSUMB, 0x10000408) \ |
| /* Vector Polynomial Multiply-Sum Doubleword */ \ |
| V(vpmsumd, VPMSUMD, 0x100004C8) \ |
| /* Vector Polynomial Multiply-Sum Halfword */ \ |
| V(vpmsumh, VPMSUMH, 0x10000448) \ |
| /* Vector Polynomial Multiply-Sum Word */ \ |
| V(vpmsumw, VPMSUMW, 0x10000488) \ |
| /* Vector Population Count Byte */ \ |
| V(vpopcntb, VPOPCNTB, 0x10000703) \ |
| /* Vector Population Count Doubleword */ \ |
| V(vpopcntd, VPOPCNTD, 0x100007C3) \ |
| /* Vector Population Count Halfword */ \ |
| V(vpopcnth, VPOPCNTH, 0x10000743) \ |
| /* Vector Population Count Word */ \ |
| V(vpopcntw, VPOPCNTW, 0x10000783) \ |
| /* Vector Reciprocal Estimate Single-Precision */ \ |
| V(vrefp, VREFP, 0x1000010A) \ |
| /* Vector Round to Single-Precision Integer toward -Infinity */ \ |
| V(vrfim, VRFIM, 0x100002CA) \ |
| /* Vector Round to Single-Precision Integer Nearest */ \ |
| V(vrfin, VRFIN, 0x1000020A) \ |
| /* Vector Round to Single-Precision Integer toward +Infinity */ \ |
| V(vrfip, VRFIP, 0x1000028A) \ |
| /* Vector Round to Single-Precision Integer toward Zero */ \ |
| V(vrfiz, VRFIZ, 0x1000024A) \ |
| /* Vector Rotate Left Byte */ \ |
| V(vrlb, VRLB, 0x10000004) \ |
| /* Vector Rotate Left Doubleword */ \ |
| V(vrld, VRLD, 0x100000C4) \ |
| /* Vector Rotate Left Halfword */ \ |
| V(vrlh, VRLH, 0x10000044) \ |
| /* Vector Rotate Left Word */ \ |
| V(vrlw, VRLW, 0x10000084) \ |
| /* Vector Reciprocal Square Root Estimate Single-Precision */ \ |
| V(vrsqrtefp, VRSQRTEFP, 0x1000014A) \ |
| /* Vector Shift Left */ \ |
| V(vsl, VSL, 0x100001C4) \ |
| /* Vector Splat Immediate Signed Byte */ \ |
| V(vspltisb, VSPLTISB, 0x1000030C) \ |
| /* Vector Splat Immediate Signed Halfword */ \ |
| V(vspltish, VSPLTISH, 0x1000034C) \ |
| /* Vector Splat Immediate Signed Word */ \ |
| V(vspltisw, VSPLTISW, 0x1000038C) \ |
| /* Vector Shift Right */ \ |
| V(vsr, VSR, 0x100002C4) \ |
| /* Vector Subtract & write Carry Unsigned Quadword */ \ |
| V(vsubcuq, VSUBCUQ, 0x10000540) \ |
| /* Vector Subtract and Write Carry-Out Unsigned Word */ \ |
| V(vsubcuw, VSUBCUW, 0x10000580) \ |
| /* Vector Subtract Signed Word Saturate */ \ |
| V(vsubsws, VSUBSWS, 0x10000780) \ |
| /* Vector Subtract Unsigned Quadword Modulo */ \ |
| V(vsubuqm, VSUBUQM, 0x10000500) \ |
| /* Vector Subtract Unsigned Word Saturate */ \ |
| V(vsubuws, VSUBUWS, 0x10000680) \ |
| /* Vector Sum across Quarter Signed Byte Saturate */ \ |
| V(vsum4sbs, VSUM4SBS, 0x10000708) \ |
| /* Vector Sum across Quarter Unsigned Byte Saturate */ \ |
| V(vsum4bus, VSUM4BUS, 0x10000608) \ |
| /* Vector Sum across Signed Word Saturate */ \ |
| V(vsumsws, VSUMSWS, 0x10000788) \ |
| /* Vector Unpack High Pixel */ \ |
| V(vupkhpx, VUPKHPX, 0x1000034E) \ |
| /* Vector Unpack High Signed Word */ \ |
| V(vupkhsw, VUPKHSW, 0x1000064E) \ |
| /* Vector Unpack Low Pixel */ \ |
| V(vupklpx, VUPKLPX, 0x100003CE) \ |
| /* Vector Unpack Low Signed Word */ \ |
| V(vupklsw, VUPKLSW, 0x100006CE) \ |
| /* Vector AES Cipher */ \ |
| V(vcipher, VCIPHER, 0x10000508) \ |
| /* Vector AES Cipher Last */ \ |
| V(vcipherlast, VCIPHERLAST, 0x10000509) \ |
| /* Vector AES Inverse Cipher */ \ |
| V(vncipher, VNCIPHER, 0x10000548) \ |
| /* Vector AES Inverse Cipher Last */ \ |
| V(vncipherlast, VNCIPHERLAST, 0x10000549) \ |
| /* Vector AES S-Box */ \ |
| V(vsbox, VSBOX, 0x100005C8) \ |
| /* Vector SHA-512 Sigma Doubleword */ \ |
| V(vshasigmad, VSHASIGMAD, 0x100006C2) \ |
| /* Vector SHA-256 Sigma Word */ \ |
| V(vshasigmaw, VSHASIGMAW, 0x10000682) \ |
| /* Vector Merge Even Word */ \ |
| V(vmrgew, VMRGEW, 0x1000078C) \ |
| /* Vector Merge Odd Word */ \ |
| V(vmrgow, VMRGOW, 0x1000068C) |
| |
| #define PPC_VX_OPCODE_LIST(V) \ |
| PPC_VX_OPCODE_A_FORM_LIST(V) \ |
| PPC_VX_OPCODE_B_FORM_LIST(V) \ |
| PPC_VX_OPCODE_C_FORM_LIST(V) \ |
| PPC_VX_OPCODE_UNUSED_LIST(V) |
| |
| #define PPC_XS_OPCODE_LIST(V) \ |
| /* Shift Right Algebraic Doubleword Immediate */ \ |
| V(sradi, SRADIX, 0x7C000674) |
| |
| #define PPC_MD_OPCODE_LIST(V) \ |
| /* Rotate Left Doubleword Immediate then Clear */ \ |
| V(rldic, RLDIC, 0x78000008) \ |
| /* Rotate Left Doubleword Immediate then Clear Left */ \ |
| V(rldicl, RLDICL, 0x78000000) \ |
| /* Rotate Left Doubleword Immediate then Clear Right */ \ |
| V(rldicr, RLDICR, 0x78000004) \ |
| /* Rotate Left Doubleword Immediate then Mask Insert */ \ |
| V(rldimi, RLDIMI, 0x7800000C) |
| |
| #define PPC_SC_OPCODE_LIST(V) \ |
| /* System Call */ \ |
| V(sc, SC, 0x44000002) |
| |
| #define PPC_OPCODE_LIST(V) \ |
| PPC_X_OPCODE_LIST(V) \ |
| PPC_X_OPCODE_EH_S_FORM_LIST(V) \ |
| PPC_XO_OPCODE_LIST(V) \ |
| PPC_DS_OPCODE_LIST(V) \ |
| PPC_DQ_OPCODE_LIST(V) \ |
| PPC_MDS_OPCODE_LIST(V) \ |
| PPC_MD_OPCODE_LIST(V) \ |
| PPC_XS_OPCODE_LIST(V) \ |
| PPC_D_OPCODE_LIST(V) \ |
| PPC_I_OPCODE_LIST(V) \ |
| PPC_B_OPCODE_LIST(V) \ |
| PPC_XL_OPCODE_LIST(V) \ |
| PPC_A_OPCODE_LIST(V) \ |
| PPC_XFX_OPCODE_LIST(V) \ |
| PPC_M_OPCODE_LIST(V) \ |
| PPC_SC_OPCODE_LIST(V) \ |
| PPC_Z23_OPCODE_LIST(V) \ |
| PPC_Z22_OPCODE_LIST(V) \ |
| PPC_EVX_OPCODE_LIST(V) \ |
| PPC_XFL_OPCODE_LIST(V) \ |
| PPC_EVS_OPCODE_LIST(V) \ |
| PPC_VX_OPCODE_LIST(V) \ |
| PPC_VA_OPCODE_LIST(V) \ |
| PPC_VC_OPCODE_LIST(V) \ |
| PPC_XX1_OPCODE_LIST(V) \ |
| PPC_XX2_OPCODE_LIST(V) \ |
| PPC_XX3_OPCODE_LIST(V) \ |
| PPC_XX4_OPCODE_LIST(V) |
| |
| enum Opcode : uint32_t { |
| #define DECLARE_INSTRUCTION(name, opcode_name, opcode_value) \ |
| opcode_name = opcode_value, |
| PPC_OPCODE_LIST(DECLARE_INSTRUCTION) |
| #undef DECLARE_INSTRUCTION |
| EXT0 = 0x10000000, // Extended code set 0 |
| EXT1 = 0x4C000000, // Extended code set 1 |
| EXT2 = 0x7C000000, // Extended code set 2 |
| EXT3 = 0xEC000000, // Extended code set 3 |
| EXT4 = 0xFC000000, // Extended code set 4 |
| EXT5 = 0x78000000, // Extended code set 5 - 64bit only |
| EXT6 = 0xF0000000, // Extended code set 6 |
| }; |
| |
| // Instruction encoding bits and masks. |
| enum { |
| // Instruction encoding bit |
| B1 = 1 << 1, |
| B2 = 1 << 2, |
| B3 = 1 << 3, |
| B4 = 1 << 4, |
| B5 = 1 << 5, |
| B7 = 1 << 7, |
| B8 = 1 << 8, |
| B9 = 1 << 9, |
| B12 = 1 << 12, |
| B18 = 1 << 18, |
| B19 = 1 << 19, |
| B20 = 1 << 20, |
| B22 = 1 << 22, |
| B23 = 1 << 23, |
| B24 = 1 << 24, |
| B25 = 1 << 25, |
| B26 = 1 << 26, |
| B27 = 1 << 27, |
| B28 = 1 << 28, |
| B6 = 1 << 6, |
| B10 = 1 << 10, |
| B11 = 1 << 11, |
| B16 = 1 << 16, |
| B17 = 1 << 17, |
| B21 = 1 << 21, |
| |
| // Instruction bit masks |
| kCondMask = 0x1F << 21, |
| kOff12Mask = (1 << 12) - 1, |
| kImm24Mask = (1 << 24) - 1, |
| kOff16Mask = (1 << 16) - 1, |
| kImm16Mask = (1 << 16) - 1, |
| kImm22Mask = (1 << 22) - 1, |
| kImm26Mask = (1 << 26) - 1, |
| kBOfieldMask = 0x1f << 21, |
| kOpcodeMask = 0x3f << 26, |
| kExt1OpcodeMask = 0x3ff << 1, |
| kExt2OpcodeMask = 0x3ff << 1, |
| kExt2OpcodeVariant2Mask = 0x1ff << 2, |
| kExt5OpcodeMask = 0x3 << 2, |
| kBOMask = 0x1f << 21, |
| kBIMask = 0x1F << 16, |
| kBDMask = 0x14 << 2, |
| kAAMask = 0x01 << 1, |
| kLKMask = 0x01, |
| kRCMask = 0x01, |
| kTOMask = 0x1f << 21 |
| }; |
| |
| // ----------------------------------------------------------------------------- |
| // Addressing modes and instruction variants. |
| |
| // Overflow Exception |
| enum OEBit { |
| SetOE = 1 << 10, // Set overflow exception |
| LeaveOE = 0 << 10 // No overflow exception |
| }; |
| |
| // Record bit |
| enum RCBit { // Bit 0 |
| SetRC = 1, // LT,GT,EQ,SO |
| LeaveRC = 0 // None |
| }; |
| // Exclusive Access hint bit |
| enum EHBit { // Bit 0 |
| SetEH = 1, // Exclusive Access |
| LeaveEH = 0 // Atomic Update |
| }; |
| |
| // Link bit |
| enum LKBit { // Bit 0 |
| SetLK = 1, // Load effective address of next instruction |
| LeaveLK = 0 // No action |
| }; |
| |
| enum BOfield { // Bits 25-21 |
| DCBNZF = 0 << 21, // Decrement CTR; branch if CTR != 0 and condition false |
| DCBEZF = 2 << 21, // Decrement CTR; branch if CTR == 0 and condition false |
| BF = 4 << 21, // Branch if condition false |
| DCBNZT = 8 << 21, // Decrement CTR; branch if CTR != 0 and condition true |
| DCBEZT = 10 << 21, // Decrement CTR; branch if CTR == 0 and condition true |
| BT = 12 << 21, // Branch if condition true |
| DCBNZ = 16 << 21, // Decrement CTR; branch if CTR != 0 |
| DCBEZ = 18 << 21, // Decrement CTR; branch if CTR == 0 |
| BA = 20 << 21 // Branch always |
| }; |
| |
| #if V8_OS_AIX |
| #undef CR_LT |
| #undef CR_GT |
| #undef CR_EQ |
| #undef CR_SO |
| #endif |
| |
| enum CRBit { CR_LT = 0, CR_GT = 1, CR_EQ = 2, CR_SO = 3, CR_FU = 3 }; |
| |
| #define CRWIDTH 4 |
| |
| // These are the documented bit positions biased down by 32 |
| enum FPSCRBit { |
| VXSOFT = 21, // 53: Software-Defined Condition |
| VXSQRT = 22, // 54: Invalid Square Root |
| VXCVI = 23 // 55: Invalid Integer Convert |
| }; |
| |
| // ----------------------------------------------------------------------------- |
| // Supervisor Call (svc) specific support. |
| |
| // Special Software Interrupt codes when used in the presence of the PPC |
| // simulator. |
| // svc (formerly swi) provides a 24bit immediate value. Use bits 22:0 for |
| // standard SoftwareInterrupCode. Bit 23 is reserved for the stop feature. |
| enum SoftwareInterruptCodes { |
| // transition to C code |
| kCallRtRedirected = 0x10, |
| // break point |
| kBreakpoint = 0x821008, // bits23-0 of 0x7d821008 = twge r2, r2 |
| // stop |
| kStopCode = 1 << 23 |
| }; |
| const uint32_t kStopCodeMask = kStopCode - 1; |
| const uint32_t kMaxStopCode = kStopCode - 1; |
| const int32_t kDefaultStopCode = -1; |
| |
| // FP rounding modes. |
| enum FPRoundingMode { |
| RN = 0, // Round to Nearest. |
| RZ = 1, // Round towards zero. |
| RP = 2, // Round towards Plus Infinity. |
| RM = 3, // Round towards Minus Infinity. |
| |
| // Aliases. |
| kRoundToNearest = RN, |
| kRoundToZero = RZ, |
| kRoundToPlusInf = RP, |
| kRoundToMinusInf = RM |
| }; |
| |
| const uint32_t kFPRoundingModeMask = 3; |
| |
| enum CheckForInexactConversion { |
| kCheckForInexactConversion, |
| kDontCheckForInexactConversion |
| }; |
| |
| // ----------------------------------------------------------------------------- |
| // Specific instructions, constants, and masks. |
| // These constants are declared in assembler-arm.cc, as they use named registers |
| // and other constants. |
| |
| // add(sp, sp, 4) instruction (aka Pop()) |
| extern const Instr kPopInstruction; |
| |
| // str(r, MemOperand(sp, 4, NegPreIndex), al) instruction (aka push(r)) |
| // register r is not encoded. |
| extern const Instr kPushRegPattern; |
| |
| // ldr(r, MemOperand(sp, 4, PostIndex), al) instruction (aka pop(r)) |
| // register r is not encoded. |
| extern const Instr kPopRegPattern; |
| |
| // use TWI to indicate redirection call for simulation mode |
| const Instr rtCallRedirInstr = TWI; |
| |
| // ----------------------------------------------------------------------------- |
| // Instruction abstraction. |
| |
| // The class Instruction enables access to individual fields defined in the PPC |
| // architecture instruction set encoding. |
| // Note that the Assembler uses typedef int32_t Instr. |
| // |
| // Example: Test whether the instruction at ptr does set the condition code |
| // bits. |
| // |
| // bool InstructionSetsConditionCodes(byte* ptr) { |
| // Instruction* instr = Instruction::At(ptr); |
| // int type = instr->TypeValue(); |
| // return ((type == 0) || (type == 1)) && instr->HasS(); |
| // } |
| // |
| |
| constexpr uint8_t kInstrSize = 4; |
| constexpr uint8_t kInstrSizeLog2 = 2; |
| constexpr uint8_t kPcLoadDelta = 8; |
| |
| class Instruction { |
| public: |
| // Helper macro to define static accessors. |
| // We use the cast to char* trick to bypass the strict anti-aliasing rules. |
| #define DECLARE_STATIC_TYPED_ACCESSOR(return_type, Name) \ |
| static inline return_type Name(Instr instr) { \ |
| char* temp = reinterpret_cast<char*>(&instr); \ |
| return reinterpret_cast<Instruction*>(temp)->Name(); \ |
| } |
| |
| #define DECLARE_STATIC_ACCESSOR(Name) DECLARE_STATIC_TYPED_ACCESSOR(int, Name) |
| |
| // Get the raw instruction bits. |
| inline Instr InstructionBits() const { |
| return *reinterpret_cast<const Instr*>(this); |
| } |
| |
| // Set the raw instruction bits to value. |
| inline void SetInstructionBits(Instr value) { |
| *reinterpret_cast<Instr*>(this) = value; |
| } |
| |
| // Read one particular bit out of the instruction bits. |
| inline int Bit(int nr) const { return (InstructionBits() >> nr) & 1; } |
| |
| // Read a bit field's value out of the instruction bits. |
| inline int Bits(int hi, int lo) const { |
| return (InstructionBits() >> lo) & ((2 << (hi - lo)) - 1); |
| } |
| |
| // Read a bit field out of the instruction bits. |
| inline uint32_t BitField(int hi, int lo) const { |
| return InstructionBits() & (((2 << (hi - lo)) - 1) << lo); |
| } |
| |
| // Static support. |
| |
| // Read one particular bit out of the instruction bits. |
| static inline int Bit(Instr instr, int nr) { return (instr >> nr) & 1; } |
| |
| // Read the value of a bit field out of the instruction bits. |
| static inline int Bits(Instr instr, int hi, int lo) { |
| return (instr >> lo) & ((2 << (hi - lo)) - 1); |
| } |
| |
| // Read a bit field out of the instruction bits. |
| static inline uint32_t BitField(Instr instr, int hi, int lo) { |
| return instr & (((2 << (hi - lo)) - 1) << lo); |
| } |
| |
| inline int RSValue() const { return Bits(25, 21); } |
| inline int RTValue() const { return Bits(25, 21); } |
| inline int RAValue() const { return Bits(20, 16); } |
| DECLARE_STATIC_ACCESSOR(RAValue) |
| inline int RBValue() const { return Bits(15, 11); } |
| DECLARE_STATIC_ACCESSOR(RBValue) |
| inline int RCValue() const { return Bits(10, 6); } |
| DECLARE_STATIC_ACCESSOR(RCValue) |
| |
| inline int OpcodeValue() const { return static_cast<Opcode>(Bits(31, 26)); } |
| inline uint32_t OpcodeField() const { |
| return static_cast<Opcode>(BitField(31, 26)); |
| } |
| |
| #define OPCODE_CASES(name, opcode_name, opcode_value) case opcode_name: |
| |
| inline Opcode OpcodeBase() const { |
| uint32_t opcode = OpcodeField(); |
| uint32_t extcode = OpcodeField(); |
| switch (opcode) { |
| PPC_D_OPCODE_LIST(OPCODE_CASES) |
| PPC_I_OPCODE_LIST(OPCODE_CASES) |
| PPC_B_OPCODE_LIST(OPCODE_CASES) |
| PPC_M_OPCODE_LIST(OPCODE_CASES) |
| return static_cast<Opcode>(opcode); |
| } |
| |
| opcode = extcode | BitField(10, 0); |
| switch (opcode) { |
| PPC_VX_OPCODE_LIST(OPCODE_CASES) |
| PPC_X_OPCODE_EH_S_FORM_LIST(OPCODE_CASES) |
| return static_cast<Opcode>(opcode); |
| } |
| opcode = extcode | BitField(9, 0); |
| switch (opcode) { |
| PPC_VC_OPCODE_LIST(OPCODE_CASES) |
| return static_cast<Opcode>(opcode); |
| } |
| opcode = extcode | BitField(10, 1) | BitField(20, 20); |
| switch (opcode) { |
| PPC_XFX_OPCODE_LIST(OPCODE_CASES) |
| return static_cast<Opcode>(opcode); |
| } |
| opcode = extcode | BitField(10, 1); |
| switch (opcode) { |
| PPC_X_OPCODE_LIST(OPCODE_CASES) |
| PPC_XL_OPCODE_LIST(OPCODE_CASES) |
| PPC_XFL_OPCODE_LIST(OPCODE_CASES) |
| PPC_XX1_OPCODE_LIST(OPCODE_CASES) |
| PPC_XX2_OPCODE_LIST(OPCODE_CASES) |
| PPC_EVX_OPCODE_LIST(OPCODE_CASES) |
| return static_cast<Opcode>(opcode); |
| } |
| opcode = extcode | BitField(9, 1); |
| switch (opcode) { |
| PPC_XO_OPCODE_LIST(OPCODE_CASES) |
| PPC_Z22_OPCODE_LIST(OPCODE_CASES) |
| return static_cast<Opcode>(opcode); |
| } |
| opcode = extcode | BitField(10, 2); |
| switch (opcode) { |
| PPC_XS_OPCODE_LIST(OPCODE_CASES) |
| return static_cast<Opcode>(opcode); |
| } |
| opcode = extcode | BitField(10, 3); |
| switch (opcode) { |
| PPC_EVS_OPCODE_LIST(OPCODE_CASES) |
| PPC_XX3_OPCODE_LIST(OPCODE_CASES) |
| return static_cast<Opcode>(opcode); |
| } |
| opcode = extcode | BitField(8, 1); |
| switch (opcode) { |
| PPC_Z23_OPCODE_LIST(OPCODE_CASES) |
| return static_cast<Opcode>(opcode); |
| } |
| opcode = extcode | BitField(5, 0); |
| switch (opcode) { |
| PPC_VA_OPCODE_LIST(OPCODE_CASES) |
| return static_cast<Opcode>(opcode); |
| } |
| opcode = extcode | BitField(5, 1); |
| switch (opcode) { |
| PPC_A_OPCODE_LIST(OPCODE_CASES) |
| return static_cast<Opcode>(opcode); |
| } |
| opcode = extcode | BitField(4, 1); |
| switch (opcode) { |
| PPC_MDS_OPCODE_LIST(OPCODE_CASES) |
| return static_cast<Opcode>(opcode); |
| } |
| opcode = extcode | BitField(4, 2); |
| switch (opcode) { |
| PPC_MD_OPCODE_LIST(OPCODE_CASES) |
| return static_cast<Opcode>(opcode); |
| } |
| opcode = extcode | BitField(5, 4); |
| switch (opcode) { |
| PPC_XX4_OPCODE_LIST(OPCODE_CASES) |
| return static_cast<Opcode>(opcode); |
| } |
| opcode = extcode | BitField(2, 0); |
| switch (opcode) { |
| PPC_DQ_OPCODE_LIST(OPCODE_CASES) |
| return static_cast<Opcode>(opcode); |
| } |
| opcode = extcode | BitField(1, 0); |
| switch (opcode) { |
| PPC_DS_OPCODE_LIST(OPCODE_CASES) |
| return static_cast<Opcode>(opcode); |
| } |
| opcode = extcode | BitField(1, 1); |
| switch (opcode) { |
| PPC_SC_OPCODE_LIST(OPCODE_CASES) |
| return static_cast<Opcode>(opcode); |
| } |
| UNIMPLEMENTED(); |
| return static_cast<Opcode>(0); |
| } |
| |
| #undef OPCODE_CASES |
| |
| // Fields used in Software interrupt instructions |
| inline SoftwareInterruptCodes SvcValue() const { |
| return static_cast<SoftwareInterruptCodes>(Bits(23, 0)); |
| } |
| |
| // Instructions are read of out a code stream. The only way to get a |
| // reference to an instruction is to convert a pointer. There is no way |
| // to allocate or create instances of class Instruction. |
| // Use the At(pc) function to create references to Instruction. |
| static Instruction* At(byte* pc) { |
| return reinterpret_cast<Instruction*>(pc); |
| } |
| |
| private: |
| // We need to prevent the creation of instances of class Instruction. |
| DISALLOW_IMPLICIT_CONSTRUCTORS(Instruction); |
| }; |
| |
| // Helper functions for converting between register numbers and names. |
| class Registers { |
| public: |
| // Lookup the register number for the name provided. |
| static int Number(const char* name); |
| |
| private: |
| static const char* names_[kNumRegisters]; |
| }; |
| |
| // Helper functions for converting between FP register numbers and names. |
| class DoubleRegisters { |
| public: |
| // Lookup the register number for the name provided. |
| static int Number(const char* name); |
| |
| private: |
| static const char* names_[kNumDoubleRegisters]; |
| }; |
| } // namespace internal |
| } // namespace v8 |
| |
| static constexpr int kR0DwarfCode = 0; |
| static constexpr int kFpDwarfCode = 31; // frame-pointer |
| static constexpr int kLrDwarfCode = 65; // return-address(lr) |
| static constexpr int kSpDwarfCode = 1; // stack-pointer (sp) |
| |
| #endif // V8_CODEGEN_PPC_CONSTANTS_PPC_H_ |