Changeset 225 in dev for trunk/abdev/BasicCompiler32/Compile_Calc.cpp
- Timestamp:
- Jul 21, 2007, 11:47:40 PM (17 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/abdev/BasicCompiler32/Compile_Calc.cpp
r206 r225 14 14 if(OldType==DEF_DOUBLE){ 15 15 //fld qword ptr[esp] 16 op_fld_ptr_esp(DEF_DOUBLE);16 compiler.codeGenerator.op_fld_ptr_esp(DEF_DOUBLE); 17 17 18 18 //add esp,8 19 op_add_esp(8);19 compiler.codeGenerator.op_add_esp(8); 20 20 } 21 21 else if(OldType==DEF_SINGLE){ 22 22 //fld dword ptr[esp] 23 op_fld_ptr_esp(DEF_SINGLE);23 compiler.codeGenerator.op_fld_ptr_esp(DEF_SINGLE); 24 24 25 25 //add esp,4 26 op_add_esp(4);26 compiler.codeGenerator.op_add_esp(4); 27 27 } 28 28 else if(OldType==DEF_LONG){ 29 29 //fild dword ptr[esp] 30 op_fld_ptr_esp(DEF_LONG);30 compiler.codeGenerator.op_fld_ptr_esp(DEF_LONG); 31 31 32 32 //add esp,4 33 op_add_esp(4);33 compiler.codeGenerator.op_add_esp(4); 34 34 } 35 35 else if(OldType==DEF_DWORD){ 36 36 //pop eax 37 op_pop(REG_EAX);37 compiler.codeGenerator.op_pop(REG_EAX); 38 38 39 39 //push 0 40 op_push_V(0);40 compiler.codeGenerator.op_push_V(0); 41 41 42 42 //push eax 43 op_push(REG_EAX);43 compiler.codeGenerator.op_push(REG_EAX); 44 44 45 45 //fild qword ptr[esp] 46 OpBuffer[obp++]=(char)0xDF; 47 OpBuffer[obp++]=(char)0x2C; 48 OpBuffer[obp++]=(char)0x24; 46 compiler.codeGenerator.PutOld( 47 (char)0xDF, 48 (char)0x2C, 49 (char)0x24 50 ); 49 51 50 52 //add esp,8 51 op_add_esp(8);53 compiler.codeGenerator.op_add_esp(8); 52 54 } 53 55 } … … 58 60 else if(OldType==DEF_SINGLE){ 59 61 //fld dword ptr[esp] 60 op_fld_ptr_esp(DEF_SINGLE);62 compiler.codeGenerator.op_fld_ptr_esp(DEF_SINGLE); 61 63 62 64 //sub esp,4 63 op_sub_esp(4);65 compiler.codeGenerator.op_sub_esp(4); 64 66 65 67 //fstp qword ptr[esp] 66 OpBuffer[obp++]=(char)0xDD; 67 OpBuffer[obp++]=(char)0x1C; 68 OpBuffer[obp++]=(char)0x24; 68 compiler.codeGenerator.op_fstp_basereg( DEF_DOUBLE, REG_ESP ); 69 69 } 70 70 else if(OldType==DEF_INT64||OldType==DEF_QWORD){ … … 72 72 73 73 //fild qword ptr[esp] 74 op_fld_ptr_esp(DEF_INT64);74 compiler.codeGenerator.op_fld_ptr_esp(DEF_INT64); 75 75 76 76 //fstp qword ptr[esp] 77 OpBuffer[obp++]=(char)0xDD; 78 OpBuffer[obp++]=(char)0x1C; 79 OpBuffer[obp++]=(char)0x24; 77 compiler.codeGenerator.op_fstp_basereg( DEF_DOUBLE, REG_ESP ); 80 78 } 81 79 else if(IsWholeNumberType(OldType)){ … … 87 85 if(OldType==DEF_INTEGER || (Smoothie::IsUnicode()&&OldType==DEF_CHAR)){ 88 86 //pop eax 89 op_pop(REG_EAX);87 compiler.codeGenerator.op_pop(REG_EAX); 90 88 91 89 //movsx eax,ax 92 OpBuffer[obp++]=(char)0x0F; 93 OpBuffer[obp++]=(char)0xBF; 94 OpBuffer[obp++]=(char)0xC0; 90 compiler.codeGenerator.op_movsx_R32R16( REG_EAX ); 95 91 96 92 //push eax 97 op_push(REG_EAX);93 compiler.codeGenerator.op_push(REG_EAX); 98 94 } 99 95 else if(OldType==DEF_SBYTE || (Smoothie::IsUnicode()==false&&OldType==DEF_CHAR)){ 100 96 //pop eax 101 op_pop(REG_EAX);97 compiler.codeGenerator.op_pop(REG_EAX); 102 98 103 99 //movsx eax,al 104 OpBuffer[obp++]=(char)0x0F; 105 OpBuffer[obp++]=(char)0xBE; 106 OpBuffer[obp++]=(char)0xC0; 100 compiler.codeGenerator.op_movsx_R32R8( REG_EAX ); 107 101 108 102 //push eax 109 op_push(REG_EAX);103 compiler.codeGenerator.op_push(REG_EAX); 110 104 } 111 105 112 106 //fild dword ptr[esp] 113 op_fld_ptr_esp(DEF_LONG);107 compiler.codeGenerator.op_fld_ptr_esp(DEF_LONG); 114 108 115 109 //sub esp,4 116 op_sub_esp(4);110 compiler.codeGenerator.op_sub_esp(4); 117 111 } 118 112 else{ … … 120 114 121 115 //pop eax 122 op_pop(REG_EAX);116 compiler.codeGenerator.op_pop(REG_EAX); 123 117 124 118 //push 0 125 op_push_V(0);119 compiler.codeGenerator.op_push_V(0); 126 120 127 121 //push eax 128 op_push(REG_EAX);122 compiler.codeGenerator.op_push(REG_EAX); 129 123 130 124 //fild qword ptr[esp] 131 OpBuffer[obp++]=(char)0xDF; 132 OpBuffer[obp++]=(char)0x2C; 133 OpBuffer[obp++]=(char)0x24; 125 compiler.codeGenerator.PutOld( 126 (char)0xDF, 127 (char)0x2C, 128 (char)0x24 129 ); 134 130 } 135 131 136 132 //fstp qword ptr[esp] 137 OpBuffer[obp++]=(char)0xDD; 138 OpBuffer[obp++]=(char)0x1C; 139 OpBuffer[obp++]=(char)0x24; 133 compiler.codeGenerator.op_fstp_basereg( DEF_DOUBLE, REG_ESP ); 140 134 } 141 135 else SetError(9,NULL,cp); … … 147 141 else if(OldType==DEF_DOUBLE){ 148 142 //fld qword ptr[esp] 149 op_fld_ptr_esp(DEF_DOUBLE);143 compiler.codeGenerator.op_fld_ptr_esp(DEF_DOUBLE); 150 144 151 145 //add esp,4 152 op_add_esp(4);146 compiler.codeGenerator.op_add_esp(4); 153 147 154 148 //fstp dword ptr[esp] 155 OpBuffer[obp++]=(char)0xD9; 156 OpBuffer[obp++]=(char)0x1C; 157 OpBuffer[obp++]=(char)0x24; 149 compiler.codeGenerator.op_fstp_basereg( DEF_SINGLE, REG_ESP ); 158 150 } 159 151 else if(OldType==DEF_INT64||OldType==DEF_QWORD){ … … 161 153 162 154 //fild qword ptr[esp] 163 op_fld_ptr_esp(DEF_INT64);155 compiler.codeGenerator.op_fld_ptr_esp(DEF_INT64); 164 156 165 157 //add esp,4 166 op_add_esp(4);158 compiler.codeGenerator.op_add_esp(4); 167 159 168 160 //fstp dword ptr[esp] 169 OpBuffer[obp++]=(char)0xD9; 170 OpBuffer[obp++]=(char)0x1C; 171 OpBuffer[obp++]=(char)0x24; 161 compiler.codeGenerator.op_fstp_basereg( DEF_SINGLE, REG_ESP ); 172 162 } 173 163 else if(IsWholeNumberType(OldType)){ … … 179 169 if(OldType==DEF_INTEGER || (Smoothie::IsUnicode()&&OldType==DEF_CHAR)){ 180 170 //pop eax 181 op_pop(REG_EAX);171 compiler.codeGenerator.op_pop(REG_EAX); 182 172 183 173 //movsx eax,ax 184 OpBuffer[obp++]=(char)0x0F; 185 OpBuffer[obp++]=(char)0xBF; 186 OpBuffer[obp++]=(char)0xC0; 174 compiler.codeGenerator.op_movsx_R32R16( REG_EAX ); 187 175 188 176 //push eax 189 op_push(REG_EAX);177 compiler.codeGenerator.op_push(REG_EAX); 190 178 } 191 179 else if(OldType==DEF_SBYTE || (Smoothie::IsUnicode()==false&&OldType==DEF_CHAR)){ 192 180 //pop eax 193 op_pop(REG_EAX);181 compiler.codeGenerator.op_pop(REG_EAX); 194 182 195 183 //movsx eax,al 196 OpBuffer[obp++]=(char)0x0F; 197 OpBuffer[obp++]=(char)0xBE; 198 OpBuffer[obp++]=(char)0xC0; 184 compiler.codeGenerator.op_movsx_R32R8( REG_EAX ); 199 185 200 186 //push eax 201 op_push(REG_EAX);187 compiler.codeGenerator.op_push(REG_EAX); 202 188 } 203 189 204 190 //fild dword ptr[esp] 205 op_fld_ptr_esp(DEF_LONG);191 compiler.codeGenerator.op_fld_ptr_esp(DEF_LONG); 206 192 } 207 193 else{ … … 209 195 210 196 //fild dword ptr[esp] 211 op_fld_ptr_esp(DEF_LONG);197 compiler.codeGenerator.op_fld_ptr_esp(DEF_LONG); 212 198 } 213 199 214 200 //fstp dword ptr[esp] 215 OpBuffer[obp++]=(char)0xD9; 216 OpBuffer[obp++]=(char)0x1C; 217 OpBuffer[obp++]=(char)0x24; 201 compiler.codeGenerator.op_fstp_basereg( DEF_SINGLE, REG_ESP ); 218 202 } 219 203 else SetError(9,NULL,cp); … … 227 211 else if(OldType==DEF_DOUBLE){ 228 212 //fld qword ptr[esp] 229 op_fld_ptr_esp(DEF_DOUBLE);213 compiler.codeGenerator.op_fld_ptr_esp(DEF_DOUBLE); 230 214 231 215 //fistp qword ptr[esp] 232 op_fistp_ptr_esp( sizeof(_int64) );216 compiler.codeGenerator.op_fistp_ptr_esp( sizeof(_int64) ); 233 217 } 234 218 else if(OldType==DEF_SINGLE){ 235 219 //fld dword ptr[esp] 236 op_fld_ptr_esp(DEF_SINGLE);220 compiler.codeGenerator.op_fld_ptr_esp(DEF_SINGLE); 237 221 238 222 //sub esp,4 239 op_sub_esp(4);223 compiler.codeGenerator.op_sub_esp(4); 240 224 241 225 //fistp qword ptr[esp] 242 op_fistp_ptr_esp( sizeof(_int64) );226 compiler.codeGenerator.op_fistp_ptr_esp( sizeof(_int64) ); 243 227 } 244 228 else if(IsWholeNumberType(OldType)){ … … 249 233 250 234 //pop eax 251 op_pop(REG_EAX);235 compiler.codeGenerator.op_pop(REG_EAX); 252 236 253 237 //cdq 254 op_cdq();238 compiler.codeGenerator.op_cdq(); 255 239 256 240 //push edx 257 op_push(REG_EDX);241 compiler.codeGenerator.op_push(REG_EDX); 258 242 259 243 //push eax 260 op_push(REG_EAX);244 compiler.codeGenerator.op_push(REG_EAX); 261 245 } 262 246 else{ … … 264 248 265 249 //pop eax 266 op_pop(REG_EAX);250 compiler.codeGenerator.op_pop(REG_EAX); 267 251 268 252 //push 0 269 op_push_V(0);253 compiler.codeGenerator.op_push_V(0); 270 254 271 255 //push eax 272 op_push(REG_EAX);256 compiler.codeGenerator.op_push(REG_EAX); 273 257 } 274 258 } … … 281 265 282 266 //fld qword ptr[esp] 283 op_fld_ptr_esp(DEF_DOUBLE);267 compiler.codeGenerator.op_fld_ptr_esp(DEF_DOUBLE); 284 268 285 269 //add esp,4 286 op_add_esp(4);270 compiler.codeGenerator.op_add_esp(4); 287 271 288 272 //fistp dword ptr[esp] 289 op_fistp_ptr_esp( sizeof(long) );273 compiler.codeGenerator.op_fistp_ptr_esp( sizeof(long) ); 290 274 } 291 275 else if(OldType==DEF_SINGLE){ 292 276 //fld dword ptr[esp] 293 op_fld_ptr_esp(DEF_SINGLE);277 compiler.codeGenerator.op_fld_ptr_esp(DEF_SINGLE); 294 278 295 279 //fistp dword ptr[esp] 296 op_fistp_ptr_esp( sizeof(long) );280 compiler.codeGenerator.op_fistp_ptr_esp( sizeof(long) ); 297 281 } 298 282 else if(OldType==DEF_INT64||OldType==DEF_QWORD){ 299 283 //pop eax 300 op_pop(REG_EAX);284 compiler.codeGenerator.op_pop(REG_EAX); 301 285 302 286 //add esp,4 303 op_add_esp(4);287 compiler.codeGenerator.op_add_esp(4); 304 288 305 289 //push eax 306 op_push(REG_EAX);290 compiler.codeGenerator.op_push(REG_EAX); 307 291 } 308 292 } … … 314 298 else if(OldType==DEF_SBYTE || (Smoothie::IsUnicode()==false&&OldType==DEF_CHAR)){ 315 299 //pop eax 316 op_pop(REG_EAX);300 compiler.codeGenerator.op_pop(REG_EAX); 317 301 318 302 //movsx eax,al 319 OpBuffer[obp++]=(char)0x0F; 320 OpBuffer[obp++]=(char)0xBE; 321 OpBuffer[obp++]=(char)0xC0; 303 compiler.codeGenerator.op_movsx_R32R8( REG_EAX ); 322 304 323 305 //push eax 324 op_push(REG_EAX);306 compiler.codeGenerator.op_push(REG_EAX); 325 307 } 326 308 else{ … … 328 310 329 311 //pop eax 330 op_pop(REG_EAX);312 compiler.codeGenerator.op_pop(REG_EAX); 331 313 332 314 //and eax,0000FFFFh 333 OpBuffer[obp++]=(char)0x25; 334 *((long *)(OpBuffer+obp))=0x0000FFFF; 335 obp+=sizeof(long); 315 compiler.codeGenerator.op_and_RV( REG_EAX, 0x0000FFFF ); 336 316 337 317 //push eax 338 op_push(REG_EAX);318 compiler.codeGenerator.op_push(REG_EAX); 339 319 } 340 320 } … … 346 326 347 327 //pop eax 348 op_pop(REG_EAX);328 compiler.codeGenerator.op_pop(REG_EAX); 349 329 350 330 //and eax,000000FFh 351 OpBuffer[obp++]=(char)0x25; 352 *((long *)(OpBuffer+obp))=0x000000FF; 353 obp+=sizeof(long); 331 compiler.codeGenerator.op_and_RV( REG_EAX, 0x000000FF ); 354 332 355 333 //push eax 356 op_push(REG_EAX);334 compiler.codeGenerator.op_push(REG_EAX); 357 335 } 358 336 … … 370 348 if(type==DEF_DOUBLE){ 371 349 //fld qword ptr[esp] 372 op_fld_ptr_esp(DEF_DOUBLE);350 compiler.codeGenerator.op_fld_ptr_esp(DEF_DOUBLE); 373 351 374 352 //add esp,8 375 op_add_esp(8);353 compiler.codeGenerator.op_add_esp(8); 376 354 } 377 355 else if(type==DEF_SINGLE){ 378 356 //fld dword ptr[esp] 379 op_fld_ptr_esp(DEF_SINGLE);357 compiler.codeGenerator.op_fld_ptr_esp(DEF_SINGLE); 380 358 381 359 //add esp,4 382 op_add_esp(4);360 compiler.codeGenerator.op_add_esp(4); 383 361 } 384 362 else if( Is64Type( type ) ){ 385 363 //pop eax 386 op_pop(REG_EAX);364 compiler.codeGenerator.op_pop(REG_EAX); 387 365 388 366 //pop edx 389 op_pop(REG_EDX);367 compiler.codeGenerator.op_pop(REG_EDX); 390 368 } 391 369 else{ 392 370 //pop eax 393 op_pop(REG_EAX);371 compiler.codeGenerator.op_pop(REG_EAX); 394 372 } 395 373 } … … 586 564 587 565 //push eax 588 op_push(REG_EAX);566 compiler.codeGenerator.op_push(REG_EAX); 589 567 } 590 568 … … 639 617 640 618 // call System.[TypeClass]._Create 641 op_call( pUserProc );619 compiler.codeGenerator.op_call( pUserProc ); 642 620 643 621 // push eax 644 op_push( REG_EAX );622 compiler.codeGenerator.op_push( REG_EAX ); 645 623 646 624 calcType = pUserProc->ReturnType();
Note:
See TracChangeset
for help on using the changeset viewer.