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_Arithmetic.cpp

    r206 r225  
    11#include "stdafx.h"
     2
     3#include <Compiler.h>
    24
    35#include "../BasicCompiler_Common/common.h"
     
    1012    if(type[sp-1]==DEF_DOUBLE){
    1113        //fld qword ptr[esp]
    12         op_fld_ptr_esp(DEF_DOUBLE);
     14        compiler.codeGenerator.op_fld_ptr_esp(DEF_DOUBLE);
    1315
    1416        //fistp qword ptr[esp]
    15         op_fistp_ptr_esp( sizeof(_int64) );
     17        compiler.codeGenerator.op_fistp_ptr_esp( sizeof(_int64) );
    1618
    1719        //pop ebx
    18         op_pop(REG_EBX);
     20        compiler.codeGenerator.op_pop(REG_EBX);
    1921
    2022        //pop ecx
    21         op_pop(REG_ECX);
     23        compiler.codeGenerator.op_pop(REG_ECX);
    2224    }
    2325    else if(type[sp-1]==DEF_SINGLE){
    2426        //fld dword ptr[esp]
    25         op_fld_ptr_esp(DEF_SINGLE);
     27        compiler.codeGenerator.op_fld_ptr_esp(DEF_SINGLE);
    2628
    2729        //sub esp,4
    28         op_sub_esp(4);
     30        compiler.codeGenerator.op_sub_esp(4);
    2931
    3032        //fistp qword ptr[esp]
    31         op_fistp_ptr_esp( sizeof(_int64) );
     33        compiler.codeGenerator.op_fistp_ptr_esp( sizeof(_int64) );
    3234
    3335        //pop ebx
    34         op_pop(REG_EBX);
     36        compiler.codeGenerator.op_pop(REG_EBX);
    3537
    3638        //pop ecx
    37         op_pop(REG_ECX);
     39        compiler.codeGenerator.op_pop(REG_ECX);
    3840    }
    3941    else if(type[sp-1]==DEF_INT64||type[sp-1]==DEF_QWORD){
    4042        //pop ebx
    41         op_pop(REG_EBX);
     43        compiler.codeGenerator.op_pop(REG_EBX);
    4244
    4345        //pop ecx
    44         op_pop(REG_ECX);
     46        compiler.codeGenerator.op_pop(REG_ECX);
    4547    }
    4648    else{
    4749        //pop eax
    48         op_pop(REG_EAX);
     50        compiler.codeGenerator.op_pop(REG_EAX);
    4951
    5052        if(IsSignedType(type[sp-1])){
     
    5355               
    5456            //cdq
    55             op_cdq();
     57            compiler.codeGenerator.op_cdq();
    5658        }
    5759        else{
     
    6062
    6163            //xor edx,edx
    62             op_zero_reg(REG_EDX);
     64            compiler.codeGenerator.op_zero_reg(REG_EDX);
    6365        }
    6466
    6567        //mov ebx,eax
    66         OpBuffer[obp++]=(char)0x8B;
    67         OpBuffer[obp++]=(char)0xD8;
     68        compiler.codeGenerator.op_mov_RR( REG_EBX, REG_EAX );
    6869
    6970        //mov ecx,edx
    70         OpBuffer[obp++]=(char)0x8B;
    71         OpBuffer[obp++]=(char)0xCA;
     71        compiler.codeGenerator.op_mov_RR( REG_ECX, REG_EDX );
    7272    }
    7373
     
    7575    if(type[sp-2]==DEF_DOUBLE){
    7676        //fld qword ptr[esp]
    77         op_fld_ptr_esp(DEF_DOUBLE);
     77        compiler.codeGenerator.op_fld_ptr_esp(DEF_DOUBLE);
    7878
    7979        //fistp qword ptr[esp]
    80         op_fistp_ptr_esp( sizeof(_int64) );
     80        compiler.codeGenerator.op_fistp_ptr_esp( sizeof(_int64) );
    8181
    8282        //pop eax
    83         op_pop(REG_EAX);
     83        compiler.codeGenerator.op_pop(REG_EAX);
    8484
    8585        //pop edx
    86         op_pop(REG_EDX);
     86        compiler.codeGenerator.op_pop(REG_EDX);
    8787    }
    8888    else if(type[sp-2]==DEF_SINGLE){
    8989        //fld dword ptr[esp]
    90         op_fld_ptr_esp(DEF_SINGLE);
     90        compiler.codeGenerator.op_fld_ptr_esp(DEF_SINGLE);
    9191
    9292        //sub esp,4
    93         op_sub_esp(4);
     93        compiler.codeGenerator.op_sub_esp(4);
    9494
    9595        //fistp qword ptr[esp]
    96         op_fistp_ptr_esp( sizeof(_int64) );
     96        compiler.codeGenerator.op_fistp_ptr_esp( sizeof(_int64) );
    9797
    9898        //pop eax
    99         op_pop(REG_EAX);
     99        compiler.codeGenerator.op_pop(REG_EAX);
    100100
    101101        //pop edx
    102         op_pop(REG_EDX);
     102        compiler.codeGenerator.op_pop(REG_EDX);
    103103    }
    104104    else if(type[sp-2]==DEF_INT64||type[sp-2]==DEF_QWORD){
    105105        //pop eax
    106         op_pop(REG_EAX);
     106        compiler.codeGenerator.op_pop(REG_EAX);
    107107
    108108        //pop edx
    109         op_pop(REG_EDX);
     109        compiler.codeGenerator.op_pop(REG_EDX);
    110110    }
    111111    else{
    112112        //pop eax
    113         op_pop(REG_EAX);
     113        compiler.codeGenerator.op_pop(REG_EAX);
    114114
    115115        if(IsSignedType(type[sp-2])){
     
    118118               
    119119            //cdq
    120             op_cdq();
     120            compiler.codeGenerator.op_cdq();
    121121        }
    122122        else{
     
    125125
    126126            //xor edx,edx
    127             op_zero_reg(REG_EDX);
     127            compiler.codeGenerator.op_zero_reg(REG_EDX);
    128128        }
    129129    }
     
    136136
    137137    //push ecx
    138     op_push(REG_ECX);
     138    compiler.codeGenerator.op_push(REG_ECX);
    139139
    140140    //push ebx
    141     op_push(REG_EBX);
     141    compiler.codeGenerator.op_push(REG_EBX);
    142142
    143143    //push edx
    144     op_push(REG_EDX);
     144    compiler.codeGenerator.op_push(REG_EDX);
    145145
    146146    //push eax
    147     op_push(REG_EAX);
     147    compiler.codeGenerator.op_push(REG_EAX);
    148148}
    149149
     
    167167        if(type[sp-1]==DEF_DOUBLE){
    168168            //fld qword ptr[esp]
    169             op_fld_ptr_esp(DEF_DOUBLE);
     169            compiler.codeGenerator.op_fld_ptr_esp(DEF_DOUBLE);
    170170
    171171            //add esp,8
    172             op_add_esp(8);
     172            compiler.codeGenerator.op_add_esp(8);
    173173        }
    174174        else if(type[sp-1]==DEF_SINGLE){
    175175            //fld dword ptr[esp]
    176             op_fld_ptr_esp(DEF_SINGLE);
    177 
    178             //add esp,4
    179             op_add_esp(4);
     176            compiler.codeGenerator.op_fld_ptr_esp(DEF_SINGLE);
     177
     178            //add esp,4
     179            compiler.codeGenerator.op_add_esp(4);
    180180        }
    181181        else if(type[sp-1]==DEF_INT64||type[sp-1]==DEF_QWORD){
     
    183183
    184184            //fild qword ptr[esp]
    185             op_fld_ptr_esp(DEF_INT64);
     185            compiler.codeGenerator.op_fld_ptr_esp(DEF_INT64);
    186186
    187187            //add esp,8
    188             op_add_esp(8);
     188            compiler.codeGenerator.op_add_esp(8);
    189189        }
    190190        else{
     
    192192
    193193            //fild dword ptr[esp]
    194             op_fld_ptr_esp(DEF_LONG);
    195 
    196             //add esp,4
    197             op_add_esp(4);
     194            compiler.codeGenerator.op_fld_ptr_esp(DEF_LONG);
     195
     196            //add esp,4
     197            compiler.codeGenerator.op_add_esp(4);
    198198        }
    199199
    200200        if(type[sp-2]==DEF_DOUBLE){
    201201            //fld qword ptr[esp]
    202             op_fld_ptr_esp(DEF_DOUBLE);
     202            compiler.codeGenerator.op_fld_ptr_esp(DEF_DOUBLE);
    203203        }
    204204        else if(type[sp-2]==DEF_SINGLE){
    205205            //fld dword ptr[esp]
    206             op_fld_ptr_esp(DEF_SINGLE);
     206            compiler.codeGenerator.op_fld_ptr_esp(DEF_SINGLE);
    207207        }
    208208        else if(type[sp-2]==DEF_INT64||type[sp-2]==DEF_QWORD){
    209209            //64ビット整数値
    210             op_fld_ptr_esp(DEF_INT64);
     210            compiler.codeGenerator.op_fld_ptr_esp(DEF_INT64);
    211211        }
    212212        else{
     
    214214
    215215            //fild dword ptr[esp]
    216             op_fld_ptr_esp(DEF_LONG);
     216            compiler.codeGenerator.op_fld_ptr_esp(DEF_LONG);
    217217        }
    218218
     
    220220            if(AnswerType==DEF_SINGLE){
    221221                //add esp,4
    222                 op_add_esp(4);
     222                compiler.codeGenerator.op_add_esp(4);
    223223            }
    224224        }
     
    226226            if(AnswerType==DEF_DOUBLE){
    227227                //sub esp,4
    228                 op_sub_esp(4);
     228                compiler.codeGenerator.op_sub_esp(4);
    229229            }
    230230        }
     
    232232        if(idCalc==CALC_ADDITION){
    233233            //faddp st(1),st
    234             OpBuffer[obp++]=(char)0xDE;
    235             OpBuffer[obp++]=(char)0xC1;
     234            compiler.codeGenerator.PutOld(
     235                (char)0xDE,
     236                (char)0xC1
     237            );
    236238        }
    237239        else if(idCalc==CALC_SUBTRACTION){
    238240            //fsubrp st(1),st
    239             OpBuffer[obp++]=(char)0xDE;
    240             OpBuffer[obp++]=(char)0xE1;
     241            compiler.codeGenerator.PutOld(
     242                (char)0xDE,
     243                (char)0xE1
     244            );
    241245        }
    242246        else if(idCalc==CALC_PRODUCT){
    243247            //fmulp st(1),st
    244             OpBuffer[obp++]=(char)0xDE;
    245             OpBuffer[obp++]=(char)0xC9;
     248            compiler.codeGenerator.PutOld(
     249                (char)0xDE,
     250                (char)0xC9
     251            );
    246252        }
    247253
    248254        if(AnswerType==DEF_DOUBLE){
    249255            //fstp qword ptr[esp]
    250             OpBuffer[obp++]=(char)0xDD;
    251             OpBuffer[obp++]=(char)0x1C;
    252             OpBuffer[obp++]=(char)0x24;
     256            compiler.codeGenerator.op_fstp_basereg( DEF_DOUBLE, REG_ESP );
    253257        }
    254258        else{
    255259            //fstp dword ptr[esp]
    256             OpBuffer[obp++]=(char)0xD9;
    257             OpBuffer[obp++]=(char)0x1C;
    258             OpBuffer[obp++]=(char)0x24;
     260            compiler.codeGenerator.op_fstp_basereg( DEF_SINGLE, REG_ESP );
    259261        }
    260262    }
     
    273275            //call _allmul
    274276            extern const UserProc *pSub_allmul;
    275             op_call(pSub_allmul);
     277            compiler.codeGenerator.op_call(pSub_allmul);
    276278
    277279            //push edx
    278             op_push(REG_EDX);
     280            compiler.codeGenerator.op_push(REG_EDX);
    279281
    280282            //push eax
    281             op_push(REG_EAX);
     283            compiler.codeGenerator.op_push(REG_EAX);
    282284        }
    283285        else{
     
    286288
    287289                //pop ebx
    288                 op_pop(REG_EBX);
     290                compiler.codeGenerator.op_pop(REG_EBX);
    289291
    290292                //pop ecx
    291                 op_pop(REG_ECX);
     293                compiler.codeGenerator.op_pop(REG_ECX);
    292294            }
    293295            else{
     
    295297
    296298                //pop eax
    297                 op_pop(REG_EAX);
     299                compiler.codeGenerator.op_pop(REG_EAX);
    298300
    299301                if(IsSignedType(type[sp-1])){
     
    302304                   
    303305                    //cdq
    304                     op_cdq();
     306                    compiler.codeGenerator.op_cdq();
    305307                }
    306308                else{
     
    309311
    310312                    //xor edx,edx
    311                     op_zero_reg(REG_EDX);
     313                    compiler.codeGenerator.op_zero_reg(REG_EDX);
    312314                }
    313315
    314316                //mov ebx,eax
    315                 OpBuffer[obp++]=(char)0x8B;
    316                 OpBuffer[obp++]=(char)0xD8;
     317                compiler.codeGenerator.op_mov_RR( REG_EBX, REG_EAX );
    317318
    318319                //mov ecx,edx
    319                 OpBuffer[obp++]=(char)0x8B;
    320                 OpBuffer[obp++]=(char)0xCA;
     320                compiler.codeGenerator.op_mov_RR( REG_ECX, REG_EDX );
    321321            }
    322322
     
    326326                if(idCalc==CALC_ADDITION){
    327327                    //add dword ptr[esp],ebx
    328                     OpBuffer[obp++]=(char)0x01;
    329                     OpBuffer[obp++]=(char)0x1C;
    330                     OpBuffer[obp++]=(char)0x24;
     328                    compiler.codeGenerator.PutOld(
     329                        (char)0x01,
     330                        (char)0x1C,
     331                        (char)0x24
     332                    );
    331333
    332334                    //adc dword ptr[esp+sizeof(long)],ecx
    333                     OpBuffer[obp++]=(char)0x11;
    334                     OpBuffer[obp++]=(char)0x4C;
    335                     OpBuffer[obp++]=(char)0x24;
    336                     OpBuffer[obp++]=(char)0x04;
     335                    compiler.codeGenerator.PutOld(
     336                        (char)0x11,
     337                        (char)0x4C,
     338                        (char)0x24,
     339                        (char)0x04
     340                    );
    337341                }
    338342                else if(idCalc==CALC_SUBTRACTION){
    339343                    //sub dword ptr[esp],ebx
    340                     OpBuffer[obp++]=(char)0x29;
    341                     OpBuffer[obp++]=(char)0x1C;
    342                     OpBuffer[obp++]=(char)0x24;
     344                    compiler.codeGenerator.PutOld(
     345                        (char)0x29,
     346                        (char)0x1C,
     347                        (char)0x24
     348                    );
    343349
    344350                    //sbb dword ptr[esp+sizeof(long)],ecx
    345                     OpBuffer[obp++]=(char)0x19;
    346                     OpBuffer[obp++]=(char)0x4C;
    347                     OpBuffer[obp++]=(char)0x24;
    348                     OpBuffer[obp++]=(char)0x04;
     351                    compiler.codeGenerator.PutOld(
     352                        (char)0x19,
     353                        (char)0x4C,
     354                        (char)0x24,
     355                        (char)0x04
     356                    );
    349357                }
    350358            }
     
    353361
    354362                //pop eax
    355                 op_pop(REG_EAX);
     363                compiler.codeGenerator.op_pop(REG_EAX);
    356364
    357365                if(IsSignedType(type[sp-2])){
     
    360368
    361369                    //cdq
    362                     op_cdq();
     370                    compiler.codeGenerator.op_cdq();
    363371                }
    364372                else{
     
    367375
    368376                    //xor edx,edx
    369                     op_zero_reg(REG_EDX);
     377                    compiler.codeGenerator.op_zero_reg(REG_EDX);
    370378                }
    371379
    372380                if(idCalc==CALC_ADDITION){
    373381                    //add ebx,eax
    374                     OpBuffer[obp++]=(char)0x03;
    375                     OpBuffer[obp++]=(char)0xD8;
     382                    compiler.codeGenerator.op_add_RR( REG_EBX, REG_EAX );
    376383
    377384                    //adc ecx,edx
    378                     OpBuffer[obp++]=(char)0x13;
    379                     OpBuffer[obp++]=(char)0xCA;
     385                    compiler.codeGenerator.op_adc_RR( REG_ECX, REG_EDX );
    380386                }
    381387                else if(idCalc==CALC_SUBTRACTION){
    382388                    //sub ebx,eax
    383                     OpBuffer[obp++]=(char)0x2B;
    384                     OpBuffer[obp++]=(char)0xC3;
     389                    compiler.codeGenerator.op_sub_RR( REG_EBX, REG_EAX );
    385390
    386391                    //sbb ecx,edx
    387                     OpBuffer[obp++]=(char)0x1B;
    388                     OpBuffer[obp++]=(char)0xD1;
     392                    compiler.codeGenerator.op_sub_RR( REG_ECX, REG_EDX );
    389393                }
    390394
    391395                //push ecx
    392                 op_push(REG_ECX);
     396                compiler.codeGenerator.op_push(REG_ECX);
    393397
    394398                //push ebx
    395                 op_push(REG_EBX);
     399                compiler.codeGenerator.op_push(REG_EBX);
    396400            }
    397401        }
     
    403407
    404408        //pop ebx
    405         op_pop(REG_EBX);
     409        compiler.codeGenerator.op_pop(REG_EBX);
    406410
    407411        //pop eax
    408         op_pop(REG_EAX);
     412        compiler.codeGenerator.op_pop(REG_EAX);
    409413
    410414        //sub esp,4
    411         op_sub_esp(4);
     415        compiler.codeGenerator.op_sub_esp(4);
    412416
    413417        if(idCalc==CALC_ADDITION){
    414418            //add eax,ebx
    415             OpBuffer[obp++]=(char)0x03;
    416             OpBuffer[obp++]=(char)0xC3;
     419            compiler.codeGenerator.op_add_RR( REG_EAX, REG_EBX );
    417420        }
    418421        else if(idCalc==CALC_SUBTRACTION){
    419422            //sub eax,ebx
    420             OpBuffer[obp++]=(char)0x2B;
    421             OpBuffer[obp++]=(char)0xC3;
     423            compiler.codeGenerator.op_sub_RR( REG_EAX, REG_EBX );
    422424        }
    423425        else if(idCalc==CALC_PRODUCT){
    424426            //imul eax,ebx(64ビット演算ではないので、符号を考慮しない)
    425             OpBuffer[obp++]=(char)0x0F;
    426             OpBuffer[obp++]=(char)0xAF;
    427             OpBuffer[obp++]=(char)0xC3;
     427            compiler.codeGenerator.op_imul_RR( REG_EAX, REG_EBX );
    428428        }
    429429
    430430        //mov dword ptr[esp],eax
    431         OpBuffer[obp++]=(char)0x89;
    432         OpBuffer[obp++]=(char)0x04;
    433         OpBuffer[obp++]=(char)0x24;
     431        compiler.codeGenerator.op_mov_MR( sizeof(long), REG_EAX, REG_ESP, 0, MOD_BASE );
    434432    }
    435433
     
    463461            //call _aullrem
    464462            extern const UserProc *pSub_aullrem;
    465             op_call(pSub_aullrem);
     463            compiler.codeGenerator.op_call(pSub_aullrem);
    466464        }
    467465        else{
     
    470468            //call _allrem
    471469            extern const UserProc *pSub_allrem;
    472             op_call(pSub_allrem);
     470            compiler.codeGenerator.op_call(pSub_allrem);
    473471        }
    474472
    475473        //push edx
    476         op_push(REG_EDX);
     474        compiler.codeGenerator.op_push(REG_EDX);
    477475
    478476        //push eax
    479         op_push(REG_EAX);
     477        compiler.codeGenerator.op_push(REG_EAX);
    480478
    481479        sp--;
     
    490488        if(type[sp-1]==DEF_DOUBLE){
    491489            //fld qword ptr[esp]
    492             op_fld_ptr_esp(DEF_DOUBLE);
    493 
    494             //add esp,4
    495             op_add_esp(4);
    496 
    497             //fistp dword ptr[esp]
    498             op_fistp_ptr_esp( sizeof(long) );
     490            compiler.codeGenerator.op_fld_ptr_esp(DEF_DOUBLE);
     491
     492            //add esp,4
     493            compiler.codeGenerator.op_add_esp(4);
     494
     495            //fistp dword ptr[esp]
     496            compiler.codeGenerator.op_fistp_ptr_esp( sizeof(long) );
    499497        }
    500498        else if(type[sp-1]==DEF_SINGLE){
    501499            //fld dword ptr[esp]
    502             op_fld_ptr_esp(DEF_SINGLE);
    503 
    504             //fistp dword ptr[esp]
    505             op_fistp_ptr_esp( sizeof(long) );
     500            compiler.codeGenerator.op_fld_ptr_esp(DEF_SINGLE);
     501
     502            //fistp dword ptr[esp]
     503            compiler.codeGenerator.op_fistp_ptr_esp( sizeof(long) );
    506504        }
    507505
    508506        //pop ebx
    509         op_pop(REG_EBX);
     507        compiler.codeGenerator.op_pop(REG_EBX);
    510508
    511509        if(type[sp-2]==DEF_DOUBLE){
    512510            //fld qword ptr[esp]
    513             op_fld_ptr_esp(DEF_DOUBLE);
    514 
    515             //add esp,4
    516             op_add_esp(4);
    517 
    518             //fistp dword ptr[esp]
    519             op_fistp_ptr_esp( sizeof(long) );
     511            compiler.codeGenerator.op_fld_ptr_esp(DEF_DOUBLE);
     512
     513            //add esp,4
     514            compiler.codeGenerator.op_add_esp(4);
     515
     516            //fistp dword ptr[esp]
     517            compiler.codeGenerator.op_fistp_ptr_esp( sizeof(long) );
    520518        }
    521519        else if(type[sp-2]==DEF_SINGLE){
    522520            //fld dword ptr[esp]
    523             op_fld_ptr_esp(DEF_SINGLE);
    524 
    525             //fistp dword ptr[esp]
    526             op_fistp_ptr_esp( sizeof(long) );
     521            compiler.codeGenerator.op_fld_ptr_esp(DEF_SINGLE);
     522
     523            //fistp dword ptr[esp]
     524            compiler.codeGenerator.op_fistp_ptr_esp( sizeof(long) );
    527525        }
    528526
    529527        //pop eax
    530         op_pop(REG_EAX);
     528        compiler.codeGenerator.op_pop(REG_EAX);
    531529
    532530        //sub esp,4
    533         op_sub_esp(4);
     531        compiler.codeGenerator.op_sub_esp(4);
    534532
    535533        if(type[sp-2]==DEF_DWORD&&type[sp-1]==DEF_DWORD){
    536534            //xor edx,edx
    537             op_zero_reg(REG_EDX);
     535            compiler.codeGenerator.op_zero_reg(REG_EDX);
    538536
    539537            //div ebx (eax=eax/ebx...edx)
    540             OpBuffer[obp++]=(char)0xF7;
    541             OpBuffer[obp++]=(char)0xF3;
     538            compiler.codeGenerator.op_div_R( REG_EBX );
    542539        }
    543540        else{
    544541            //cdq
    545             op_cdq();
     542            compiler.codeGenerator.op_cdq();
    546543
    547544            //idiv ebx (eax=eax/ebx...edx)
    548             OpBuffer[obp++]=(char)0xF7;
    549             OpBuffer[obp++]=(char)0xFB;
     545            compiler.codeGenerator.op_idiv_R( REG_EBX );
    550546        }
    551547
    552548        //mov dword ptr[esp],edx
    553         OpBuffer[obp++]=(char)0x89;
    554         OpBuffer[obp++]=(char)0x14;
    555         OpBuffer[obp++]=(char)0x24;
     549        compiler.codeGenerator.op_mov_MR( sizeof(long), REG_EDX, REG_ESP, 0, MOD_BASE );
    556550
    557551        sp--;
     
    581575    if(type[sp-1]==DEF_DOUBLE){
    582576        //fld qword ptr[esp]
    583         op_fld_ptr_esp(DEF_DOUBLE);
     577        compiler.codeGenerator.op_fld_ptr_esp(DEF_DOUBLE);
    584578
    585579        //add esp,8
    586         op_add_esp(8);
     580        compiler.codeGenerator.op_add_esp(8);
    587581    }
    588582    else if(type[sp-1]==DEF_SINGLE){
    589583        //fld dword ptr[esp]
    590         op_fld_ptr_esp(DEF_SINGLE);
     584        compiler.codeGenerator.op_fld_ptr_esp(DEF_SINGLE);
    591585
    592586        //add esp,4
    593         op_add_esp(4);
     587        compiler.codeGenerator.op_add_esp(4);
    594588    }
    595589    else if(type[sp-1]==DEF_INT64||type[sp-1]==DEF_QWORD){
     
    597591
    598592        //fild qword ptr[esp]
    599         op_fld_ptr_esp(DEF_INT64);
     593        compiler.codeGenerator.op_fld_ptr_esp(DEF_INT64);
    600594
    601595        //add esp,8
    602         op_add_esp(8);
     596        compiler.codeGenerator.op_add_esp(8);
    603597    }
    604598    else if(type[sp-1]==DEF_DWORD){
    605599        //pop eax
    606         op_pop(REG_EAX);
     600        compiler.codeGenerator.op_pop(REG_EAX);
    607601
    608602        //push 0
    609         op_push_V(0);
     603        compiler.codeGenerator.op_push_V(0);
    610604
    611605        //push eax
    612         op_push(REG_EAX);
     606        compiler.codeGenerator.op_push(REG_EAX);
    613607
    614608        //fild qword ptr[esp]
    615         OpBuffer[obp++]=(char)0xDF;
    616         OpBuffer[obp++]=(char)0x2C;
    617         OpBuffer[obp++]=(char)0x24;
     609        compiler.codeGenerator.op_fld_ptr_esp(DEF_INT64);
    618610
    619611        //add esp,8
    620         op_add_esp(8);
     612        compiler.codeGenerator.op_add_esp(8);
    621613    }
    622614    else{
    623615        //fild dword ptr[esp]
    624         op_fld_ptr_esp(DEF_LONG);
     616        compiler.codeGenerator.op_fld_ptr_esp(DEF_LONG);
    625617
    626618        //add esp,4
    627         op_add_esp(4);
     619        compiler.codeGenerator.op_add_esp(4);
    628620    }
    629621
    630622    if(type[sp-2]==DEF_DOUBLE){
    631623        //fld qword ptr[esp]
    632         op_fld_ptr_esp(DEF_DOUBLE);
     624        compiler.codeGenerator.op_fld_ptr_esp(DEF_DOUBLE);
    633625    }
    634626    else if(type[sp-2]==DEF_SINGLE){
    635627        //fld dword ptr[esp]
    636         op_fld_ptr_esp(DEF_SINGLE);
     628        compiler.codeGenerator.op_fld_ptr_esp(DEF_SINGLE);
    637629    }
    638630    else if(type[sp-2]==DEF_INT64||type[sp-2]==DEF_QWORD){
     
    640632
    641633        //fild qword ptr[esp]
    642         op_fld_ptr_esp(DEF_INT64);
     634        compiler.codeGenerator.op_fld_ptr_esp(DEF_INT64);
    643635    }
    644636    else if(type[sp-2]==DEF_DWORD){
    645637        //pop eax
    646         op_pop(REG_EAX);
     638        compiler.codeGenerator.op_pop(REG_EAX);
    647639
    648640        //push 0
    649         op_push_V(0);
     641        compiler.codeGenerator.op_push_V(0);
    650642
    651643        //push eax
    652         op_push(REG_EAX);
     644        compiler.codeGenerator.op_push(REG_EAX);
    653645
    654646        //fild qword ptr[esp]
    655         OpBuffer[obp++]=(char)0xDF;
    656         OpBuffer[obp++]=(char)0x2C;
    657         OpBuffer[obp++]=(char)0x24;
     647        compiler.codeGenerator.op_fld_ptr_esp(DEF_INT64);
    658648    }
    659649    else{   //Long
    660650        //fild dword ptr[esp]
    661         op_fld_ptr_esp(DEF_LONG);
     651        compiler.codeGenerator.op_fld_ptr_esp(DEF_LONG);
    662652    }
    663653                                                            //↓ここだけ例外DWord
     
    665655        if(AnswerType==DEF_SINGLE){
    666656            //add esp,4
    667             op_add_esp(4);
     657            compiler.codeGenerator.op_add_esp(4);
    668658        }
    669659    }
     
    671661        if(AnswerType==DEF_DOUBLE){
    672662            //sub esp,4
    673             op_sub_esp(4);
     663            compiler.codeGenerator.op_sub_esp(4);
    674664        }
    675665    }
    676666
    677667    //fdivrp st(1),st
    678     OpBuffer[obp++]=(char)0xDE;
    679     OpBuffer[obp++]=(char)0xF1;
     668    compiler.codeGenerator.PutOld(
     669        (char)0xDE,
     670        (char)0xF1
     671    );
    680672
    681673    sp--;
    682674    if(AnswerType==DEF_DOUBLE){
    683675        //fstp qword ptr[esp]
    684         OpBuffer[obp++]=(char)0xDD;
    685         OpBuffer[obp++]=(char)0x1C;
    686         OpBuffer[obp++]=(char)0x24;
     676        compiler.codeGenerator.op_fstp_basereg( DEF_DOUBLE, REG_ESP );
    687677
    688678        type[sp-1]=DEF_DOUBLE;
     
    690680    else{
    691681        //fstp dword ptr[esp]
    692         OpBuffer[obp++]=(char)0xD9;
    693         OpBuffer[obp++]=(char)0x1C;
    694         OpBuffer[obp++]=(char)0x24;
     682        compiler.codeGenerator.op_fstp_basereg( DEF_SINGLE, REG_ESP );
    695683
    696684        type[sp-1]=DEF_SINGLE;
     
    723711            //call _aulldiv
    724712            extern const UserProc *pSub_aulldiv;
    725             op_call(pSub_aulldiv);
     713            compiler.codeGenerator.op_call(pSub_aulldiv);
    726714        }
    727715        else{
     
    730718            //call _alldiv
    731719            extern const UserProc *pSub_alldiv;
    732             op_call(pSub_alldiv);
     720            compiler.codeGenerator.op_call(pSub_alldiv);
    733721        }
    734722
    735723        //push edx
    736         op_push(REG_EDX);
     724        compiler.codeGenerator.op_push(REG_EDX);
    737725
    738726        //push eax
    739         op_push(REG_EAX);
     727        compiler.codeGenerator.op_push(REG_EAX);
    740728
    741729        sp--;
     
    750738        if(type[sp-1]==DEF_DOUBLE){
    751739            //fld qword ptr[esp]
    752             op_fld_ptr_esp(DEF_DOUBLE);
    753 
    754             //add esp,4
    755             op_add_esp(4);
    756 
    757             //fistp dword ptr[esp]
    758             op_fistp_ptr_esp( sizeof(long) );
     740            compiler.codeGenerator.op_fld_ptr_esp(DEF_DOUBLE);
     741
     742            //add esp,4
     743            compiler.codeGenerator.op_add_esp(4);
     744
     745            //fistp dword ptr[esp]
     746            compiler.codeGenerator.op_fistp_ptr_esp( sizeof(long) );
    759747        }
    760748        else if(type[sp-1]==DEF_SINGLE){
    761749            //fld dword ptr[esp]
    762             op_fld_ptr_esp(DEF_SINGLE);
    763 
    764             //fistp dword ptr[esp]
    765             op_fistp_ptr_esp( sizeof(long) );
     750            compiler.codeGenerator.op_fld_ptr_esp(DEF_SINGLE);
     751
     752            //fistp dword ptr[esp]
     753            compiler.codeGenerator.op_fistp_ptr_esp( sizeof(long) );
    766754        }
    767755
    768756        //pop ebx
    769         op_pop(REG_EBX);
     757        compiler.codeGenerator.op_pop(REG_EBX);
    770758
    771759        if(type[sp-2]==DEF_DOUBLE){
    772760            //fld qword ptr[esp]
    773             op_fld_ptr_esp(DEF_DOUBLE);
    774 
    775             //add esp,4
    776             op_add_esp(4);
    777 
    778             //fistp dword ptr[esp]
    779             op_fistp_ptr_esp( sizeof(long) );
     761            compiler.codeGenerator.op_fld_ptr_esp(DEF_DOUBLE);
     762
     763            //add esp,4
     764            compiler.codeGenerator.op_add_esp(4);
     765
     766            //fistp dword ptr[esp]
     767            compiler.codeGenerator.op_fistp_ptr_esp( sizeof(long) );
    780768        }
    781769        else if(type[sp-2]==DEF_SINGLE){
    782770            //fld dword ptr[esp]
    783             op_fld_ptr_esp(DEF_SINGLE);
    784 
    785             //fistp dword ptr[esp]
    786             op_fistp_ptr_esp( sizeof(long) );
     771            compiler.codeGenerator.op_fld_ptr_esp(DEF_SINGLE);
     772
     773            //fistp dword ptr[esp]
     774            compiler.codeGenerator.op_fistp_ptr_esp( sizeof(long) );
    787775        }
    788776
    789777        //pop eax
    790         op_pop(REG_EAX);
     778        compiler.codeGenerator.op_pop(REG_EAX);
    791779
    792780        //sub esp,4
    793         op_sub_esp(4);
     781        compiler.codeGenerator.op_sub_esp(4);
    794782
    795783        if((type[sp-2]==DEF_DWORD&&type[sp-1]==DEF_DWORD)||
     
    797785            (type[sp-2]==DEF_DWORD&&IS_POSITIVE_LITERAL(index_stack[sp-1]))){
    798786            //xor edx,edx
    799             op_zero_reg(REG_EDX);
     787            compiler.codeGenerator.op_zero_reg(REG_EDX);
    800788
    801789            //div ebx (eax=eax/ebx...edx)
    802             OpBuffer[obp++]=(char)0xF7;
    803             OpBuffer[obp++]=(char)0xF3;
     790            compiler.codeGenerator.op_div_R( REG_EBX );
    804791        }
    805792        else{
    806793            //cdq
    807             op_cdq();
     794            compiler.codeGenerator.op_cdq();
    808795
    809796            //idiv ebx (eax=eax/ebx...edx)
    810             OpBuffer[obp++]=(char)0xF7;
    811             OpBuffer[obp++]=(char)0xFB;
     797            compiler.codeGenerator.op_idiv_R( REG_EBX );
    812798        }
    813799
    814800        //mov dword ptr[esp],eax
    815         OpBuffer[obp++]=(char)0x89;
    816         OpBuffer[obp++]=(char)0x04;
    817         OpBuffer[obp++]=(char)0x24;
     801        compiler.codeGenerator.op_mov_MR( sizeof(long), REG_EAX, REG_ESP, 0, MOD_BASE );
    818802
    819803        sp--;
     
    833817    if(type[sp-1]==DEF_DOUBLE){
    834818        //fld qword ptr[esp]
    835         op_fld_ptr_esp(DEF_DOUBLE);
     819        compiler.codeGenerator.op_fld_ptr_esp(DEF_DOUBLE);
    836820
    837821        //push -1
    838         op_push_V(-1);
     822        compiler.codeGenerator.op_push_V(-1);
    839823
    840824        //fild dword ptr[esp]
    841         op_fld_ptr_esp(DEF_LONG);
     825        compiler.codeGenerator.op_fld_ptr_esp(DEF_LONG);
    842826
    843827        //add esp,4
    844         op_add_esp(4);
     828        compiler.codeGenerator.op_add_esp(4);
    845829
    846830        //fmulp st(1),st
    847         OpBuffer[obp++]=(char)0xDE;
    848         OpBuffer[obp++]=(char)0xC9;
     831        compiler.codeGenerator.PutOld(
     832            (char)0xDE,
     833            (char)0xC9
     834        );
    849835
    850836        //fstp qword ptr[esp]
    851         OpBuffer[obp++]=(char)0xDD;
    852         OpBuffer[obp++]=(char)0x1C;
    853         OpBuffer[obp++]=(char)0x24;
     837        compiler.codeGenerator.op_fstp_basereg( DEF_DOUBLE, REG_ESP );
    854838    }
    855839    else if(type[sp-1]==DEF_SINGLE){
    856840        //fld dword ptr[esp]
    857         op_fld_ptr_esp(DEF_SINGLE);
     841        compiler.codeGenerator.op_fld_ptr_esp(DEF_SINGLE);
    858842
    859843        //push -1
    860         op_push_V(-1);
     844        compiler.codeGenerator.op_push_V(-1);
    861845
    862846        //fild dword ptr[esp]
    863         op_fld_ptr_esp(DEF_LONG);
     847        compiler.codeGenerator.op_fld_ptr_esp(DEF_LONG);
    864848
    865849        //add esp,4
    866         op_add_esp(4);
     850        compiler.codeGenerator.op_add_esp(4);
    867851
    868852        //fmulp st(1),st
    869         OpBuffer[obp++]=(char)0xDE;
    870         OpBuffer[obp++]=(char)0xC9;
     853        compiler.codeGenerator.PutOld(
     854            (char)0xDE,
     855            (char)0xC9
     856        );
    871857
    872858        //fstp dword ptr[esp]
    873         OpBuffer[obp++]=(char)0xD9;
    874         OpBuffer[obp++]=(char)0x1C;
    875         OpBuffer[obp++]=(char)0x24;
     859        compiler.codeGenerator.op_fstp_basereg( DEF_SINGLE, REG_ESP );
    876860    }
    877861    else if(type[sp-1]==DEF_INT64||type[sp-1]==DEF_QWORD){
    878862        //pop eax
    879         op_pop(REG_EAX);
     863        compiler.codeGenerator.op_pop(REG_EAX);
    880864
    881865        //neg eax
    882         OpBuffer[obp++]=(char)0xF7;
    883         OpBuffer[obp++]=(char)0xD8;
     866        compiler.codeGenerator.op_neg( REG_EAX );
    884867
    885868        //pop edx
    886         op_pop(REG_EDX);
     869        compiler.codeGenerator.op_pop(REG_EDX);
    887870
    888871        //adc edx,0
    889         OpBuffer[obp++]=(char)0x83;
    890         OpBuffer[obp++]=(char)0xD2;
    891         OpBuffer[obp++]=(char)0x00;
     872        compiler.codeGenerator.op_adc_RV8(REG_EDX,0);
    892873
    893874        //neg edx
    894         OpBuffer[obp++]=(char)0xF7;
    895         OpBuffer[obp++]=(char)0xDA;
     875        compiler.codeGenerator.op_neg( REG_EDX );
    896876
    897877        //push edx
    898         op_push(REG_EDX);
     878        compiler.codeGenerator.op_push(REG_EDX);
    899879
    900880        //push eax
    901         op_push(REG_EAX);
     881        compiler.codeGenerator.op_push(REG_EAX);
    902882
    903883        type[sp-1]=DEF_INT64;   //QWordはInt64へ
     
    905885    else if(IsWholeNumberType(type[sp-1])){
    906886        //pop eax
    907         op_pop(REG_EAX);
     887        compiler.codeGenerator.op_pop(REG_EAX);
    908888
    909889        //imul eax,-1
    910         OpBuffer[obp++]=(char)0x6B;
    911         OpBuffer[obp++]=(char)0xC0;
    912         OpBuffer[obp++]=(char)0xFF;
     890        compiler.codeGenerator.op_imul_RV8( REG_EAX, -1 );
    913891
    914892        //push eax
    915         op_push(REG_EAX);
     893        compiler.codeGenerator.op_push(REG_EAX);
    916894
    917895        type[sp-1]=GetSignedType(type[sp-1]);
     
    929907    if(type[sp-1]==DEF_DOUBLE){
    930908        //fld qword ptr[esp]
    931         op_fld_ptr_esp(DEF_DOUBLE);
     909        compiler.codeGenerator.op_fld_ptr_esp(DEF_DOUBLE);
    932910
    933911        //add esp,8
    934         op_add_esp(8);
     912        compiler.codeGenerator.op_add_esp(8);
    935913    }
    936914    else if(type[sp-1]==DEF_SINGLE){
    937915        //fld dword ptr[esp]
    938         op_fld_ptr_esp(DEF_SINGLE);
     916        compiler.codeGenerator.op_fld_ptr_esp(DEF_SINGLE);
    939917
    940918        //add esp,4
    941         op_add_esp(4);
     919        compiler.codeGenerator.op_add_esp(4);
    942920    }
    943921    else if(type[sp-1]==DEF_INT64||type[sp-1]==DEF_QWORD){
     
    945923
    946924        //fild qword ptr[esp]
    947         op_fld_ptr_esp(DEF_INT64);
     925        compiler.codeGenerator.op_fld_ptr_esp(DEF_INT64);
    948926
    949927        //add esp,8
    950         op_add_esp(8);
     928        compiler.codeGenerator.op_add_esp(8);
    951929    }
    952930    else{
     
    954932
    955933        //fild dword ptr[esp]
    956         op_fld_ptr_esp(DEF_LONG);
     934        compiler.codeGenerator.op_fld_ptr_esp(DEF_LONG);
    957935
    958936        //add esp,4
    959         op_add_esp(4);
     937        compiler.codeGenerator.op_add_esp(4);
    960938    }
    961939
    962940    if(type[sp-2]==DEF_DOUBLE){
    963941        //fld qword ptr[esp]
    964         op_fld_ptr_esp(DEF_DOUBLE);
     942        compiler.codeGenerator.op_fld_ptr_esp(DEF_DOUBLE);
    965943    }
    966944    else if(type[sp-2]==DEF_SINGLE){
    967945        //fld dword ptr[esp]
    968         op_fld_ptr_esp(DEF_SINGLE);
     946        compiler.codeGenerator.op_fld_ptr_esp(DEF_SINGLE);
    969947
    970948        //sub esp,4
    971         op_sub_esp(4);
     949        compiler.codeGenerator.op_sub_esp(4);
    972950    }
    973951    else if(type[sp-2]==DEF_INT64||type[sp-2]==DEF_QWORD){
     
    975953
    976954        //fild qword ptr[esp]
    977         op_fld_ptr_esp(DEF_INT64);
     955        compiler.codeGenerator.op_fld_ptr_esp(DEF_INT64);
    978956    }
    979957    else{
     
    981959
    982960        //fild dword ptr[esp]
    983         op_fld_ptr_esp(DEF_LONG);
     961        compiler.codeGenerator.op_fld_ptr_esp(DEF_LONG);
    984962
    985963        //sub esp,4
    986         op_sub_esp(4);
     964        compiler.codeGenerator.op_sub_esp(4);
    987965    }
    988966
    989967    //sub esp,8
    990     op_sub_esp(8);
     968    compiler.codeGenerator.op_sub_esp(8);
    991969
    992970    //fstp qword ptr[esp]
    993     OpBuffer[obp++]=(char)0xDD;
    994     OpBuffer[obp++]=(char)0x1C;
    995     OpBuffer[obp++]=(char)0x24;
     971    compiler.codeGenerator.op_fstp_basereg( DEF_DOUBLE, REG_ESP );
    996972
    997973    //fstp qword ptr[esp+8]
    998     OpBuffer[obp++]=(char)0xDD;
    999     OpBuffer[obp++]=(char)0x5C;
    1000     OpBuffer[obp++]=(char)0x24;
    1001     OpBuffer[obp++]=(char)0x08;
     974    compiler.codeGenerator.op_fstp_base_offset(DEF_DOUBLE,REG_ESP,8);
    1002975
    1003976    //call pow
    1004977    extern const UserProc *pSub_pow;
    1005     op_call(pSub_pow);
     978    compiler.codeGenerator.op_call(pSub_pow);
    1006979
    1007980    //sub esp,8
    1008     op_sub_esp(8);
     981    compiler.codeGenerator.op_sub_esp(8);
    1009982
    1010983    //fstp qword ptr[esp]
    1011     OpBuffer[obp++]=(char)0xDD;
    1012     OpBuffer[obp++]=(char)0x1C;
    1013     OpBuffer[obp++]=(char)0x24;
     984    compiler.codeGenerator.op_fstp_basereg( DEF_DOUBLE, REG_ESP );
    1014985
    1015986    sp--;
     
    10671038        if(type[sp-1]==DEF_DOUBLE){
    10681039            //fld qword ptr[esp]
    1069             op_fld_ptr_esp(DEF_DOUBLE);
    1070 
    1071             //add esp,4
    1072             op_add_esp(4);
    1073 
    1074             //fistp dword ptr[esp]
    1075             op_fistp_ptr_esp( sizeof(long) );
    1076 
    1077             //pop ecx
    1078             op_pop(REG_ECX);
     1040            compiler.codeGenerator.op_fld_ptr_esp(DEF_DOUBLE);
     1041
     1042            //add esp,4
     1043            compiler.codeGenerator.op_add_esp(4);
     1044
     1045            //fistp dword ptr[esp]
     1046            compiler.codeGenerator.op_fistp_ptr_esp( sizeof(long) );
     1047
     1048            //pop ecx
     1049            compiler.codeGenerator.op_pop(REG_ECX);
    10791050        }
    10801051        else if(type[sp-1]==DEF_SINGLE){
    10811052            //fld dword ptr[esp]
    1082             op_fld_ptr_esp(DEF_SINGLE);
    1083 
    1084             //fistp dword ptr[esp]
    1085             op_fistp_ptr_esp( sizeof(long) );
    1086 
    1087             //pop ecx
    1088             op_pop(REG_ECX);
     1053            compiler.codeGenerator.op_fld_ptr_esp(DEF_SINGLE);
     1054
     1055            //fistp dword ptr[esp]
     1056            compiler.codeGenerator.op_fistp_ptr_esp( sizeof(long) );
     1057
     1058            //pop ecx
     1059            compiler.codeGenerator.op_pop(REG_ECX);
    10891060        }
    10901061        else if(type[sp-1]==DEF_INT64||type[sp-1]==DEF_QWORD){
    10911062            //pop ecx
    1092             op_pop(REG_ECX);
    1093 
    1094             //add esp,4
    1095             op_add_esp(4);
    1096         }
    1097         else{
    1098             //pop ecx
    1099             op_pop(REG_ECX);
     1063            compiler.codeGenerator.op_pop(REG_ECX);
     1064
     1065            //add esp,4
     1066            compiler.codeGenerator.op_add_esp(4);
     1067        }
     1068        else{
     1069            //pop ecx
     1070            compiler.codeGenerator.op_pop(REG_ECX);
    11001071        }
    11011072
     
    11031074        if(type[sp-2]==DEF_DOUBLE){
    11041075            //fld qword ptr[esp]
    1105             op_fld_ptr_esp(DEF_DOUBLE);
     1076            compiler.codeGenerator.op_fld_ptr_esp(DEF_DOUBLE);
    11061077
    11071078            //fistp qword ptr[esp]
    1108             op_fistp_ptr_esp( sizeof(_int64) );
     1079            compiler.codeGenerator.op_fistp_ptr_esp( sizeof(_int64) );
    11091080
    11101081            //pop eax
    1111             op_pop(REG_EAX);
     1082            compiler.codeGenerator.op_pop(REG_EAX);
    11121083
    11131084            //pop edx
    1114             op_pop(REG_EDX);
     1085            compiler.codeGenerator.op_pop(REG_EDX);
    11151086        }
    11161087        else if(type[sp-2]==DEF_SINGLE){
    11171088            //fld dword ptr[esp]
    1118             op_fld_ptr_esp(DEF_SINGLE);
     1089            compiler.codeGenerator.op_fld_ptr_esp(DEF_SINGLE);
    11191090
    11201091            //sub esp,4
    1121             op_sub_esp(4);
     1092            compiler.codeGenerator.op_sub_esp(4);
    11221093
    11231094            //fistp qword ptr[esp]
    1124             op_fistp_ptr_esp( sizeof(_int64) );
     1095            compiler.codeGenerator.op_fistp_ptr_esp( sizeof(_int64) );
    11251096
    11261097            //pop eax
    1127             op_pop(REG_EAX);
     1098            compiler.codeGenerator.op_pop(REG_EAX);
    11281099
    11291100            //pop edx
    1130             op_pop(REG_EDX);
     1101            compiler.codeGenerator.op_pop(REG_EDX);
    11311102        }
    11321103        else if(type[sp-2]==DEF_INT64||type[sp-2]==DEF_QWORD){
    11331104            //pop eax
    1134             op_pop(REG_EAX);
     1105            compiler.codeGenerator.op_pop(REG_EAX);
    11351106
    11361107            //pop edx
    1137             op_pop(REG_EDX);
     1108            compiler.codeGenerator.op_pop(REG_EDX);
    11381109        }
    11391110        else{
    11401111            //pop eax
    1141             op_pop(REG_EAX);
     1112            compiler.codeGenerator.op_pop(REG_EAX);
    11421113
    11431114            if(IsSignedType(type[sp-2])){
     
    11461117                   
    11471118                //cdq
    1148                 op_cdq();
     1119                compiler.codeGenerator.op_cdq();
    11491120            }
    11501121            else{
     
    11531124
    11541125                //xor edx,edx
    1155                 op_zero_reg(REG_EDX);
     1126                compiler.codeGenerator.op_zero_reg(REG_EDX);
    11561127            }
    11571128        }
     
    11591130        //call _allshl
    11601131        extern const UserProc *pSub_allshl;
    1161         op_call(pSub_allshl);
     1132        compiler.codeGenerator.op_call(pSub_allshl);
    11621133
    11631134        //push edx
    1164         op_push(REG_EDX);
     1135        compiler.codeGenerator.op_push(REG_EDX);
    11651136
    11661137        //push eax
    1167         op_push(REG_EAX);
     1138        compiler.codeGenerator.op_push(REG_EAX);
    11681139
    11691140        sp--;
     
    11771148        if(type[sp-1]==DEF_DOUBLE){
    11781149            //fld qword ptr[esp]
    1179             op_fld_ptr_esp(DEF_DOUBLE);
    1180 
    1181             //add esp,4
    1182             op_add_esp(4);
    1183 
    1184             //fistp dword ptr[esp]
    1185             op_fistp_ptr_esp( sizeof(long) );
    1186 
    1187             //pop ecx
    1188             op_pop(REG_ECX);
     1150            compiler.codeGenerator.op_fld_ptr_esp(DEF_DOUBLE);
     1151
     1152            //add esp,4
     1153            compiler.codeGenerator.op_add_esp(4);
     1154
     1155            //fistp dword ptr[esp]
     1156            compiler.codeGenerator.op_fistp_ptr_esp( sizeof(long) );
     1157
     1158            //pop ecx
     1159            compiler.codeGenerator.op_pop(REG_ECX);
    11891160        }
    11901161        else if(type[sp-1]==DEF_SINGLE){
    11911162            //fld dword ptr[esp]
    1192             op_fld_ptr_esp(DEF_SINGLE);
    1193 
    1194             //fistp dword ptr[esp]
    1195             op_fistp_ptr_esp( sizeof(long) );
    1196 
    1197             //pop ecx
    1198             op_pop(REG_ECX);
     1163            compiler.codeGenerator.op_fld_ptr_esp(DEF_SINGLE);
     1164
     1165            //fistp dword ptr[esp]
     1166            compiler.codeGenerator.op_fistp_ptr_esp( sizeof(long) );
     1167
     1168            //pop ecx
     1169            compiler.codeGenerator.op_pop(REG_ECX);
    11991170        }
    12001171        else if(type[sp-1]==DEF_INT64||type[sp-1]==DEF_QWORD){
    12011172            //pop ecx
    1202             op_pop(REG_ECX);
    1203 
    1204             //add esp,4
    1205             op_add_esp(4);
    1206         }
    1207         else{
    1208             //pop ecx
    1209             op_pop(REG_ECX);
     1173            compiler.codeGenerator.op_pop(REG_ECX);
     1174
     1175            //add esp,4
     1176            compiler.codeGenerator.op_add_esp(4);
     1177        }
     1178        else{
     1179            //pop ecx
     1180            compiler.codeGenerator.op_pop(REG_ECX);
    12101181        }
    12111182
    12121183        if(type[sp-2]==DEF_DOUBLE){
    12131184            //fld qword ptr[esp]
    1214             op_fld_ptr_esp(DEF_DOUBLE);
    1215 
    1216             //add esp,4
    1217             op_add_esp(4);
    1218 
    1219             //fistp dword ptr[esp]
    1220             op_fistp_ptr_esp( sizeof(long) );
     1185            compiler.codeGenerator.op_fld_ptr_esp(DEF_DOUBLE);
     1186
     1187            //add esp,4
     1188            compiler.codeGenerator.op_add_esp(4);
     1189
     1190            //fistp dword ptr[esp]
     1191            compiler.codeGenerator.op_fistp_ptr_esp( sizeof(long) );
    12211192        }
    12221193        else if(type[sp-2]==DEF_SINGLE){
    12231194            //fld dword ptr[esp]
    1224             op_fld_ptr_esp(DEF_SINGLE);
    1225 
    1226             //fistp dword ptr[esp]
    1227             op_fistp_ptr_esp( sizeof(long) );
     1195            compiler.codeGenerator.op_fld_ptr_esp(DEF_SINGLE);
     1196
     1197            //fistp dword ptr[esp]
     1198            compiler.codeGenerator.op_fistp_ptr_esp( sizeof(long) );
    12281199        }
    12291200
    12301201        //pop eax
    1231         op_pop(REG_EAX);
     1202        compiler.codeGenerator.op_pop(REG_EAX);
    12321203
    12331204        //sub esp,4
    1234         op_sub_esp(4);
     1205        compiler.codeGenerator.op_sub_esp(4);
    12351206
    12361207        //shl eax,cl
    1237         OpBuffer[obp++]=(char)0xD3;
    1238         OpBuffer[obp++]=(char)0xE0;
     1208        compiler.codeGenerator.PutOld(
     1209            (char)0xD3,
     1210            (char)0xE0
     1211        );
    12391212
    12401213        //mov dword ptr[esp],eax
    1241         OpBuffer[obp++]=(char)0x89;
    1242         OpBuffer[obp++]=(char)0x04;
    1243         OpBuffer[obp++]=(char)0x24;
     1214        compiler.codeGenerator.op_mov_MR( sizeof(long), REG_EAX, REG_ESP, 0, MOD_BASE );
    12441215
    12451216        sp--;
     
    12691240        if(type[sp-1]==DEF_DOUBLE){
    12701241            //fld qword ptr[esp]
    1271             op_fld_ptr_esp(DEF_DOUBLE);
    1272 
    1273             //add esp,4
    1274             op_add_esp(4);
    1275 
    1276             //fistp dword ptr[esp]
    1277             op_fistp_ptr_esp( sizeof(long) );
    1278 
    1279             //pop ecx
    1280             op_pop(REG_ECX);
     1242            compiler.codeGenerator.op_fld_ptr_esp(DEF_DOUBLE);
     1243
     1244            //add esp,4
     1245            compiler.codeGenerator.op_add_esp(4);
     1246
     1247            //fistp dword ptr[esp]
     1248            compiler.codeGenerator.op_fistp_ptr_esp( sizeof(long) );
     1249
     1250            //pop ecx
     1251            compiler.codeGenerator.op_pop(REG_ECX);
    12811252        }
    12821253        else if(type[sp-1]==DEF_SINGLE){
    12831254            //fld dword ptr[esp]
    1284             op_fld_ptr_esp(DEF_SINGLE);
    1285 
    1286             //fistp dword ptr[esp]
    1287             op_fistp_ptr_esp( sizeof(long) );
    1288 
    1289             //pop ecx
    1290             op_pop(REG_ECX);
     1255            compiler.codeGenerator.op_fld_ptr_esp(DEF_SINGLE);
     1256
     1257            //fistp dword ptr[esp]
     1258            compiler.codeGenerator.op_fistp_ptr_esp( sizeof(long) );
     1259
     1260            //pop ecx
     1261            compiler.codeGenerator.op_pop(REG_ECX);
    12911262        }
    12921263        else if(type[sp-1]==DEF_INT64||type[sp-1]==DEF_QWORD){
    12931264            //pop ecx
    1294             op_pop(REG_ECX);
    1295 
    1296             //add esp,4
    1297             op_add_esp(4);
    1298         }
    1299         else{
    1300             //pop ecx
    1301             op_pop(REG_ECX);
     1265            compiler.codeGenerator.op_pop(REG_ECX);
     1266
     1267            //add esp,4
     1268            compiler.codeGenerator.op_add_esp(4);
     1269        }
     1270        else{
     1271            //pop ecx
     1272            compiler.codeGenerator.op_pop(REG_ECX);
    13021273        }
    13031274
     
    13051276        if(type[sp-2]==DEF_DOUBLE){
    13061277            //fld qword ptr[esp]
    1307             op_fld_ptr_esp(DEF_DOUBLE);
     1278            compiler.codeGenerator.op_fld_ptr_esp(DEF_DOUBLE);
    13081279
    13091280            //fistp qword ptr[esp]
    1310             op_fistp_ptr_esp( sizeof(_int64) );
     1281            compiler.codeGenerator.op_fistp_ptr_esp( sizeof(_int64) );
    13111282
    13121283            //pop eax
    1313             op_pop(REG_EAX);
     1284            compiler.codeGenerator.op_pop(REG_EAX);
    13141285
    13151286            //pop edx
    1316             op_pop(REG_EDX);
     1287            compiler.codeGenerator.op_pop(REG_EDX);
    13171288        }
    13181289        else if(type[sp-2]==DEF_SINGLE){
    13191290            //fld dword ptr[esp]
    1320             op_fld_ptr_esp(DEF_SINGLE);
     1291            compiler.codeGenerator.op_fld_ptr_esp(DEF_SINGLE);
    13211292
    13221293            //sub esp,4
    1323             op_sub_esp(4);
     1294            compiler.codeGenerator.op_sub_esp(4);
    13241295
    13251296            //fistp qword ptr[esp]
    1326             op_fistp_ptr_esp( sizeof(_int64) );
     1297            compiler.codeGenerator.op_fistp_ptr_esp( sizeof(_int64) );
    13271298
    13281299            //pop eax
    1329             op_pop(REG_EAX);
     1300            compiler.codeGenerator.op_pop(REG_EAX);
    13301301
    13311302            //pop edx
    1332             op_pop(REG_EDX);
     1303            compiler.codeGenerator.op_pop(REG_EDX);
    13331304        }
    13341305        else if(type[sp-2]==DEF_INT64||type[sp-2]==DEF_QWORD){
    13351306            //pop eax
    1336             op_pop(REG_EAX);
     1307            compiler.codeGenerator.op_pop(REG_EAX);
    13371308
    13381309            //pop edx
    1339             op_pop(REG_EDX);
     1310            compiler.codeGenerator.op_pop(REG_EDX);
    13401311        }
    13411312        else{
    13421313            //pop eax
    1343             op_pop(REG_EAX);
     1314            compiler.codeGenerator.op_pop(REG_EAX);
    13441315
    13451316            if(IsSignedType(type[sp-2])){
     
    13481319
    13491320                //cdq
    1350                 op_cdq();
     1321                compiler.codeGenerator.op_cdq();
    13511322            }
    13521323            else{
     
    13551326
    13561327                //xor edx,edx
    1357                 op_zero_reg(REG_EDX);
     1328                compiler.codeGenerator.op_zero_reg(REG_EDX);
    13581329            }
    13591330        }
     
    13641335            //call _aullshr
    13651336            extern const UserProc *pSub_aullshr;
    1366             op_call(pSub_aullshr);
     1337            compiler.codeGenerator.op_call(pSub_aullshr);
    13671338        }
    13681339        else{
     
    13711342            //call _allshr
    13721343            extern const UserProc *pSub_allshr;
    1373             op_call(pSub_allshr);
     1344            compiler.codeGenerator.op_call(pSub_allshr);
    13741345        }
    13751346
    13761347        //push edx
    1377         op_push(REG_EDX);
     1348        compiler.codeGenerator.op_push(REG_EDX);
    13781349
    13791350        //push eax
    1380         op_push(REG_EAX);
     1351        compiler.codeGenerator.op_push(REG_EAX);
    13811352
    13821353        sp--;
     
    13901361        if(type[sp-1]==DEF_DOUBLE){
    13911362            //fld qword ptr[esp]
    1392             op_fld_ptr_esp(DEF_DOUBLE);
    1393 
    1394             //add esp,4
    1395             op_add_esp(4);
    1396 
    1397             //fistp dword ptr[esp]
    1398             op_fistp_ptr_esp( sizeof(long) );
    1399 
    1400             //pop ecx
    1401             op_pop(REG_ECX);
     1363            compiler.codeGenerator.op_fld_ptr_esp(DEF_DOUBLE);
     1364
     1365            //add esp,4
     1366            compiler.codeGenerator.op_add_esp(4);
     1367
     1368            //fistp dword ptr[esp]
     1369            compiler.codeGenerator.op_fistp_ptr_esp( sizeof(long) );
     1370
     1371            //pop ecx
     1372            compiler.codeGenerator.op_pop(REG_ECX);
    14021373        }
    14031374        else if(type[sp-1]==DEF_SINGLE){
    14041375            //fld dword ptr[esp]
    1405             op_fld_ptr_esp(DEF_SINGLE);
    1406 
    1407             //fistp dword ptr[esp]
    1408             op_fistp_ptr_esp( sizeof(long) );
    1409 
    1410             //pop ecx
    1411             op_pop(REG_ECX);
     1376            compiler.codeGenerator.op_fld_ptr_esp(DEF_SINGLE);
     1377
     1378            //fistp dword ptr[esp]
     1379            compiler.codeGenerator.op_fistp_ptr_esp( sizeof(long) );
     1380
     1381            //pop ecx
     1382            compiler.codeGenerator.op_pop(REG_ECX);
    14121383        }
    14131384        else if(type[sp-1]==DEF_INT64||type[sp-1]==DEF_QWORD){
    14141385            //pop ecx
    1415             op_pop(REG_ECX);
    1416 
    1417             //add esp,4
    1418             op_add_esp(4);
    1419         }
    1420         else{
    1421             //pop ecx
    1422             op_pop(REG_ECX);
     1386            compiler.codeGenerator.op_pop(REG_ECX);
     1387
     1388            //add esp,4
     1389            compiler.codeGenerator.op_add_esp(4);
     1390        }
     1391        else{
     1392            //pop ecx
     1393            compiler.codeGenerator.op_pop(REG_ECX);
    14231394        }
    14241395
    14251396        if(type[sp-2]==DEF_DOUBLE){
    14261397            //fld qword ptr[esp]
    1427             op_fld_ptr_esp(DEF_DOUBLE);
    1428 
    1429             //add esp,4
    1430             op_add_esp(4);
    1431 
    1432             //fistp dword ptr[esp]
    1433             op_fistp_ptr_esp( sizeof(long) );
     1398            compiler.codeGenerator.op_fld_ptr_esp(DEF_DOUBLE);
     1399
     1400            //add esp,4
     1401            compiler.codeGenerator.op_add_esp(4);
     1402
     1403            //fistp dword ptr[esp]
     1404            compiler.codeGenerator.op_fistp_ptr_esp( sizeof(long) );
    14341405        }
    14351406        else if(type[sp-2]==DEF_SINGLE){
    14361407            //fld dword ptr[esp]
    1437             op_fld_ptr_esp(DEF_SINGLE);
    1438 
    1439             //fistp dword ptr[esp]
    1440             op_fistp_ptr_esp( sizeof(long) );
     1408            compiler.codeGenerator.op_fld_ptr_esp(DEF_SINGLE);
     1409
     1410            //fistp dword ptr[esp]
     1411            compiler.codeGenerator.op_fistp_ptr_esp( sizeof(long) );
    14411412        }
    14421413
    14431414        //pop eax
    1444         op_pop(REG_EAX);
     1415        compiler.codeGenerator.op_pop(REG_EAX);
    14451416
    14461417        //sub esp,4
    1447         op_sub_esp(4);
     1418        compiler.codeGenerator.op_sub_esp(4);
    14481419
    14491420        if(type[sp-2]==DEF_DWORD){
    14501421            //shr eax,cl
    1451             OpBuffer[obp++]=(char)0xD3;
    1452             OpBuffer[obp++]=(char)0xE8;
     1422            compiler.codeGenerator.PutOld(
     1423                (char)0xD3,
     1424                (char)0xE8
     1425            );
    14531426        }
    14541427        else{
    14551428            //sar eax,cl
    1456             OpBuffer[obp++]=(char)0xD3;
    1457             OpBuffer[obp++]=(char)0xF8;
     1429            compiler.codeGenerator.PutOld(
     1430                (char)0xD3,
     1431                (char)0xF8
     1432            );
    14581433        }
    14591434
    14601435        //mov dword ptr[esp],eax
    1461         OpBuffer[obp++]=(char)0x89;
    1462         OpBuffer[obp++]=(char)0x04;
    1463         OpBuffer[obp++]=(char)0x24;
     1436        compiler.codeGenerator.op_mov_MR( sizeof(long), REG_EAX, REG_ESP, 0, MOD_BASE );
    14641437
    14651438        sp--;
Note: See TracChangeset for help on using the changeset viewer.