source: dev/trunk/ab5.0/abdev/compiler_x86/NumOpe_TypeOperation.cpp@ 765

Last change on this file since 765 was 765, checked in by イグトランス (egtra), 16 years ago

#229の解決

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