Ignore:
Timestamp:
Jul 21, 2007, 11:47:40 PM (17 years ago)
Author:
dai_9181
Message:

CodeGeneratorクラスのベースを実装

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/abdev/BasicCompiler32/NumOpe_Relation.cpp

    r206 r225  
    11#include "stdafx.h"
     2
     3#include <Compiler.h>
    24
    35#include "../BasicCompiler_Common/common.h"
     
    4446        if(type_stack[sp-1]==DEF_DOUBLE){
    4547            //fld qword ptr[esp]
    46             op_fld_ptr_esp(DEF_DOUBLE);
     48            compiler.codeGenerator.op_fld_ptr_esp(DEF_DOUBLE);
    4749
    4850            //add esp,8
    49             op_add_esp(8);
     51            compiler.codeGenerator.op_add_esp(8);
    5052        }
    5153        else if(type_stack[sp-1]==DEF_SINGLE){
    5254            //fld dword ptr[esp]
    53             op_fld_ptr_esp(DEF_SINGLE);
    54 
    55             //add esp,4
    56             op_add_esp(4);
     55            compiler.codeGenerator.op_fld_ptr_esp(DEF_SINGLE);
     56
     57            //add esp,4
     58            compiler.codeGenerator.op_add_esp(4);
    5759        }
    5860        else if(type_stack[sp-1]==DEF_INT64||type_stack[sp-1]==DEF_QWORD){
     
    6062
    6163            //fild qword ptr[esp]
    62             op_fld_ptr_esp(DEF_INT64);
     64            compiler.codeGenerator.op_fld_ptr_esp(DEF_INT64);
    6365
    6466            //add esp,8
    65             op_add_esp(8);
     67            compiler.codeGenerator.op_add_esp(8);
    6668        }
    6769        else{
     
    6971
    7072            //fild dword ptr[esp]
    71             op_fld_ptr_esp(DEF_LONG);
    72 
    73             //add esp,4
    74             op_add_esp(4);
     73            compiler.codeGenerator.op_fld_ptr_esp(DEF_LONG);
     74
     75            //add esp,4
     76            compiler.codeGenerator.op_add_esp(4);
    7577        }
    7678
    7779        if(type_stack[sp-2]==DEF_DOUBLE){
    7880            //fld qword ptr[esp]
    79             op_fld_ptr_esp(DEF_DOUBLE);
    80 
    81             //add esp,4
    82             op_add_esp(4);
     81            compiler.codeGenerator.op_fld_ptr_esp(DEF_DOUBLE);
     82
     83            //add esp,4
     84            compiler.codeGenerator.op_add_esp(4);
    8385        }
    8486        else if(type_stack[sp-2]==DEF_SINGLE){
    8587            //fld dword ptr[esp]
    86             op_fld_ptr_esp(DEF_SINGLE);
     88            compiler.codeGenerator.op_fld_ptr_esp(DEF_SINGLE);
    8789        }
    8890        else if(type_stack[sp-2]==DEF_INT64||type_stack[sp-2]==DEF_QWORD){
     
    9092
    9193            //fild qword ptr[esp]
    92             op_fld_ptr_esp(DEF_INT64);
    93 
    94             //add esp,4
    95             op_add_esp(4);
     94            compiler.codeGenerator.op_fld_ptr_esp(DEF_INT64);
     95
     96            //add esp,4
     97            compiler.codeGenerator.op_add_esp(4);
    9698        }
    9799        else{
     
    99101
    100102            //fild dword ptr[esp]
    101             op_fld_ptr_esp(DEF_LONG);
     103            compiler.codeGenerator.op_fld_ptr_esp(DEF_LONG);
    102104        }
    103105
    104106        //fcompp
    105         OpBuffer[obp++]=(char)0xDE;
    106         OpBuffer[obp++]=(char)0xD9;
     107        compiler.codeGenerator.op_fcompp();
    107108
    108109        //fnstsw ax
    109         OpBuffer[obp++]=(char)0xDF;
    110         OpBuffer[obp++]=(char)0xE0;
     110        compiler.codeGenerator.op_fnstsw_ax();
    111111
    112112        //mov ecx,1
    113         OpBuffer[obp++]=(char)0xB9;
    114         *((long *)(OpBuffer+obp))=1;
    115         obp+=sizeof(long);
     113        compiler.codeGenerator.op_mov_RV( REG_ECX, 1 );
    116114
    117115        //test ah,41h
    118         OpBuffer[obp++]=(char)0xF6;
    119         OpBuffer[obp++]=(char)0xC4;
    120         OpBuffer[obp++]=(char)0x41;
     116        compiler.codeGenerator.op_test_ah( (char)0x41 );
    121117
    122118        //jne 5
    123         OpBuffer[obp++]=(char)0x75;
    124         OpBuffer[obp++]=(char)0x02;
     119        compiler.codeGenerator.PutOld(
     120            (char)0x75,
     121            (char)0x02
     122        );
    125123
    126124        //xor ecx,ecx(ecxを0にする)
    127         op_zero_reg(REG_ECX);
     125        compiler.codeGenerator.op_zero_reg(REG_ECX);
    128126
    129127        //mov dword ptr[esp],ecx
    130         OpBuffer[obp++]=(char)0x89;
    131         OpBuffer[obp++]=(char)0x0C;
    132         OpBuffer[obp++]=(char)0x24;
     128        compiler.codeGenerator.op_mov_MR( sizeof(long), REG_ECX, REG_ESP, 0, MOD_BASE );
    133129    }
    134130    else if(Is64Type(AnswerType)){
     
    147143
    148144        //cmp edx,ecx
    149         OpBuffer[obp++]=(char)0x3B;
    150         OpBuffer[obp++]=(char)0xD1;
     145        compiler.codeGenerator.op_cmp_RR( REG_EDX, REG_ECX );
    151146
    152147        if(IsSignedType(type_stack[sp-2])==0&&IsSignedType(type_stack[sp-1])==0){
     
    206201
    207202        //xor eax,eax(eaxを0にする)
    208         op_zero_reg(REG_EAX);
     203        compiler.codeGenerator.op_zero_reg(REG_EAX);
    209204
    210205        //push eax
    211         op_push(REG_EAX);
     206        compiler.codeGenerator.op_push(REG_EAX);
    212207    }
    213208    else{
     
    217212
    218213        //pop ebx
    219         op_pop(REG_EBX);
     214        compiler.codeGenerator.op_pop(REG_EBX);
    220215
    221216        //pop eax
    222         op_pop(REG_EAX);
     217        compiler.codeGenerator.op_pop(REG_EAX);
    223218
    224219        // どちらかのサイズが足りない場合は自動拡張する
     
    226221
    227222        //sub esp,4
    228         op_sub_esp(4);
     223        compiler.codeGenerator.op_sub_esp(4);
    229224
    230225        //mov ecx,1
     
    258253
    259254        //mov dword ptr[esp],ecx
    260         OpBuffer[obp++]=(char)0x89;
    261         OpBuffer[obp++]=(char)0x0C;
    262         OpBuffer[obp++]=(char)0x24;
     255        compiler.codeGenerator.op_mov_MR( sizeof(long), REG_ECX, REG_ESP, 0, MOD_BASE );
    263256    }
    264257
     
    283276        if(type_stack[sp-1]==DEF_DOUBLE){
    284277            //fld qword ptr[esp]
    285             op_fld_ptr_esp(DEF_DOUBLE);
     278            compiler.codeGenerator.op_fld_ptr_esp(DEF_DOUBLE);
    286279
    287280            //add esp,8
    288             op_add_esp(8);
     281            compiler.codeGenerator.op_add_esp(8);
    289282        }
    290283        else if(type_stack[sp-1]==DEF_SINGLE){
    291284            //fld dword ptr[esp]
    292             op_fld_ptr_esp(DEF_SINGLE);
    293 
    294             //add esp,4
    295             op_add_esp(4);
     285            compiler.codeGenerator.op_fld_ptr_esp(DEF_SINGLE);
     286
     287            //add esp,4
     288            compiler.codeGenerator.op_add_esp(4);
    296289        }
    297290        else if(type_stack[sp-1]==DEF_INT64||type_stack[sp-1]==DEF_QWORD){
     
    299292
    300293            //fild qword ptr[esp]
    301             op_fld_ptr_esp(DEF_INT64);
     294            compiler.codeGenerator.op_fld_ptr_esp(DEF_INT64);
    302295
    303296            //add esp,8
    304             op_add_esp(8);
     297            compiler.codeGenerator.op_add_esp(8);
    305298        }
    306299        else{
     
    308301
    309302            //fild dword ptr[esp]
    310             op_fld_ptr_esp(DEF_LONG);
    311 
    312             //add esp,4
    313             op_add_esp(4);
     303            compiler.codeGenerator.op_fld_ptr_esp(DEF_LONG);
     304
     305            //add esp,4
     306            compiler.codeGenerator.op_add_esp(4);
    314307        }
    315308
    316309        if(type_stack[sp-2]==DEF_DOUBLE){
    317310            //fld qword ptr[esp]
    318             op_fld_ptr_esp(DEF_DOUBLE);
    319 
    320             //add esp,4
    321             op_add_esp(4);
     311            compiler.codeGenerator.op_fld_ptr_esp(DEF_DOUBLE);
     312
     313            //add esp,4
     314            compiler.codeGenerator.op_add_esp(4);
    322315        }
    323316        else if(type_stack[sp-2]==DEF_SINGLE){
    324317            //fld dword ptr[esp]
    325             op_fld_ptr_esp(DEF_SINGLE);
     318            compiler.codeGenerator.op_fld_ptr_esp(DEF_SINGLE);
    326319        }
    327320        else if(type_stack[sp-2]==DEF_INT64||type_stack[sp-2]==DEF_QWORD){
     
    329322
    330323            //fild qword ptr[esp]
    331             op_fld_ptr_esp(DEF_INT64);
    332 
    333             //add esp,4
    334             op_add_esp(4);
     324            compiler.codeGenerator.op_fld_ptr_esp(DEF_INT64);
     325
     326            //add esp,4
     327            compiler.codeGenerator.op_add_esp(4);
    335328        }
    336329        else{
     
    338331
    339332            //fild dword ptr[esp]
    340             op_fld_ptr_esp(DEF_LONG);
     333            compiler.codeGenerator.op_fld_ptr_esp(DEF_LONG);
    341334        }
    342335
     
    346339
    347340        //fnstsw ax
    348         OpBuffer[obp++]=(char)0xDF;
    349         OpBuffer[obp++]=(char)0xE0;
     341        compiler.codeGenerator.op_fnstsw_ax();
    350342
    351343        //mov ecx,1
     
    355347
    356348        //test ah,1
    357         OpBuffer[obp++]=(char)0xF6;
    358         OpBuffer[obp++]=(char)0xC4;
    359         OpBuffer[obp++]=(char)0x01;
     349        compiler.codeGenerator.op_test_ah( (char)0x01 );
    360350
    361351        //je 5
     
    369359
    370360        //mov dword ptr[esp],ecx
    371         OpBuffer[obp++]=(char)0x89;
    372         OpBuffer[obp++]=(char)0x0C;
    373         OpBuffer[obp++]=(char)0x24;
     361        compiler.codeGenerator.op_mov_MR( sizeof(long), REG_ECX, REG_ESP, 0, MOD_BASE );
    374362    }
    375363    else if(Is64Type(AnswerType)){
     
    447435
    448436        //xor eax,eax(eaxを0にする)
    449         op_zero_reg(REG_EAX);
     437        compiler.codeGenerator.op_zero_reg(REG_EAX);
    450438
    451439        //push eax
    452         op_push(REG_EAX);
     440        compiler.codeGenerator.op_push(REG_EAX);
    453441    }
    454442    else{
     
    458446
    459447        //pop ebx
    460         op_pop(REG_EBX);
     448        compiler.codeGenerator.op_pop(REG_EBX);
    461449
    462450        //pop eax
    463         op_pop(REG_EAX);
     451        compiler.codeGenerator.op_pop(REG_EAX);
    464452
    465453        // どちらかのサイズが足りない場合は自動拡張する
     
    467455
    468456        //sub esp,4
    469         op_sub_esp(4);
     457        compiler.codeGenerator.op_sub_esp(4);
    470458
    471459        //mov ecx,1
     
    499487
    500488        //mov dword ptr[esp],ecx
    501         OpBuffer[obp++]=(char)0x89;
    502         OpBuffer[obp++]=(char)0x0C;
    503         OpBuffer[obp++]=(char)0x24;
     489        compiler.codeGenerator.op_mov_MR( sizeof(long), REG_ECX, REG_ESP, 0, MOD_BASE );
    504490    }
    505491
     
    527513        if(type_stack[sp-1]==DEF_DOUBLE){
    528514            //fld qword ptr[esp]
    529             op_fld_ptr_esp(DEF_DOUBLE);
     515            compiler.codeGenerator.op_fld_ptr_esp(DEF_DOUBLE);
    530516
    531517            //add esp,8
    532             op_add_esp(8);
     518            compiler.codeGenerator.op_add_esp(8);
    533519        }
    534520        else if(type_stack[sp-1]==DEF_SINGLE){
    535521            //fld dword ptr[esp]
    536             op_fld_ptr_esp(DEF_SINGLE);
    537 
    538             //add esp,4
    539             op_add_esp(4);
     522            compiler.codeGenerator.op_fld_ptr_esp(DEF_SINGLE);
     523
     524            //add esp,4
     525            compiler.codeGenerator.op_add_esp(4);
    540526        }
    541527        else if(type_stack[sp-1]==DEF_INT64||type_stack[sp-1]==DEF_QWORD){
     
    543529
    544530            //fild qword ptr[esp]
    545             op_fld_ptr_esp(DEF_INT64);
     531            compiler.codeGenerator.op_fld_ptr_esp(DEF_INT64);
    546532
    547533            //add esp,8
    548             op_add_esp(8);
     534            compiler.codeGenerator.op_add_esp(8);
    549535        }
    550536        else{
     
    552538
    553539            //fild dword ptr[esp]
    554             op_fld_ptr_esp(DEF_LONG);
    555 
    556             //add esp,4
    557             op_add_esp(4);
     540            compiler.codeGenerator.op_fld_ptr_esp(DEF_LONG);
     541
     542            //add esp,4
     543            compiler.codeGenerator.op_add_esp(4);
    558544        }
    559545
    560546        if(type_stack[sp-2]==DEF_DOUBLE){
    561547            //fld qword ptr[esp]
    562             op_fld_ptr_esp(DEF_DOUBLE);
    563 
    564             //add esp,4
    565             op_add_esp(4);
     548            compiler.codeGenerator.op_fld_ptr_esp(DEF_DOUBLE);
     549
     550            //add esp,4
     551            compiler.codeGenerator.op_add_esp(4);
    566552        }
    567553        else if(type_stack[sp-2]==DEF_SINGLE){
    568554            //fld dword ptr[esp]
    569             op_fld_ptr_esp(DEF_SINGLE);
     555            compiler.codeGenerator.op_fld_ptr_esp(DEF_SINGLE);
    570556        }
    571557        else if(type_stack[sp-2]==DEF_INT64||type_stack[sp-2]==DEF_QWORD){
     
    573559
    574560            //fild qword ptr[esp]
    575             op_fld_ptr_esp(DEF_INT64);
    576 
    577             //add esp,4
    578             op_add_esp(4);
     561            compiler.codeGenerator.op_fld_ptr_esp(DEF_INT64);
     562
     563            //add esp,4
     564            compiler.codeGenerator.op_add_esp(4);
    579565        }
    580566        else{
     
    582568
    583569            //fild dword ptr[esp]
    584             op_fld_ptr_esp(DEF_LONG);
     570            compiler.codeGenerator.op_fld_ptr_esp(DEF_LONG);
    585571        }
    586572
    587573        //fcompp
    588         OpBuffer[obp++]=(char)0xDE;
    589         OpBuffer[obp++]=(char)0xD9;
     574        compiler.codeGenerator.op_fcompp();
    590575
    591576        //fnstsw ax
    592         OpBuffer[obp++]=(char)0xDF;
    593         OpBuffer[obp++]=(char)0xE0;
     577        compiler.codeGenerator.op_fnstsw_ax();
    594578
    595579        //mov ecx,1
     
    599583
    600584        //test ah,01h
    601         OpBuffer[obp++]=(char)0xF6;
    602         OpBuffer[obp++]=(char)0xC4;
    603         OpBuffer[obp++]=(char)0x01;
     585        compiler.codeGenerator.op_test_ah( (char)0x41 );
    604586
    605587        //jne 5
     
    613595
    614596        //mov dword ptr[esp],ecx
    615         OpBuffer[obp++]=(char)0x89;
    616         OpBuffer[obp++]=(char)0x0C;
    617         OpBuffer[obp++]=(char)0x24;
     597        compiler.codeGenerator.op_mov_MR( sizeof(long), REG_ECX, REG_ESP, 0, MOD_BASE );
    618598    }
    619599    else if(Is64Type(AnswerType)){
     
    678658
    679659        //xor eax,eax(eaxを0にする)
    680         op_zero_reg(REG_EAX);
     660        compiler.codeGenerator.op_zero_reg(REG_EAX);
    681661
    682662        //jmp 5(演算終了位置へジャンプ)
     
    694674
    695675        //push eax
    696         op_push(REG_EAX);
     676        compiler.codeGenerator.op_push(REG_EAX);
    697677    }
    698678    else{
     
    702682
    703683        //pop ebx
    704         op_pop(REG_EBX);
     684        compiler.codeGenerator.op_pop(REG_EBX);
    705685
    706686        //pop eax
    707         op_pop(REG_EAX);
     687        compiler.codeGenerator.op_pop(REG_EAX);
    708688
    709689        // どちらかのサイズが足りない場合は自動拡張する
     
    711691
    712692        //sub esp,4
    713         op_sub_esp(4);
     693        compiler.codeGenerator.op_sub_esp(4);
    714694
    715695        //mov ecx,1
     
    743723
    744724        //mov dword ptr[esp],ecx
    745         OpBuffer[obp++]=(char)0x89;
    746         OpBuffer[obp++]=(char)0x0C;
    747         OpBuffer[obp++]=(char)0x24;
     725        compiler.codeGenerator.op_mov_MR( sizeof(long), REG_ECX, REG_ESP, 0, MOD_BASE );
    748726    }
    749727
     
    771749        if(type_stack[sp-1]==DEF_DOUBLE){
    772750            //fld qword ptr[esp]
    773             op_fld_ptr_esp(DEF_DOUBLE);
     751            compiler.codeGenerator.op_fld_ptr_esp(DEF_DOUBLE);
    774752
    775753            //add esp,8
    776             op_add_esp(8);
     754            compiler.codeGenerator.op_add_esp(8);
    777755        }
    778756        else if(type_stack[sp-1]==DEF_SINGLE){
    779757            //fld dword ptr[esp]
    780             op_fld_ptr_esp(DEF_SINGLE);
    781 
    782             //add esp,4
    783             op_add_esp(4);
     758            compiler.codeGenerator.op_fld_ptr_esp(DEF_SINGLE);
     759
     760            //add esp,4
     761            compiler.codeGenerator.op_add_esp(4);
    784762        }
    785763        else if(type_stack[sp-1]==DEF_INT64||type_stack[sp-1]==DEF_QWORD){
     
    787765
    788766            //fild qword ptr[esp]
    789             op_fld_ptr_esp(DEF_INT64);
     767            compiler.codeGenerator.op_fld_ptr_esp(DEF_INT64);
    790768
    791769            //add esp,8
    792             op_add_esp(8);
     770            compiler.codeGenerator.op_add_esp(8);
    793771        }
    794772        else{   //Long、DWord
    795773            //fild dword ptr[esp]
    796             op_fld_ptr_esp(DEF_LONG);
    797 
    798             //add esp,4
    799             op_add_esp(4);
     774            compiler.codeGenerator.op_fld_ptr_esp(DEF_LONG);
     775
     776            //add esp,4
     777            compiler.codeGenerator.op_add_esp(4);
    800778        }
    801779
    802780        if(type_stack[sp-2]==DEF_DOUBLE){
    803781            //fld qword ptr[esp]
    804             op_fld_ptr_esp(DEF_DOUBLE);
    805 
    806             //add esp,4
    807             op_add_esp(4);
     782            compiler.codeGenerator.op_fld_ptr_esp(DEF_DOUBLE);
     783
     784            //add esp,4
     785            compiler.codeGenerator.op_add_esp(4);
    808786        }
    809787        else if(type_stack[sp-2]==DEF_SINGLE){
    810788            //fld dword ptr[esp]
    811             op_fld_ptr_esp(DEF_SINGLE);
     789            compiler.codeGenerator.op_fld_ptr_esp(DEF_SINGLE);
    812790        }
    813791        else if(type_stack[sp-2]==DEF_INT64||type_stack[sp-2]==DEF_QWORD){
     
    815793
    816794            //fild qword ptr[esp]
    817             op_fld_ptr_esp(DEF_INT64);
    818 
    819             //add esp,4
    820             op_add_esp(4);
     795            compiler.codeGenerator.op_fld_ptr_esp(DEF_INT64);
     796
     797            //add esp,4
     798            compiler.codeGenerator.op_add_esp(4);
    821799        }
    822800        else{   //Long、DWord
    823801            //fild dword ptr[esp]
    824             op_fld_ptr_esp(DEF_LONG);
     802            compiler.codeGenerator.op_fld_ptr_esp(DEF_LONG);
    825803        }
    826804
    827805        //fcompp
    828         OpBuffer[obp++]=(char)0xDE;
    829         OpBuffer[obp++]=(char)0xD9;
     806        compiler.codeGenerator.op_fcompp();
    830807
    831808        //fnstsw ax
    832         OpBuffer[obp++]=(char)0xDF;
    833         OpBuffer[obp++]=(char)0xE0;
     809        compiler.codeGenerator.op_fnstsw_ax();
    834810
    835811        //mov ecx,1
     
    839815
    840816        //test ah,41
    841         OpBuffer[obp++]=(char)0xF6;
    842         OpBuffer[obp++]=(char)0xC4;
    843         OpBuffer[obp++]=(char)0x41;
     817        compiler.codeGenerator.op_test_ah( (char)0x41 );
    844818
    845819        //je 5
     
    853827
    854828        //mov dword ptr[esp],ecx
    855         OpBuffer[obp++]=(char)0x89;
    856         OpBuffer[obp++]=(char)0x0C;
    857         OpBuffer[obp++]=(char)0x24;
     829        compiler.codeGenerator.op_mov_MR( sizeof(long), REG_ECX, REG_ESP, 0, MOD_BASE );
    858830    }
    859831    else if(Is64Type(AnswerType)){
     
    918890
    919891        //xor eax,eax(eaxを0にする)
    920         op_zero_reg(REG_EAX);
     892        compiler.codeGenerator.op_zero_reg(REG_EAX);
    921893
    922894        //jmp 5(演算終了位置へジャンプ)
     
    934906
    935907        //push eax
    936         op_push(REG_EAX);
     908        compiler.codeGenerator.op_push(REG_EAX);
    937909    }
    938910    else{
     
    942914
    943915        //pop ebx
    944         op_pop(REG_EBX);
     916        compiler.codeGenerator.op_pop(REG_EBX);
    945917
    946918        //pop eax
    947         op_pop(REG_EAX);
     919        compiler.codeGenerator.op_pop(REG_EAX);
    948920
    949921        // どちらかのサイズが足りない場合は自動拡張する
     
    951923
    952924        //sub esp,4
    953         op_sub_esp(4);
     925        compiler.codeGenerator.op_sub_esp(4);
    954926
    955927        //mov ecx,1
     
    979951
    980952        //mov dword ptr[esp],ecx
    981         OpBuffer[obp++]=(char)0x89;
    982         OpBuffer[obp++]=(char)0x0C;
    983         OpBuffer[obp++]=(char)0x24;
     953        compiler.codeGenerator.op_mov_MR( sizeof(long), REG_ECX, REG_ESP, 0, MOD_BASE );
    984954    }
    985955
     
    1005975        if(type[sp-1]==DEF_DOUBLE){
    1006976            //fld qword ptr[esp]
    1007             op_fld_ptr_esp(DEF_DOUBLE);
     977            compiler.codeGenerator.op_fld_ptr_esp(DEF_DOUBLE);
    1008978
    1009979            //add esp,8
    1010             op_add_esp(8);
     980            compiler.codeGenerator.op_add_esp(8);
    1011981        }
    1012982        else if(type[sp-1]==DEF_SINGLE){
    1013983            //fld dword ptr[esp]
    1014             op_fld_ptr_esp(DEF_SINGLE);
    1015 
    1016             //add esp,4
    1017             op_add_esp(4);
     984            compiler.codeGenerator.op_fld_ptr_esp(DEF_SINGLE);
     985
     986            //add esp,4
     987            compiler.codeGenerator.op_add_esp(4);
    1018988        }
    1019989        else if(type[sp-1]==DEF_INT64||type[sp-1]==DEF_QWORD){
     
    1021991
    1022992            //fild qword ptr[esp]
    1023             op_fld_ptr_esp(DEF_INT64);
     993            compiler.codeGenerator.op_fld_ptr_esp(DEF_INT64);
    1024994
    1025995            //add esp,8
    1026             op_add_esp(8);
     996            compiler.codeGenerator.op_add_esp(8);
    1027997        }
    1028998        else{   //Long、DWord
    1029999            //fild dword ptr[esp]
    1030             op_fld_ptr_esp(DEF_LONG);
    1031 
    1032             //add esp,4
    1033             op_add_esp(4);
     1000            compiler.codeGenerator.op_fld_ptr_esp(DEF_LONG);
     1001
     1002            //add esp,4
     1003            compiler.codeGenerator.op_add_esp(4);
    10341004        }
    10351005
    10361006        if(type[sp-2]==DEF_DOUBLE){
    10371007            //fld qword ptr[esp]
    1038             op_fld_ptr_esp(DEF_DOUBLE);
    1039 
    1040             //add esp,4
    1041             op_add_esp(4);
     1008            compiler.codeGenerator.op_fld_ptr_esp(DEF_DOUBLE);
     1009
     1010            //add esp,4
     1011            compiler.codeGenerator.op_add_esp(4);
    10421012        }
    10431013        else if(type[sp-2]==DEF_SINGLE){
    10441014            //fld dword ptr[esp]
    1045             op_fld_ptr_esp(DEF_SINGLE);
     1015            compiler.codeGenerator.op_fld_ptr_esp(DEF_SINGLE);
    10461016        }
    10471017        else if(type[sp-2]==DEF_INT64||type[sp-2]==DEF_QWORD){
     
    10491019
    10501020            //fild qword ptr[esp]
    1051             op_fld_ptr_esp(DEF_INT64);
    1052 
    1053             //add esp,4
    1054             op_add_esp(4);
     1021            compiler.codeGenerator.op_fld_ptr_esp(DEF_INT64);
     1022
     1023            //add esp,4
     1024            compiler.codeGenerator.op_add_esp(4);
    10551025        }
    10561026        else{   //Long、DWord
    10571027            //fild dword ptr[esp]
    1058             op_fld_ptr_esp(DEF_LONG);
     1028            compiler.codeGenerator.op_fld_ptr_esp(DEF_LONG);
    10591029        }
    10601030
    10611031        //fcompp
    1062         OpBuffer[obp++]=(char)0xDE;
    1063         OpBuffer[obp++]=(char)0xD9;
     1032        compiler.codeGenerator.op_fcompp();
    10641033
    10651034        //fnstsw ax
    1066         OpBuffer[obp++]=(char)0xDF;
    1067         OpBuffer[obp++]=(char)0xE0;
     1035        compiler.codeGenerator.op_fnstsw_ax();
    10681036
    10691037        //mov ecx,1
     
    10731041
    10741042        //test ah,40
    1075         OpBuffer[obp++]=(char)0xF6;
    1076         OpBuffer[obp++]=(char)0xC4;
    1077         OpBuffer[obp++]=(char)0x40;
     1043        compiler.codeGenerator.op_test_ah( (char)0x40 );
    10781044
    10791045        //je 5
     
    10871053
    10881054        //mov dword ptr[esp],ecx
    1089         OpBuffer[obp++]=(char)0x89;
    1090         OpBuffer[obp++]=(char)0x0C;
    1091         OpBuffer[obp++]=(char)0x24;
     1055        compiler.codeGenerator.op_mov_MR( sizeof(long), REG_ECX, REG_ESP, 0, MOD_BASE );
    10921056    }
    10931057    else if(type[sp-2]==DEF_INT64||type[sp-2]==DEF_QWORD||
     
    11241088
    11251089        //xor eax,eax(eaxを0にする)
    1126         op_zero_reg(REG_EAX);
     1090        compiler.codeGenerator.op_zero_reg(REG_EAX);
    11271091
    11281092        //jmp 5(演算終了位置へジャンプ)
     
    11401104
    11411105        //push eax
    1142         op_push(REG_EAX);
     1106        compiler.codeGenerator.op_push(REG_EAX);
    11431107    }
    11441108    else{
     
    11481112
    11491113        //pop eax
    1150         op_pop(REG_EAX);
     1114        compiler.codeGenerator.op_pop(REG_EAX);
    11511115
    11521116        //pop ebx
    1153         op_pop(REG_EBX);
     1117        compiler.codeGenerator.op_pop(REG_EBX);
    11541118
    11551119        // どちらかのサイズが足りない場合は自動拡張する
     
    11571121
    11581122        //sub esp,4
    1159         op_sub_esp(4);
     1123        compiler.codeGenerator.op_sub_esp(4);
    11601124
    11611125        //xor eax,ebx
     
    11731137
    11741138        //mov dword ptr[esp],eax
    1175         OpBuffer[obp++]=(char)0x89;
    1176         OpBuffer[obp++]=(char)0x04;
    1177         OpBuffer[obp++]=(char)0x24;
     1139        compiler.codeGenerator.op_mov_MR( sizeof(long), REG_EAX, REG_ESP, 0, MOD_BASE );
    11781140    }
    11791141
     
    11991161        if(type[sp-1]==DEF_DOUBLE){
    12001162            //fld qword ptr[esp]
    1201             op_fld_ptr_esp(DEF_DOUBLE);
     1163            compiler.codeGenerator.op_fld_ptr_esp(DEF_DOUBLE);
    12021164
    12031165            //add esp,8
    1204             op_add_esp(8);
     1166            compiler.codeGenerator.op_add_esp(8);
    12051167        }
    12061168        else if(type[sp-1]==DEF_SINGLE){
    12071169            //fld dword ptr[esp]
    1208             op_fld_ptr_esp(DEF_SINGLE);
    1209 
    1210             //add esp,4
    1211             op_add_esp(4);
     1170            compiler.codeGenerator.op_fld_ptr_esp(DEF_SINGLE);
     1171
     1172            //add esp,4
     1173            compiler.codeGenerator.op_add_esp(4);
    12121174        }
    12131175        else if(type[sp-1]==DEF_INT64||type[sp-1]==DEF_QWORD){
     
    12151177
    12161178            //fild qword ptr[esp]
    1217             op_fld_ptr_esp(DEF_INT64);
     1179            compiler.codeGenerator.op_fld_ptr_esp(DEF_INT64);
    12181180
    12191181            //add esp,8
    1220             op_add_esp(8);
     1182            compiler.codeGenerator.op_add_esp(8);
    12211183        }
    12221184        else{   //Long、DWord
    12231185            //fild dword ptr[esp]
    1224             op_fld_ptr_esp(DEF_LONG);
    1225 
    1226             //add esp,4
    1227             op_add_esp(4);
     1186            compiler.codeGenerator.op_fld_ptr_esp(DEF_LONG);
     1187
     1188            //add esp,4
     1189            compiler.codeGenerator.op_add_esp(4);
    12281190        }
    12291191
    12301192        if(type[sp-2]==DEF_DOUBLE){
    12311193            //fld qword ptr[esp]
    1232             op_fld_ptr_esp(DEF_DOUBLE);
    1233 
    1234             //add esp,4
    1235             op_add_esp(4);
     1194            compiler.codeGenerator.op_fld_ptr_esp(DEF_DOUBLE);
     1195
     1196            //add esp,4
     1197            compiler.codeGenerator.op_add_esp(4);
    12361198        }
    12371199        else if(type[sp-2]==DEF_SINGLE){
    12381200            //fld dword ptr[esp]
    1239             op_fld_ptr_esp(DEF_SINGLE);
     1201            compiler.codeGenerator.op_fld_ptr_esp(DEF_SINGLE);
    12401202        }
    12411203        else if(type[sp-2]==DEF_INT64||type[sp-2]==DEF_QWORD){
     
    12431205
    12441206            //fild qword ptr[esp]
    1245             op_fld_ptr_esp(DEF_INT64);
    1246 
    1247             //add esp,4
    1248             op_add_esp(4);
     1207            compiler.codeGenerator.op_fld_ptr_esp(DEF_INT64);
     1208
     1209            //add esp,4
     1210            compiler.codeGenerator.op_add_esp(4);
    12491211        }
    12501212        else{   //Long、DWord
    12511213            //fild dword ptr[esp]
    1252             op_fld_ptr_esp(DEF_LONG);
     1214            compiler.codeGenerator.op_fld_ptr_esp(DEF_LONG);
    12531215        }
    12541216
    12551217        //fcompp
    1256         OpBuffer[obp++]=(char)0xDE;
    1257         OpBuffer[obp++]=(char)0xD9;
     1218        compiler.codeGenerator.op_fcompp();
    12581219
    12591220        //fnstsw ax
    1260         OpBuffer[obp++]=(char)0xDF;
    1261         OpBuffer[obp++]=(char)0xE0;
     1221        compiler.codeGenerator.op_fnstsw_ax();
    12621222
    12631223        //mov ecx,1
     
    12671227
    12681228        //test ah,40
    1269         OpBuffer[obp++]=(char)0xF6;
    1270         OpBuffer[obp++]=(char)0xC4;
    1271         OpBuffer[obp++]=(char)0x40;
     1229        compiler.codeGenerator.op_test_ah( (char)0x40 );
    12721230
    12731231        //jne 5
     
    12811239
    12821240        //mov dword ptr[esp],ecx
    1283         OpBuffer[obp++]=(char)0x89;
    1284         OpBuffer[obp++]=(char)0x0C;
    1285         OpBuffer[obp++]=(char)0x24;
     1241        compiler.codeGenerator.op_mov_MR( sizeof(long), REG_ECX, REG_ESP, 0, MOD_BASE );
    12861242    }
    12871243    else if(type[sp-2]==DEF_INT64||type[sp-2]==DEF_QWORD||
     
    13311287
    13321288        //xor eax,eax(eaxを0にする)
    1333         op_zero_reg(REG_EAX);
     1289        compiler.codeGenerator.op_zero_reg(REG_EAX);
    13341290
    13351291        //push eax
    1336         op_push(REG_EAX);
     1292        compiler.codeGenerator.op_push(REG_EAX);
    13371293    }
    13381294    else{
     
    13421298
    13431299        //pop eax
    1344         op_pop(REG_EAX);
     1300        compiler.codeGenerator.op_pop(REG_EAX);
    13451301
    13461302        //pop ebx
    1347         op_pop(REG_EBX);
     1303        compiler.codeGenerator.op_pop(REG_EBX);
    13481304
    13491305        // どちらかのサイズが足りない場合は自動拡張する
     
    13511307
    13521308        //sub esp,4
    1353         op_sub_esp(4);
     1309        compiler.codeGenerator.op_sub_esp(4);
    13541310
    13551311        //xor eax,ebx
     
    13751331
    13761332        //mov dword ptr[esp],eax
    1377         OpBuffer[obp++]=(char)0x89;
    1378         OpBuffer[obp++]=(char)0x04;
    1379         OpBuffer[obp++]=(char)0x24;
     1333        compiler.codeGenerator.op_mov_MR( sizeof(long), REG_EAX, REG_ESP, 0, MOD_BASE );
    13801334    }
    13811335
Note: See TracChangeset for help on using the changeset viewer.