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
RevLine 
[206]1#include "stdafx.h"
2
[226]3#include <Compiler.h>
4
[3]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}
[220]22int CStackFrame::GetFrameSize( int localParamSize ){
[3]23 int answer_sp;
24
25 answer_sp=lowest_sp-max_parm_size;
26
[220]27 if((localParamSize%0x10)){
[3]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}
[64]41int CStackFrame::GetNowSp(){
42 return now_sp;
43}
44void CStackFrame::mov_sp( int reg ){
45 //mov reg,rsp
[226]46 compiler.codeGenerator.op_mov_RR( reg, REG_RSP );
[64]47
48 //add reg,now_sp
[226]49 compiler.codeGenerator.op_add_RV( reg, now_sp );
[64]50
51 //スケジュールをセット
52 obp-=sizeof(long);
53 add();
54 obp+=sizeof(long);
55}
[20]56int CStackFrame::push(int reg){
[3]57 now_sp-=sizeof(_int64);
58 if(lowest_sp>now_sp) lowest_sp=now_sp;
59
[20]60 if(reg==REG_NON) return now_sp;
[3]61
62 //mov qword ptr[rsp+offset],reg
[226]63 compiler.codeGenerator.op_mov_MR(sizeof(_int64),reg,REG_RSP,now_sp,MOD_BASE_DISP32);
[3]64
65 //スケジュールをセット
66 obp-=sizeof(long);
67 add();
68 obp+=sizeof(long);
[20]69
70 return now_sp;
[3]71}
[66]72void CStackFrame::push(int xmm_reg,int varSize){
[3]73 now_sp-=sizeof(_int64);
74 if(lowest_sp>now_sp) lowest_sp=now_sp;
75
[66]76 if(varSize==sizeof(double)){
[3]77 //movlpd qword ptr[rsp+offset],xmm_reg
[226]78 compiler.codeGenerator.op_movlpd_MR(xmm_reg,REG_RSP,now_sp,MOD_BASE_DISP32);
[3]79 }
[66]80 if(varSize==sizeof(float)){
[3]81 //movss dword ptr[rsp+offset],xmm_reg
[228]82 compiler.codeGenerator.op_movss_MR( xmm_reg, REG_RSP, now_sp, MOD_BASE_DISP32 );
[3]83 }
84
85 //スケジュールをセット
86 obp-=sizeof(long);
87 add();
88 obp+=sizeof(long);
89}
[20]90void CStackFrame::ref_offset_data( int reg, int sp_offset ){
[3]91 //mov reg,qword ptr[rsp+offset] ※スタックフレームを利用
[226]92 compiler.codeGenerator.op_mov_RM(sizeof(_int64),reg,REG_RSP,sp_offset,MOD_BASE_DISP32);
[3]93
94 //スケジュールをセット
95 obp-=sizeof(long);
96 add();
97 obp+=sizeof(long);
98}
[20]99void CStackFrame::ref(int reg){
100 ref_offset_data( reg, now_sp );
101}
[66]102void CStackFrame::ref(int xmm_reg,int varSize){
103 if(varSize==sizeof(double)){
[3]104 //movlpd xmm_reg,qword ptr[rsp+offset]
[226]105 compiler.codeGenerator.op_movlpd_RM(xmm_reg,REG_RSP,now_sp,MOD_BASE_DISP32);
[3]106 }
[66]107 if(varSize==sizeof(float)){
[3]108 //movss xmm_reg,dword ptr[rsp+offset]
[228]109 compiler.codeGenerator.op_movss_MR( xmm_reg, REG_RSP, now_sp, MOD_BASE_DISP32 );
[3]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}
[66]122void CStackFrame::pop(int xmm_reg,int varSize){
123 ref(xmm_reg,varSize);
[3]124
125 now_sp+=sizeof(_int64);
126}
127void CStackFrame::parameter_allocate(int size){
128 if(max_parm_size<size) max_parm_size=size;
129}
[220]130void CStackFrame::RunningSchedule( int stackFrameSize ){
131 for(int i=0;i<num;i++){
132 *((long *)(OpBuffer+pObpValues[i])) += stackFrameSize;
[3]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.