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 + -
显示快捷键?