source: dev/trunk/abdev/BasicCompiler32/NumOpe_TypeOperation.cpp@ 206

Last change on this file since 206 was 206, checked in by dai_9181, 17 years ago

コード全体のリファクタリングを実施

File size: 3.6 KB
Line 
1#include "stdafx.h"
2
3#include <jenga/include/smoothie/Smoothie.h>
4
5#include <Compiler.h>
6
7#include "../BasicCompiler_Common/common.h"
8#include "Opcode.h"
9
10void ExtendStackTo32(int type);
11void ExtendStackTo64(int type){
12 if(Is64Type(type)) return;
13
14 //32ビットに拡張
15 ExtendStackTo32(type);
16
17 //64ビットに拡張
18 if(IsSignedType(type)){
19 //符号あり
20
21 //pop eax
22 op_pop(REG_EAX);
23
24 //cdq
25 op_cdq();
26
27 //push edx
28 op_push(REG_EDX);
29
30 //push eax
31 op_push(REG_EAX);
32 }
33 else{
34 //符号なし
35
36 //pop eax
37 op_pop(REG_EAX);
38
39 //push 0
40 op_push_V(0);
41
42 //push eax
43 op_push(REG_EAX);
44 }
45}
46void ExtendStackTo32(int type){
47 if(GetTypeSize(type,-1)==sizeof(long)) return;
48
49 if(Is64Type(type)){
50 //pop eax
51 op_pop(REG_EAX);
52
53 //pop edx
54 op_pop(REG_EDX);
55
56 //push eax
57 op_push(REG_EAX);
58 }
59 else if(type==DEF_INTEGER || (Smoothie::IsUnicode()&&type==DEF_CHAR)){
60 //pop eax
61 op_pop(REG_EAX);
62
63 //movsx eax,ax
64 OpBuffer[obp++]=(char)0x0F;
65 OpBuffer[obp++]=(char)0xBF;
66 OpBuffer[obp++]=(char)0xC0;
67
68 //push eax
69 op_push(REG_EAX);
70 }
71 else if(type==DEF_WORD){
72 //pop eax
73 op_pop(REG_EAX);
74
75 //and eax,0000FFFFh
76 OpBuffer[obp++]=(char)0x25;
77 *((long *)(OpBuffer+obp))=0x0000FFFF;
78 obp+=sizeof(long);
79
80 //push eax
81 op_push(REG_EAX);
82 }
83 else if(type==DEF_SBYTE || (Smoothie::IsUnicode()==false&&type==DEF_CHAR)){
84 //pop eax
85 op_pop(REG_EAX);
86
87 //movsx eax,al
88 OpBuffer[obp++]=(char)0x0F;
89 OpBuffer[obp++]=(char)0xBE;
90 OpBuffer[obp++]=(char)0xC0;
91
92 //push eax
93 op_push(REG_EAX);
94 }
95 else if(type==DEF_BYTE||type==DEF_BOOLEAN){
96 //pop eax
97 op_pop(REG_EAX);
98
99 //and eax,000000FFh
100 OpBuffer[obp++]=(char)0x25;
101 *((long *)(OpBuffer+obp))=0x000000FF;
102 obp+=sizeof(long);
103
104 //push eax
105 op_push(REG_EAX);
106 }
107}
108void ExtendStackTo16(int type){
109 if(type==DEF_SBYTE || (Smoothie::IsUnicode()==false&&type==DEF_CHAR)){
110 //pop eax
111 op_pop(REG_EAX);
112
113 //movsx eax,al
114 OpBuffer[obp++]=(char)0x0F;
115 OpBuffer[obp++]=(char)0xBE;
116 OpBuffer[obp++]=(char)0xC0;
117
118 //push eax
119 op_push(REG_EAX);
120 }
121 else if(type==DEF_BYTE){
122 //pop eax
123 op_pop(REG_EAX);
124
125 //and eax,000000FFh
126 OpBuffer[obp++]=(char)0x25;
127 *((long *)(OpBuffer+obp))=0x000000FF;
128 obp+=sizeof(long);
129
130 //push eax
131 op_push(REG_EAX);
132 }
133}
134void ExtendStackTo8(int type){
135 if(Is64Type(type)){
136 //pop eax
137 op_pop(REG_EAX);
138
139 //pop edx
140 op_pop(REG_EDX);
141
142 //push eax
143 op_push(REG_EAX);
144 }
145}
146
147
148void ChangeTypeToWhole(int OldType,int NewType){
149 if(OldType==DEF_DOUBLE){
150 if(Is64Type(NewType)){
151 //fld qword ptr[esp]
152 op_fld_ptr_esp(DEF_DOUBLE);
153
154 //fistp qword ptr[esp]
155 op_fistp_ptr_esp( sizeof(_int64) );
156 }
157 else{
158 //fld qword ptr[esp]
159 op_fld_ptr_esp(DEF_DOUBLE);
160
161 //add esp,4
162 op_add_esp(4);
163
164 //fistp dword ptr[esp]
165 op_fistp_ptr_esp( sizeof(long) );
166 }
167 }
168 else if(OldType==DEF_SINGLE){
169 if(Is64Type(NewType)){
170 //fld dword ptr[esp]
171 op_fld_ptr_esp(DEF_SINGLE);
172
173 //sub esp,4
174 op_sub_esp(4);
175
176 //fistp qword ptr[esp]
177 op_fistp_ptr_esp( sizeof(_int64) );
178 }
179 else{
180 //fld dword ptr[esp]
181 op_fld_ptr_esp(DEF_SINGLE);
182
183 //fistp dword ptr[esp]
184 op_fistp_ptr_esp( sizeof(long) );
185 }
186 }
187 else{
188 //整数から整数へ変換
189
190 if(Is64Type(NewType)){
191 ExtendStackTo64(OldType);
192 }
193 else if(GetTypeSize(NewType,-1)==sizeof(long)){
194 ExtendStackTo32(OldType);
195 }
196 else if(GetTypeSize(NewType,-1)==sizeof(short)){
197 ExtendStackTo16(OldType);
198 }
199 else if(GetTypeSize(NewType,-1)==sizeof(char)){
200 ExtendStackTo8(OldType);
201 }
202 }
203}
Note: See TracBrowser for help on using the repository browser.