⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 i386.c

📁 linux下的gcc编译器
💻 C
📖 第 1 页 / 共 5 页
字号:
/* Subroutines used for code generation on IA-32.   Copyright (C) 1988, 1992, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001,   2002, 2003, 2004 Free Software Foundation, Inc.This file is part of GNU CC.GNU CC is free software; you can redistribute it and/or modifyit under the terms of the GNU General Public License as published bythe Free Software Foundation; either version 2, or (at your option)any later version.GNU CC is distributed in the hope that it will be useful,but WITHOUT ANY WARRANTY; without even the implied warranty ofMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See theGNU General Public License for more details.You should have received a copy of the GNU General Public Licensealong with GNU CC; see the file COPYING.  If not, write tothe Free Software Foundation, 59 Temple Place - Suite 330,Boston, MA 02111-1307, USA.  */#include "config.h"#include "system.h"#include "rtl.h"#include "tree.h"#include "tm_p.h"#include "regs.h"#include "hard-reg-set.h"#include "real.h"#include "insn-config.h"#include "conditions.h"#include "output.h"#include "insn-attr.h"#include "flags.h"#include "except.h"#include "function.h"#include "recog.h"#include "expr.h"#include "optabs.h"#include "toplev.h"#include "basic-block.h"#include "ggc.h"#include "target.h"#include "target-def.h"#include "langhooks.h"#ifndef CHECK_STACK_LIMIT#define CHECK_STACK_LIMIT (-1)#endif/* Processor costs (relative to an add) */static conststruct processor_costs size_cost = {	/* costs for tunning for size */  2,					/* cost of an add instruction */  3,					/* cost of a lea instruction */  2,					/* variable shift costs */  3,					/* constant shift costs */  3,					/* cost of starting a multiply */  0,					/* cost of multiply per each bit set */  3,					/* cost of a divide/mod */  3,					/* cost of movsx */  3,					/* cost of movzx */  0,					/* "large" insn */  2,					/* MOVE_RATIO */  2,					/* cost for loading QImode using movzbl */  {2, 2, 2},				/* cost of loading integer registers					   in QImode, HImode and SImode.					   Relative to reg-reg move (2).  */  {2, 2, 2},				/* cost of storing integer registers */  2,					/* cost of reg,reg fld/fst */  {2, 2, 2},				/* cost of loading fp registers					   in SFmode, DFmode and XFmode */  {2, 2, 2},				/* cost of loading integer registers */  3,					/* cost of moving MMX register */  {3, 3},				/* cost of loading MMX registers					   in SImode and DImode */  {3, 3},				/* cost of storing MMX registers					   in SImode and DImode */  3,					/* cost of moving SSE register */  {3, 3, 3},				/* cost of loading SSE registers					   in SImode, DImode and TImode */  {3, 3, 3},				/* cost of storing SSE registers					   in SImode, DImode and TImode */  3,					/* MMX or SSE register to integer */  0,					/* size of prefetch block */  0,					/* number of parallel prefetches */  2,					/* cost of FADD and FSUB insns.  */  2,					/* cost of FMUL instruction.  */  2,					/* cost of FDIV instruction.  */  2,					/* cost of FABS instruction.  */  2,					/* cost of FCHS instruction.  */  2,					/* cost of FSQRT instruction.  */};/* Processor costs (relative to an add) */static conststruct processor_costs i386_cost = {	/* 386 specific costs */  1,					/* cost of an add instruction */  1,					/* cost of a lea instruction */  3,					/* variable shift costs */  2,					/* constant shift costs */  6,					/* cost of starting a multiply */  1,					/* cost of multiply per each bit set */  23,					/* cost of a divide/mod */  3,					/* cost of movsx */  2,					/* cost of movzx */  15,					/* "large" insn */  3,					/* MOVE_RATIO */  4,					/* cost for loading QImode using movzbl */  {2, 4, 2},				/* cost of loading integer registers					   in QImode, HImode and SImode.					   Relative to reg-reg move (2).  */  {2, 4, 2},				/* cost of storing integer registers */  2,					/* cost of reg,reg fld/fst */  {8, 8, 8},				/* cost of loading fp registers					   in SFmode, DFmode and XFmode */  {8, 8, 8},				/* cost of loading integer registers */  2,					/* cost of moving MMX register */  {4, 8},				/* cost of loading MMX registers					   in SImode and DImode */  {4, 8},				/* cost of storing MMX registers					   in SImode and DImode */  2,					/* cost of moving SSE register */  {4, 8, 16},				/* cost of loading SSE registers					   in SImode, DImode and TImode */  {4, 8, 16},				/* cost of storing SSE registers					   in SImode, DImode and TImode */  3,					/* MMX or SSE register to integer */  0,					/* size of prefetch block */  0,					/* number of parallel prefetches */  23,					/* cost of FADD and FSUB insns.  */  27,					/* cost of FMUL instruction.  */  88,					/* cost of FDIV instruction.  */  22,					/* cost of FABS instruction.  */  24,					/* cost of FCHS instruction.  */  122,					/* cost of FSQRT instruction.  */};static conststruct processor_costs i486_cost = {	/* 486 specific costs */  1,					/* cost of an add instruction */  1,					/* cost of a lea instruction */  3,					/* variable shift costs */  2,					/* constant shift costs */  12,					/* cost of starting a multiply */  1,					/* cost of multiply per each bit set */  40,					/* cost of a divide/mod */  3,					/* cost of movsx */  2,					/* cost of movzx */  15,					/* "large" insn */  3,					/* MOVE_RATIO */  4,					/* cost for loading QImode using movzbl */  {2, 4, 2},				/* cost of loading integer registers					   in QImode, HImode and SImode.					   Relative to reg-reg move (2).  */  {2, 4, 2},				/* cost of storing integer registers */  2,					/* cost of reg,reg fld/fst */  {8, 8, 8},				/* cost of loading fp registers					   in SFmode, DFmode and XFmode */  {8, 8, 8},				/* cost of loading integer registers */  2,					/* cost of moving MMX register */  {4, 8},				/* cost of loading MMX registers					   in SImode and DImode */  {4, 8},				/* cost of storing MMX registers					   in SImode and DImode */  2,					/* cost of moving SSE register */  {4, 8, 16},				/* cost of loading SSE registers					   in SImode, DImode and TImode */  {4, 8, 16},				/* cost of storing SSE registers					   in SImode, DImode and TImode */  3,					/* MMX or SSE register to integer */  0,					/* size of prefetch block */  0,					/* number of parallel prefetches */  8,					/* cost of FADD and FSUB insns.  */  16,					/* cost of FMUL instruction.  */  73,					/* cost of FDIV instruction.  */  3,					/* cost of FABS instruction.  */  3,					/* cost of FCHS instruction.  */  83,					/* cost of FSQRT instruction.  */};static conststruct processor_costs pentium_cost = {  1,					/* cost of an add instruction */  1,					/* cost of a lea instruction */  4,					/* variable shift costs */  1,					/* constant shift costs */  11,					/* cost of starting a multiply */  0,					/* cost of multiply per each bit set */  25,					/* cost of a divide/mod */  3,					/* cost of movsx */  2,					/* cost of movzx */  8,					/* "large" insn */  6,					/* MOVE_RATIO */  6,					/* cost for loading QImode using movzbl */  {2, 4, 2},				/* cost of loading integer registers					   in QImode, HImode and SImode.					   Relative to reg-reg move (2).  */  {2, 4, 2},				/* cost of storing integer registers */  2,					/* cost of reg,reg fld/fst */  {2, 2, 6},				/* cost of loading fp registers					   in SFmode, DFmode and XFmode */  {4, 4, 6},				/* cost of loading integer registers */  8,					/* cost of moving MMX register */  {8, 8},				/* cost of loading MMX registers					   in SImode and DImode */  {8, 8},				/* cost of storing MMX registers					   in SImode and DImode */  2,					/* cost of moving SSE register */  {4, 8, 16},				/* cost of loading SSE registers					   in SImode, DImode and TImode */  {4, 8, 16},				/* cost of storing SSE registers					   in SImode, DImode and TImode */  3,					/* MMX or SSE register to integer */  0,					/* size of prefetch block */  0,					/* number of parallel prefetches */  3,					/* cost of FADD and FSUB insns.  */  3,					/* cost of FMUL instruction.  */  39,					/* cost of FDIV instruction.  */  1,					/* cost of FABS instruction.  */  1,					/* cost of FCHS instruction.  */  70,					/* cost of FSQRT instruction.  */};static conststruct processor_costs pentiumpro_cost = {  1,					/* cost of an add instruction */  1,					/* cost of a lea instruction */  1,					/* variable shift costs */  1,					/* constant shift costs */  4,					/* cost of starting a multiply */  0,					/* cost of multiply per each bit set */  17,					/* cost of a divide/mod */  1,					/* cost of movsx */  1,					/* cost of movzx */  8,					/* "large" insn */  6,					/* MOVE_RATIO */  2,					/* cost for loading QImode using movzbl */  {4, 4, 4},				/* cost of loading integer registers					   in QImode, HImode and SImode.					   Relative to reg-reg move (2).  */  {2, 2, 2},				/* cost of storing integer registers */  2,					/* cost of reg,reg fld/fst */  {2, 2, 6},				/* cost of loading fp registers					   in SFmode, DFmode and XFmode */  {4, 4, 6},				/* cost of loading integer registers */  2,					/* cost of moving MMX register */  {2, 2},				/* cost of loading MMX registers					   in SImode and DImode */  {2, 2},				/* cost of storing MMX registers					   in SImode and DImode */  2,					/* cost of moving SSE register */  {2, 2, 8},				/* cost of loading SSE registers					   in SImode, DImode and TImode */  {2, 2, 8},				/* cost of storing SSE registers					   in SImode, DImode and TImode */  3,					/* MMX or SSE register to integer */  32,					/* size of prefetch block */  6,					/* number of parallel prefetches */  3,					/* cost of FADD and FSUB insns.  */  5,					/* cost of FMUL instruction.  */  56,					/* cost of FDIV instruction.  */  2,					/* cost of FABS instruction.  */  2,					/* cost of FCHS instruction.  */  56,					/* cost of FSQRT instruction.  */};static conststruct processor_costs k6_cost = {  1,					/* cost of an add instruction */  2,					/* cost of a lea instruction */  1,					/* variable shift costs */  1,					/* constant shift costs */  3,					/* cost of starting a multiply */  0,					/* cost of multiply per each bit set */  18,					/* cost of a divide/mod */  2,					/* cost of movsx */  2,					/* cost of movzx */  8,					/* "large" insn */  4,					/* MOVE_RATIO */  3,					/* cost for loading QImode using movzbl */  {4, 5, 4},				/* cost of loading integer registers					   in QImode, HImode and SImode.					   Relative to reg-reg move (2).  */  {2, 3, 2},				/* cost of storing integer registers */  4,					/* cost of reg,reg fld/fst */  {6, 6, 6},				/* cost of loading fp registers					   in SFmode, DFmode and XFmode */  {4, 4, 4},				/* cost of loading integer registers */  2,					/* cost of moving MMX register */  {2, 2},				/* cost of loading MMX registers					   in SImode and DImode */  {2, 2},				/* cost of storing MMX registers					   in SImode and DImode */  2,					/* cost of moving SSE register */  {2, 2, 8},				/* cost of loading SSE registers					   in SImode, DImode and TImode */  {2, 2, 8},				/* cost of storing SSE registers					   in SImode, DImode and TImode */  6,					/* MMX or SSE register to integer */  32,					/* size of prefetch block */  1,					/* number of parallel prefetches */  2,					/* cost of FADD and FSUB insns.  */  2,					/* cost of FMUL instruction.  */  56,					/* cost of FDIV instruction.  */  2,					/* cost of FABS instruction.  */  2,					/* cost of FCHS instruction.  */  56,					/* cost of FSQRT instruction.  */};static conststruct processor_costs athlon_cost = {  1,					/* cost of an add instruction */  2,					/* cost of a lea instruction */  1,					/* variable shift costs */  1,					/* constant shift costs */  5,					/* cost of starting a multiply */  0,					/* cost of multiply per each bit set */  42,					/* cost of a divide/mod */  1,					/* cost of movsx */  1,					/* cost of movzx */  8,					/* "large" insn */  9,					/* MOVE_RATIO */  4,					/* cost for loading QImode using movzbl */  {3, 4, 3},				/* cost of loading integer registers					   in QImode, HImode and SImode.					   Relative to reg-reg move (2).  */  {3, 4, 3},				/* cost of storing integer registers */  4,					/* cost of reg,reg fld/fst */  {4, 4, 12},				/* cost of loading fp registers					   in SFmode, DFmode and XFmode */  {6, 6, 8},				/* cost of loading integer registers */  2,					/* cost of moving MMX register */  {4, 4},				/* cost of loading MMX registers					   in SImode and DImode */  {4, 4},				/* cost of storing MMX registers					   in SImode and DImode */  2,					/* cost of moving SSE register */  {4, 4, 6},				/* cost of loading SSE registers					   in SImode, DImode and TImode */  {4, 4, 5},				/* cost of storing SSE registers					   in SImode, DImode and TImode */  5,					/* MMX or SSE register to integer */  64,					/* size of prefetch block */  6,					/* number of parallel prefetches */  4,					/* cost of FADD and FSUB insns.  */  4,					/* cost of FMUL instruction.  */  24,					/* cost of FDIV instruction.  */  2,					/* cost of FABS instruction.  */  2,					/* cost of FCHS instruction.  */  35,					/* cost of FSQRT instruction.  */};static conststruct processor_costs pentium4_cost = {  1,					/* cost of an add instruction */  1,					/* cost of a lea instruction */  8,					/* variable shift costs */  8,					/* constant shift costs */  30,					/* cost of starting a multiply */  0,					/* cost of multiply per each bit set */  112,					/* cost of a divide/mod */  1,					/* cost of movsx */  1,					/* cost of movzx */  16,					/* "large" insn */  6,					/* MOVE_RATIO */  2,					/* cost for loading QImode using movzbl */  {4, 5, 4},				/* cost of loading integer registers					   in QImode, HImode and SImode.

⌨️ 快捷键说明

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