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

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

CodeGeneratorクラスのベースを実装

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