386rtrtn.c
来自「开放源码的编译器open watcom 1.6.0版的源代码」· C语言 代码 · 共 478 行 · 第 1/2 页
C
478 行
/****************************************************************************
*
* 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: Generate calls to runtime support routines.
*
****************************************************************************/
#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 name *GenFloat(name*,type_class_def);
extern void UpdateLive(instruction*,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 void DelSeg(instruction*);
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 AskBackSeg(void);
extern void LookupRoutine(instruction *);
extern label_handle RTLabel(int);
extern int FindRTLabel(label_handle);
extern instruction *rMAKECALL(instruction*);
extern hw_reg_set FirstReg(reg_set_index);
/*
* If you add a new routine, let John know as the debugger recognizes
* these.
*/
rtn_info RTInfo[RT_NOP-BEG_RTNS+1] = {
/* name op class left right result*/
"__U4FS", OP_CONVERT, U4, RL_EAX, RL_, RL_EAX,
"__I4FS", OP_CONVERT, I4, RL_EAX, RL_, RL_EAX,
"__U4FD", OP_CONVERT, U4, RL_EAX, RL_, RL_EDX_EAX,
"__I4FD", OP_CONVERT, I4, RL_EAX, RL_, RL_EDX_EAX,
"__FSFD", OP_CONVERT, FS, RL_EAX, RL_, RL_EDX_EAX,
"__FSI4", OP_CONVERT, FS, RL_EAX, RL_, RL_EAX,
"__RSI4", OP_ROUND, FS, RL_EAX, RL_, RL_EAX,
"__FSU4", OP_CONVERT, FS, RL_EAX, RL_, RL_EAX,
"__RSU4", OP_ROUND, FS, RL_EAX, RL_, RL_EAX,
"__FDI4", OP_CONVERT, FD, RL_EDX_EAX, RL_, RL_EAX,
"__RDI4", OP_ROUND, FD, RL_EDX_EAX, RL_, RL_EAX,
"__FDU4", OP_CONVERT, FD, RL_EDX_EAX, RL_, RL_EAX,
"__RDU4", OP_ROUND, FD, RL_EDX_EAX, RL_, RL_EAX,
"__FDFS", OP_CONVERT, FD, RL_EDX_EAX, RL_, RL_EAX,
"__RDFS", OP_ROUND, FD, RL_EDX_EAX, RL_, RL_EAX,
"__U8FS", OP_CONVERT, U8, RL_EDX_EAX, RL_, RL_EAX,
"__I8FS", OP_CONVERT, I8, RL_EDX_EAX, RL_, RL_EAX,
"__U8FD", OP_CONVERT, U8, RL_EDX_EAX, RL_, RL_EDX_EAX,
"__I8FD", OP_CONVERT, I8, RL_EDX_EAX, RL_, RL_EDX_EAX,
"__FSI8", OP_CONVERT, FS, RL_EAX, RL_, RL_EDX_EAX,
"__RSI8", OP_ROUND, FS, RL_EAX, RL_, RL_EDX_EAX,
"__FSU8", OP_CONVERT, FS, RL_EAX, RL_, RL_EDX_EAX,
"__RSU8", OP_ROUND, FS, RL_EAX, RL_, RL_EDX_EAX,
"__FDI8", OP_CONVERT, FD, RL_EDX_EAX, RL_, RL_EDX_EAX,
"__RDI8", OP_ROUND, FD, RL_EDX_EAX, RL_, RL_EDX_EAX,
"__FDU8", OP_CONVERT, FD, RL_EDX_EAX, RL_, RL_EDX_EAX,
"__RDU8", OP_ROUND, FD, RL_EDX_EAX, RL_, RL_EDX_EAX,
"__U8FS7",OP_CONVERT, U8, RL_EDX_EAX, RL_, RL_EAX,
"__U8FD7",OP_CONVERT, U8, RL_EDX_EAX, RL_, RL_EDX_EAX,
"__FSU87",OP_CONVERT, FS, RL_EAX, RL_, RL_EDX_EAX,
"__FDU87",OP_CONVERT, FD, RL_EDX_EAX, RL_, RL_EDX_EAX,
"__I8M", OP_MUL, I8, RL_EDX_EAX, RL_FPPARM2, RL_EDX_EAX,
"__I8D", OP_DIV, I8, RL_EDX_EAX, RL_FPPARM2, RL_EDX_EAX,
"__I8D", OP_MOD, I8, RL_EDX_EAX, RL_FPPARM2, RL_FPPARM2,
"__I8RS", OP_RSHIFT, I8, RL_EDX_EAX, RL_FPPARM2, RL_EDX_EAX,
"__I8LS", OP_LSHIFT, I8, RL_EDX_EAX, RL_FPPARM2, RL_EDX_EAX,
"__U8M", OP_MUL, U8, RL_EDX_EAX, RL_FPPARM2, RL_EDX_EAX,
"__U8D", OP_DIV, U8, RL_EDX_EAX, RL_FPPARM2, RL_EDX_EAX,
"__U8D", OP_MOD, U8, RL_EDX_EAX, RL_FPPARM2, RL_FPPARM2,
"__U8RS", OP_RSHIFT, U8, RL_EDX_EAX, RL_FPPARM2, RL_EDX_EAX,
"__U8LS", OP_LSHIFT, U8, RL_EDX_EAX, RL_FPPARM2, RL_EDX_EAX,
"__FSA", OP_ADD, FS, RL_EAX, RL_EDX, RL_EAX,
"__FSS", OP_SUB, FS, RL_EAX, RL_EDX, RL_EAX,
"__FSM", OP_MUL, FS, RL_EAX, RL_EDX, RL_EAX,
"__FSD", OP_DIV, FS, RL_EAX, RL_EDX, RL_EAX,
"__FSC", OP_CMP, FS, RL_EAX, RL_EDX, RL_,
"__FSN", OP_NEGATE, FS, RL_EAX, RL_, RL_EAX,
"__FDA", OP_ADD, FD, RL_EDX_EAX, RL_FPPARM2, RL_EDX_EAX,
"__FDS", OP_SUB, FD, RL_EDX_EAX, RL_FPPARM2, RL_EDX_EAX,
"__FDM", OP_MUL, FD, RL_EDX_EAX, RL_FPPARM2, RL_EDX_EAX,
"__FDD", OP_DIV, FD, RL_EDX_EAX, RL_FPPARM2, RL_EDX_EAX,
"__FDC", OP_CMP, FD, RL_EDX_EAX, RL_FPPARM2, RL_EDX_EAX,
"__FDN", OP_NEGATE, FD, RL_EDX_EAX, RL_, RL_EDX_EAX,
"__CHK", OP_CALL, 0, RL_, RL_, RL_,
"__GRO", OP_CALL, 0, RL_, RL_, RL_,
"__TNK", OP_CALL, 0, RL_, RL_, RL_,
"__TNC", 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_EAX, RL_, RL_,
"__GETDS",OP_CALL, 0, RL_, RL_, RL_,
"__EPI", OP_CALL, 0, RL_, RL_, RL_,
"__PRO", OP_CALL, 0, RL_, RL_, RL_,
"__PON", OP_CALL, 0, RL_, RL_, RL_,
"__POFF", OP_CALL, 0, RL_, RL_, RL_,
"__FlatToFar16", OP_PTR_TO_FOREIGN, U4, RL_EAX, RL_, RL_EAX,
"__Far16ToFlat", OP_PTR_TO_NATIVE, U4, RL_EAX, RL_, RL_EAX,
"__Far16Func2", OP_CALL, U4, RL_EAX, RL_, RL_EAX,
"__Far16Cdecl2", OP_CALL, U4, RL_EAX, RL_, RL_EAX,
"__Far16Pascal2", OP_CALL, U4, RL_EAX, RL_, RL_EAX,
"__Far32Func", OP_CALL, 0, RL_, RL_, RL_,
"IF@DP5DIV",OP_P5DIV, FD, RL_EDX_EAX, RL_FPPARM2, RL_EDX_EAX,
"IF@P5DIV", OP_P5DIV, FS, RL_EAX, RL_EDX, RL_EAX,
"IF@DPOW", OP_POW, FD, RL_EDX_EAX, RL_FPPARM2, RL_EDX_EAX,
"IF@DPOWI", OP_POW, FD, RL_EDX_EAX, RL_ECX, RL_EDX_EAX,
"IF@POW", OP_POW, FS, RL_EAX, RL_EDX, RL_EAX,
"IF@POWI", OP_POW, FS, RL_EAX, RL_EDX, RL_EAX,
"IF@IPOW", OP_POW, I4, RL_EAX, RL_EDX, RL_EAX,
"IF@DATAN2",OP_ATAN2, FD, RL_EDX_EAX, RL_FPPARM2, RL_EDX_EAX,
"IF@DFMOD", OP_FMOD, FD, RL_EDX_EAX, RL_FPPARM2, RL_EDX_EAX,
"IF@DLOG", OP_LOG, FD, RL_EDX_EAX, RL_, RL_EDX_EAX,
"IF@DCOS", OP_COS, FD, RL_EDX_EAX, RL_, RL_EDX_EAX,
"IF@DSIN", OP_SIN, FD, RL_EDX_EAX, RL_, RL_EDX_EAX,
"IF@DTAN", OP_TAN, FD, RL_EDX_EAX, RL_, RL_EDX_EAX,
"IF@DSQRT", OP_SQRT, FD, RL_EDX_EAX, RL_, RL_EDX_EAX,
"IF@DFABS", OP_FABS, FD, RL_EDX_EAX, RL_, RL_EDX_EAX,
"IF@DACOS", OP_ACOS, FD, RL_EDX_EAX, RL_, RL_EDX_EAX,
"IF@DASIN", OP_ASIN, FD, RL_EDX_EAX, RL_, RL_EDX_EAX,
"IF@DATAN", OP_ATAN, FD, RL_EDX_EAX, RL_, RL_EDX_EAX,
"IF@DCOSH", OP_COSH, FD, RL_EDX_EAX, RL_, RL_EDX_EAX,
"IF@DEXP", OP_EXP, FD, RL_EDX_EAX, RL_, RL_EDX_EAX,
"IF@DLOG10",OP_LOG10, FD, RL_EDX_EAX, RL_, RL_EDX_EAX,
"IF@DSINH", OP_SINH, FD, RL_EDX_EAX, RL_, RL_EDX_EAX,
"IF@DTANH", OP_TANH, FD, RL_EDX_EAX, RL_, RL_EDX_EAX,
"IF@ATAN2", OP_ATAN2, FS, RL_EAX, RL_EDX, RL_EAX,
"IF@FMOD", OP_FMOD, FS, RL_EAX, RL_EDX, RL_EAX,
"IF@LOG", OP_LOG, FS, RL_EAX, RL_, RL_EAX,
"IF@COS", OP_COS, FS, RL_EAX, RL_, RL_EAX,
"IF@SIN", OP_SIN, FS, RL_EAX, RL_, RL_EAX,
"IF@TAN", OP_TAN, FS, RL_EAX, RL_, RL_EAX,
"IF@SQRT", OP_SQRT, FS, RL_EAX, RL_, RL_EAX,
"IF@FABS", OP_FABS, FS, RL_EAX, RL_, RL_EAX,
"IF@ACOS", OP_ACOS, FS, RL_EAX, RL_, RL_EAX,
"IF@ASIN", OP_ASIN, FS, RL_EAX, RL_, RL_EAX,
"IF@ATAN", OP_ATAN, FS, RL_EAX, RL_, RL_EAX,
"IF@COSH", OP_COSH, FS, RL_EAX, RL_, RL_EAX,
"IF@EXP", OP_EXP, FS, RL_EAX, RL_, RL_EAX,
"IF@LOG10", OP_LOG10, FS, RL_EAX, RL_, RL_EAX,
"IF@SINH", OP_SINH, FS, RL_EAX, RL_, RL_EAX,
"IF@TANH", OP_TANH, FS, RL_EAX, RL_, RL_EAX,
/* Following are special runtime routines called from the FAST -od codegen */
"__87LDI2", OP_NOP, 0, RL_, RL_, RL_,
"__87LDI4", OP_NOP, 0, RL_, RL_, RL_,
"__COPY", OP_NOP, 0, RL_, RL_, RL_,
"__FADD", OP_NOP, 0, RL_, RL_, RL_,
"__FSUB", OP_NOP, 0, RL_, RL_, RL_,
"__FSUBR", OP_NOP, 0, RL_, RL_, RL_,
"__FMUL", OP_NOP, 0, RL_, RL_, RL_,
"__FDIV", OP_NOP, 0, RL_, RL_, RL_,
"__FDIVR", OP_NOP, 0, RL_, RL_, RL_,
"__FCMP", OP_NOP, 0, RL_, RL_, RL_,
"__FCMPR", OP_NOP, 0, RL_, RL_, RL_,
"__TryInit2",OP_NOP, 0, RL_, RL_, RL_,
"__TryUnwind2",OP_NOP, 0, RL_, RL_, RL_,
/* End of special runtime routines called from the FAST -od codegen */
"__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_,
"__tls_index",OP_NOP, 0, RL_, RL_, RL_,
"__tls_array",OP_NOP, 0, RL_, RL_, RL_,
"__tls_region",OP_NOP, 0, RL_, RL_, RL_,
"__NOP", OP_NOP, 0, RL_, RL_, RL_ };
#include "cgnoalgn.h"
typedef struct {
call_class class;
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?