i86rtrtn.c
来自「开放源码的编译器open watcom 1.6.0版的源代码」· C语言 代码 · 共 752 行 · 第 1/3 页
C
752 行
/****************************************************************************
*
* 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 "standard.h"
#include "coderep.h"
#include "opcodes.h"
#include "rtclass.h"
#include "regset.h"
#include "rttable.h"
#include "model.h"
#include "zoiks.h"
#include "conflict.h"
#include "seldef.h"
#include "cgaux.h"
extern hw_reg_set *RegSets[];
extern name *GenFloat(name*,type_class_def);
extern name *GenConstData(char*,type_class_def);
extern void UpdateLive(instruction*,instruction*);
extern void DoNothing(instruction*);
extern name *AllocIntConst(int);
extern void ReplIns(instruction*,instruction*);
extern void SuffixIns(instruction*,instruction*);
extern void MoveSegRes(instruction*,instruction*);
extern instruction *MakeBinary(opcode_defs,name*,name*,name*,type_class_def);
extern name *AllocMemory(pointer,type_length,cg_class,type_class_def);
extern bool SegIsSS(name*);
extern name *GetSegment(name*);
extern void DelSeg(instruction*);
extern instruction *MakeUnary(opcode_defs,name*,name*,type_class_def);
extern instruction *MakeConvert(name*,name*,type_class_def,type_class_def);
extern void PrefixIns(instruction*,instruction*);
extern void MoveSegOp(instruction*,instruction*,int);
extern instruction *MakeMove(name*,name*,type_class_def);
extern name *AllocRegName(hw_reg_set);
extern rt_class AskHow(type_class_def,type_class_def);
extern label_handle AskRTLabel(sym_handle*);
extern instruction *NewIns(int);
extern conflict_node *NameConflict(instruction*,name*);
extern conflict_node *InMemory(conflict_node*);
extern int NumOperands(instruction*);
extern void AddIns(instruction*);
extern name *AllocTemp(type_class_def);
extern name *AllocIndex(name*,name*,type_length,type_class_def);
extern name *AddrConst(name*,int,constant_class);
extern seg_id AskCodeSeg(void);
extern void LookupRoutine(instruction *);
extern label_handle RTLabel(int);
extern int FindRTLabel(label_handle);
extern hw_reg_set ReturnReg(type_class_def,bool);
/*
* If you add a new routine, let John know as the debugger recognizes
* these.
*/
/*
OK, so I'm going to go to hell for this, it works don't it?
*/
#define RL_SI RL_TEMP_INDEX
rtn_info RTInfo[RT_NOP-BEG_RTNS+1] = {
/* name op class left right result*/
{"__U4FS", OP_CONVERT, U4, RL_DX_AX, RL_, RL_DX_AX},
{"__I4FS", OP_CONVERT, I4, RL_DX_AX, RL_, RL_DX_AX},
{"__U4FD", OP_CONVERT, U4, RL_DX_AX, RL_, RL_8},
{"__I4FD", OP_CONVERT, I4, RL_DX_AX, RL_, RL_8},
{"__U8FS", OP_CONVERT, U8, RL_8, RL_, RL_DX_AX},
{"__I8FS", OP_CONVERT, I8, RL_8, RL_, RL_DX_AX},
{"__U8FD", OP_CONVERT, U8, RL_8, RL_, RL_8},
{"__I8FD", OP_CONVERT, I8, RL_8, RL_, RL_8},
{"__FSFD", OP_CONVERT, FS, RL_DX_AX, RL_, RL_8},
{"__FSI4", OP_CONVERT, FS, RL_DX_AX, RL_, RL_DX_AX},
{"__RSI4", OP_ROUND, FS, RL_DX_AX, RL_, RL_DX_AX},
{"__FSU4", OP_CONVERT, FS, RL_DX_AX, RL_, RL_DX_AX},
{"__RSU4", OP_ROUND, FS, RL_DX_AX, RL_, RL_DX_AX},
{"__FSI8", OP_CONVERT, FS, RL_DX_AX, RL_, RL_8},
{"__RSI8", OP_ROUND, FS, RL_DX_AX, RL_, RL_8},
{"__FSU8", OP_CONVERT, FS, RL_DX_AX, RL_, RL_8},
{"__RSU8", OP_ROUND, FS, RL_DX_AX, RL_, RL_8},
{"__FDI4", OP_CONVERT, FD, RL_8, RL_, RL_DX_AX},
{"__RDI4", OP_ROUND, FD, RL_8, RL_, RL_DX_AX},
{"__FDU4", OP_CONVERT, FD, RL_8, RL_, RL_DX_AX},
{"__RDU4", OP_ROUND, FD, RL_8, RL_, RL_DX_AX},
{"__FDI8", OP_CONVERT, FD, RL_8, RL_, RL_8},
{"__RDI8", OP_ROUND, FD, RL_8, RL_, RL_8},
{"__FDU8", OP_CONVERT, FD, RL_8, RL_, RL_8},
{"__RDU8", OP_ROUND, FD, RL_8, RL_, RL_8},
{"__U8FS7", OP_CONVERT, U8, RL_8, RL_, RL_DX_AX},
{"__U8FD7", OP_CONVERT, U8, RL_8, RL_, RL_8},
{"__FSU87", OP_CONVERT, FS, RL_DX_AX, RL_, RL_8},
{"__FDU87", OP_CONVERT, FD, RL_8, RL_, RL_8},
{"__FDFS", OP_CONVERT, FD, RL_8, RL_, RL_DX_AX},
{"__RDFS", OP_ROUND, FD, RL_8, RL_, RL_DX_AX},
{"__FSA", OP_ADD, FS, RL_DX_AX, RL_CX_BX, RL_DX_AX},
{"__FSS", OP_SUB, FS, RL_DX_AX, RL_CX_BX, RL_DX_AX},
{"__FSM", OP_MUL, FS, RL_DX_AX, RL_CX_BX, RL_DX_AX},
{"__FSD", OP_DIV, FS, RL_DX_AX, RL_CX_BX, RL_DX_AX},
{"__FSC", OP_CMP, FS, RL_DX_AX, RL_CX_BX, RL_},
{"__FSN", OP_NEGATE, FS, RL_DX_AX, RL_, RL_DX_AX},
{"__FDA", OP_ADD, FD, RL_8, RL_8, RL_8},
{"__EDA", OP_ADD, FD, RL_8, RL_8, RL_8},
{"__FDS", OP_SUB, FD, RL_8, RL_8, RL_8},
{"__EDS", OP_SUB, FD, RL_8, RL_8, RL_8},
{"__FDM", OP_MUL, FD, RL_8, RL_8, RL_8},
{"__EDM", OP_MUL, FD, RL_8, RL_8, RL_8},
{"__FDD", OP_DIV, FD, RL_8, RL_8, RL_8},
{"__EDD", OP_DIV, FD, RL_8, RL_8, RL_8},
{"__FDC", OP_CMP, FD, RL_8, RL_8, RL_},
{"__EDC", OP_CMP, FD, RL_8, RL_8, RL_},
{"__FDN", OP_NEGATE, FD, RL_8, RL_, RL_8},
{"__I4M", OP_MUL, I4, RL_DX_AX, RL_CX_BX, RL_DX_AX},
{"__I4D", OP_DIV, I4, RL_DX_AX, RL_CX_BX, RL_DX_AX},
{"__I4D", OP_MOD, I4, RL_DX_AX, RL_CX_BX, RL_CX_BX},
{"__I8M", OP_MUL, I8, RL_8, RL_8, RL_8},
{"__I8ME", OP_MUL, I8, RL_8, RL_8, RL_8},
{"__I8DQ", OP_DIV, I8, RL_8, RL_8, RL_8},
{"__I8DQE", OP_DIV, I8, RL_8, RL_8, RL_8},
{"__I8DR", OP_MOD, I8, RL_8, RL_8, RL_8},
{"__I8DRE", OP_MOD, I8, RL_8, RL_8, RL_8},
{"__U4M", OP_MUL, U4, RL_DX_AX, RL_CX_BX, RL_DX_AX},
{"__U4D", OP_DIV, U4, RL_DX_AX, RL_CX_BX, RL_DX_AX},
{"__U4D", OP_MOD, U4, RL_DX_AX, RL_CX_BX, RL_CX_BX},
{"__U8M", OP_MUL, U8, RL_8, RL_8, RL_8},
{"__U8ME", OP_MUL, U8, RL_8, RL_8, RL_8},
{"__U8DQ", OP_DIV, U8, RL_8, RL_8, RL_8},
{"__U8DQE", OP_DIV, U8, RL_8, RL_8, RL_8},
{"__U8DR", OP_MOD, U8, RL_8, RL_8, RL_8},
{"__U8DRE", OP_MOD, U8, RL_8, RL_8, RL_8},
{"__I8LS", OP_LSHIFT, I8, RL_8, RL_SI, RL_8},
{"__I8RS", OP_RSHIFT, I8, RL_8, RL_SI, RL_8},
{"__U8LS", OP_LSHIFT, U8, RL_8, RL_SI, RL_8},
{"__U8RS", OP_RSHIFT, U8, RL_8, RL_SI, RL_8},
{"__PTS", OP_SUB, PT, RL_DX_AX, RL_CX_BX, RL_DX_AX},
{"__PTC", OP_CMP, PT, RL_DX_AX, RL_CX_BX, RL_},
{"__PIS", OP_SUB, PT, RL_DX_AX, RL_CX_BX, RL_DX_AX},
{"__PIA", OP_ADD, PT, RL_DX_AX, RL_CX_BX, RL_DX_AX},
{"__STK", OP_CALL, 0, RL_, RL_, RL_},
{"__CHP", OP_CALL, 0, RL_, RL_, RL_},
{"__SCN1", OP_SELECT, 0, RL_AL, RL_, RL_},
{"__SCN2", OP_SELECT, 0, RL_AX, RL_, RL_},
{"__SCN4", OP_SELECT, 0, RL_DX_AX, RL_, RL_},
{"__EPI", OP_CALL, 0, RL_, RL_, RL_},
{"__PRO", OP_CALL, 0, RL_, RL_, RL_},
{"IF@DP5DIV",OP_P5DIV, FD, RL_8, RL_, RL_8},
{"IF@P5DIV", OP_P5DIV, FS, RL_DX_AX, RL_CX_BX, RL_DX_AX},
{"IF@DPOW", OP_POW, FD, RL_8, RL_, RL_8},
{"IF@DPOWI", OP_POW, FD, RL_8, RL_, RL_8},
{"IF@POW", OP_POW, FS, RL_DX_AX, RL_CX_BX, RL_DX_AX},
{"IF@POWI", OP_POW, FS, RL_DX_AX, RL_CX_BX, RL_DX_AX},
{"IF@IPOW", OP_POW, I4, RL_DX_AX, RL_CX_BX, RL_DX_AX},
{"IF@DATAN2",OP_ATAN2, FD, RL_8, RL_, RL_8},
{"IF@DFMOD", OP_FMOD, FD, RL_8, RL_, RL_8},
{"IF@DLOG", OP_LOG, FD, RL_8, RL_, RL_8},
{"IF@DCOS", OP_COS, FD, RL_8, RL_, RL_8},
{"IF@DSIN", OP_SIN, FD, RL_8, RL_, RL_8},
{"IF@DTAN", OP_TAN, FD, RL_8, RL_, RL_8},
{"IF@DSQRT", OP_SQRT, FD, RL_8, RL_, RL_8},
{"IF@DFABS", OP_FABS, FD, RL_8, RL_, RL_8},
{"IF@DACOS", OP_ACOS, FD, RL_8, RL_, RL_8},
{"IF@DASIN", OP_ASIN, FD, RL_8, RL_, RL_8},
{"IF@DATAN", OP_ATAN, FD, RL_8, RL_, RL_8},
{"IF@DCOSH", OP_COSH, FD, RL_8, RL_, RL_8},
{"IF@DEXP", OP_EXP, FD, RL_8, RL_, RL_8},
{"IF@DLOG10",OP_LOG10, FD, RL_8, RL_, RL_8},
{"IF@DSINH", OP_SINH, FD, RL_8, RL_, RL_8},
{"IF@DTANH", OP_TANH, FD, RL_8, RL_, RL_8},
{"IF@ATAN2",OP_ATAN2, FS, RL_DX_AX, RL_CX_BX, RL_DX_AX},
{"IF@FMOD", OP_FMOD, FS, RL_DX_AX, RL_CX_BX, RL_DX_AX},
{"IF@LOG", OP_LOG, FS, RL_DX_AX, RL_, RL_DX_AX},
{"IF@COS", OP_COS, FS, RL_DX_AX, RL_, RL_DX_AX},
{"IF@SIN", OP_SIN, FS, RL_DX_AX, RL_, RL_DX_AX},
{"IF@TAN", OP_TAN, FS, RL_DX_AX, RL_, RL_DX_AX},
{"IF@SQRT", OP_SQRT, FS, RL_DX_AX, RL_, RL_DX_AX},
{"IF@FABS", OP_FABS, FS, RL_DX_AX, RL_, RL_DX_AX},
{"IF@ACOS", OP_ACOS, FS, RL_DX_AX, RL_, RL_DX_AX},
{"IF@ASIN", OP_ASIN, FS, RL_DX_AX, RL_, RL_DX_AX},
{"IF@ATAN", OP_ATAN, FS, RL_DX_AX, RL_, RL_DX_AX},
{"IF@COSH", OP_COSH, FS, RL_DX_AX, RL_, RL_DX_AX},
{"IF@EXP", OP_EXP, FS, RL_DX_AX, RL_, RL_DX_AX},
{"IF@LOG10",OP_LOG10, FS, RL_DX_AX, RL_, RL_DX_AX},
{"IF@SINH", OP_SINH, FS, RL_DX_AX, RL_, RL_DX_AX},
{"IF@TANH", OP_TANH, FS, RL_DX_AX, RL_, RL_DX_AX},
{"__chipbug",OP_NOP, 0, RL_, RL_, RL_},
{"__fdiv_m32",OP_NOP, 0, RL_, RL_, RL_},
{"__fdiv_m64",OP_NOP, 0, RL_, RL_, RL_},
{"__fdiv_m32r",OP_NOP, 0, RL_, RL_, RL_},
{"__fdiv_m64r",OP_NOP, 0, RL_, RL_, RL_},
{"__fdiv_fpr",OP_NOP, 0, RL_, RL_, RL_},
{"__NOP", OP_NOP, 0, RL_, RL_, RL_ }};
#include "cgnoalgn.h"
typedef struct {
call_class class;
byte_seq_len length;
char data[];
}rt_aux_info;
static rt_aux_info Scn1 = {
0, 6,
{0xF2, /* repne*/
0xAE, /* scasb*/
0xD1, 0xE1, /* shl cx,1*/
0x89, 0xCF} /* mov di,cx*/
};
static rt_aux_info Scn2 = {
0, 2,
{0xF2, /* repne*/
0xAF} /* scasw*/
};
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?