Changeset 290 in dev for trunk/abdev/BasicCompiler32/NumOpe_TypeOperation.cpp
- Timestamp:
- Aug 21, 2007, 11:00:25 PM (17 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/abdev/BasicCompiler32/NumOpe_TypeOperation.cpp
r235 r290 8 8 #include "Opcode.h" 9 9 10 void ExtendStackTo32(int type); 11 void ExtendStackTo64(int type){ 12 if(Is64Type(type)) return; 10 void ExtendStackTo32( const Type &oldType ); 11 12 void ExtendStackTo64( const Type &oldType ) 13 { 14 if( oldType.Is64() ) 15 { 16 return; 17 } 13 18 14 19 //32ビットに拡張 15 ExtendStackTo32( type);20 ExtendStackTo32( oldType ); 16 21 17 22 //64ビットに拡張 18 if(IsSignedType(type)){ 23 if( oldType.IsSigned() ) 24 { 19 25 //符号あり 20 26 … … 44 50 } 45 51 } 46 void ExtendStackTo32(int type){ 47 if(GetTypeSize(type,-1)==sizeof(long)) return; 48 49 if(Is64Type(type)){ 52 void ExtendStackTo32( const Type &oldType ) 53 { 54 if( oldType.GetSize() == sizeof(long) ) 55 { 56 return; 57 } 58 59 if( oldType.Is64() ) 60 { 50 61 //pop eax 51 62 compiler.codeGenerator.op_pop(REG_EAX); … … 57 68 compiler.codeGenerator.op_push(REG_EAX); 58 69 } 59 else if(type==DEF_INTEGER || (Smoothie::IsUnicode()&&type==DEF_CHAR)){ 70 else if( oldType.IsInteger() ) 71 { 60 72 //pop eax 61 73 compiler.codeGenerator.op_pop(REG_EAX); … … 67 79 compiler.codeGenerator.op_push(REG_EAX); 68 80 } 69 else if(type==DEF_WORD){ 81 else if( oldType.IsWord() ) 82 { 70 83 //pop eax 71 84 compiler.codeGenerator.op_pop(REG_EAX); … … 77 90 compiler.codeGenerator.op_push(REG_EAX); 78 91 } 79 else if(type==DEF_SBYTE || (Smoothie::IsUnicode()==false&&type==DEF_CHAR)){ 92 else if( oldType.IsSByte() ) 93 { 80 94 //pop eax 81 95 compiler.codeGenerator.op_pop(REG_EAX); … … 87 101 compiler.codeGenerator.op_push(REG_EAX); 88 102 } 89 else if(type==DEF_BYTE||type==DEF_BOOLEAN){ 103 else if( oldType.IsByte() || oldType.IsBoolean() ) 104 { 90 105 //pop eax 91 106 compiler.codeGenerator.op_pop(REG_EAX); … … 98 113 } 99 114 } 100 void ExtendStackTo16(int type){ 101 if(type==DEF_SBYTE || (Smoothie::IsUnicode()==false&&type==DEF_CHAR)){ 115 void ExtendStackTo16( const Type &oldType ){ 116 if( oldType.IsSByte() ) 117 { 102 118 //pop eax 103 119 compiler.codeGenerator.op_pop(REG_EAX); … … 109 125 compiler.codeGenerator.op_push(REG_EAX); 110 126 } 111 else if(type==DEF_BYTE){ 127 else if( oldType.IsByte() ) 128 { 112 129 //pop eax 113 130 compiler.codeGenerator.op_pop(REG_EAX); … … 120 137 } 121 138 } 122 void ExtendStackTo8(int type){ 123 if(Is64Type(type)){ 139 void ExtendStackTo8( const Type &oldType ) 140 { 141 if( oldType.Is64() ) 142 { 124 143 //pop eax 125 144 compiler.codeGenerator.op_pop(REG_EAX); … … 134 153 135 154 136 void ChangeTypeToWhole(int OldType,int NewType){ 137 if(OldType==DEF_DOUBLE){ 138 if(Is64Type(NewType)){ 155 void ChangeTypeToWhole( const Type &oldType, const Type &newType ){ 156 if( oldType.IsDouble() ) 157 { 158 if( newType.Is64() ) 159 { 139 160 //fld qword ptr[esp] 140 161 compiler.codeGenerator.op_fld_ptr_esp(DEF_DOUBLE); … … 154 175 } 155 176 } 156 else if(OldType==DEF_SINGLE){ 157 if(Is64Type(NewType)){ 177 else if( oldType.IsSingle() ) 178 { 179 if( newType.Is64() ) 180 { 158 181 //fld dword ptr[esp] 159 182 compiler.codeGenerator.op_fld_ptr_esp(DEF_SINGLE); … … 176 199 //整数から整数へ変換 177 200 178 if(Is64Type(NewType)){ 179 ExtendStackTo64(OldType); 180 } 181 else if(GetTypeSize(NewType,-1)==sizeof(long)){ 182 ExtendStackTo32(OldType); 183 } 184 else if(GetTypeSize(NewType,-1)==sizeof(short)){ 185 ExtendStackTo16(OldType); 186 } 187 else if(GetTypeSize(NewType,-1)==sizeof(char)){ 188 ExtendStackTo8(OldType); 189 } 190 } 191 } 201 if( newType.Is64() ) 202 { 203 ExtendStackTo64( oldType ); 204 } 205 else if( newType.GetSize()==sizeof(long)){ 206 ExtendStackTo32( oldType ); 207 } 208 else if( newType.GetSize()==sizeof(short)){ 209 ExtendStackTo16( oldType ); 210 } 211 else if( newType.GetSize()==sizeof(char)){ 212 ExtendStackTo8( oldType ); 213 } 214 } 215 }
Note:
See TracChangeset
for help on using the changeset viewer.