source: dev/BasicCompiler32/NumOpe_TypeOperation.cpp@ 3

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