alphains.c

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

C
647
字号
/****************************************************************************
*
*                            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 INS( a, b, c, d, e ) { a, b, c, d, e, NULL }

ins_table AlphaTable[] = {
 /* INS( name,      opcode, funccode,   template,               method ), */
 // Memory Format Instructions
    INS( "lda",     0x08,   0x0000,     IT_MEMORY_LDA,          ENUM_NONE ),
    INS( "ldah",    0x09,   0x0000,     IT_MEMORY_ALL,          ENUM_NONE ),
    INS( "ldf",     0x20,   0x0000,     IT_FP_MEMORY_ALL,       ENUM_NONE ),
    INS( "ldg",     0x21,   0x0000,     IT_FP_MEMORY_ALL,       ENUM_NONE ),
    INS( "ldl",     0x28,   0x0000,     IT_MEMORY_ALL,          ENUM_NONE ),
    INS( "ldl_l",   0x2A,   0x0000,     IT_MEMORY_ALL,          ENUM_NONE ),
    INS( "ldq",     0x29,   0x0000,     IT_MEMORY_ALL,          ENUM_NONE ),
    INS( "ldq_l",   0x2B,   0x0000,     IT_MEMORY_ALL,          ENUM_NONE ),
    INS( "ldq_u",   0x0B,   0x0000,     IT_MEMORY_ALL,          ENUM_NONE ),
    INS( "lds",     0x22,   0x0000,     IT_FP_MEMORY_ALL,       ENUM_NONE ),
    INS( "ldt",     0x23,   0x0000,     IT_FP_MEMORY_ALL,       ENUM_NONE ),
    INS( "stf",     0x24,   0x0000,     IT_FP_MEMORY_ALL,       ENUM_NONE ),
    INS( "stg",     0x25,   0x0000,     IT_FP_MEMORY_ALL,       ENUM_NONE ),
    INS( "stl",     0x2C,   0x0000,     IT_MEMORY_ALL,          ENUM_NONE ),
    INS( "stl_c",   0x2E,   0x0000,     IT_MEMORY_ALL,          ENUM_NONE ),
    INS( "stq",     0x2D,   0x0000,     IT_MEMORY_ALL,          ENUM_NONE ),
    INS( "stq_c",   0x2F,   0x0000,     IT_MEMORY_ALL,          ENUM_NONE ),
    INS( "stq_u",   0x0F,   0x0000,     IT_MEMORY_ALL,          ENUM_NONE ),
    INS( "sts",     0x26,   0x0000,     IT_FP_MEMORY_ALL,       ENUM_NONE ),
    INS( "stt",     0x27,   0x0000,     IT_FP_MEMORY_ALL,       ENUM_NONE ),
 // Memory Format Instructions with a function code
    INS( "fetch",   0x18,   0x8000,     IT_MEMORY_B,            ENUM_NONE ),
    INS( "fetch_m", 0x18,   0xA000,     IT_MEMORY_B,            ENUM_NONE ),
    INS( "mb",      0x18,   0x4000,     IT_MEMORY_NONE,         ENUM_NONE ),
    INS( "wmb",     0x18,   0x4400,     IT_MEMORY_NONE,         ENUM_NONE ),
    INS( "rc",      0x18,   0xE000,     IT_MEMORY_A,            ENUM_NONE ),
    INS( "rpcc",    0x18,   0xC000,     IT_MEMORY_A,            ENUM_NONE ),
    INS( "rs",      0x18,   0xF000,     IT_MEMORY_A,            ENUM_NONE ),
    INS( "trapb",   0x18,   0x0000,     IT_MEMORY_NONE,         ENUM_NONE ),
    INS( "excb",    0x18,   0x0400,     IT_MEMORY_NONE,         ENUM_NONE ),
 // Memory Branch Instructions
    INS( "jmp",     0x1A,   0x0000,     IT_MEMORY_JUMP,         ENUM_NONE ),
    INS( "jsr",     0x1A,   0x0001,     IT_MEMORY_JUMP,         ENUM_NONE ),
    INS( "jsr_coroutine", 0x1A, 0x0003, IT_RET,                 ENUM_NONE ),
    INS( "ret",     0x1A,   0x0002,     IT_RET,                 ENUM_NONE ),
 // Branch Format Instructions
    INS( "br",      0x30,   0x0000,     IT_BR,                  ENUM_NONE ),
    INS( "fbeq",    0x31,   0x0000,     IT_FP_BRANCH,           ENUM_NONE ),
    INS( "fblt",    0x32,   0x0000,     IT_FP_BRANCH,           ENUM_NONE ),
    INS( "fble",    0x33,   0x0000,     IT_FP_BRANCH,           ENUM_NONE ),
    INS( "bsr",     0x34,   0x0000,     IT_BRANCH,              ENUM_NONE ),
    INS( "fbne",    0x35,   0x0000,     IT_FP_BRANCH,           ENUM_NONE ),
    INS( "fbge",    0x36,   0x0000,     IT_FP_BRANCH,           ENUM_NONE ),
    INS( "fbgt",    0x37,   0x0000,     IT_FP_BRANCH,           ENUM_NONE ),
    INS( "blbc",    0x38,   0x0000,     IT_BRANCH,              ENUM_NONE ),
    INS( "beq",     0x39,   0x0000,     IT_BRANCH,              ENUM_NONE ),
    INS( "blt",     0x3A,   0x0000,     IT_BRANCH,              ENUM_NONE ),
    INS( "ble",     0x3B,   0x0000,     IT_BRANCH,              ENUM_NONE ),
    INS( "blbs",    0x3C,   0x0000,     IT_BRANCH,              ENUM_NONE ),
    INS( "bne",     0x3D,   0x0000,     IT_BRANCH,              ENUM_NONE ),
    INS( "bge",     0x3E,   0x0000,     IT_BRANCH,              ENUM_NONE ),
    INS( "bgt",     0x3F,   0x0000,     IT_BRANCH,              ENUM_NONE ),
 // Operate Format Instructions
    INS( "addl",    0x10,   0x0000,     IT_OPERATE,             ENUM_OF_ADDL ),
    INS( "addq",    0x10,   0x0020,     IT_OPERATE,             ENUM_OF_ADDL ),
    INS( "cmpbge",  0x10,   0x000F,     IT_OPERATE,             ENUM_NONE ),
    INS( "cmpeq",   0x10,   0x002D,     IT_OPERATE,             ENUM_NONE ),
    INS( "cmple",   0x10,   0x006D,     IT_OPERATE,             ENUM_NONE ),
    INS( "cmplt",   0x10,   0x004D,     IT_OPERATE,             ENUM_NONE ),
    INS( "cmpule",  0x10,   0x003D,     IT_OPERATE,             ENUM_NONE ),
    INS( "cmpult",  0x10,   0x001D,     IT_OPERATE,             ENUM_NONE ),
    INS( "subl",    0x10,   0x0009,     IT_OPERATE,             ENUM_OF_ADDL ),
    INS( "subq",    0x10,   0x0029,     IT_OPERATE,             ENUM_OF_ADDL ),
    INS( "s4addl",  0x10,   0x0002,     IT_OPERATE,             ENUM_NONE ),
    INS( "s4addq",  0x10,   0x0022,     IT_OPERATE,             ENUM_NONE ),
    INS( "s4subl",  0x10,   0x000B,     IT_OPERATE,             ENUM_NONE ),
    INS( "s4subq",  0x10,   0x002B,     IT_OPERATE,             ENUM_NONE ),
    INS( "s8addl",  0x10,   0x0012,     IT_OPERATE,             ENUM_NONE ),
    INS( "s8addq",  0x10,   0x0032,     IT_OPERATE,             ENUM_NONE ),
    INS( "s8subl",  0x10,   0x001B,     IT_OPERATE,             ENUM_NONE ),
    INS( "s8subq",  0x10,   0x003B,     IT_OPERATE,             ENUM_NONE ),
    INS( "and",     0x11,   0x0000,     IT_OPERATE,             ENUM_NONE ),
    INS( "bic",     0x11,   0x0008,     IT_OPERATE,             ENUM_NONE ),
    INS( "bis",     0x11,   0x0020,     IT_OPERATE,             ENUM_NONE ),
    INS( "cmoveq",  0x11,   0x0024,     IT_OPERATE,             ENUM_NONE ),
    INS( "cmovlbc", 0x11,   0x0016,     IT_OPERATE,             ENUM_NONE ),
    INS( "cmovlbs", 0x11,   0x0014,     IT_OPERATE,             ENUM_NONE ),
    INS( "cmovge",  0x11,   0x0046,     IT_OPERATE,             ENUM_NONE ),
    INS( "cmovgt",  0x11,   0x0066,     IT_OPERATE,             ENUM_NONE ),
    INS( "cmovle",  0x11,   0x0064,     IT_OPERATE,             ENUM_NONE ),
    INS( "cmovlt",  0x11,   0x0044,     IT_OPERATE,             ENUM_NONE ),
    INS( "cmovne",  0x11,   0x0026,     IT_OPERATE,             ENUM_NONE ),
    INS( "eqv",     0x11,   0x0048,     IT_OPERATE,             ENUM_NONE ),
    INS( "ornot",   0x11,   0x0028,     IT_OPERATE,             ENUM_NONE ),
    INS( "xor",     0x11,   0x0040,     IT_OPERATE,             ENUM_NONE ),
    INS( "extbl",   0x12,   0x0006,     IT_OPERATE,             ENUM_NONE ),
    INS( "extlh",   0x12,   0x006A,     IT_OPERATE,             ENUM_NONE ),
    INS( "extll",   0x12,   0x0026,     IT_OPERATE,             ENUM_NONE ),
    INS( "extqh",   0x12,   0x007A,     IT_OPERATE,             ENUM_NONE ),
    INS( "extql",   0x12,   0x0036,     IT_OPERATE,             ENUM_NONE ),
    INS( "extwh",   0x12,   0x005A,     IT_OPERATE,             ENUM_NONE ),
    INS( "extwl",   0x12,   0x0016,     IT_OPERATE,             ENUM_NONE ),
    INS( "insbl",   0x12,   0x000B,     IT_OPERATE,             ENUM_NONE ),
    INS( "inslh",   0x12,   0x0067,     IT_OPERATE,             ENUM_NONE ),
    INS( "insll",   0x12,   0x002B,     IT_OPERATE,             ENUM_NONE ),
    INS( "insqh",   0x12,   0x0077,     IT_OPERATE,             ENUM_NONE ),
    INS( "insql",   0x12,   0x003B,     IT_OPERATE,             ENUM_NONE ),
    INS( "inswh",   0x12,   0x0057,     IT_OPERATE,             ENUM_NONE ),
    INS( "inswl",   0x12,   0x001B,     IT_OPERATE,             ENUM_NONE ),
    INS( "mskbl",   0x12,   0x0002,     IT_OPERATE,             ENUM_NONE ),
    INS( "msklh",   0x12,   0x0062,     IT_OPERATE,             ENUM_NONE ),
    INS( "mskll",   0x12,   0x0022,     IT_OPERATE,             ENUM_NONE ),
    INS( "mskqh",   0x12,   0x0072,     IT_OPERATE,             ENUM_NONE ),
    INS( "mskql",   0x12,   0x0032,     IT_OPERATE,             ENUM_NONE ),
    INS( "mskwh",   0x12,   0x0052,     IT_OPERATE,             ENUM_NONE ),
    INS( "mskwl",   0x12,   0x0012,     IT_OPERATE,             ENUM_NONE ),
    INS( "sll",     0x12,   0x0039,     IT_OPERATE,             ENUM_NONE ),
    INS( "sra",     0x12,   0x003C,     IT_OPERATE,             ENUM_NONE ),
    INS( "srl",     0x12,   0x0034,     IT_OPERATE,             ENUM_NONE ),
    INS( "zap",     0x12,   0x0030,     IT_OPERATE,             ENUM_NONE ),
    INS( "zapnot",  0x12,   0x0031,     IT_OPERATE,             ENUM_NONE ),
    INS( "mull",    0x13,   0x0000,     IT_OPERATE,             ENUM_OF_ADDL ),
    INS( "mulq",    0x13,   0x0020,     IT_OPERATE,             ENUM_OF_ADDL ),
    INS( "umulh",   0x13,   0x0030,     IT_OPERATE,             ENUM_NONE ),
 // Floating-Point Operate Format Instructions - Data Type Independent
    INS( "cpys",    0x17,   0x0020,     IT_FP_OPERATE,          ENUM_NONE ),
    INS( "cpyse",   0x17,   0x0022,     IT_FP_OPERATE,          ENUM_NONE ),
    INS( "cpysn",   0x17,   0x0021,     IT_FP_OPERATE,          ENUM_NONE ),
    INS( "cvtlq",   0x17,   0x0010,     IT_FP_CONVERT,          ENUM_NONE ),
    INS( "cvtql",   0x17,   0x0030,     IT_FP_CONVERT,          ENUM_DTI_CVTQL ),
    INS( "fcmoveq", 0x17,   0x002A,     IT_FP_OPERATE,          ENUM_NONE ),
    INS( "fcmovge", 0x17,   0x002D,     IT_FP_OPERATE,          ENUM_NONE ),
    INS( "fcmovgt", 0x17,   0x002F,     IT_FP_OPERATE,          ENUM_NONE ),
    INS( "fcmovle", 0x17,   0x002E,     IT_FP_OPERATE,          ENUM_NONE ),
    INS( "fcmovlt", 0x17,   0x002C,     IT_FP_OPERATE,          ENUM_NONE ),
    INS( "fcmovne", 0x17,   0x002B,     IT_FP_OPERATE,          ENUM_NONE ),
    INS( "mf_fpcr", 0x17,   0x0025,     IT_MT_MF_FPCR,          ENUM_NONE ),
    INS( "mt_fpcr", 0x17,   0x0024,     IT_MT_MF_FPCR,          ENUM_NONE ),
 // Floating-Point Operate Format Instructions - IEEE
    INS( "adds",    0x16,   0x0080,     IT_FP_OPERATE,          ENUM_IEEE_ADDS ),
    INS( "addt",    0x16,   0x00A0,     IT_FP_OPERATE,          ENUM_IEEE_ADDS ),
    INS( "cmpteq",  0x16,   0x00A5,     IT_FP_OPERATE,          ENUM_IEEE_CMPTEQ ),
    INS( "cmptlt",  0x16,   0x00A6,     IT_FP_OPERATE,          ENUM_IEEE_CMPTEQ ),
    INS( "cmptle",  0x16,   0x00A7,     IT_FP_OPERATE,          ENUM_IEEE_CMPTEQ ),
    INS( "cmptun",  0x16,   0x00A4,     IT_FP_OPERATE,          ENUM_IEEE_CMPTEQ ),
    INS( "cvtqs",   0x16,   0x00BC,     IT_FP_CONVERT,          ENUM_IEEE_CVTQS ),
    INS( "cvtqt",   0x16,   0x00BE,     IT_FP_CONVERT,          ENUM_IEEE_CVTQS ),
    INS( "cvtts",   0x16,   0x00AC,     IT_FP_CONVERT,          ENUM_IEEE_ADDS ),
    INS( "divs",    0x16,   0x0083,     IT_FP_OPERATE,          ENUM_IEEE_ADDS ),
    INS( "divt",    0x16,   0x00A3,     IT_FP_OPERATE,          ENUM_IEEE_ADDS ),
    INS( "muls",    0x16,   0x0082,     IT_FP_OPERATE,          ENUM_IEEE_ADDS ),
    INS( "mult",    0x16,   0x00A2,     IT_FP_OPERATE,          ENUM_IEEE_ADDS ),
    INS( "subs",    0x16,   0x0081,     IT_FP_OPERATE,          ENUM_IEEE_ADDS ),
    INS( "subt",    0x16,   0x00A1,     IT_FP_OPERATE,          ENUM_IEEE_ADDS ),
    INS( "cvttq",   0x16,   0x00AF,     IT_FP_CONVERT,          ENUM_IEEE_CVTTQ ),
 // Floating-Point Operate Format Instructions - VAX
    INS( "addf",    0x15,   0x0080,     IT_FP_OPERATE,          ENUM_VAX_ADDF ),
    INS( "cvtdg",   0x15,   0x009E,     IT_FP_CONVERT,          ENUM_VAX_ADDF ),
    INS( "addg",    0x15,   0x00A0,     IT_FP_OPERATE,          ENUM_VAX_ADDF ),
    INS( "cmpgeq",  0x15,   0x00A5,     IT_FP_OPERATE,          ENUM_VAX_CMPGEQ ),
    INS( "cmpglt",  0x15,   0x00A6,     IT_FP_OPERATE,          ENUM_VAX_CMPGEQ ),
    INS( "cmpgle",  0x15,   0x00A7,     IT_FP_OPERATE,          ENUM_VAX_CMPGEQ ),
    INS( "cvtgf",   0x15,   0x00AC,     IT_FP_CONVERT,          ENUM_VAX_ADDF ),
    INS( "cvtgd",   0x15,   0x00AD,     IT_FP_CONVERT,          ENUM_VAX_ADDF ),
    INS( "cvtqf",   0x15,   0x00BC,     IT_FP_CONVERT,          ENUM_VAX_CVTQF ),
    INS( "cvtqg",   0x15,   0x00BE,     IT_FP_CONVERT,          ENUM_VAX_CVTQF ),
    INS( "divf",    0x15,   0x0083,     IT_FP_OPERATE,          ENUM_VAX_ADDF ),
    INS( "divg",    0x15,   0x00A3,     IT_FP_OPERATE,          ENUM_VAX_ADDF ),
    INS( "mulf",    0x15,   0x0082,     IT_FP_OPERATE,          ENUM_VAX_ADDF ),
    INS( "mulg",    0x15,   0x00A2,     IT_FP_OPERATE,          ENUM_VAX_ADDF ),
    INS( "subf",    0x15,   0x0081,     IT_FP_OPERATE,          ENUM_VAX_ADDF ),
    INS( "subg",    0x15,   0x00A1,     IT_FP_OPERATE,          ENUM_VAX_ADDF ),
    INS( "cvtgq",   0x15,   0x00AF,     IT_FP_CONVERT,          ENUM_VAX_CVTGQ ),
 // PALcode
    INS( "call_pal",0x00,   0x0000,     IT_CALL_PAL,            ENUM_NONE ),
 // Stylized Code Forms
    // nop and fnop are in directiv.c since they don't require much parsing
    INS( "clr",     0x11,   0x0020,     IT_PSEUDO_CLR,          ENUM_NONE ),
    INS( "fclr",    0x17,   0x0020,     IT_PSEUDO_FCLR,         ENUM_NONE ),
    INS( "fmov",    0x17,   0x0020,     IT_PSEUDO_FMOV,         ENUM_NONE ),
    INS( "negl",    0x10,   0x0009,     IT_PSEUDO_NOT,          ENUM_OF_ADDL ),
    INS( "negq",    0x10,   0x0029,     IT_PSEUDO_NOT,          ENUM_OF_ADDL ),
    INS( "negf",    0x15,   0x0081,     IT_PSEUDO_NEGF,         ENUM_VAX_ADDF ),
    INS( "negg",    0x15,   0x00A1,     IT_PSEUDO_NEGF,         ENUM_VAX_ADDF ),
    INS( "negs",    0x16,   0x0081,     IT_PSEUDO_NEGF,         ENUM_IEEE_ADDS ),

⌨️ 快捷键说明

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