source: dev/trunk/abdev/BasicCompiler64/stack_frame.cpp@ 228

Last change on this file since 228 was 228, checked in by dai_9181, 17 years ago
File size: 3.4 KB
Line 
1#include "stdafx.h"
2
3#include <Compiler.h>
4
5#include "../BasicCompiler_Common/common.h"
6#include "Opcode.h"
7
8
9/////////////////////////
10// スタックフレーム管理
11/////////////////////////
12
13CStackFrame::CStackFrame(){
14 lowest_sp=0;
15 now_sp=0;
16 max_parm_size=0;
17}
18CStackFrame::~CStackFrame(){
19 //オブジェクト破棄時に不整合がないかをチェック(バグ回避)
20 error_check();
21}
22int CStackFrame::GetFrameSize( int localParamSize ){
23 int answer_sp;
24
25 answer_sp=lowest_sp-max_parm_size;
26
27 if((localParamSize%0x10)){
28 if((answer_sp%0x10)==0){
29 //関数のエントリポイントで128ビット境界ラインに合わせるため
30 return -(answer_sp-0x08);
31 }
32 return -(answer_sp-0x10);
33 }
34
35 if((answer_sp%0x10)==0){
36 //関数のエントリポイントで128ビット境界ラインに合わせるため
37 return -(answer_sp-0x10);
38 }
39 return -(answer_sp-0x08);
40}
41int CStackFrame::GetNowSp(){
42 return now_sp;
43}
44void CStackFrame::mov_sp( int reg ){
45 //mov reg,rsp
46 compiler.codeGenerator.op_mov_RR( reg, REG_RSP );
47
48 //add reg,now_sp
49 compiler.codeGenerator.op_add_RV( reg, now_sp );
50
51 //スケジュールをセット
52 obp-=sizeof(long);
53 add();
54 obp+=sizeof(long);
55}
56int CStackFrame::push(int reg){
57 now_sp-=sizeof(_int64);
58 if(lowest_sp>now_sp) lowest_sp=now_sp;
59
60 if(reg==REG_NON) return now_sp;
61
62 //mov qword ptr[rsp+offset],reg
63 compiler.codeGenerator.op_mov_MR(sizeof(_int64),reg,REG_RSP,now_sp,MOD_BASE_DISP32);
64
65 //スケジュールをセット
66 obp-=sizeof(long);
67 add();
68 obp+=sizeof(long);
69
70 return now_sp;
71}
72void CStackFrame::push(int xmm_reg,int varSize){
73 now_sp-=sizeof(_int64);
74 if(lowest_sp>now_sp) lowest_sp=now_sp;
75
76 if(varSize==sizeof(double)){
77 //movlpd qword ptr[rsp+offset],xmm_reg
78 compiler.codeGenerator.op_movlpd_MR(xmm_reg,REG_RSP,now_sp,MOD_BASE_DISP32);
79 }
80 if(varSize==sizeof(float)){
81 //movss dword ptr[rsp+offset],xmm_reg
82 compiler.codeGenerator.op_movss_MR( xmm_reg, REG_RSP, now_sp, MOD_BASE_DISP32 );
83 }
84
85 //スケジュールをセット
86 obp-=sizeof(long);
87 add();
88 obp+=sizeof(long);
89}
90void CStackFrame::ref_offset_data( int reg, int sp_offset ){
91 //mov reg,qword ptr[rsp+offset] ※スタックフレームを利用
92 compiler.codeGenerator.op_mov_RM(sizeof(_int64),reg,REG_RSP,sp_offset,MOD_BASE_DISP32);
93
94 //スケジュールをセット
95 obp-=sizeof(long);
96 add();
97 obp+=sizeof(long);
98}
99void CStackFrame::ref(int reg){
100 ref_offset_data( reg, now_sp );
101}
102void CStackFrame::ref(int xmm_reg,int varSize){
103 if(varSize==sizeof(double)){
104 //movlpd xmm_reg,qword ptr[rsp+offset]
105 compiler.codeGenerator.op_movlpd_RM(xmm_reg,REG_RSP,now_sp,MOD_BASE_DISP32);
106 }
107 if(varSize==sizeof(float)){
108 //movss xmm_reg,dword ptr[rsp+offset]
109 compiler.codeGenerator.op_movss_MR( xmm_reg, REG_RSP, now_sp, MOD_BASE_DISP32 );
110 }
111
112 //スケジュールをセット
113 obp-=sizeof(long);
114 add();
115 obp+=sizeof(long);
116}
117void CStackFrame::pop(int reg){
118 if(reg!=REG_NON) ref(reg);
119
120 now_sp+=sizeof(_int64);
121}
122void CStackFrame::pop(int xmm_reg,int varSize){
123 ref(xmm_reg,varSize);
124
125 now_sp+=sizeof(_int64);
126}
127void CStackFrame::parameter_allocate(int size){
128 if(max_parm_size<size) max_parm_size=size;
129}
130void CStackFrame::RunningSchedule( int stackFrameSize ){
131 for(int i=0;i<num;i++){
132 *((long *)(OpBuffer+pObpValues[i])) += stackFrameSize;
133 }
134}
135
136void CStackFrame::error_check(){
137 if(now_sp){
138 SetError(300,NULL,cp);
139 }
140}
141
142//スタックフレーム管理用オブジェクトポインタ
143CStackFrame *pobj_sf;
Note: See TracBrowser for help on using the repository browser.