ppcins.c

来自「开放源码的编译器open watcom 1.6.0版的源代码」· C语言 代码 · 共 663 行 · 第 1/3 页

C
663
字号
/****************************************************************************
*
*                            Open Watcom Project
*
*    Portions Copyright (c) 1983-2002 Sybase, Inc. All Rights Reserved.
*
*  ========================================================================
*
*    This file contains Original Code and/or Modifications of Original
*    Code as defined in and that are subject to the Sybase Open Watcom
*    Public License version 1.0 (the 'License'). You may not use this file
*    except in compliance with the License. BY USING THIS FILE YOU AGREE TO
*    ALL TERMS AND CONDITIONS OF THE LICENSE. A copy of the License is
*    provided with the Original Code and Modifications, and is also
*    available at www.sybase.com/developer/opensource.
*
*    The Original Code and all software distributed under the License are
*    distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
*    EXPRESS OR IMPLIED, AND SYBASE AND ALL CONTRIBUTORS HEREBY DISCLAIM
*    ALL SUCH WARRANTIES, INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF
*    MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR
*    NON-INFRINGEMENT. Please see the License for the specific language
*    governing rights and limitations under the License.
*
*  ========================================================================
*
* Description:  WHEN YOU FIGURE OUT WHAT THIS FILE DOES, PLEASE
*               DESCRIBE IT HERE!
*
****************************************************************************/

#include "as.h"

static bool insErrFlag = FALSE;    // to tell whether we had problems or not

#define OE      IF_SETS_OVERFLOW
#define RC      IF_SETS_CC
#define AA      IF_SETS_ABSOLUTE
#define LK      IF_SETS_LINK

#define INS( a, b, c, d, e, f ) { a, b, c, 0, d, e, f, NULL }
// many simpilfied mnemonics use the special field
#define INS2( a, b, c, d, e, f, g ) { a, b, c, d, e, f, g, NULL }

ins_table PPCTable[] = {
    INS( "abs",         31, 360,        IT_UN,          OE | RC,        0 ),
    INS( "add",         31, 266,        IT_BIN,         OE | RC,        0 ),
    INS( "addc",        31, 10,         IT_BIN,         OE | RC,        0 ),
    INS( "adde",        31, 138,        IT_BIN,         OE | RC,        0 ),
    INS( "addi",        14, 0,          IT_BIN_IMM,     0,              0 ),
    INS( "addic",       12, 0,          IT_BIN_IMM,     0,              0 ),
    INS( "addic.",      13, 0,          IT_BIN_IMM,     0,              0 ),
    INS( "addis",       15, 0,          IT_BIN_IMM,     0,              0 ),
    INS( "addme",       31, 234,        IT_UN,          OE | RC,        0 ),
    INS( "addze",       31, 202,        IT_UN,          OE | RC,        0 ),
    INS( "and",         31, 28,         IT_BIN,         RC,             0 ),
    INS( "andc",        31, 60,         IT_BIN,         RC,             0 ),
    INS( "andi.",       28, 0,          IT_BIN_IMM,     0,              0 ),
    INS( "andis.",      29, 0,          IT_BIN_IMM,     0,              0 ),

    INS( "b",           18, 0,          IT_BR,          AA | LK,        0 ),
    INS( "bc",          16, 0,          IT_BR_COND,     AA | LK,        0 ),
    INS( "bcctr",       19, 528,        IT_BR_SPEC,     LK,             0 ),
    INS( "bclr",        19, 16,         IT_BR_SPEC,     LK,             0 ),
    INS( "clcs",        31, 531,        IT_UN,          RC,             0 ),
    INS( "cmp",         31, 0,          IT_CMP,         0,              0 ),
    INS( "cmpi",        11, 0,          IT_CMP_IMM,     0,              0 ),
    INS( "cmpl",        31, 32,         IT_CMP,         0,              0 ),
    INS( "cmpli",       10, 0,          IT_CMP_IMM,     0,              0 ),
    // INS( "cntlzd",   31, 58,         IT_UN,          RC,             0 ),
    INS( "cntlzw",      31, 26,         IT_UN,          RC,             0 ),
    INS( "crand",       19, 257,        IT_CRB_BIN,     0,              0 ),
    INS( "crandc",      19, 129,        IT_CRB_BIN,     0,              0 ),
    INS( "creqv",       19, 289,        IT_CRB_BIN,     0,              0 ),
    INS( "crnand",      19, 225,        IT_CRB_BIN,     0,              0 ),
    INS( "crnor",       19, 33,         IT_CRB_BIN,     0,              0 ),
    INS( "cror",        19, 449,        IT_CRB_BIN,     0,              0 ),
    INS( "crorc",       19, 417,        IT_CRB_BIN,     0,              0 ),
    INS( "crxor",       19, 193,        IT_CRB_BIN,     0,              0 ),
    INS( "dcbf",        31, 86,         IT_DC,          0,              0 ),
    INS( "dcbi",        31, 470,        IT_DC,          0,              0 ),
    INS( "dcbst",       31, 54,         IT_DC,          0,              0 ),
    INS( "dcbt",        31, 278,        IT_DC,          0,              0 ),
    INS( "dcbtst",      31, 246,        IT_DC,          0,              0 ),
    INS( "dcbz",        31, 1014,       IT_DC,          0,              0 ),
    INS( "div",         31, 331,        IT_BIN,         OE | RC,        0 ),
    // INS( "divd",     31, 489,        IT_BIN,         OE | RC,        0 ),
    // INS( "divdu",    31, 457,        IT_BIN,         OE | RC,        0 ),
    INS( "divs",        31, 363,        IT_BIN,         OE | RC,        0 ),
    INS( "divw",        31, 491,        IT_BIN,         OE | RC,        0 ),
    INS( "divwu",       31, 459,        IT_BIN,         OE | RC,        0 ),
    INS( "doz",         31, 264,        IT_BIN,         OE | RC,        0 ),
    INS( "dozi",        9, 0,           IT_BIN_IMM,     0,              0 ),

    INS( "eciwx",       31, 310,        IT_BIN,         0,              0 ),
    INS( "ecowx",       31, 438,        IT_BIN,         0,              0 ),
    INS( "eieio",       31, 854,        IT_EIEIO,       0,              OE ),
    INS( "eqv",         31, 284,        IT_BIN2,        RC,             0 ),
    INS( "extsb",       31, 954,        IT_UN2,         RC,             OE ),
    INS( "extsh",       31, 922,        IT_UN2,         RC,             OE ),
    // INS( "extsw",    31, 986,        IT_BIN,         RC,             OE ),
    INS( "fabs",        63, 264,        IT_FP_UN,       RC,             0 ),
    INS( "fadd",        63, 21,         IT_FP_BIN,      RC,             0 ),
    INS( "fadds",       59, 21,         IT_FP_BIN,      RC,             0 ),
    // INS( "fcfid",    63, 846,        IT_FCTID,       RC,             0 ),
    INS( "fcmpo",       63, 32,         IT_FP_CMP,      0,              0 ),
    INS( "fcmpu",       63, 0,          IT_FP_CMP,      0,              0 ),
    // INS( "fctid",    63, 814,        IT_FCTID,       RC,             0 ),
    // INS( "fctidz",   63, 815,        IT_FCTID,       RC,             0 ),
    INS( "fctiw",       63, 14,         IT_FP_UN,       RC,             0 ),
    INS( "fctiwz",      63, 15,         IT_FP_UN,       RC,             0 ),
    INS( "fdiv",        63, 18,         IT_FP_BIN,      RC,             0 ),
    INS( "fdivs",       59, 18,         IT_FP_BIN,      RC,             0 ),
    INS( "fmadd",       63, 29,         IT_FP_MULADD,   RC,             0 ),
    INS( "fmadds",      59, 29,         IT_FP_MULADD,   RC,             0 ),
    INS( "fmr",         63, 72,         IT_FP_UN,       RC,             0 ),
    INS( "fmsub",       63, 28,         IT_FP_MULADD,   RC,             0 ),
    INS( "fmsubs",      59, 28,         IT_FP_MULADD,   RC,             0 ),
    INS( "fmul",        63, 25,         IT_FP_MUL,      RC,             0 ),
    INS( "fmuls",       59, 25,         IT_FP_MUL,      RC,             0 ),
    INS( "fnabs",       63, 136,        IT_FP_UN,       RC,             0 ),
    INS( "fneg",        63, 40,         IT_FP_UN,       RC,             0 ),
    INS( "fnmadd",      63, 31,         IT_FP_MULADD,   RC,             0 ),
    INS( "fnmadds",     59, 31,         IT_FP_MULADD,   RC,             0 ),
    INS( "fnmsub",      63, 30,         IT_FP_MULADD,   RC,             0 ),
    INS( "fnmsubs",     59, 30,         IT_FP_MULADD,   RC,             0 ),
    // INS( "fres",     59, 24,         IT_FCTID,       RC,             0 ),

    INS( "frsp",        63, 12,         IT_FP_UN,       RC,             0 ),
    // INS( "frsqrte",  63, 26,         IT_FCTID,       RC,             0 ),
    // INS( "fsel",     63, 23,         ????????,       RC,             0 ),
    // INS( "fsqrt",    63, 22,         IT_FCTID,       RC,             0 ),
    // INS( "fsqrts",   59, 22,         IT_FCTID,       RC,             0 ),
    INS( "fsub",        63, 20,         IT_FP_BIN,      RC,             0 ),
    INS( "fsubs",       59, 20,         IT_FP_BIN,      RC,             0 ),
    INS( "icbi",        31, 982,        IT_DC,          0,              0 ),
    INS( "isync",       19, 150,        IT_EIEIO,       0,              0 ),
    INS( "lbz",         34, 0,          IT_LS,          0,              0 ),
    INS( "lbzu",        35, 0,          IT_LS,          0,              0 ),
    INS( "lbzux",       31, 119,        IT_LS_INDEX,    0,              0 ),
    INS( "lbzx",        31, 87,         IT_LS_INDEX,    0,              0 ),
    // INS( "ld",       58, 0,          IT_LS,          0,              0 ),
    // INS( "ldarx",    31, 84,         IT_LS_INDEX,    0,              0 ),
    // INS( "ldu",      58, 0,          IT_LS,          0,              0 ),
    // INS( "ldux",     31, 53,         IT_LS_INDEX,    0,              0 ),
    // INS( "ldx",      31, 21,         IT_LS_INDEX,    0,              0 ),
    INS( "lfd",         50, 0,          IT_LS_FP,       0,              0 ),
    INS( "lfdu",        51, 0,          IT_LS_FP,       0,              0 ),
    INS( "lfdux",       31, 631,        IT_LS_INDEX_FP, 0,              0 ),
    INS( "lfdx",        31, 599,        IT_LS_INDEX_FP, 0,              0 ),
    INS( "lfs",         48, 0,          IT_LS_FP,       0,              0 ),
    INS( "lfsu",        49, 0,          IT_LS_FP,       0,              0 ),
    INS( "lfsux",       31, 567,        IT_LS_INDEX_FP, 0,              0 ),
    INS( "lfsx",        31, 535,        IT_LS_INDEX_FP, 0,              0 ),
    INS( "lha",         42, 0,          IT_LS,          0,              0 ),
    INS( "lhau",        43, 0,          IT_LS,          0,              0 ),
    INS( "lhaux",       31, 375,        IT_LS_INDEX,    0,              0 ),
    INS( "lhax",        31, 343,        IT_LS_INDEX,    0,              0 ),
    INS( "lhbrx",       31, 790,        IT_LS_INDEX,    0,              0 ),
    INS( "lhz",         40, 0,          IT_LS,          0,              0 ),
    INS( "lhzu",        41, 0,          IT_LS,          0,              0 ),
    INS( "lhzux",       31, 311,        IT_LS_INDEX,    0,              0 ),

    INS( "lhzx",        31, 279,        IT_LS_INDEX,    0,              0 ),
    INS( "lmw",         46, 0,          IT_LS,          0,              0 ),
    INS( "lscbx",       31, 277,        IT_LS_INDEX,    RC,             0 ),
    INS( "lswi",        31, 597,        IT_LSWI,        0,              0 ),
    INS( "lswx",        31, 533,        IT_LS_INDEX,    0,              0 ),
    // INS( "lwa",              58, 0,          IT_LS,          0,              0 ),
    INS( "lwarx",       31, 20,         IT_LS_INDEX,    0,              0 ),
    // INS( "lwaux",    31, 373,        IT_LS_INDEX,    0,              0 ),
    // INS( "lwax",     31, 341,        IT_LS_INDEX,    0,              0 ),
    INS( "lwbrx",       31, 534,        IT_LS_INDEX,    0,              0 ),
    INS( "lwz",         32, 0,          IT_LS,          0,              0 ),
    INS( "lwzu",        33, 0,          IT_LS,          0,              0 ),
    INS( "lwzux",       31, 55,         IT_LS_INDEX,    0,              0 ),
    INS( "lwzx",        31, 23,         IT_LS_INDEX,    0,              0 ),
    INS( "maskg",       31, 29,         IT_BIN2,        RC,             0 ),
    INS( "maskir",      31, 541,        IT_BIN2,        RC,             0 ),
    INS( "mcrf",        19, 0,          IT_CRF_UN,      0,              0 ),
    INS( "mcrfs",       63, 64,         IT_CRF_UN,      0,              0 ),
    INS( "mcrxr",       31, 512,        IT_CRF_MCRXR,   0,              0 ),
    INS( "mfcr",        31, 19,         IT_MFCRMSR,     0,              0 ),
    INS( "mffs",        63, 583,        IT_MFFS,        RC,             0 ),
    INS( "mfmsr",       31, 83,         IT_MFCRMSR,     0,              0 ),
    INS( "mfspr",       31, 339,        IT_MFSPR,       0,              0 ),
    INS( "mfsr",        31, 595,        IT_MFSR,        0,              0 ),
    INS( "mfsrin",      31, 659,        IT_MFSRIN,      0,              0 ),
    // INS( "mftb",     31, 371,        IT_MFTB,        0,              0 ),
    INS( "mtcrf",       31, 144,        IT_MTCRF,       0,              0 ),
    INS( "mtfsb0",      63, 70,         IT_MTFSB,       RC,             0 ),
    INS( "mtfsb1",      63, 38,         IT_MTFSB,       RC,             0 ),
    INS( "mtfsf",       31, 711,        IT_MTFSF,       RC,             0 ),
    INS( "mtfsfi",      63, 134,        IT_MTFSF_IMM,   RC,             0 ),
    INS( "mtmsr",       31, 146,        IT_MFCRMSR,     0,              0 ),
    INS( "mtspr",       31, 467,        IT_MTSPR,       0,              0 ),
    INS( "mtsr",        31, 210,        IT_MTSR,        0,              0 ),
    INS( "mtsrin",      31, 242,        IT_MFSRIN,      0,              0 ),
    INS( "mul",         31, 107,        IT_BIN,         OE | RC,        0 ),
    // INS( "mulhd",    31, 73,         IT_BIN,         RC,             0 ),
    // INS( "mulhdu",   31, 9,          IT_BIN,         RC,             0 ),
    INS( "mulhw",       31, 75,         IT_BIN,         RC,             0 ),
    INS( "mulhwu",      31, 11,         IT_BIN,         RC,             0 ),
    // INS( "mulld",    31, 233,        IT_BIN,         OE | RC,        0 ),
    INS( "mullw",       31, 235,        IT_BIN,         OE | RC,        0 ),
    INS( "mulli",       7, 0,           IT_BIN_IMM,     0,              0 ),
    INS( "nabs",        31, 488,        IT_UN,          OE | RC,        0 ),
    INS( "nand",        31, 476,        IT_BIN2,        RC,             0 ),
    INS( "neg",         31, 104,        IT_UN,          OE | RC,        0 ),
    INS( "nor",         31, 124,        IT_BIN2,        RC,             0 ),
    INS( "or",          31, 444,        IT_BIN2,        RC,             0 ),
    INS( "orc",         31, 412,        IT_BIN2,        RC,             0 ),
    INS( "ori",         24, 0,          IT_BIN_IMM2,    0,              0 ),
    INS( "oris",        25, 0,          IT_BIN_IMM2,    0,              0 ),
    INS( "rfi",         19, 50,         IT_EIEIO,       0,              0 ),
    // INS( "rldcl",    30, 8,          IT_NYI,         0,              RC ),
    // INS( "rldcr",    30, 9,          IT_NYI,         0,              RC ),
    // INS( "rldic",    30, 2,          IT_NYI,         0,              RC ),
    // INS( "rldicl",   30, 0,          IT_NYI,         0,              RC ),
    // INS( "rldicr",   30, 1,          IT_NYI,         0,              RC ),
    // INS( "rldimi",   30, 3,          IT_NYI,         0,              RC ),

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?