182 lines
12 KiB
C++
182 lines
12 KiB
C++
/* -
|
|
* Interactive disassembler (IDA).
|
|
* Copyright (c) 1990-2000 by Ilfak Guilfanov.
|
|
* ALL RIGHTS RESERVED.
|
|
* E-mail: ig@datarescue.com
|
|
*
|
|
*
|
|
*/
|
|
|
|
#include "hppa.hpp"
|
|
|
|
/*
|
|
#define u 1
|
|
#define c 2
|
|
#define o1(x) ((x & u) ? CF_USE1 : 0) | (x & c) ? CF_CHG1 : 0))
|
|
#define o2(x) ((x & u) ? CF_USE2 : 0) | (x & c) ? CF_CHG2 : 0))
|
|
#define o3(x) ((x & u) ? CF_USE3 : 0) | (x & c) ? CF_CHG3 : 0))
|
|
#define OPS(x,y,z,others) (o1(x) | o2(y) | o3(z) | others)
|
|
*/
|
|
|
|
const instruc_t Instructions[] =
|
|
{
|
|
|
|
{ "", 0 }, // Unknown Operation
|
|
|
|
{ "add", CF_USE1|CF_USE2|CF_CHG3 }, // Add
|
|
{ "addb", CF_USE1|CF_USE2|CF_CHG2|CF_USE3 }, // Add and Branch
|
|
{ "addi", CF_USE1|CF_USE2|CF_CHG3 }, // Add to Immediate
|
|
{ "addib", CF_USE1|CF_USE2|CF_CHG2|CF_USE3 }, // Add Immediate and Branch
|
|
{ "addil", CF_USE1|CF_USE2 }, // Add to Immediate Left
|
|
{ "and", CF_USE1|CF_USE2|CF_CHG3 }, // AND
|
|
{ "andcm", CF_USE1|CF_USE2|CF_CHG3 }, // AND complement
|
|
{ "b", CF_USE1|CF_CHG2 }, // Branch
|
|
{ "bb", CF_USE1|CF_USE2|CF_USE3 }, // Branch on Bit
|
|
{ "be", CF_USE1 }, // Branch External
|
|
{ "blr", CF_USE1|CF_CHG2|CF_CALL }, // Branch and Link Register
|
|
{ "break", CF_USE1|CF_USE2 }, // Break
|
|
{ "bv", CF_USE1 }, // Branch Vectored
|
|
{ "bve", CF_USE1 }, // Branch Vectored External
|
|
{ "cldd", CF_USE1|CF_CHG2 }, // Coprocessor Load Doubleword
|
|
{ "cldw", CF_USE1|CF_CHG2 }, // Coprocessor Load Word
|
|
{ "clrbts", 0 }, // Clear Branch Target Stack
|
|
{ "cmpb", CF_USE1|CF_USE2|CF_USE3 }, // Compare and Branch
|
|
{ "cmpclr", CF_USE1|CF_USE2|CF_CHG3 }, // Compare and Clear
|
|
{ "cmpib", CF_USE1|CF_USE2|CF_USE3 }, // Compare Immediate and Branch
|
|
{ "cmpiclr", CF_USE1|CF_USE2|CF_CHG3 }, // Compare Immediate and Clear
|
|
{ "copr", 0 }, // Coprocessor Operation
|
|
{ "cstd", CF_USE1|CF_CHG2 }, // Coprocessor Store Doubleword
|
|
{ "cstw", CF_USE1|CF_CHG2 }, // Coprocessor Store Word
|
|
{ "dcor", CF_USE1|CF_CHG2 }, // Decimal Correct
|
|
{ "depd", CF_USE1|CF_USE2|CF_USE3|CF_CHG4 }, // Deposit Doubleword
|
|
{ "depdi", CF_USE1|CF_USE2|CF_USE3|CF_CHG4 }, // Deposit Doubleword Immediate
|
|
{ "depw", CF_USE1|CF_USE2|CF_USE3|CF_CHG4 }, // Deposit Word
|
|
{ "depwi", CF_USE1|CF_USE2|CF_USE3|CF_CHG4 }, // Deposit Word Immediate
|
|
{ "diag", CF_USE1 }, // Diagnose
|
|
{ "ds", CF_USE1|CF_USE2|CF_CHG3 }, // Divide Step
|
|
{ "extrd", CF_USE1|CF_USE2|CF_USE3|CF_CHG4 }, // Extract Doubleword
|
|
{ "extrw", CF_USE1|CF_USE2|CF_USE3|CF_CHG4 }, // Extract Word
|
|
{ "fdc", CF_USE1 }, // Flush Data Cache
|
|
{ "fdce", CF_USE1 }, // Flush Data Cache Entry
|
|
{ "fic", CF_USE1 }, // Flush Instruction Cache
|
|
{ "fice", CF_USE1 }, // Flush Instruction Cache Entry
|
|
{ "hadd", CF_USE1|CF_USE2|CF_CHG3 }, // Halfword Parallel Add
|
|
{ "havg", CF_USE1|CF_USE2|CF_CHG3 }, // Halfword Parallel Average
|
|
{ "hshl", CF_USE1|CF_USE2|CF_CHG3 }, // Halfword Parallel Shift Left
|
|
{ "hshladd", CF_USE1|CF_USE2|CF_USE3|CF_CHG4 }, // Halfword Parallel Shift Left and Add
|
|
{ "hshr", CF_USE1|CF_USE2|CF_CHG3 }, // Halfword Parallel Shift Right
|
|
{ "hshradd", CF_USE1|CF_USE2|CF_USE3|CF_CHG4 }, // Halfword Parallel Shift Right and Add
|
|
{ "hsub", CF_USE1|CF_USE2|CF_CHG3 }, // Halfword Parallel Subtract
|
|
{ "idtlbt", CF_USE1|CF_USE2 }, // Insert Data TLB Translation
|
|
{ "iitlbt", CF_USE1|CF_USE2 }, // Insert Instruction TLB Translation
|
|
{ "lci", CF_USE1|CF_CHG2 }, // Load Coherence Index
|
|
{ "ldb", CF_USE1|CF_CHG2 }, // Load Byte
|
|
{ "ldcd", CF_USE1|CF_CHG2 }, // Load and Clear Doubleword
|
|
{ "ldcw", CF_USE1|CF_CHG2 }, // Load and Clear Word
|
|
{ "ldd", CF_USE1|CF_CHG2 }, // Load Doubleword
|
|
{ "ldda", CF_USE1|CF_CHG2 }, // Load Doubleword Absolute
|
|
{ "ldh", CF_USE1|CF_CHG2 }, // Load Halfword
|
|
{ "ldil", CF_USE1|CF_CHG2 }, // Load Immediate Left
|
|
{ "ldo", CF_USE1|CF_CHG2 }, // Load Offset
|
|
{ "ldsid", CF_USE1|CF_CHG2 }, // Load Space Identifier
|
|
{ "ldw", CF_USE1|CF_CHG2 }, // Load Word
|
|
{ "ldwa", CF_USE1|CF_CHG2 }, // Load Word Absolute
|
|
{ "lpa", CF_USE1|CF_CHG2 }, // Load Physical Address
|
|
{ "mfctl", CF_USE1|CF_CHG2 }, // Move From Control Register
|
|
{ "mfia", CF_CHG1 }, // Move From Instruction Address
|
|
{ "mfsp", CF_USE1|CF_CHG2 }, // Move From Space Register
|
|
{ "mixh", CF_USE1|CF_USE2|CF_CHG3 }, // Mix Halfwords
|
|
{ "mixw", CF_USE1|CF_USE2|CF_CHG3 }, // Mix Words
|
|
{ "movb", CF_USE1|CF_CHG2|CF_USE3 }, // Move and Branch
|
|
{ "movib", CF_USE1|CF_CHG2|CF_USE3 }, // Move Immediate and Branch
|
|
{ "mtctl", CF_USE1|CF_CHG2 }, // Move To Control Register
|
|
{ "mtsarcm", CF_USE1 }, // Move To Shift Amount Register Complement
|
|
{ "mtsm", CF_USE1 }, // Move To System Mask
|
|
{ "mtsp", CF_USE1|CF_CHG2 }, // Move To Space Register
|
|
{ "or", CF_USE1|CF_USE2|CF_CHG3 }, // Inclusive OR
|
|
{ "pdc", CF_USE1 }, // Purge Data Cache
|
|
{ "pdtlb", CF_USE1 }, // Purge Data TLB
|
|
{ "pdtlbe", CF_USE1 }, // Purge Data TLB Entry
|
|
{ "permh", CF_USE1|CF_CHG2 }, // Permute Halfwords
|
|
{ "pitlb", CF_USE1 }, // Purge Instruction TLB
|
|
{ "pitlbe", CF_USE1 }, // Purge Instruction TLB Entry
|
|
{ "popbts", CF_USE1 }, // Pop Branch Target Stack
|
|
{ "probe", CF_USE1|CF_USE2|CF_CHG3 }, // Probe Access
|
|
{ "probei", CF_USE1|CF_USE2|CF_CHG3 }, // Probe Access Immediate
|
|
{ "pushbts", CF_USE1 }, // Push Branch Target Stack
|
|
{ "pushnom", 0 }, // Push Nominated
|
|
{ "rfi", 0 }, // Return From Interruption
|
|
{ "rsm", CF_USE1|CF_CHG2 }, // Reset System Mask
|
|
{ "shladd", CF_USE1|CF_USE2|CF_USE3|CF_CHG4 }, // Shift Left and Add
|
|
{ "shrpd", CF_USE1|CF_USE2|CF_USE3|CF_CHG4 }, // Sihft Right Pair Doubleword
|
|
{ "shrpw", CF_USE1|CF_USE2|CF_USE3|CF_CHG4 }, // Sihft Right Pair Word
|
|
{ "spop0", 0 }, // Special Operation Zero
|
|
{ "spop1", CF_CHG1 }, // Special Operation One
|
|
{ "spop2", CF_USE1 }, // Special Operation Two
|
|
{ "spop3", CF_USE1|CF_USE2 }, // Special Operation Three
|
|
{ "ssm", CF_USE1|CF_CHG2 }, // Set System Mask
|
|
{ "stb", CF_USE1|CF_CHG2 }, // Store Byte
|
|
{ "stby", CF_USE1|CF_CHG2 }, // Store Bytes
|
|
{ "std", CF_USE1|CF_CHG2 }, // Store Doubleword
|
|
{ "stda", CF_USE1|CF_CHG2 }, // Store Doubleword Absolute
|
|
{ "stdby", CF_USE1|CF_CHG2 }, // Store Doubleword Bytes
|
|
{ "sth", CF_USE1|CF_CHG2 }, // Store Halfword
|
|
{ "stw", CF_USE1|CF_CHG2 }, // Store Word
|
|
{ "stwa", CF_USE1|CF_CHG2 }, // Store Word Absolute
|
|
{ "sub", CF_USE1|CF_USE2|CF_CHG3 }, // Subtract
|
|
{ "subi", CF_USE1|CF_USE2|CF_CHG3 }, // Subtract from Immediate
|
|
{ "sync", 0 }, // Synchronize Caches
|
|
{ "syncdma", 0 }, // Synchronize DMA
|
|
{ "uaddcm", CF_USE1|CF_USE2|CF_CHG3 }, // Unit Add Complement
|
|
{ "uxor", CF_USE1|CF_USE2|CF_CHG3 }, // Unit XOR
|
|
{ "xor", CF_USE1|CF_USE2|CF_CHG3 }, // Exclusive OR
|
|
|
|
// Floating point instructions
|
|
|
|
{ "fabs", CF_USE1|CF_CHG2 }, // Floating-Point Absolute Value
|
|
{ "fadd", CF_USE1|CF_USE2|CF_CHG3 }, // Floating-Point Add
|
|
{ "fcmp", CF_USE1|CF_USE2|CF_CHG3 }, // Floating-Point Compare
|
|
{ "fcnv", CF_USE1|CF_CHG2 }, // Floating-Point Convert
|
|
{ "fcpy", CF_USE1|CF_CHG2 }, // Floating-Point Copy
|
|
{ "fdiv", CF_USE1|CF_USE2|CF_CHG3 }, // Floating-Point Divide
|
|
{ "fid", 0 }, // Floating-Point Identity
|
|
{ "fldd", CF_USE1|CF_CHG2 }, // Floating-Point Load Doubleword
|
|
{ "fldw", CF_USE1|CF_CHG2 }, // Floating-Point Load Word
|
|
{ "fmpy", CF_USE1|CF_USE2|CF_CHG3 }, // Floating-Point Multiply
|
|
{ "fmpyadd", CF_USE1|CF_USE2|CF_CHG3|CF_USE4|CF_CHG5 }, // Floating-Point Multiply/Add
|
|
{ "fmpyfadd", CF_USE1|CF_USE2|CF_USE3|CF_CHG4 }, // Floating-Point Multiply Fused Add
|
|
{ "fmpynfadd", CF_USE1|CF_USE2|CF_USE3|CF_CHG4 }, // Floating-Point Multiply Negate Fused Add
|
|
{ "fmpysub", CF_USE1|CF_USE2|CF_CHG3|CF_USE4|CF_CHG5 }, // Floating-Point Multiply/Subtract
|
|
{ "fneg", CF_USE1|CF_CHG2 }, // Floating-Point Negate
|
|
{ "fnegabs", CF_USE1|CF_CHG2 }, // Floating-Point Negate Absolute Value
|
|
{ "frem", CF_USE1|CF_USE2|CF_CHG3 }, // Floating-Point Remainder
|
|
{ "frnd", CF_USE1|CF_CHG2 }, // Floating-Point Round to Integer
|
|
{ "fsqrt", CF_USE1|CF_CHG2 }, // Floating-Point Square Root
|
|
{ "fstd", CF_USE1|CF_CHG2 }, // Floating-Point Store Doubleword
|
|
{ "fstw", CF_USE1|CF_CHG2 }, // Floating-Point Store Word
|
|
{ "fsub", CF_USE1|CF_USE2|CF_CHG3 }, // Floating-Point Subtract
|
|
{ "ftest", CF_CHG1 }, // Floating-Point Test
|
|
{ "xmpyu", CF_USE1|CF_USE2|CF_CHG3 }, // Fixed-Point Multiply Unsigned
|
|
|
|
// Performance Monitor Coprocessor
|
|
|
|
{ "pmdis", 0 }, // Performance Monitor Disable
|
|
{ "pmenb", 0 }, // Performance Monitor Enable
|
|
|
|
// Macros
|
|
|
|
{ "call", CF_USE1|CF_CALL }, // Call Subroutine
|
|
{ "ret", 0 }, // Return From Subroutine
|
|
{ "shld", CF_USE1|CF_USE2|CF_CHG3 }, // Shift Left Doubleword
|
|
{ "shlw", CF_USE1|CF_USE2|CF_CHG3 }, // Shift Left Word
|
|
{ "shrd", CF_USE1|CF_USE2|CF_CHG3 }, // Shift Right Doubleword
|
|
{ "shrw", CF_USE1|CF_USE2|CF_CHG3 }, // Shift Right Word
|
|
{ "ldi", CF_USE1|CF_CHG2 }, // Load Immediate
|
|
{ "copy", CF_USE1|CF_CHG2 }, // Copy Register
|
|
{ "mtsar", CF_USE1 }, // Move To %SAR
|
|
{ "nop", 0 }, // No Operation
|
|
|
|
};
|
|
|
|
CASSERT(qnumber(Instructions) == HPPA_last);
|