Subversion Repositories Kolibri OS

Rev

Rev 7545 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

  1. #define _TOKB_
  2.  
  3. #include "tok.h"
  4.  
  5.  
  6.  
  7. char badadr[]="Bad outrm value in outaddress();";
  8.  
  9. char CXandDX[]="CX and DX";
  10.  
  11. char ECXandEDX[]="ECX and EDX";
  12.  
  13. char BXandFS[]="BX and FS";
  14.  
  15. int divexpand=FALSE;
  16.  
  17. int optnumber=FALSE;
  18.  
  19. ITOK itok,itok2,ptok;
  20.  
  21. char *pbuf;
  22.  
  23. SINFO pstr;
  24.  
  25.  
  26.  
  27. LISTFLOAT *floatnum=NULL;       //ᯨ᮪ float ª®­áâ ­â
  28.  
  29. unsigned int numfloatconst=0;
  30.  
  31. unsigned int maxnumfloatconst;
  32.  
  33. #define STEPFLOATCONST 16
  34.  
  35. unsigned int ofsfloatlist=0;
  36.  
  37. unsigned char idxregs[5]={ESI,EDI,EBX,EDX,255};
  38.  
  39.  
  40.  
  41. int expandvar();
  42.  
  43. int speedmul(unsigned long num, int razr);
  44.  
  45. int leamul32(unsigned long num,int reg,int razr);
  46.  
  47. void Float2reg32(int reg,int addop=0,int reg1=idxregs[0],int reg2=idxregs[1]);
  48.  
  49. void NegReg(int razr,int reg);
  50.  
  51. int RshiftReg(int razr,int reg,int sign);
  52.  
  53. void do_e_axmath2(int sign,int razr,int expand);
  54.  
  55. int MulReg(int reg,int razr);
  56.  
  57. void DivMod(int vop,int sign,int razr,int expand);
  58.  
  59. void DivNum2(unsigned long num,int razr,int sign);
  60.  
  61. void DivNum(unsigned long num,int razr,int sign);
  62.  
  63. void ClearDX(int razr,int sign);
  64.  
  65. void  doalmath2(int sign);
  66.  
  67. void num2bits(ITOK *gtok,unsigned long num,int razr);
  68.  
  69. void reg2bits(ITOK *gtok,int razr);
  70.  
  71. void cwpointr(ITOK *wtok,char *&wbuf,SINFO *wstr,int *otok,int npointr,int ureg);
  72.  
  73. int CheckAddOnly();
  74.  
  75. void optnumadd64(unsigned long long num,int r1,int r2,int vop);
  76.  
  77. void CallExternProc(char *name);
  78.  
  79. void getinto_reg(int gtok,ITOK *gstok,char *&gbuf,SINFO *gstr,int razr,int reg);
  80.  
  81. void intinstack(int addop);
  82.  
  83.  
  84.  
  85. extern void warningoptnum();
  86.  
  87. extern void segoperror();
  88.  
  89. extern void segbyteerror();
  90.  
  91. extern void regmathoperror();
  92.  
  93. extern void begmathoperror();
  94.  
  95. extern void negregerror();
  96.  
  97. extern void regbyteerror();
  98.  
  99. extern void begworderror();
  100.  
  101. extern void regshifterror();
  102.  
  103. extern void regmatherror();
  104.  
  105. extern void DevideZero();
  106.  
  107. extern void wordnotoper();
  108.  
  109.  
  110.  
  111. unsigned long long li[]={0x1,0x2,0x4,0x8,0x10,0x20,0x40,0x80,0x100,0x200,0x400,
  112.  
  113. 0x800,0x1000,0x2000,0x4000,0x8000,0x10000,0x20000,0x40000,0x80000,0x100000,
  114.  
  115. 0x200000,0x400000,0x800000,0x1000000,0x2000000,0x4000000,0x8000000,0x10000000,
  116.  
  117. 0x20000000,0x40000000,0x80000000,0x100000000LL,0x200000000LL,0x400000000LL
  118.  
  119. ,0x800000000LL,0x1000000000LL,0x2000000000LL,0x4000000000LL,0x8000000000LL
  120.  
  121. ,0x10000000000LL,0x20000000000LL,0x40000000000LL,0x80000000000LL
  122.  
  123. ,0x100000000000LL,0x200000000000LL,0x400000000000LL,0x800000000000LL
  124.  
  125. ,0x1000000000000LL,0x2000000000000LL,0x4000000000000LL,0x8000000000000LL
  126.  
  127. ,0x10000000000000LL,0x20000000000000LL,0x40000000000000LL,0x80000000000000LL
  128.  
  129. ,0x100000000000000LL,0x200000000000000LL,0x400000000000000LL,0x800000000000000LL
  130.  
  131. ,0x1000000000000000LL,0x2000000000000000LL,0x4000000000000000LL,0x8000000000000000LL};
  132.  
  133.  
  134.  
  135. unsigned long leanum[24]={3,5,9,15,25,27,45,81,75,125,135,225,243,405,729,
  136.  
  137.                 375,675,1215,2187,625,1125,2025,3645,6561};
  138.  
  139.  
  140.  
  141. unsigned int numleamul[24][4]={
  142.  
  143.         {3,0,0,0},{5,0,0,0},{9,0,0,0},{3,5,0,0},{5,5,0,0},{3,9,0,0},{5,9,0,0},
  144.  
  145.         {9,9,0,0},{5,5,3,0},{5,5,5,0},{9,5,3,0},{9,5,5,0},{9,9,3,0},{9,9,5,0},
  146.  
  147.         {9,9,9,0},{5,5,5,3},{5,5,9,3},{9,9,5,3},{9,9,9,3},{5,5,5,5},{9,5,5,5},
  148.  
  149.         {9,9,5,5},{9,9,9,5},{9,9,9,9}};
  150.  
  151.  
  152.  
  153. int RmEqualReg(int reg,int rm,int sib)
  154.  
  155. {
  156.  
  157. int rm0;
  158.  
  159. int reg1=-1,reg2=-1;
  160.  
  161.         rm0=rm&0x7;
  162.  
  163.         if(sib==CODE16){
  164.  
  165.                 switch(rm0){
  166.  
  167.                         case 0:
  168.  
  169.                                 reg1=BX;
  170.  
  171.                                 reg2=SI;
  172.  
  173.                                 break;
  174.  
  175.                         case 1:
  176.  
  177.                                 reg1=BX;
  178.  
  179.                                 reg2=DI;
  180.  
  181.                                 break;
  182.  
  183.                         case 2:
  184.  
  185.                                 reg1=BP;
  186.  
  187.                                 reg2=SI;
  188.  
  189.                                 break;
  190.  
  191.                         case 3:
  192.  
  193.                                 reg1=BP;
  194.  
  195.                                 reg2=DI;
  196.  
  197.                                 break;
  198.  
  199.                         case 4:
  200.  
  201.                                 reg1=SI;
  202.  
  203.                                 break;
  204.  
  205.                         case 5:
  206.  
  207.                                 reg1=DI;
  208.  
  209.                                 break;
  210.  
  211.                         case 6:
  212.  
  213.                                 if((rm&0xC0)!=0)reg1=BP;
  214.  
  215.                                 break;
  216.  
  217.                         case 7:
  218.  
  219.                                 reg1=BX;
  220.  
  221.                                 break;
  222.  
  223.                 }
  224.  
  225.         }
  226.  
  227.         else{
  228.  
  229.                 if(rm0==4){
  230.  
  231.                         reg1=sib&7;
  232.  
  233.                         reg2=(sib>>3)&7;
  234.  
  235.                         if(reg1==5&&(rm&0xc0)==0)reg1=-1;
  236.  
  237.                         if(reg2==4)reg2=-1;
  238.  
  239.                 }
  240.  
  241.                 else{
  242.  
  243.                         reg1=rm0;
  244.  
  245.                         if(reg1==5&&(rm&0xc0)==0)reg1=-1;
  246.  
  247.                 }
  248.  
  249.         }
  250.  
  251.         if(reg==reg1||reg==reg2)return TRUE;
  252.  
  253.         return FALSE;
  254.  
  255. }
  256.  
  257.  
  258.  
  259. void startmul(int razr)
  260.  
  261. {
  262.  
  263.         if(razr==r8)outword(0xE08A);    //mov ah,al
  264.  
  265.         else{
  266.  
  267.                 op66(razr);
  268.  
  269.                 outword(0xD08B);        //mov dx,ax
  270.  
  271.                 warningreg(regs[razr/2-1][2]);
  272.  
  273.         }
  274.  
  275. }
  276.  
  277.  
  278.  
  279. void lshiftmul(int num,int razr,int reg=AX)
  280.  
  281. {
  282.  
  283.         if(razr==r8){
  284.  
  285.                 if(num==1)outword(0xC002);      //add al,al
  286.  
  287.                 else{
  288.  
  289.                         if(chip==0){
  290.  
  291.                                 op(0xB1);       //mov cl,num
  292.  
  293.                                 op(num);
  294.  
  295.                                 outword(0xE0D2);        //shl al,cl
  296.  
  297.                                 warningreg(begs[1]);
  298.  
  299.                         }
  300.  
  301.                         else{
  302.  
  303.                                 outword(0xE0C0);        //shl al,num
  304.  
  305.                                 op(num);
  306.  
  307.                         }
  308.  
  309.                 }
  310.  
  311.         }
  312.  
  313.         else{
  314.  
  315.                 if(num==1){
  316.  
  317.                         op66(razr);
  318.  
  319.                         op(1);
  320.  
  321.                         op(0xC0+reg*9); //add reg,reg
  322.  
  323.                 }
  324.  
  325.                 else{
  326.  
  327.                         if(chip==0){
  328.  
  329.                                 op(0xB1);       //mov cl,num
  330.  
  331.                                 op(num);
  332.  
  333.                                 op(0xD3);
  334.  
  335.                                 op(0xE0+reg);   //shl ax,cl
  336.  
  337.                                 warningreg(begs[1]);
  338.  
  339.                         }
  340.  
  341.                         else{
  342.  
  343.                                 if(chip>2&&optimizespeed&&leamul32(li[num],reg,razr))return;
  344.  
  345.                                 op66(razr);
  346.  
  347.                                 op(0xC1);
  348.  
  349.                                 op(0xE0+reg);   //shl ax,num
  350.  
  351.                                 op(num);
  352.  
  353.                         }
  354.  
  355.                 }
  356.  
  357.         }
  358.  
  359. }
  360.  
  361.  
  362.  
  363. void submul(int razr)
  364.  
  365. {
  366.  
  367.         if(razr==r8)outword(0xC42A);    //sub al,ah
  368.  
  369.         else{
  370.  
  371.                 op66(razr);
  372.  
  373.                 outword(0xC22B);        //sub ax,dx
  374.  
  375.         }
  376.  
  377. }
  378.  
  379.  
  380.  
  381. void addmul(int razr)
  382.  
  383. {
  384.  
  385.         if(razr==r8)outword(0xC402);    //add al,ah
  386.  
  387.         else{
  388.  
  389.                 op66(razr);
  390.  
  391.                 outword(0xC203);        //add ax,dx
  392.  
  393.         }
  394.  
  395. }
  396.  
  397.  
  398.  
  399. int leamul32(unsigned long num,int reg,int razr)
  400.  
  401. {
  402.  
  403.         if(num==0)return FALSE;
  404.  
  405. int vop=0,i=8*reg+4;
  406.  
  407.         switch(num){
  408.  
  409.                 case 9: vop+=0x40;
  410.  
  411.                 case 5: vop+=0x40;
  412.  
  413.                 case 3: vop+=0x40;
  414.  
  415.                         op66(razr);
  416.  
  417.                         op67(r32);      // AX * n = LEA AX,[EAX*n+?EAX]
  418.  
  419.                         op(0x8d);
  420.  
  421.                         op(reg==BP?i|rm_mod01:i);
  422.  
  423.                         op(vop+9*reg);
  424.  
  425.                         if(reg==BP)op(0);
  426.  
  427.                         return TRUE;
  428.  
  429.         }
  430.  
  431. //                      if(chip>3&&chip<7)return FALSE; //¨§¡¥¦ âì AGI ¤«ï 486,p5,p5mmx
  432.  
  433.         switch(num){
  434.  
  435.                 case 2: vop=reg; break;
  436.  
  437.                 case 4: vop=0x85; break;
  438.  
  439.                 case 8: vop=0xc5; break;
  440.  
  441.                 default: return FALSE;
  442.  
  443.         }
  444.  
  445.         op66(razr);
  446.  
  447.         op67(r32);      // AX * n = LEA AX,[EAX*n+?EAX]
  448.  
  449.         op(0x8d);
  450.  
  451.         if(vop!=0x85&&vop!=0xc5&&reg==BP)i|=rm_mod01;
  452.  
  453.         op(i);
  454.  
  455.         op(vop+8*reg);
  456.  
  457.         if(vop==0x85||vop==0xc5)outdword(0L);
  458.  
  459.         else if(reg==BP)op(0);
  460.  
  461.         return TRUE;
  462.  
  463. }
  464.  
  465.  
  466.  
  467. int speedmul32(unsigned long num,int reg,int razr)
  468.  
  469. {
  470.  
  471. int i;
  472.  
  473.         for(i=3;i<24;i++){
  474.  
  475.                 if(leanum[i]==num){
  476.  
  477.                         leamul32(numleamul[i][0],reg,razr);
  478.  
  479.                         leamul32(numleamul[i][1],reg,razr);
  480.  
  481.                         leamul32(numleamul[i][2],reg,razr);
  482.  
  483.                         leamul32(numleamul[i][3],reg,razr);
  484.  
  485.                         return TRUE;
  486.  
  487.                 }
  488.  
  489.         }
  490.  
  491.         for(unsigned int j=1;j<NUMNUM;j++){
  492.  
  493.                 unsigned long v=li[j];
  494.  
  495.                 if((v*3)>num)break;
  496.  
  497.                 for(i=0;i<15;i++){
  498.  
  499.                         unsigned long lm=leanum[i]*v;
  500.  
  501.                         if(lm==num){
  502.  
  503.                                 leamul32(numleamul[i][0],reg,razr);
  504.  
  505.                                 lshiftmul(j,razr,reg);
  506.  
  507.                                 leamul32(numleamul[i][1],reg,razr);
  508.  
  509.                                 leamul32(numleamul[i][2],reg,razr);
  510.  
  511.                                 return TRUE;
  512.  
  513.                         }
  514.  
  515.                 }
  516.  
  517.         }
  518.  
  519.         if(reg==EAX)return speedmul(num,r32);
  520.  
  521.         return FALSE;
  522.  
  523. }
  524.  
  525.  
  526.  
  527. int speedmul(unsigned long num, int razr)       //¯®¨áª ¢®§¬®¦­®á⨠§ ¬¥­ë 㬭®¦¥­¨ï ­ 
  528.  
  529. //ᤢ¨£¨ ¨ á«®¦¥­¨ï
  530.  
  531. {
  532.  
  533. int first,second;
  534.  
  535.         for(unsigned int j=1;j<NUMNUM;j++){
  536.  
  537.                 unsigned long v=li[j];
  538.  
  539.                 if((v-1)>num)break;
  540.  
  541.                 if((num%(v-1))==0){
  542.  
  543.                         second=caselong(num/(v-1));
  544.  
  545.                         if(second!=NUMNUM){
  546.  
  547.                                 first=caselong(v);
  548.  
  549.                                 if(first!=1){
  550.  
  551.                                         startmul(razr);
  552.  
  553.                                         lshiftmul(first,razr);
  554.  
  555.                                         submul(razr);
  556.  
  557.                                         if(second!=0)lshiftmul(second,razr);
  558.  
  559.                                         setzeroflag=TRUE;
  560.  
  561.                                         return TRUE;
  562.  
  563.                                 }
  564.  
  565.                         }
  566.  
  567.                 }
  568.  
  569.                 if((v+1)>num)break;
  570.  
  571.                 if((num%(v+1))==0){
  572.  
  573.                         second=caselong(num/(v+1));
  574.  
  575.                         if(second!=NUMNUM){
  576.  
  577.                                 first=caselong(v);
  578.  
  579.                                 startmul(razr);
  580.  
  581.                                 lshiftmul(first,razr);
  582.  
  583.                                 addmul(razr);
  584.  
  585.                                 if(second!=0)lshiftmul(second,razr);
  586.  
  587.                                 setzeroflag=TRUE;
  588.  
  589.                                 return TRUE;
  590.  
  591.                         }
  592.  
  593.                 }
  594.  
  595.                 if(num>10){
  596.  
  597.                         if((v-1)>(num-1))break;
  598.  
  599.                         if(((num-1)%(v-1))==0){
  600.  
  601.                                 second=caselong((num-1)/(v-1));
  602.  
  603.                                 if(second!=NUMNUM&&second!=1){
  604.  
  605.                                         first=caselong(v);
  606.  
  607.                                         if(first!=1){
  608.  
  609.                                                 startmul(razr);
  610.  
  611.                                                 lshiftmul(first,razr);
  612.  
  613.                                                 submul(razr);
  614.  
  615.                                                 lshiftmul(second,razr);
  616.  
  617.                                                 addmul(razr);
  618.  
  619.                                                 setzeroflag=TRUE;
  620.  
  621.                                                 return TRUE;
  622.  
  623.                                         }
  624.  
  625.                                 }
  626.  
  627.                         }
  628.  
  629.                         if((v+1)>(num-1))break;
  630.  
  631.                         if(((num-1)%(v+1))==0){
  632.  
  633.                                 second=caselong((num-1)/(v+1));
  634.  
  635.                                 if(second!=NUMNUM){
  636.  
  637.                                         first=caselong(v);
  638.  
  639.                                         startmul(razr);
  640.  
  641.                                         lshiftmul(first,razr);
  642.  
  643.                                         addmul(razr);
  644.  
  645.                                         lshiftmul(second,razr);
  646.  
  647.                                         addmul(razr);
  648.  
  649.                                         setzeroflag=TRUE;
  650.  
  651.                                         return TRUE;
  652.  
  653.                                 }
  654.  
  655.                         }
  656.  
  657.                         if((v-1)>(num+1))break;
  658.  
  659.                         if(((num+1)%(v-1))==0){
  660.  
  661.                                 second=caselong((num+1)/(v-1));
  662.  
  663.                                 if(second!=NUMNUM){
  664.  
  665.                                         first=caselong(v);
  666.  
  667.                                         if(first!=1){
  668.  
  669.                                                 startmul(razr);
  670.  
  671.                                                 lshiftmul(first,razr);
  672.  
  673.                                                 submul(razr);
  674.  
  675.                                                 lshiftmul(second,razr);
  676.  
  677.                                                 submul(razr);
  678.  
  679.                                                 setzeroflag=TRUE;
  680.  
  681.                                                 return TRUE;
  682.  
  683.                                         }
  684.  
  685.                                 }
  686.  
  687.                         }
  688.  
  689.                         if((v+1)>(num+1))break;
  690.  
  691.                         if(((num+1)%(v+1))==0){
  692.  
  693.                                 second=caselong((num+1)/(v+1));
  694.  
  695.                                 if(second!=NUMNUM&&second!=1){
  696.  
  697.                                         first=caselong(v);
  698.  
  699.                                         startmul(razr);
  700.  
  701.                                         lshiftmul(first,razr);
  702.  
  703.                                         addmul(razr);
  704.  
  705.                                         lshiftmul(second,razr);
  706.  
  707.                                         submul(razr);
  708.  
  709.                                         setzeroflag=TRUE;
  710.  
  711.                                         return TRUE;
  712.  
  713.                                 }
  714.  
  715.                         }
  716.  
  717.                 }
  718.  
  719.         }
  720.  
  721.         return FALSE;
  722.  
  723. }
  724.  
  725.  
  726.  
  727. void CheckRegForLea(int reg,int *idx,int *base, int *zoom,unsigned long *val,
  728.  
  729.         unsigned int *rflag,ITOK *posttok)
  730.  
  731. {
  732.  
  733. //      printf("in:reg=%02X base=%02X idx=%02X zoom=%02X\n",reg,*base,*idx,*zoom);
  734.  
  735.         for(;;){
  736.  
  737. //              printf("tok=%d flag=%08X %s\n",tok2,itok2.flag,itok2.name);
  738.  
  739. //              printf("tok=%d tok2=%d %s\n",tok,tok2,itok2.name);
  740.  
  741.                 if((tok==tk_plus||tok==tk_minus)&&(tok2==tk_minus||
  742.  
  743.                                 (tok2==tk_number&&itok2.rm!=tk_float&&itok2.rm!=tk_double)||
  744.  
  745.                                 (tok2==tk_postnumber&&posttok->post==0)||(tok==tk_plus&&tok2==tk_rmnumber&&(itok2.flag&f_useidx)==0))){
  746.  
  747.                         goto con1;
  748.  
  749.                 }
  750.  
  751.                 if((tok!=tk_plus&&(!(tok2==tk_number&&itok2.rm!=tk_float&&itok2.rm!=tk_double)))
  752.  
  753.                                 ||(tok2!=tk_reg32&&tok2!=tk_number)||tok2==tk_rmnumber){
  754.  
  755.                         break;
  756.  
  757.                 }
  758.  
  759.                 if(tok==tk_plus&&tok2==tk_reg32&&(itok2.number==reg||(*idx!=-1&&*base!=-1))){
  760.  
  761.                         break;
  762.  
  763.                 }
  764.  
  765.                 if(tok==tk_mult&&(tok2!=tk_number||*zoom!=-1||*val!=0||*idx!=-1))break;
  766.  
  767. con1:
  768.  
  769.                 if(tok==tk_minus){
  770.  
  771.                         if(tok2==tk_postnumber||(tok2==tk_number&&(itok2.flag&f_reloc)))break;
  772.  
  773.                         nexttok();
  774.  
  775.                         if(tok==tk_minus){
  776.  
  777.                                 if(tok2!=tk_number)break;
  778.  
  779.                                 nexttok();
  780.  
  781.                                 *val+=itok.number;
  782.  
  783.                         }
  784.  
  785.                         else *val-=itok.number;
  786.  
  787.                         if(tok==tk_number)*rflag^=itok.flag;
  788.  
  789.                         else *posttok=itok;
  790.  
  791.                 }
  792.  
  793.                 else if(tok==tk_plus){
  794.  
  795.                         nexttok();
  796.  
  797.                         if(tok==tk_number){
  798.  
  799.                                 *val+=itok.number;
  800.  
  801.                                 *rflag^=itok.flag;
  802.  
  803.                         }
  804.  
  805.                         else if(tok==tk_postnumber){
  806.  
  807.                                 *val+=itok.number;
  808.  
  809.                                 *posttok=itok;
  810.  
  811.                         }
  812.  
  813.                         else if(tok==tk_rmnumber){
  814.  
  815.                                 int r1,r2,z;
  816.  
  817.                                 ExpandRm(itok.rm,itok.sib,&z,&r1,&r2);
  818.  
  819.                                 if(z&&*zoom>0)break;
  820.  
  821.                                 if(r1>=0&&r2>=0&&(*idx>=0||*base>=0))break;
  822.  
  823.                                 *val+=itok.number;
  824.  
  825.                                 if(*zoom<=0)*zoom=z;
  826.  
  827.                                 if(*base==-1){
  828.  
  829.                                         if(r1>=0){
  830.  
  831.                                                 *base=r1;
  832.  
  833.                                                 r1=-1;
  834.  
  835.                                         }
  836.  
  837.                                         else{
  838.  
  839.                                                 *base=r2;
  840.  
  841.                                                 r2=-1;
  842.  
  843.                                         }
  844.  
  845.                                 }
  846.  
  847.                                 if(*idx==-1){
  848.  
  849.                                         if(r1>=0)*idx=r1;
  850.  
  851.                                         else if(r2>=0)*idx=r2;
  852.  
  853.                                 }
  854.  
  855.                         }
  856.  
  857.                         else{
  858.  
  859.                                 if(*base==-1)*base=itok.number;
  860.  
  861.                                 else *idx=itok.number;
  862.  
  863.                         }
  864.  
  865.                 }
  866.  
  867.                 else if(tok==tk_mult){
  868.  
  869.                         *zoom=0;
  870.  
  871.                         switch(itok2.number){
  872.  
  873.                                 case 8: *zoom=*zoom+1;
  874.  
  875.                                 case 4: *zoom=*zoom+1;
  876.  
  877.                                 case 2: *zoom=*zoom+1;
  878.  
  879.                                 case 1:
  880.  
  881.                                         *idx=*base;
  882.  
  883.                                         *base=-1;
  884.  
  885.                                         break;
  886.  
  887.                                 case 9: *zoom=*zoom+1;
  888.  
  889.                                 case 5: *zoom=*zoom+1;
  890.  
  891.                                 case 3:
  892.  
  893.                                         *zoom=*zoom+1;
  894.  
  895.                                         *idx=*base;
  896.  
  897.                                         break;
  898.  
  899.                                 default: *zoom=-1;
  900.  
  901.                         }
  902.  
  903.                         if(*zoom==-1)break;
  904.  
  905.                         nexttok();
  906.  
  907.                 }
  908.  
  909.                 else break;
  910.  
  911.                 nexttok();
  912.  
  913.                 if(*base!=-1&&*idx!=-1&&tok2!=tk_number)break;
  914.  
  915.         }
  916.  
  917.         if(*zoom==-1&&*base==-1){
  918.  
  919.                 *base=*idx;
  920.  
  921.                 *idx=-1;
  922.  
  923.         }
  924.  
  925. //      printf("out:reg=%02X base=%02X idx=%02X zoom=%02X\n",reg,*base,*idx,*zoom);
  926.  
  927. }
  928.  
  929.  
  930.  
  931. int OutLea(int reg,int idx,int base, int zoom,unsigned long val,
  932.  
  933.         unsigned int rflag,ITOK *posttok)
  934.  
  935. {
  936.  
  937. int mod=rm_mod00;
  938.  
  939. int q;
  940.  
  941.         if(zoom==-1)zoom=0;
  942.  
  943.         if(val!=0){
  944.  
  945.                 if(short_ok(val,TRUE)!=0)mod=rm_mod01;
  946.  
  947.                 else mod=rm_mod10;
  948.  
  949.         }
  950.  
  951.         if((rflag&f_reloc)!=0||posttok->post)mod=rm_mod10;
  952.  
  953.         if(idx==-1){
  954.  
  955.                 idx=base;
  956.  
  957.                 base=-1;
  958.  
  959.         }
  960.  
  961.         if(base==-1){
  962.  
  963.                 if(zoom==0){
  964.  
  965.                         op66(r32);
  966.  
  967.                         op67(r32);
  968.  
  969.                         op(0x8d);
  970.  
  971.                         if(idx==5&&mod==rm_mod00)mod=rm_mod01;
  972.  
  973.                         op((reg*8+idx)|mod);
  974.  
  975.                         if(idx==4)op(idx*9);
  976.  
  977.                 }
  978.  
  979.                 else{
  980.  
  981.                         if(idx==4)return FALSE;
  982.  
  983.                         mod=rm_mod10;
  984.  
  985.                         op66(r32);
  986.  
  987.                         op67(r32);
  988.  
  989.                         op(0x8d);
  990.  
  991.                         op(reg*8+4);
  992.  
  993.                         op(idx*8+5+(zoom<<6));
  994.  
  995.                 }
  996.  
  997.         }
  998.  
  999.         else{
  1000.  
  1001.                 if(idx==4){
  1002.  
  1003.                         if(base==-1){ idx=-1; base=4;}
  1004.  
  1005.                         else if(zoom==0){
  1006.  
  1007.                                 q=base;
  1008.  
  1009.                                 base=idx;
  1010.  
  1011.                                 idx=q;
  1012.  
  1013.                         }
  1014.  
  1015.                         else return FALSE;
  1016.  
  1017.                 }
  1018.  
  1019.                 if(base==5&&mod==rm_mod00){
  1020.  
  1021.                         if(idx!=-1&&idx!=5){
  1022.  
  1023.                                 if(zoom==0){
  1024.  
  1025.                                         q=base;
  1026.  
  1027.                                         base=idx;
  1028.  
  1029.                                         idx=q;
  1030.  
  1031.                                 }
  1032.  
  1033.                                 else mod=rm_mod01;
  1034.  
  1035.                         }
  1036.  
  1037.                         else mod=rm_mod01;
  1038.  
  1039.                 }
  1040.  
  1041.                 op66(r32);
  1042.  
  1043.                 op67(r32);
  1044.  
  1045.                 op(0x8d);
  1046.  
  1047.                 op((reg*8+4)|mod);      //sib
  1048.  
  1049.                 op((zoom<<6)+(idx<<3)+base);
  1050.  
  1051.         }
  1052.  
  1053.         if(mod==rm_mod01)op(val);
  1054.  
  1055.         else if(mod==rm_mod10){
  1056.  
  1057.                 if(posttok->post)setwordpost(posttok);
  1058.  
  1059.                 else if((rflag&f_reloc)!=0)AddReloc();
  1060.  
  1061.                 outdword(val);
  1062.  
  1063.         }
  1064.  
  1065.         else if(mod==rm_mod00&&base==5)outdword(val);
  1066.  
  1067.         return TRUE;
  1068.  
  1069. }
  1070.  
  1071.  
  1072.  
  1073. int Reg32ToLea2(int reg)        //®¯â¨¬¨§ æ¨ï á«®¦¥­¨ï 32-¡¨â­ëå ॣ¨áâ஢ ¢ LEA
  1074.  
  1075. {
  1076.  
  1077. int idx,base,zoom;
  1078.  
  1079. unsigned long val;
  1080.  
  1081. int otok,otok2,otype2;
  1082.  
  1083. unsigned char ocha,next;
  1084.  
  1085. unsigned int oinptr,rflag;
  1086.  
  1087. int oline;
  1088.  
  1089. ITOK oitok;
  1090.  
  1091. ITOK posttok;
  1092.  
  1093.         if(tok!=tk_minus&&tok!=tk_plus&&tok!=tk_mult)return FALSE;
  1094.  
  1095.         if(tok==tk_minus&&(!((tok2==tk_number&&itok2.rm!=tk_float&&itok2.rm!=tk_double)||tok2==tk_postnumber)))return FALSE;
  1096.  
  1097.         if(tok==tk_mult&&(!(tok2==tk_number&&itok2.rm!=tk_float&&itok2.rm!=tk_double&&(itok2.flag&f_reloc)==0)))return FALSE;
  1098.  
  1099.         if(tok==tk_plus&&tok2!=tk_reg32&&tok2!=tk_number&&tok2!=tk_postnumber&&(!(tok2==tk_rmnumber&&(itok2.flag&f_useidx)==0)))return FALSE;
  1100.  
  1101.         if(cur_mod)return FALSE;
  1102.  
  1103.         posttok.post=0;
  1104.  
  1105.         idx=zoom=-1;
  1106.  
  1107.         base=reg;
  1108.  
  1109.         if(tok==tk_mult){
  1110.  
  1111.                 zoom=0;
  1112.  
  1113.                 switch(itok2.number){
  1114.  
  1115.                         case 8: zoom++;
  1116.  
  1117.                         case 4: zoom++;
  1118.  
  1119.                         case 2: zoom++;
  1120.  
  1121.                         case 1:
  1122.  
  1123.                                 idx=reg;
  1124.  
  1125.                                 base=-1;
  1126.  
  1127.                                 break;
  1128.  
  1129. //new!
  1130.  
  1131.                         case 9: zoom++;
  1132.  
  1133.                         case 5: zoom++;
  1134.  
  1135.                         case 3:
  1136.  
  1137. //                              if(!(am32==FALSE&&tok!=tk_plus&&(!(tok2==tk_minus||tok2==tk_number)))){
  1138.  
  1139.                                 if(am32){
  1140.  
  1141.                                         zoom++;
  1142.  
  1143.                                         idx=base=reg;
  1144.  
  1145.                                         break;
  1146.  
  1147.                                 }
  1148.  
  1149. // end new!!
  1150.  
  1151.                         default: return FALSE;
  1152.  
  1153.                 }
  1154.  
  1155.                 if(zoom==0){
  1156.  
  1157.                         zoom=-1;
  1158.  
  1159.                         base=reg;
  1160.  
  1161.                         idx=-1;
  1162.  
  1163.                 }
  1164.  
  1165.         }
  1166.  
  1167.         val=0;
  1168.  
  1169.         rflag=0;
  1170.  
  1171.         oinptr=inptr2;
  1172.  
  1173.         ocha=cha2;
  1174.  
  1175.         otok=tok;
  1176.  
  1177.         oitok=itok;
  1178.  
  1179.         otok2=tok2;
  1180.  
  1181.         otype2=itok2.type;
  1182.  
  1183.         oline=linenumber;
  1184.  
  1185.         if(tok==tk_mult){
  1186.  
  1187.                 nexttok();
  1188.  
  1189.                 nexttok();
  1190.  
  1191.         }
  1192.  
  1193.         CheckRegForLea(reg,&idx,&base,&zoom,&val,&rflag,&posttok);
  1194.  
  1195.         next=0;
  1196.  
  1197.         if(idx==-1)next=1;
  1198.  
  1199.         if(base==-1)next|=2;
  1200.  
  1201.         if(zoom==-1)next|=4;
  1202.  
  1203.         if(val==0&&rflag==0&&posttok.post==0)next|=8;
  1204.  
  1205. //      printf("next=%d\n",next);
  1206.  
  1207.         switch(next){
  1208.  
  1209.                 case 1:         // idx=-1                  Rb+N
  1210.  
  1211.                         if(base==ESP&&val==1)goto retfalse;
  1212.  
  1213.                 case 4:         // zoom=-1                 Rb+Ri+N
  1214.  
  1215.                         if(val<2||val>127)goto retfalse;
  1216.  
  1217.                         break;
  1218.  
  1219.                 case 2:         // base=-1                 Ri*Z+N
  1220.  
  1221.                         if(zoom<3){
  1222.  
  1223.                                 if(zoom==2&&val>2){
  1224.  
  1225.                                         if(val<128)goto retfalse;
  1226.  
  1227.                                         break;
  1228.  
  1229.                                 }
  1230.  
  1231.                                 goto retfalse;
  1232.  
  1233.                         }
  1234.  
  1235.                 case 0:
  1236.  
  1237.                 case 8:         // val=0                   Rb+Ri*Z
  1238.  
  1239.                         break;
  1240.  
  1241.                 default:
  1242.  
  1243. //              case 12:        // val=0   zoom=-1         Rb+Ri
  1244.  
  1245. //              case 10:        // val=0   base=-1         Ri*Z
  1246.  
  1247. //              case 13:        // val=0   idx=-1  zoom=-1 Rb
  1248.  
  1249. //              case 5:         // idx=-1  zoom=-1         Rb+N
  1250.  
  1251. //              case 3:         // idx=-1  base=-1         N
  1252.  
  1253. //              case 6:         // base=-1 zoom=-1         Ri+N
  1254.  
  1255. //              case 11:        // val=0   base=-1 idx=-1  -
  1256.  
  1257. //              case 9:         // val=0   idx=-1          Rb
  1258.  
  1259. //              case 14:        // val=0   base=-1 zoom=-1 Ri
  1260.  
  1261. //              case 7:         // idx=-1  base=-1 zoom=-1 N
  1262.  
  1263. //              case 15:        // val=0   base=-1 idx=-1  zoom=-1
  1264.  
  1265. retfalse:
  1266.  
  1267.                         inptr2=oinptr;
  1268.  
  1269.                         cha2=ocha;
  1270.  
  1271.                         tok=otok;
  1272.  
  1273.                         itok=oitok;
  1274.  
  1275.                         tok2=otok2;
  1276.  
  1277.                         itok2.type=(unsigned short)otype2;
  1278.  
  1279.                         if(bufrm){
  1280.  
  1281.                                 free(bufrm);
  1282.  
  1283.                                 bufrm=NULL;
  1284.  
  1285.                         }
  1286.  
  1287.                         if(strinf.bufstr){
  1288.  
  1289.                                 free(strinf.bufstr);
  1290.  
  1291.                                 strinf.bufstr=NULL;
  1292.  
  1293.                         }
  1294.  
  1295.                         endoffile=0;
  1296.  
  1297.                         linenum2=linenumber=oline;
  1298.  
  1299.                         return FALSE;
  1300.  
  1301.         }
  1302.  
  1303.         if(OutLea(reg,idx,base,zoom,val,rflag,&posttok)==FALSE)goto retfalse;
  1304.  
  1305.         ClearReg(reg);
  1306.  
  1307. //      printf("%s (%u) Combination %d\n",(startfileinfo+currentfileinfo)->filename,linenumber,next);
  1308.  
  1309.         return TRUE;
  1310.  
  1311. }
  1312.  
  1313.  
  1314.  
  1315. int RegEqualToLea(int reg)
  1316.  
  1317. {
  1318.  
  1319. int idx,base,zoom;
  1320.  
  1321. unsigned long val;
  1322.  
  1323. int otok,otok2;
  1324.  
  1325. unsigned char ocha,next;
  1326.  
  1327. unsigned int oinptr,rflag;
  1328.  
  1329. ITOK oitok;
  1330.  
  1331. ITOK oitok2;
  1332.  
  1333. ITOK posttok;
  1334.  
  1335.         if(cur_mod)return FALSE;
  1336.  
  1337.         oinptr=inptr2;
  1338.  
  1339.         ocha=cha2;
  1340.  
  1341.         otok=tok;
  1342.  
  1343.         oitok=itok;
  1344.  
  1345.         otok2=tok2;
  1346.  
  1347.         oitok2=oitok;
  1348.  
  1349.         base=idx=zoom=-1;
  1350.  
  1351.         val=0;
  1352.  
  1353.         rflag=0;
  1354.  
  1355.         posttok.post=0;
  1356.  
  1357.         tok=tk_plus;
  1358.  
  1359.         CheckRegForLea(reg,&idx,&base,&zoom,&val,&rflag,&posttok);
  1360.  
  1361.         if(tok!=tk_semicolon)goto retfalse;
  1362.  
  1363.         if(base==-1)base=reg;
  1364.  
  1365.         else if(idx==-1)idx=reg;
  1366.  
  1367.         else goto retfalse;
  1368.  
  1369.         next=0;
  1370.  
  1371.         if(idx==-1)next=1;
  1372.  
  1373.         if(base==-1)next|=2;
  1374.  
  1375.         if(zoom==-1)next|=4;
  1376.  
  1377.         if(val==0&&rflag==0&&posttok.post==0)next|=8;
  1378.  
  1379. //      printf("base=%d idx=%d zoom=%d val=%d next=%d\n",base,idx,zoom,val,next);
  1380.  
  1381.         if(val==0&&rflag==0&&posttok.post==0)next|=8;
  1382.  
  1383.         switch(next){
  1384.  
  1385.                 case 5:         // idx=-1  zoom=-1         Rb+N
  1386.  
  1387.                         if(reg==EAX&&(val>127||val<0xffffff80)) {  //cppcheck - condition val>127||val<0xffffff80 always true, add diagnostic
  1388.                                 printf("suspicious instruction compilation\n");
  1389.                                 goto retfalse;  
  1390.                         }
  1391.  
  1392.                         if(val<3||val>0xfffffffd)goto retfalse;
  1393.  
  1394.                         if(base==ESP)goto retfalse;
  1395.  
  1396.                         break;
  1397.  
  1398.                 case 4:         // zoom=-1                 Rb+Ri+N
  1399.  
  1400.                         if(val==1||val==0xffffffff)goto retfalse;
  1401.  
  1402.                         break;
  1403.  
  1404.                 case 0:
  1405.  
  1406.                 case 8:         // val=0                   Rb+Ri*Z
  1407.  
  1408.                         break;
  1409.  
  1410.                 default:
  1411.  
  1412. //              case 13:        // val=0   idx=-1  zoom=-1 Rb
  1413.  
  1414. //              case 3:         // idx=-1  base=-1         N
  1415.  
  1416. //              case 6:         // base=-1 zoom=-1         Ri+N
  1417.  
  1418. //              case 11:        // val=0   base=-1 idx=-1  -
  1419.  
  1420. //              case 9:         // val=0   idx=-1          Rb
  1421.  
  1422. //              case 14:        // val=0   base=-1 zoom=-1 Ri
  1423.  
  1424. //              case 7:         // idx=-1  base=-1 zoom=-1 N
  1425.  
  1426. //              case 15:        // val=0   base=-1 idx=-1  zoom=-1
  1427.  
  1428. retfalse:
  1429.  
  1430.                         inptr2=oinptr;
  1431.  
  1432.                         cha2=ocha;
  1433.  
  1434.                         tok=otok;
  1435.  
  1436.                         itok=oitok;
  1437.  
  1438.                         tok2=otok2;
  1439.  
  1440.                         itok2=oitok2;
  1441.  
  1442.                         endoffile=0;
  1443.  
  1444.                         if(bufrm){
  1445.  
  1446.                                 free(bufrm);
  1447.  
  1448.                                 bufrm=NULL;
  1449.  
  1450.                         }
  1451.  
  1452.                         if(strinf.bufstr){
  1453.  
  1454.                                 free(strinf.bufstr);
  1455.  
  1456.                                 strinf.bufstr=NULL;
  1457.  
  1458.                         }
  1459.  
  1460. //      printf("return input=%08X inptr=%08X\n",input,inptr2);
  1461.  
  1462.                         return FALSE;
  1463.  
  1464.         }
  1465.  
  1466. //      printf("next=%d\n",next);
  1467.  
  1468.         if(OutLea(reg,idx,base,zoom,val,rflag,&posttok)==FALSE)goto retfalse;
  1469.  
  1470.         return TRUE;
  1471.  
  1472. }
  1473.  
  1474.  
  1475.  
  1476. int Reg32ToLea(int reg) //®¯â¨¬¨§ æ¨ï á«®¦¥­¨ï 32-¡¨â­ëå ॣ¨áâ஢ ¢ LEA
  1477.  
  1478. {
  1479.  
  1480. int idx,base,zoom;
  1481.  
  1482. unsigned long val;
  1483.  
  1484. int otok,otok2,otype2;
  1485.  
  1486. unsigned char ocha,next;
  1487.  
  1488. unsigned int oinptr,rflag;
  1489.  
  1490. int oline;
  1491.  
  1492. ITOK oitok;
  1493.  
  1494. ITOK posttok;
  1495.  
  1496.         if(tok!=tk_reg32&&tok!=tk_number&&tok!=tk_postnumber&&(!(tok==tk_rmnumber&&(itok.flag&f_useidx)==0)))return FALSE;
  1497.  
  1498.         if(cur_mod)return FALSE;
  1499.  
  1500.         posttok.post=0;
  1501.  
  1502.         idx=base=zoom=-1;
  1503.  
  1504.         val=0;
  1505.  
  1506.         rflag=0;
  1507.  
  1508. //      printf("input=%08X inptr=%08X\n",input,inptr2);
  1509.  
  1510.         oinptr=inptr2;
  1511.  
  1512.         ocha=cha2;
  1513.  
  1514.         otok=tok;
  1515.  
  1516.         oitok=itok;
  1517.  
  1518.         otok2=tok2;
  1519.  
  1520.         otype2=itok2.type;
  1521.  
  1522.         oline=linenumber;
  1523.  
  1524. //      printf("tok=%d type=%d %s\n",tok,itok.type,itok.name);
  1525.  
  1526.         if(tok==tk_number){
  1527.  
  1528.                 if(itok.rm==tk_float||itok.rm==tk_double||itok.rm==tk_qword)return FALSE;
  1529.  
  1530.                 val=doconstdwordmath();
  1531.  
  1532.                 rflag=postnumflag;
  1533.  
  1534.                 if((rflag&f_reloc)&&tok==tk_mult)goto retfalse;
  1535.  
  1536.         }
  1537.  
  1538.         else if(tok==tk_postnumber){
  1539.  
  1540.                 posttok=itok;
  1541.  
  1542.                 tok=tk_number;
  1543.  
  1544.                 val=doconstdwordmath();
  1545.  
  1546.                 if(tok==tk_mult)goto retfalse;
  1547.  
  1548.         }
  1549.  
  1550.         else if(tok==tk_rmnumber){
  1551.  
  1552.                 ExpandRm(itok.rm,itok.sib,&zoom,&base,&idx);
  1553.  
  1554.                 val=itok.number;
  1555.  
  1556.                 nexttok();
  1557.  
  1558.         }
  1559.  
  1560.         else{
  1561.  
  1562.                 base=itok.number;
  1563.  
  1564.                 nexttok();
  1565.  
  1566.         }
  1567.  
  1568.         if(tok==tk_mult){
  1569.  
  1570.                 nexttok();
  1571.  
  1572.                 if(base==-1&&tok==tk_reg32){
  1573.  
  1574.                         if(itok.number==reg)goto retfalse;
  1575.  
  1576.                         idx=itok.number;
  1577.  
  1578.                 }
  1579.  
  1580.                 else if(base!=-1&&tok==tk_number){
  1581.  
  1582.                         if((itok.flag&f_reloc)&&(itok.rm==tk_float||itok.rm==tk_double||itok.rm==tk_qword))goto retfalse;
  1583.  
  1584.                         idx=base;
  1585.  
  1586.                         base=-1;
  1587.  
  1588.                         val=itok.number;
  1589.  
  1590.                 }
  1591.  
  1592.                 else goto retfalse;
  1593.  
  1594.                 nexttok();
  1595.  
  1596.                 zoom=0;
  1597.  
  1598.                 switch(val){
  1599.  
  1600.                         case 8: zoom++;
  1601.  
  1602.                         case 4: zoom++;
  1603.  
  1604.                         case 2: zoom++;
  1605.  
  1606.                         case 1: break;
  1607.  
  1608. //new!
  1609.  
  1610.                         case 9: zoom++;
  1611.  
  1612.                         case 5: zoom++;
  1613.  
  1614.                         case 3:
  1615.  
  1616. //                              if(!(am32==FALSE&&tok!=tk_plus&&(!(tok2==tk_minus||tok2==tk_number)))){
  1617.  
  1618.                                 if(am32||((tok==tk_plus||tok==tk_minus)&&(tok2==tk_number||tok2==tk_minus))){
  1619.  
  1620.                                         zoom++;
  1621.  
  1622.                                         base=idx;
  1623.  
  1624.                                         break;
  1625.  
  1626.                                 }
  1627.  
  1628. // end new!!
  1629.  
  1630.                         default:
  1631.  
  1632.                                 goto retfalse;
  1633.  
  1634.                 }
  1635.  
  1636.                 if(zoom==0){
  1637.  
  1638.                         zoom=-1;
  1639.  
  1640.                         base=idx;
  1641.  
  1642.                         idx=-1;
  1643.  
  1644.                 }
  1645.  
  1646.                 val=0;
  1647.  
  1648.         }
  1649.  
  1650.         CheckRegForLea(reg,&idx,&base,&zoom,&val,&rflag,&posttok);
  1651.  
  1652.         next=0;
  1653.  
  1654.         if(idx==-1)next=1;
  1655.  
  1656.         if(base==-1)next|=2;
  1657.  
  1658.         if(zoom==-1)next|=4;
  1659.  
  1660.         if(val==0&&rflag==0&&posttok.post==0)next|=8;
  1661.  
  1662.         switch(next){
  1663.  
  1664.                 case 5:         // idx=-1  zoom=-1         Rb+N
  1665.  
  1666.                 case 1:         // idx=-1                  Rb+N
  1667.  
  1668.                         if(base==ESP&&val==1)goto retfalse;
  1669.  
  1670.                 case 12:        // val=0   zoom=-1         Rb+Ri
  1671.  
  1672.                         if(base==reg)goto retfalse;
  1673.  
  1674.                         break;
  1675.  
  1676.                 case 10:        // val=0   base=-1         Ri*Z
  1677.  
  1678.                         if(optimizespeed==FALSE||idx==reg)goto retfalse;
  1679.  
  1680.                         break;
  1681.  
  1682.                 case 2:         // base=-1                 Ri*Z+N
  1683.  
  1684.                         if(optimizespeed)break;
  1685.  
  1686.                         if(zoom<3){
  1687.  
  1688.                                 if(zoom==2&&val>2){
  1689.  
  1690.                                         if(val<128){
  1691.  
  1692.                                                 if(idx!=reg)break;
  1693.  
  1694.                                                 goto retfalse;
  1695.  
  1696.                                         }
  1697.  
  1698.                                         break;
  1699.  
  1700.                                 }
  1701.  
  1702.                                 if(zoom==1&&val>3&&idx!=reg)break;
  1703.  
  1704.                                 goto retfalse;
  1705.  
  1706.                         }
  1707.  
  1708.                 case 0:
  1709.  
  1710.                 case 4:         // zoom=-1                 Rb+Ri+N
  1711.  
  1712.                 case 8:         // val=0                   Rb+Ri*Z
  1713.  
  1714.                         break;
  1715.  
  1716.                 default:
  1717.  
  1718. //              case 13:        // val=0   idx=-1  zoom=-1 Rb
  1719.  
  1720. //              case 3:         // idx=-1  base=-1         N
  1721.  
  1722. //              case 6:         // base=-1 zoom=-1         Ri+N
  1723.  
  1724. //              case 11:        // val=0   base=-1 idx=-1  -
  1725.  
  1726. //              case 9:         // val=0   idx=-1          Rb
  1727.  
  1728. //              case 14:        // val=0   base=-1 zoom=-1 Ri
  1729.  
  1730. //              case 7:         // idx=-1  base=-1 zoom=-1 N
  1731.  
  1732. //              case 15:        // val=0   base=-1 idx=-1  zoom=-1
  1733.  
  1734. retfalse:
  1735.  
  1736.                         inptr2=oinptr;
  1737.  
  1738.                         cha2=ocha;
  1739.  
  1740.                         tok=otok;
  1741.  
  1742.                         itok=oitok;
  1743.  
  1744.                         tok2=otok2;
  1745.  
  1746.                         itok2.type=(unsigned short)otype2;
  1747.  
  1748.                         linenum2=linenumber=oline;
  1749.  
  1750.                         endoffile=0;
  1751.  
  1752.                         if(bufrm){
  1753.  
  1754.                                 free(bufrm);
  1755.  
  1756.                                 bufrm=NULL;
  1757.  
  1758.                         }
  1759.  
  1760.                         if(strinf.bufstr){
  1761.  
  1762.                                 free(strinf.bufstr);
  1763.  
  1764.                                 strinf.bufstr=NULL;
  1765.  
  1766.                         }
  1767.  
  1768. //      printf("return input=%08X inptr=%08X\n",input,inptr2);
  1769.  
  1770.                         return FALSE;
  1771.  
  1772.         }
  1773.  
  1774. //      printf("flag=%08X\n",rflag);
  1775.  
  1776.         if(OutLea(reg,idx,base,zoom,val,rflag,&posttok)==FALSE)goto retfalse;
  1777.  
  1778.         ClearReg(reg);
  1779.  
  1780.         return TRUE;
  1781.  
  1782. }
  1783.  
  1784.  
  1785.  
  1786. void CheckRegForLea16(int reg,int *idx,int *base,unsigned long *val,unsigned int *rflag,ITOK *posttok)
  1787.  
  1788. {
  1789.  
  1790. int endloop=FALSE;
  1791.  
  1792.         for(;;){
  1793.  
  1794.                 if(tok!=tk_plus&&(!(tok==tk_minus&&((tok2==tk_number&&itok2.rm!=tk_float&&itok2.rm!=tk_qword&&itok2.rm!=tk_double)||tok2==tk_postnumber))))break;
  1795.  
  1796.                 if(tok2==tk_postnumber&&(posttok->post||tok==tk_minus))break;
  1797.  
  1798.                 if(tok2==tk_reg){
  1799.  
  1800.                         if(itok2.number==reg)endloop=TRUE;
  1801.  
  1802.                         else if(*base==-1){
  1803.  
  1804.                                 switch(itok2.number){
  1805.  
  1806.                                         case BX:
  1807.  
  1808.                                         case BP:
  1809.  
  1810.                                         case SI:
  1811.  
  1812.                                         case DI:
  1813.  
  1814.                                                 *base=itok2.number;
  1815.  
  1816.                                                 break;
  1817.  
  1818.                                         default: endloop=TRUE; break;
  1819.  
  1820.                                 }
  1821.  
  1822.                         }
  1823.  
  1824.                         else if(*idx==-1){
  1825.  
  1826.                                 switch(itok2.number){
  1827.  
  1828.                                         case BX:
  1829.  
  1830.                                         case BP:
  1831.  
  1832.                                                 if(*base==BX||*base==BP)endloop=TRUE;
  1833.  
  1834.                                                 else{
  1835.  
  1836.                                                         *idx=*base;
  1837.  
  1838.                                                         *base=itok2.number;
  1839.  
  1840.                                                 }
  1841.  
  1842.                                                 break;
  1843.  
  1844.                                         case SI:
  1845.  
  1846.                                         case DI:
  1847.  
  1848.                                                 if(*base==SI||*base==DI)endloop=TRUE;
  1849.  
  1850.                                                 else{
  1851.  
  1852.                                                         *idx=itok2.number;
  1853.  
  1854.                                                 }
  1855.  
  1856.                                                 break;
  1857.  
  1858.                                         default: endloop=TRUE; break;
  1859.  
  1860.                                 }
  1861.  
  1862.                         }
  1863.  
  1864.                         else break;
  1865.  
  1866.                         if(endloop)break;
  1867.  
  1868.                         nexttok();
  1869.  
  1870.                 }
  1871.  
  1872.                 else if(tok2==tk_number&&itok2.rm!=tk_float&&itok2.rm!=tk_qword&&itok2.rm!=tk_double){
  1873.  
  1874.                         if(tok==tk_plus)*val+=itok2.number;
  1875.  
  1876.                         else *val-=itok2.number;
  1877.  
  1878.                         nexttok();
  1879.  
  1880.                         *rflag^=itok.flag;
  1881.  
  1882.                 }
  1883.  
  1884.                 else if(tok2==tk_postnumber){
  1885.  
  1886.                         if(posttok->post)break;
  1887.  
  1888.                         if(tok==tk_plus)*val+=itok2.number;
  1889.  
  1890.                         else *val-=itok2.number;
  1891.  
  1892.                         nexttok();
  1893.  
  1894.                         *posttok=itok;
  1895.  
  1896.                 }
  1897.  
  1898.                 else break;
  1899.  
  1900.                 nexttok();
  1901.  
  1902.         }
  1903.  
  1904. }
  1905.  
  1906.  
  1907.  
  1908. void OutLea16(int reg,int idx,int base,unsigned int val,int rflag,ITOK *posttok)
  1909.  
  1910. {
  1911.  
  1912. int mod=rm_mod00;
  1913.  
  1914. int rm;
  1915.  
  1916.         if(val!=0){
  1917.  
  1918.                 if(short_ok(val,FALSE)!=0)mod=rm_mod01;
  1919.  
  1920.                 else mod=rm_mod10;
  1921.  
  1922.         }
  1923.  
  1924.         if((rflag&f_reloc)!=0||posttok->post)mod=rm_mod10;
  1925.  
  1926.         rm=CalcRm16(base,idx);
  1927.  
  1928.         op66(r16);
  1929.  
  1930.         op67(r16);
  1931.  
  1932.         op(0x8D);
  1933.  
  1934.         op((rm+reg*8)|mod);
  1935.  
  1936.         if(mod==rm_mod01)op(val);
  1937.  
  1938.         else if(mod==rm_mod10){
  1939.  
  1940.                 if(posttok->post)setwordpost(posttok);
  1941.  
  1942.                 else if((rflag&f_reloc)!=0)AddReloc();
  1943.  
  1944.                 outword(val);
  1945.  
  1946.         }
  1947.  
  1948. }
  1949.  
  1950.  
  1951.  
  1952. int Reg16ToLea(int reg) //®¯â¨¬¨§ æ¨ï á«®¦¥­¨ï 16-¡¨â­ëå ॣ¨áâ஢ ¢ LEA
  1953.  
  1954. {
  1955.  
  1956. int idx,base;
  1957.  
  1958. unsigned long val;
  1959.  
  1960. int otok,otok2,otype2;
  1961.  
  1962. unsigned char ocha,next;
  1963.  
  1964. unsigned int oinptr,rflag;
  1965.  
  1966. int oline;
  1967.  
  1968. ITOK oitok;
  1969.  
  1970. ITOK posttok;
  1971.  
  1972.         if(cur_mod)return FALSE;
  1973.  
  1974.         posttok.post=0;
  1975.  
  1976. //      if(tok!=tk_reg&&tok!=tk_number&&am32!=0&&tok2!=tk_plus)return FALSE;
  1977.  
  1978.         if(!((tok==tk_reg||(tok==tk_number&&itok.rm!=tk_float&&itok.rm!=tk_double)&&tok==tk_postnumber)&&tok2==tk_plus))return FALSE;
  1979.  
  1980.         idx=base=-1;
  1981.  
  1982.         if(tok==tk_reg){
  1983.  
  1984.                 if(itok.number==reg)return FALSE;
  1985.  
  1986.                 switch(itok.number){
  1987.  
  1988.                         case BX:
  1989.  
  1990.                         case BP:
  1991.  
  1992.                         case SI:
  1993.  
  1994.                         case DI:
  1995.  
  1996.                                 base=itok.number;
  1997.  
  1998.                                 break;
  1999.  
  2000.                         default: return FALSE;
  2001.  
  2002.                 }
  2003.  
  2004.         }
  2005.  
  2006.         val=0;
  2007.  
  2008.         rflag=0;
  2009.  
  2010.         oinptr=inptr2;
  2011.  
  2012.         ocha=cha2;
  2013.  
  2014.         otok=tok;
  2015.  
  2016.         oitok=itok;
  2017.  
  2018.         otok2=tok2;
  2019.  
  2020.         otype2=itok2.type;
  2021.  
  2022.         oline=linenumber;
  2023.  
  2024.         if(tok==tk_postnumber){
  2025.  
  2026.                 posttok=itok;
  2027.  
  2028.                 tok=tk_number;
  2029.  
  2030.         }
  2031.  
  2032.         if(tok==tk_number){
  2033.  
  2034.                 val=doconstdwordmath();
  2035.  
  2036.                 rflag=postnumflag;
  2037.  
  2038.         }
  2039.  
  2040.         else nexttok();
  2041.  
  2042.         CheckRegForLea16(reg,&idx,&base,&val,&rflag,&posttok);
  2043.  
  2044.         next=0;
  2045.  
  2046.         if(idx==-1)next=1;
  2047.  
  2048.         if(base==-1)next|=2;
  2049.  
  2050.         if(val==0&&rflag==0&&posttok.post==0)next|=4;
  2051.  
  2052.         switch(next){
  2053.  
  2054.                 case 0: //base+idx+num
  2055.  
  2056.                 case 1: //base+num
  2057.  
  2058. //              case 2: //idx+num
  2059.  
  2060. //              case 3: //num
  2061.  
  2062.                 case 4: //base+idx
  2063.  
  2064. //              case 6: //idx
  2065.  
  2066. //              case 7: //
  2067.  
  2068.                         break;
  2069.  
  2070.                 case 5: //base
  2071.  
  2072.                         if(am32==0)break;
  2073.  
  2074.                 default:
  2075.  
  2076. retfalse:
  2077.  
  2078.                         inptr2=oinptr;
  2079.  
  2080.                         cha2=ocha;
  2081.  
  2082.                         tok=otok;
  2083.  
  2084.                         itok=oitok;
  2085.  
  2086.                         tok2=otok2;
  2087.  
  2088.                         itok2.type=(unsigned short)otype2;
  2089.  
  2090.                         linenum2=linenumber=oline;
  2091.  
  2092.                         endoffile=0;
  2093.  
  2094.                         if(bufrm){
  2095.  
  2096.                                 free(bufrm);
  2097.  
  2098.                                 bufrm=NULL;
  2099.  
  2100.                         }
  2101.  
  2102.                         if(strinf.bufstr){
  2103.  
  2104.                                 free(strinf.bufstr);
  2105.  
  2106.                                 strinf.bufstr=NULL;
  2107.  
  2108.                         }
  2109.  
  2110.                         return FALSE;
  2111.  
  2112.         }
  2113.  
  2114.         OutLea16(reg,idx,base,val,rflag,&posttok);
  2115.  
  2116.         return TRUE;
  2117.  
  2118. }
  2119.  
  2120.  
  2121.  
  2122. int Reg16ToLea2(int reg)        //®¯â¨¬¨§ æ¨ï á«®¦¥­¨ï 16-¡¨â­ëå ॣ¨áâ஢ ¢ LEA
  2123.  
  2124. {
  2125.  
  2126. int idx,base;
  2127.  
  2128. unsigned long val;
  2129.  
  2130. int otok,otok2,otype2;
  2131.  
  2132. unsigned char ocha,next;
  2133.  
  2134. unsigned int oinptr,rflag;
  2135.  
  2136. int oline;
  2137.  
  2138. ITOK oitok;
  2139.  
  2140. ITOK posttok;
  2141.  
  2142.         if(cur_mod)return FALSE;
  2143.  
  2144.         posttok.post=0;
  2145.  
  2146.         if(tok==tk_plus&&((tok2==tk_reg&&itok2.number!=reg)||(tok2==tk_number&&itok2.rm!=tk_float&&itok2.rm!=tk_double))&&
  2147.  
  2148.                 (reg==BX||reg==BP||reg==SI||reg==DI)){
  2149.  
  2150.                 val=0;
  2151.  
  2152.                 rflag=0;
  2153.  
  2154.                 oinptr=inptr2;
  2155.  
  2156.                 ocha=cha2;
  2157.  
  2158.                 otok=tok;
  2159.  
  2160.                 oitok=itok;
  2161.  
  2162.                 otok2=tok2;
  2163.  
  2164.                 otype2=itok2.type;
  2165.  
  2166.                 oline=linenumber;
  2167.  
  2168.                 idx=-1;
  2169.  
  2170.                 base=reg;
  2171.  
  2172.                 CheckRegForLea16(reg,&idx,&base,&val,&rflag,&posttok);
  2173.  
  2174.                 next=0;
  2175.  
  2176.                 if(idx==-1)next=1;
  2177.  
  2178.                 if(base==-1)next|=2;
  2179.  
  2180.                 if(val==0&&rflag==0&&posttok.post==0)next|=4;
  2181.  
  2182.                 switch(next){
  2183.  
  2184.                         case 1: //base+num
  2185.  
  2186.                                 if(val<3&&rflag==0&&posttok.post==0)goto retfalse;
  2187.  
  2188.                         case 0: //base+idx+num
  2189.  
  2190. //              case 2: //idx+num
  2191.  
  2192. //              case 3: //num
  2193.  
  2194.                         case 4: //base+idx
  2195.  
  2196. //              case 6: //idx
  2197.  
  2198. //              case 7: //
  2199.  
  2200.                                 break;
  2201.  
  2202. //                      case 5: //base
  2203.  
  2204.                 default:
  2205.  
  2206. retfalse:
  2207.  
  2208.                         inptr2=oinptr;
  2209.  
  2210.                         cha2=ocha;
  2211.  
  2212.                         tok=otok;
  2213.  
  2214.                         itok=oitok;
  2215.  
  2216.                         tok2=otok2;
  2217.  
  2218.                         itok2.type=(unsigned short)otype2;
  2219.  
  2220.                         endoffile=0;
  2221.  
  2222.                         linenum2=linenumber=oline;
  2223.  
  2224.                         if(bufrm){
  2225.  
  2226.                                 free(bufrm);
  2227.  
  2228.                                 bufrm=NULL;
  2229.  
  2230.                         }
  2231.  
  2232.                         if(strinf.bufstr){
  2233.  
  2234.                                 free(strinf.bufstr);
  2235.  
  2236.                                 strinf.bufstr=NULL;
  2237.  
  2238.                         }
  2239.  
  2240.                         return FALSE;
  2241.  
  2242.                 }
  2243.  
  2244.                 OutLea16(reg,idx,base,val,rflag,&posttok);
  2245.  
  2246.                 return TRUE;
  2247.  
  2248.         }
  2249.  
  2250.         return FALSE;
  2251.  
  2252. }
  2253.  
  2254.  
  2255.  
  2256. int OptimNum()  //®¯â¨¬¨§ æ¨ï æ¨ä஢ëå ®¯¥à ­¤®¢
  2257.  
  2258. {
  2259.  
  2260. int otok,oinptr,deistv,negflag,starttok;
  2261.  
  2262. char ocha2;
  2263.  
  2264. long long val;
  2265.  
  2266. unsigned int flag,oflag;
  2267.  
  2268. int plusreloc=0;
  2269.  
  2270.         if(optnumber==FALSE||cur_mod)return FALSE;      //®¯â¨¬¨§ æ¨ï ®âª«î祭 
  2271.  
  2272.         if(tok==tk_minus&&(itok2.flag&f_reloc))return FALSE;
  2273.  
  2274.         deistv=0;
  2275.  
  2276.         negflag=0;
  2277.  
  2278.         starttok=otok=tok;
  2279.  
  2280.         oflag=itok.flag;
  2281.  
  2282.         oinptr=inptr2;
  2283.  
  2284.         ocha2=cha2;
  2285.  
  2286.         nexttok();
  2287.  
  2288.         flag=itok.flag;
  2289.  
  2290.         val=itok.lnumber;
  2291.  
  2292.         switch(otok){
  2293.  
  2294.                 case tk_minus:
  2295.  
  2296.                         val=-val;
  2297.  
  2298.                 case tk_plus:
  2299.  
  2300.                         for(;;){        //®¯â¨¬¨§ æ¨ï á«®¦¥­¨©-¢ëç¨â ­¨©
  2301.  
  2302.                                 nexttok();
  2303.  
  2304.                                 if((tok!=tk_plus&&tok!=tk_minus)||tok2!=tk_number||
  2305.  
  2306.                                                 (tok==tk_minus&&(itok2.flag&f_reloc)&&plusreloc==0)){//­¥ æëäà  ¨«¨ ¤à㣮¥ ¤¥©á⢨¥
  2307.  
  2308.                                         tok=otok;
  2309.  
  2310.                                         cha2=ocha2;
  2311.  
  2312.                                         inptr2=oinptr;
  2313.  
  2314.                                         endoffile=0;
  2315.  
  2316.                                         if(deistv==0)break;     //­¨ç¥£® ­¥ ¡ë«® ®¯â¨¬¨§¨à®¢ ­®
  2317.  
  2318.                                         warningoptnum();
  2319.  
  2320.                                         tok=tk_plus;
  2321.  
  2322.                                         itok.lnumber=val;
  2323.  
  2324.                                         itok.flag|=flag;
  2325.  
  2326.                                         return TRUE;
  2327.  
  2328.                                 }
  2329.  
  2330.                                 deistv=tok;
  2331.  
  2332.                                 nexttok();
  2333.  
  2334.                                 oinptr=inptr2;
  2335.  
  2336.                                 ocha2=cha2;
  2337.  
  2338.                                 if(deistv==tk_minus){
  2339.  
  2340.                                         val-=itok.lnumber;
  2341.  
  2342.                                         if(itok.flag&f_reloc)plusreloc--;
  2343.  
  2344.                                 }
  2345.  
  2346.                                 else{
  2347.  
  2348.                                         val+=itok.lnumber;
  2349.  
  2350.                                         if(itok.flag&f_reloc)plusreloc++;
  2351.  
  2352.                                 }
  2353.  
  2354.                                 flag^=itok.flag;
  2355.  
  2356.                         }
  2357.  
  2358.                         break;
  2359.  
  2360.                 case tk_divminus:
  2361.  
  2362.                         otok=tk_div;
  2363.  
  2364.                         goto LL1;
  2365.  
  2366.                 case tk_multminus:
  2367.  
  2368.                         otok=tk_mult;
  2369.  
  2370. LL1:
  2371.  
  2372.                         negflag=TRUE;
  2373.  
  2374.                 case tk_div:
  2375.  
  2376.                 case tk_mult:
  2377.  
  2378.                         for(;;){
  2379.  
  2380.                                 nexttok();
  2381.  
  2382.                                 if((tok!=tk_div&&tok!=tk_mult&&tok!=tk_divminus&&tok!=tk_multminus)||
  2383.  
  2384.                                     tok2!=tk_number||
  2385.  
  2386.                                                 (otok!=tok&&((val>itok2.lnumber&&(val%itok2.lnumber)!=0)
  2387.  
  2388.                                                 ||(val<itok2.lnumber&&(itok2.lnumber%val)!=0)))||
  2389.  
  2390.                                                 ((flag&f_reloc)&&(itok2.flag&f_reloc))){
  2391.  
  2392.                                         tok=starttok;
  2393.  
  2394.                                         cha2=ocha2;
  2395.  
  2396.                                         inptr2=oinptr;
  2397.  
  2398.                                         endoffile=0;
  2399.  
  2400.                                         if(deistv==0)break;
  2401.  
  2402.                                         warningoptnum();
  2403.  
  2404.                                         tok=otok;
  2405.  
  2406.                                         if(negflag==TRUE)val=-val;
  2407.  
  2408.                                         itok.lnumber=val;
  2409.  
  2410.                                         itok.flag|=flag;
  2411.  
  2412.                                         return TRUE;
  2413.  
  2414.                                 }
  2415.  
  2416.                                 if(tok==tk_divminus){
  2417.  
  2418.                                         tok=tk_div;
  2419.  
  2420.                                         negflag^=TRUE;
  2421.  
  2422.                                 }
  2423.  
  2424.                                 else if(tok==tk_multminus){
  2425.  
  2426.                                         tok=tk_mult;
  2427.  
  2428.                                         negflag^=TRUE;
  2429.  
  2430.                                 }
  2431.  
  2432.                                 deistv=tok;
  2433.  
  2434.                                 nexttok();
  2435.  
  2436.                                 oinptr=inptr2;
  2437.  
  2438.                                 ocha2=cha2;
  2439.  
  2440.                                 if(otok==deistv)val=val*itok.lnumber;
  2441.  
  2442.                                 else{
  2443.  
  2444.                                         if(val>itok.lnumber)val=val/itok.lnumber;
  2445.  
  2446.                                         else if(val<itok.lnumber){
  2447.  
  2448.                                                 val=itok.lnumber/val;
  2449.  
  2450.                                                 otok=deistv;
  2451.  
  2452.                                         }
  2453.  
  2454.                                         else{
  2455.  
  2456.                                                 val=1;
  2457.  
  2458.                                                 otok=tk_mult;
  2459.  
  2460.                                         }
  2461.  
  2462.                                 }
  2463.  
  2464.                                 flag|=itok.flag;
  2465.  
  2466.                         }
  2467.  
  2468.                         break;
  2469.  
  2470.                 default:
  2471.  
  2472.                         tok=starttok;
  2473.  
  2474.                         cha2=ocha2;
  2475.  
  2476.                         inptr2=oinptr;
  2477.  
  2478.                         itok.flag=oflag;
  2479.  
  2480.         }
  2481.  
  2482.         if(bufrm){
  2483.  
  2484.                 free(bufrm);
  2485.  
  2486.                 bufrm=NULL;
  2487.  
  2488.         }
  2489.  
  2490.         if(strinf.bufstr){
  2491.  
  2492.                 free(strinf.bufstr);
  2493.  
  2494.                 strinf.bufstr=NULL;
  2495.  
  2496.         }
  2497.  
  2498.         return FALSE;
  2499.  
  2500. }
  2501.  
  2502.  
  2503.  
  2504. int expandvar()
  2505.  
  2506. {
  2507.  
  2508.         if(divexpand==FALSE)return FALSE;
  2509.  
  2510.         for(int i=inptr2-1;;i++){
  2511.  
  2512.                 switch(input[i]){
  2513.  
  2514.                         case '"':
  2515.  
  2516.                         case ';':
  2517.  
  2518.                         case '*':
  2519.  
  2520.                         case '|':
  2521.  
  2522.                         case '^':
  2523.  
  2524.                         case ',':
  2525.  
  2526.                         case 0:
  2527.  
  2528.                         case '&': return FALSE;
  2529.  
  2530.                         case '/':
  2531.  
  2532.                                 i++;
  2533.  
  2534.                                 if(input[i]=='/'||input[i]=='*')return FALSE;
  2535.  
  2536.                         case '%': goto en;
  2537.  
  2538.                 }
  2539.  
  2540.         }
  2541.  
  2542. en:
  2543.  
  2544.         warningexpand();
  2545.  
  2546.         return TRUE;
  2547.  
  2548. }
  2549.  
  2550.  
  2551.  
  2552. void RegMulNum(int reg,unsigned long num,int razr,int sign,int *expand,int flag)
  2553.  
  2554. {
  2555.  
  2556. int vop,i=0;
  2557.  
  2558.         if((flag&f_reloc)!=0)goto num_imul;
  2559.  
  2560.         if(razr==r16)num&=0xffff;
  2561.  
  2562.         if(chip>2&&(*expand==FALSE)&&optimizespeed&&leamul32(num,reg,razr)){
  2563.  
  2564.                 setzeroflag=FALSE;
  2565.  
  2566.                 return;
  2567.  
  2568.         }
  2569.  
  2570.         switch(num){
  2571.  
  2572.                 case 0:
  2573.  
  2574.                         ZeroReg(reg,razr);
  2575.  
  2576.                         setzeroflag=TRUE;
  2577.  
  2578.                 case 1: *expand=FALSE; break; /* AX * 1 = AX */
  2579.  
  2580.                 case 2:  /* AX * 2 = ADD AX,AX */
  2581.  
  2582.                         if(*expand==TRUE){
  2583.  
  2584.                                 if(optimizespeed==FALSE)goto num_imul;
  2585.  
  2586.                                 if(sign)cwdq(razr);
  2587.  
  2588.                                 else{
  2589.  
  2590.                                         op66(razr);
  2591.  
  2592.                                         outword(0xD231);
  2593.  
  2594.                                 }
  2595.  
  2596.                         }
  2597.  
  2598.                         op66(razr);
  2599.  
  2600.                         op(1);
  2601.  
  2602.                         op(0xC0+9*reg); // ADD reg,reg
  2603.  
  2604.                         if(*expand==TRUE){
  2605.  
  2606.                                 op66(razr);
  2607.  
  2608.                                 outword(0xd283);        //adc dx,0
  2609.  
  2610.                                 op(0);
  2611.  
  2612.                                 ClearReg(DX);
  2613.  
  2614.                         }
  2615.  
  2616.                         setzeroflag=TRUE;
  2617.  
  2618.                         break;
  2619.  
  2620.                 default:
  2621.  
  2622.                         vop=caselong(num);
  2623.  
  2624.                         if(vop!=NUMNUM){
  2625.  
  2626.                                 if(chip<1&&razr==r16){
  2627.  
  2628.                                         if(*expand==TRUE){
  2629.  
  2630.                                                 if(optimizespeed==FALSE)goto num_imul;
  2631.  
  2632.                                                 op(0xB1);       op(vop); /* MOV CL,num */
  2633.  
  2634.                                                 op66(r16);
  2635.  
  2636.                                                 if(sign)op(0x99);
  2637.  
  2638.                                                 else outword(0xD231);
  2639.  
  2640.                                                 outdword(0xd213c001);   //ADD AX,AX ADC DX,DX
  2641.  
  2642.                                                 outword(0xfae2);  //LOOP -6
  2643.  
  2644.                                                 warningreg(regs[0][2]);
  2645.  
  2646.                                                 ClearReg(DX);
  2647.  
  2648.                                         }
  2649.  
  2650.                                         else{
  2651.  
  2652.                                                 if(reg==CX)goto num_imul;
  2653.  
  2654.                                                 if(vop>3){
  2655.  
  2656.                                                         for(;vop!=0;vop--){
  2657.  
  2658.                                                                 op66(r16);
  2659.  
  2660.                                                                 op(3);  //add
  2661.  
  2662.                                                                 op(0xc0+reg*9);
  2663.  
  2664.                                                         }
  2665.  
  2666.                                                         return;
  2667.  
  2668.                                                 }
  2669.  
  2670.                                                 op(0xB1);       op(vop); /* MOV CL,num */
  2671.  
  2672.                                                 op(0xD3);
  2673.  
  2674.                                                 op(0xE0+reg);   //SHL reg,CL
  2675.  
  2676.                                         }
  2677.  
  2678.                                         ConstToReg(vop,CL,r8);
  2679.  
  2680.                                         warningreg(begs[1]);
  2681.  
  2682.                                 }
  2683.  
  2684.                                 else{/* SHL AX,num */
  2685.  
  2686.                                         if(*expand==TRUE){
  2687.  
  2688.                                                 if(optimizespeed==FALSE)goto num_imul;
  2689.  
  2690. //                                              op66(razr);
  2691.  
  2692.                                                 ClearDX(razr,sign);
  2693.  
  2694. /*                                              if(sign)cwdq(razr);
  2695.  
  2696.                                                 else{
  2697.  
  2698.                                                         op66(razr);
  2699.  
  2700.                                                         outword(0xC031);
  2701.  
  2702.                                                 }*/
  2703.  
  2704.                                                 if(chip<3&&razr==r16){
  2705.  
  2706.                                                         op(0xB1);       op(vop); /* MOV CL,num */
  2707.  
  2708.                                                         outdword(0xd213c001);   //ADD AX,AX ADC DX,DX
  2709.  
  2710.                                                         outword(0xfae2);  //LOOP -6
  2711.  
  2712.                                                         ConstToReg(vop,CL,r8);
  2713.  
  2714.                                                         warningreg(begs[1]);
  2715.  
  2716.                                                 }
  2717.  
  2718.                                                 else{
  2719.  
  2720.                                                         op66(razr);
  2721.  
  2722.                                                         op(0x0f);
  2723.  
  2724.                                                         outword(0xC2a4);        //SHLD DX,AX,num
  2725.  
  2726.                                                         op(vop);
  2727.  
  2728.                                                         op66(razr);
  2729.  
  2730.                                                         outword(0xE0C1);        //SHL AX,num
  2731.  
  2732.                                                         op(vop);
  2733.  
  2734.                                                 }
  2735.  
  2736.                                                 ClearReg(DX);
  2737.  
  2738.                                                 warningreg(regs[razr/2-1][2]);
  2739.  
  2740.                                         }
  2741.  
  2742.                                         else{
  2743.  
  2744.                                                 op66(razr);
  2745.  
  2746.                                                 op(0xc1);
  2747.  
  2748.                                                 op(0xe0+reg); // SHL reg,imm8
  2749.  
  2750.                                                 op(vop);
  2751.  
  2752.                                                 if(cpu<2)cpu=2;
  2753.  
  2754.                                         }
  2755.  
  2756.                                 }
  2757.  
  2758.                                 setzeroflag=TRUE;
  2759.  
  2760.                                 break;
  2761.  
  2762.                         }
  2763.  
  2764.                         if(chip<7&&*expand==FALSE&&optimizespeed&&speedmul32(num,reg,razr))break;
  2765.  
  2766. num_imul:
  2767.  
  2768.                         if((razr==r16&&chip<2)||(*expand==TRUE)){
  2769.  
  2770.                                 if(reg==AX){
  2771.  
  2772.                                         op66(razr);
  2773.  
  2774.                                         op(0xB9);  /* MOV CX,# */
  2775.  
  2776.                                         if((flag&f_reloc)!=0)AddReloc();
  2777.  
  2778.                                         razr==r16?outword((unsigned int)num):outdword(num);
  2779.  
  2780.                                         op66(razr);
  2781.  
  2782.                                         if(sign)outword(0xE9F7); /* IMUL CX */
  2783.  
  2784.                                         else outword(0xE1F7); /* MUL CX */
  2785.  
  2786.                                         ConstToReg(num,CX,razr);
  2787.  
  2788.                                         warningreg(regs[razr/2-1][1]);
  2789.  
  2790.                                 }
  2791.  
  2792.                                 else{
  2793.  
  2794.                                         op66(r16);
  2795.  
  2796.                                         op(0x90+reg);   //XCHG AX,reg
  2797.  
  2798.                                         op66(r16);
  2799.  
  2800.                                         op(reg!=DX?0xBA:0xB9);
  2801.  
  2802.                                         outword(num);   //mov DX,num
  2803.  
  2804.                                         op66(r16);
  2805.  
  2806.                                         op(0xF7);
  2807.  
  2808.                                         op(reg!=DX?0xE2:0xE1);  // mul DX
  2809.  
  2810.                                         op66(r16);
  2811.  
  2812.                                         op(0x90+reg);   //XCHG AX,reg
  2813.  
  2814.                                         warningreg(regs[0][reg!=DX?2:1]);
  2815.  
  2816.                                         ClearReg(DX);
  2817.  
  2818.                                 }
  2819.  
  2820.                         }
  2821.  
  2822.                         else{
  2823.  
  2824.                                 if((flag&f_reloc)==0&&short_ok(num,razr/2-1))i=2;       //ª®à®âª ï ä®à¬ 
  2825.  
  2826.                                 op66(razr);
  2827.  
  2828.                                 op(0x69+i);     //imul
  2829.  
  2830.                                 op(0xc0+reg*9);
  2831.  
  2832.                                 if(i==2)op(num);
  2833.  
  2834.                                 else{
  2835.  
  2836.                                         if((flag&f_reloc)!=0)AddReloc();
  2837.  
  2838.                                         razr==r16?outword((unsigned int)num):outdword(num);
  2839.  
  2840.                                 }
  2841.  
  2842.                         }
  2843.  
  2844.                         setzeroflag=FALSE;
  2845.  
  2846.                         break;
  2847.  
  2848.         }
  2849.  
  2850. }
  2851.  
  2852.  
  2853.  
  2854. /* --------------- byte, char, word, int math starts ----------------- */
  2855.  
  2856.  
  2857.  
  2858. long long CalcNumber(int sign)
  2859.  
  2860. {
  2861.  
  2862. long long hold;
  2863.  
  2864.         switch(sign){
  2865.  
  2866.                 case 0:
  2867.  
  2868.                         hold=doconstdwordmath();
  2869.  
  2870.                         break;
  2871.  
  2872.                 case 1:
  2873.  
  2874.                         hold=doconstlongmath();
  2875.  
  2876.                         break;
  2877.  
  2878.                 case 2:
  2879.  
  2880.                         hold=doconstfloatmath();
  2881.  
  2882.                         break;
  2883.  
  2884.                 case 3:
  2885.  
  2886.                         hold=doconstdoublemath();
  2887.  
  2888.                         break;
  2889.  
  2890.                 default:
  2891.  
  2892.                         hold=doconstqwordmath();
  2893.  
  2894.                         break;
  2895.  
  2896.         }
  2897.  
  2898.         return hold;
  2899.  
  2900. }
  2901.  
  2902.  
  2903.  
  2904. int OnlyNumber(int sign)
  2905.  
  2906. /*-----------------11.09.00 12:44-------------------
  2907.  
  2908.  ¯à®¢¥à¨âì çâ® áâப  á®á⮨â ⮫쪮 ¨§ æ¨äà.
  2909.  
  2910. --------------------------------------------------*/
  2911.  
  2912. {
  2913.  
  2914. ITOK oitok=itok;
  2915.  
  2916. unsigned char ocha=cha2;
  2917.  
  2918. unsigned int oinptr=inptr2;
  2919.  
  2920. unsigned int otok2=tok2;
  2921.  
  2922. int otype2=itok2.type;
  2923.  
  2924.         itok.lnumber=CalcNumber(sign);
  2925.  
  2926. //      printf("tok=%d num=%d type=%d\n",tok,itok.number,itok.type);
  2927.  
  2928.         if(itok.type==tp_stopper){
  2929.  
  2930.                 return TRUE;    //⮫쪮 æ¨äàë
  2931.  
  2932.         }
  2933.  
  2934.         cha2=ocha;      //¢®áâ ­®¢¨âì ¨á室­®¥ á®áâ®ï­¨¥
  2935.  
  2936.         inptr2=oinptr;
  2937.  
  2938.         tok2=otok2;
  2939.  
  2940.         tok=tk_number;
  2941.  
  2942.         itok=oitok;
  2943.  
  2944.         itok2.type=(unsigned short)otype2;
  2945.  
  2946.         if(bufrm){
  2947.  
  2948.                 free(bufrm);
  2949.  
  2950.                 bufrm=NULL;
  2951.  
  2952.         }
  2953.  
  2954.         if(strinf.bufstr){
  2955.  
  2956.                 free(strinf.bufstr);
  2957.  
  2958.                 strinf.bufstr=NULL;
  2959.  
  2960.         }
  2961.  
  2962.         return FALSE;
  2963.  
  2964. }
  2965.  
  2966.  
  2967.  
  2968. void MultiAssignFloat(int type,int npointr=0)
  2969.  
  2970. {
  2971.  
  2972. int otok;
  2973.  
  2974. ITOK wtok;
  2975.  
  2976. char *wbuf;
  2977.  
  2978. SINFO wstr;
  2979.  
  2980. char *ofsstr=NULL;
  2981.  
  2982.         if(tok!=type)illegalfloat();
  2983.  
  2984.         wstr=strinf;
  2985.  
  2986.         strinf.bufstr=NULL;
  2987.  
  2988.         wtok=itok;
  2989.  
  2990.         wbuf=bufrm;
  2991.  
  2992.         bufrm=NULL;
  2993.  
  2994.         otok=tok;
  2995.  
  2996.         nexttok();
  2997.  
  2998. //      getoperand();
  2999.  
  3000. int numpointr=0;
  3001.  
  3002.         nexttok();
  3003.  
  3004.         if(tok==tk_float||tok==tk_double)nexttok();
  3005.  
  3006.         while(tok==tk_mult){
  3007.  
  3008.                 nexttok();
  3009.  
  3010.                 numpointr++;
  3011.  
  3012.         }
  3013.  
  3014.         if(numpointr>itok.npointr)unuseableinput();
  3015.  
  3016.         if(tok2==tk_assign)MultiAssignFloat(type,numpointr);
  3017.  
  3018.         else{
  3019.  
  3020.                 if(tok==tk_pointer)cpointr(BX,numpointr);
  3021.  
  3022.                 if(tok==tk_floatvar&&tok2==tk_semicolon){
  3023.  
  3024.                         tok=tk_dwordvar;
  3025.  
  3026.                         do_e_axmath(1,r32,&ofsstr);
  3027.  
  3028.                 }
  3029.  
  3030.                 else doeaxfloatmath(tk_reg32,AX);
  3031.  
  3032.         }
  3033.  
  3034.         if(otok==tk_pointer){
  3035.  
  3036.                 if(wtok.type==tk_proc){
  3037.  
  3038.                         wtok.rm=wtok.sib;
  3039.  
  3040.                         if(am32)wtok.sib=CODE32;
  3041.  
  3042.                         else wtok.sib=CODE16;
  3043.  
  3044.                         compressoffset(&wtok);
  3045.  
  3046.                 }
  3047.  
  3048.                 else{
  3049.  
  3050.                         int razr=typesize(itok.type);
  3051.  
  3052.                         if(npointr<=wtok.npointr)getpointeradr(&wtok,wbuf,&wstr,npointr-1,razr,BX);
  3053.  
  3054.                         else unuseableinput();
  3055.  
  3056.                         wtok=itok;
  3057.  
  3058.                 }
  3059.  
  3060.         }
  3061.  
  3062.         if((wtok.rm==rm_d16&&wtok.sib==CODE16)||(wtok.rm==rm_d32&&(wtok.sib==CODE32||wtok.sib==0))){
  3063.  
  3064.                 op66(r32);
  3065.  
  3066.                 outseg(&wtok,1);
  3067.  
  3068.                 op(0xA3); /* MOV [word],AX */
  3069.  
  3070.                 if(wtok.post==UNDEF_OFSET){
  3071.  
  3072.                         AddUndefOff(2,wtok.name);
  3073.  
  3074.                         wtok.post=0;
  3075.  
  3076.                 }
  3077.  
  3078.                 if(am32==FALSE)outword(wtok.number);    //????
  3079.  
  3080.                 else outdword(wtok.number);
  3081.  
  3082.         }
  3083.  
  3084.         else{
  3085.  
  3086.                 CheckAllMassiv(wbuf,r32,&wstr,&wtok);
  3087.  
  3088.                 op66(r32);
  3089.  
  3090.                 outseg(&wtok,2);
  3091.  
  3092.                 op(0x89); op(wtok.rm); /* MOV [rmword],reg */
  3093.  
  3094.                 outaddress(&wtok);
  3095.  
  3096.         }
  3097.  
  3098. }
  3099.  
  3100.  
  3101.  
  3102. int MultiAssign(int razr,int usereg,int npointr)
  3103.  
  3104. {
  3105.  
  3106. int otok;
  3107.  
  3108. ITOK wtok;
  3109.  
  3110. char *wbuf;
  3111.  
  3112. SINFO wstr;
  3113.  
  3114. int sign=0,rettype,nrazr,posiblret,pointr=0;
  3115.  
  3116. int hnumber=0;
  3117.  
  3118. int ureg;
  3119.  
  3120. char *ofsstr=NULL;
  3121.  
  3122.         wstr=strinf;
  3123.  
  3124.         strinf.bufstr=NULL;
  3125.  
  3126.         wtok=itok;
  3127.  
  3128.         wbuf=bufrm;
  3129.  
  3130.         bufrm=NULL;
  3131.  
  3132.         otok=tok;
  3133.  
  3134.         if(tok==tk_bits){
  3135.  
  3136.                 usereg=EAX;//USEONLY_AX;
  3137.  
  3138.                 nrazr=r32;
  3139.  
  3140.                 rettype=tk_dword;
  3141.  
  3142.                 int i=itok.bit.siz+itok.bit.ofs;
  3143.  
  3144.                 if(i<9){
  3145.  
  3146.                         nrazr=r8;
  3147.  
  3148.                         rettype=tk_byte;
  3149.  
  3150.                 }
  3151.  
  3152.                 else if(i<17){
  3153.  
  3154.                         rettype=tk_word;
  3155.  
  3156.                         nrazr=r16;
  3157.  
  3158.                 }
  3159.  
  3160.                 else if(i>32)nrazr=r64;
  3161.  
  3162.         }
  3163.  
  3164.         else{
  3165.  
  3166.                 nrazr=GetVarSize(tok);
  3167.  
  3168.                 switch(tok){
  3169.  
  3170.                         case tk_beg:
  3171.  
  3172.                                 ureg=itok.number;
  3173.  
  3174.                                 if(ureg>3)ureg-=4;
  3175.  
  3176.                                 if(usereg>ureg)usereg=ureg;
  3177.  
  3178.                                 break;
  3179.  
  3180.                         case tk_reg:
  3181.  
  3182.                         case tk_reg32:
  3183.  
  3184.                                 if(usereg>itok.number)usereg=itok.number;
  3185.  
  3186.                                 break;
  3187.  
  3188.                 }
  3189.  
  3190. //              if(tok==tk_beg)usereg|=USEFIRST4REG;
  3191.  
  3192.         }
  3193.  
  3194.         posiblret=nrazr;
  3195.  
  3196.         if(nrazr>razr&&nrazr<r64)razr=nrazr;
  3197.  
  3198.         switch ( razr ) {
  3199.  
  3200.                 case r8:
  3201.  
  3202.                         rettype=tk_byte;
  3203.  
  3204.                         break;
  3205.  
  3206.                 case r16:
  3207.  
  3208.                         rettype=tk_word;
  3209.  
  3210.                         break;
  3211.  
  3212.                 case r32:
  3213.  
  3214.                         rettype=tk_dword;
  3215.  
  3216.                         break;
  3217.  
  3218.         }
  3219.  
  3220.         nexttok();
  3221.  
  3222. int numpointr=0;
  3223.  
  3224.         ofsstr=GetLecsem(tk_assign,tk_semicolon);
  3225.  
  3226.         nexttok();
  3227.  
  3228.         convert_type(&sign,&rettype,&pointr);
  3229.  
  3230.         while(tok==tk_mult){
  3231.  
  3232.                 nexttok();
  3233.  
  3234.                 numpointr++;
  3235.  
  3236.         }
  3237.  
  3238.         if(numpointr>itok.npointr){
  3239.  
  3240.                 unuseableinput();
  3241.  
  3242.         }
  3243.  
  3244.         ureg=AX;
  3245.  
  3246.         if(tok2==tk_assign){
  3247.  
  3248.                 ureg=hnumber=MultiAssign(razr,usereg,numpointr);
  3249.  
  3250.                 if(ofsstr){
  3251.  
  3252.                         free(ofsstr);
  3253.  
  3254.                         ofsstr=NULL;
  3255.  
  3256.                 }
  3257.  
  3258.         }
  3259.  
  3260.         else{
  3261.  
  3262.                 if(tok==tk_pointer){
  3263.  
  3264.                         int reg=idxregs[2];
  3265.  
  3266.                         if(reg==ureg)reg=idxregs[1];
  3267.  
  3268.                         cpointr(reg,numpointr);
  3269.  
  3270.                 }
  3271.  
  3272.                 if(usereg==USEALLREG){
  3273.  
  3274.                         switch(tok){
  3275.  
  3276.                                 case tk_reg:
  3277.  
  3278.                                 case tk_reg32:
  3279.  
  3280.                                         usereg=itok.number;
  3281.  
  3282.                                         break;
  3283.  
  3284.                                 case tk_beg:
  3285.  
  3286.                                         usereg=(itok.number>3?itok.number-4:itok.number);
  3287.  
  3288.                                         break;
  3289.  
  3290.                                 default:
  3291.  
  3292.                                         usereg=EAX;
  3293.  
  3294.                                         break;
  3295.  
  3296.                         }
  3297.  
  3298.                 }
  3299.  
  3300.                 switch(rettype){
  3301.  
  3302.                         case tk_char:
  3303.  
  3304.                         case tk_byte:
  3305.  
  3306.                                 if(tok2==tk_semicolon&&usereg!=0&&usereg<4){
  3307.  
  3308.                                         ureg=hnumber=usereg;
  3309.  
  3310. //                                      if(tok==tk_beg&&itok.number<4)ureg=hnumber=itok.number;
  3311.  
  3312.                                         getintoreg(usereg,r16,sign,&ofsstr);
  3313.  
  3314.                                 }
  3315.  
  3316. /*                              if(tok2==tk_semicolon&&tok==tk_beg&&usereg<2){
  3317.  
  3318.                                         if((usereg==1&&itok.number<4)||usereg==0){
  3319.  
  3320.                                                 ureg=hnumber=itok.number;
  3321.  
  3322.                                                 nexttok();
  3323.  
  3324.                                                 break;
  3325.  
  3326.                                         }
  3327.  
  3328.                                 }*/
  3329.  
  3330.                                 else doalmath(sign,&ofsstr);
  3331.  
  3332.                                 if(ofsstr)IDZToReg(ofsstr,usereg,r8);
  3333.  
  3334.                                 break;
  3335.  
  3336.                         case tk_int:
  3337.  
  3338.                         case tk_word:
  3339.  
  3340.                                 if(tok2==tk_semicolon&&usereg!=0){
  3341.  
  3342.                                         ureg=hnumber=usereg;
  3343.  
  3344. //                                      if(tok==tk_reg)ureg=hnumber=itok.number;
  3345.  
  3346.                                         getintoreg(usereg,r16,sign,&ofsstr);
  3347.  
  3348.                                 }
  3349.  
  3350.                                 else do_e_axmath(sign,r16,&ofsstr);
  3351.  
  3352.                                 if(ofsstr)IDZToReg(ofsstr,usereg,r16);
  3353.  
  3354.                                 break;
  3355.  
  3356.                         case tk_float:
  3357.  
  3358.                                 doeaxfloatmath(tk_reg32,AX);
  3359.  
  3360.                                 break;
  3361.  
  3362.                         default:
  3363.  
  3364.                                 if(tok2==tk_semicolon&&usereg!=0&&tok!=tk_floatvar){
  3365.  
  3366.                                         ureg=hnumber=usereg;
  3367.  
  3368. //                                      if(tok==tk_reg32)ureg=hnumber=itok.number;
  3369.  
  3370.                                         getintoreg(usereg,r32,sign,&ofsstr);
  3371.  
  3372.                                 }
  3373.  
  3374.                                 else{
  3375.  
  3376.                                         if(tok==tk_floatvar&&tok2==tk_semicolon)tok=tk_dwordvar;
  3377.  
  3378.                                         do_e_axmath(sign,r32,&ofsstr);
  3379.  
  3380.                                 }
  3381.  
  3382.                                 if(ofsstr)IDZToReg(ofsstr,usereg,r32);
  3383.  
  3384.                                 break;
  3385.  
  3386.                 }
  3387.  
  3388.         }
  3389.  
  3390.         if(ofsstr){
  3391.  
  3392.                 free(ofsstr);
  3393.  
  3394.                 ofsstr=NULL;
  3395.  
  3396.         }
  3397.  
  3398.         switch ( nrazr ) {
  3399.  
  3400.                 case r8:
  3401.  
  3402.                         posiblret=tk_byte;
  3403.  
  3404.                         break;
  3405.  
  3406.                 case r16:
  3407.  
  3408.                         posiblret=tk_word;
  3409.  
  3410.                         break;
  3411.  
  3412.                 case r32:
  3413.  
  3414.                         posiblret=tk_dword;
  3415.  
  3416.                         break;
  3417.  
  3418.         }
  3419.  
  3420.         convert_returnvalue(posiblret,rettype);
  3421.  
  3422.         if(otok==tk_pointer)cwpointr(&wtok,wbuf,&wstr,&otok,npointr,ureg);
  3423.  
  3424.         switch ( otok ) {
  3425.  
  3426.                 case tk_intvar:
  3427.  
  3428.                 case tk_wordvar:
  3429.  
  3430.                 case tk_longvar:
  3431.  
  3432.                 case tk_dwordvar:
  3433.  
  3434.                 case tk_floatvar:
  3435.  
  3436. #ifdef OPTVARCONST
  3437.  
  3438.                         CheckRegToConst(hnumber,&wtok,otok>tk_wordvar?r32:r16);
  3439.  
  3440. #endif
  3441.  
  3442.                         KillVar(wtok.name);
  3443.  
  3444.                         AddRegVar(hnumber,razr,&wtok);
  3445.  
  3446.                         if(hnumber==0&&((wtok.rm==rm_d16&&wtok.sib==CODE16)||(wtok.rm==rm_d32&&(wtok.sib==CODE32||wtok.sib==0)))){
  3447.  
  3448.                                 op66(nrazr);
  3449.  
  3450.                                 outseg(&wtok,1);
  3451.  
  3452.                                 op(0xA3); /* MOV [word],AX */
  3453.  
  3454.                                 if(wtok.post==UNDEF_OFSET){
  3455.  
  3456.                                         AddUndefOff(2,wtok.name);
  3457.  
  3458.                                         wtok.post=0;
  3459.  
  3460.                                 }
  3461.  
  3462.                                 if(am32==FALSE)outword(wtok.number);    //????
  3463.  
  3464.                                 else outdword(wtok.number);
  3465.  
  3466.                         }
  3467.  
  3468.                         else{
  3469.  
  3470.                                 CheckAllMassiv(wbuf,nrazr,&wstr,&wtok);
  3471.  
  3472.                                 op66(nrazr);
  3473.  
  3474.                                 outseg(&wtok,2);
  3475.  
  3476.                                 op(0x89); op(wtok.rm+hnumber*8); /* MOV [rmword],reg */
  3477.  
  3478.                                 outaddress(&wtok);
  3479.  
  3480.                         }
  3481.  
  3482.                         break;
  3483.  
  3484.                 case tk_charvar:
  3485.  
  3486.                 case tk_bytevar:
  3487.  
  3488. #ifdef OPTVARCONST
  3489.  
  3490.                         CheckRegToConst(hnumber,&wtok,r8);
  3491.  
  3492. #endif
  3493.  
  3494.                         KillVar(wtok.name);
  3495.  
  3496.                         AddRegVar(hnumber,r8,&wtok);
  3497.  
  3498.                         if(hnumber==0&&((wtok.rm==rm_d16&&wtok.sib==CODE16)||(wtok.rm==rm_d32&&(wtok.sib==CODE32||wtok.sib==0)))){
  3499.  
  3500.                                 outseg(&wtok,1);
  3501.  
  3502.                                 op(0xA2);               /* MOV [byte],AL */
  3503.  
  3504.                                 if(wtok.post==UNDEF_OFSET){
  3505.  
  3506.                                         AddUndefOff(2,wtok.name);
  3507.  
  3508.                                         wtok.post=0;
  3509.  
  3510.                                 }
  3511.  
  3512.                                 if(am32==FALSE)outword(wtok.number);
  3513.  
  3514.                                 else outdword(wtok.number);
  3515.  
  3516.                         }
  3517.  
  3518.                         else{
  3519.  
  3520.                                 CheckAllMassiv(wbuf,1,&wstr,&wtok);
  3521.  
  3522.                                 outseg(&wtok,2);  /* MOV [rmbyte],AL */
  3523.  
  3524.                                 op(0x88);
  3525.  
  3526.                                 op(wtok.rm+hnumber*8);
  3527.  
  3528.                                 outaddress(&wtok);
  3529.  
  3530.                         }
  3531.  
  3532.                         break;
  3533.  
  3534.                 case tk_bits:
  3535.  
  3536.                         if(razr!=r64){
  3537.  
  3538.                                 op66(nrazr==r32?r32:r16);
  3539.  
  3540.                                 op(0x50);       //push eax
  3541.  
  3542.                                 if(ESPloc&&am32&&wtok.segm==SS)wtok.number+=4;
  3543.  
  3544.                                 reg2bits(&wtok,razr);
  3545.  
  3546.                                 op66(nrazr==r32?r32:r16);
  3547.  
  3548.                                 op(0x58);       //pop eax
  3549.  
  3550.                         }
  3551.  
  3552.                         else{
  3553.  
  3554.                                 op66(r32);
  3555.  
  3556.                                 op(0x50);       //push eax
  3557.  
  3558.                                 int siz=wtok.bit.siz;
  3559.  
  3560.                                 op66(r32);
  3561.  
  3562.                                 op(0x50);       //push eax
  3563.  
  3564.                                 wtok.bit.siz=32-wtok.bit.ofs;
  3565.  
  3566.                                 if(ESPloc&&am32&&wtok.segm==SS)wtok.number+=8;
  3567.  
  3568.                                 reg2bits(&wtok,r32);
  3569.  
  3570.                                 op66(r32);
  3571.  
  3572.                                 op(0x58);       //pop eax
  3573.  
  3574.                                 op66(r32);      //shr eax,size
  3575.  
  3576.                                 outword(0xE8C1);
  3577.  
  3578.                                 op(wtok.bit.siz);
  3579.  
  3580.                                 wtok.bit.siz=siz+wtok.bit.ofs-32;
  3581.  
  3582.                                 wtok.bit.ofs=0;
  3583.  
  3584.                                 wtok.number+=4;
  3585.  
  3586.                                 reg2bits(&wtok,r8);
  3587.  
  3588.                                 op66(r32);
  3589.  
  3590.                                 op(0x58);       //pop eax
  3591.  
  3592.                         }
  3593.  
  3594.                         break;
  3595.  
  3596.                 case tk_reg:
  3597.  
  3598.                 case tk_reg32:
  3599.  
  3600.                         if(wtok.number!=hnumber){
  3601.  
  3602.                                 if(RegToReg(hnumber,wtok.number,nrazr)==NOINREG){
  3603.  
  3604.                                         op66(nrazr);
  3605.  
  3606.                                         op(0x89);
  3607.  
  3608.                                         op(0xC0+wtok.number+hnumber*8); //mov reg,AX
  3609.  
  3610.                                 }
  3611.  
  3612.                                 else waralreadinitreg(regs[nrazr/4][wtok.number],regs[nrazr/4][hnumber]);
  3613.  
  3614.                         }
  3615.  
  3616.                         break;
  3617.  
  3618.                 case tk_beg:
  3619.  
  3620.                         if(razr>r8&&wtok.number>3&&(wtok.number%4)==hnumber)preerror("register AH,BH,CH,DH should be first");
  3621.  
  3622.                         if(wtok.number!=hnumber){
  3623.  
  3624.                                 if(RegToReg(hnumber,wtok.number,r8)==NOINREG){
  3625.  
  3626.                                         op(0x88);
  3627.  
  3628.                                         op(0xC0+wtok.number+hnumber*8); //mov beg,AL
  3629.  
  3630.                                 }
  3631.  
  3632.                                 else waralreadinitreg(begs[wtok.number],begs[hnumber]);
  3633.  
  3634.                         }
  3635.  
  3636.                         break;
  3637.  
  3638.                 case tk_seg:
  3639.  
  3640.                         op(0x8E);       /* MOV SEG,AX */
  3641.  
  3642.                         op(0xC0+wtok.number*8+hnumber);
  3643.  
  3644.                         break;
  3645.  
  3646.                 default:
  3647.  
  3648.                         thisundefined(wtok.name);
  3649.  
  3650.         }
  3651.  
  3652.         return hnumber;
  3653.  
  3654. }
  3655.  
  3656.  
  3657.  
  3658. int do_d_wordvar(int sign,int razr,int terminater)      //signed or unsigned 16 or 32 bit memory variable
  3659.  
  3660. {
  3661.  
  3662. unsigned char next=1,getfromAX=0;
  3663.  
  3664. unsigned int vop=0,otok,rettype,posiblret;
  3665.  
  3666. ITOK wtok;
  3667.  
  3668. char *wbuf,*rbuf;
  3669.  
  3670. SINFO wstr;
  3671.  
  3672. int retrez=0,pointr=0,hnumber=EAX;
  3673.  
  3674. int numpointr=0;
  3675.  
  3676. char *ofsstr=NULL;
  3677.  
  3678. int reg1=idxregs[0],reg2=idxregs[1];
  3679.  
  3680. #ifdef OPTVARCONST
  3681.  
  3682. int initconst=FALSE;
  3683.  
  3684. int operand;
  3685.  
  3686. #endif
  3687.  
  3688. unsigned int oaddESP=addESP;
  3689.  
  3690. //      sign==0?rettype=(razr==r16?tk_word:tk_dword):rettype=(razr==r16?tk_int:tk_long);
  3691.  
  3692.         posiblret=rettype=(sign==0?(razr==r16?tk_word:tk_dword):(razr==r16?tk_int:tk_long));
  3693.  
  3694.         wstr=strinf;
  3695.  
  3696.         strinf.bufstr=NULL;
  3697.  
  3698.         wtok=itok;
  3699.  
  3700.         wbuf=bufrm;
  3701.  
  3702.         bufrm=NULL;
  3703.  
  3704.         otok=tok;
  3705.  
  3706.         while(RmEqualReg(hnumber,itok.rm,itok.sib))hnumber++;
  3707.  
  3708.         nexttok();
  3709.  
  3710. #ifdef OPTVARCONST
  3711.  
  3712.         operand=tok;
  3713.  
  3714. #endif
  3715.  
  3716.         switch(tok){
  3717.  
  3718.                 case tk_assign: //=
  3719.  
  3720.                         if(!((tok2==tk_reg||tok2==tk_reg32)&&ScanTok3()==terminater)){
  3721.  
  3722.                                 ofsstr=GetLecsem(terminater);
  3723.  
  3724.                         }
  3725.  
  3726.                         if(ofsstr){
  3727.  
  3728.                                 int retreg;
  3729.  
  3730.                                 if((retreg=CheckIDZReg(ofsstr,AX,razr))!=NOINREG){
  3731.  
  3732.                                         GetEndLex(terminater);
  3733.  
  3734.                                         if(retreg==SKIPREG)retreg=AX;
  3735.  
  3736.                                         if((GetRegVar(&wtok)&(1<<retreg))!=0){
  3737.  
  3738.                                                 free(ofsstr);
  3739.  
  3740.                                                 if(wbuf)free(wbuf);
  3741.  
  3742.                                                 if(wstr.bufstr)free(wstr.bufstr);
  3743.  
  3744.                                                 break;
  3745.  
  3746.                                         }
  3747.  
  3748.                                         if(razr==r16)tok=tk_reg;
  3749.  
  3750.                                         else tok=tk_reg32;
  3751.  
  3752.                                         itok.number=retreg;
  3753.  
  3754.                                         if(reg1==itok.number){
  3755.  
  3756.                                                 reg1=idxregs[1]; reg2=idxregs[2];
  3757.  
  3758.                                         }
  3759.  
  3760.                                         if(reg2==itok.number){
  3761.  
  3762.                                                 reg2=idxregs[2];
  3763.  
  3764.                                         }
  3765.  
  3766.                                         goto regtovar;
  3767.  
  3768.                                 }
  3769.  
  3770.                         }
  3771.  
  3772.                         nexttok();
  3773.  
  3774. //                      printf("tok=%d %s\n",tok,itok.name);
  3775.  
  3776.                         convert_type(&sign,(int *)&rettype,&pointr);
  3777.  
  3778.                         while(tok==tk_mult){
  3779.  
  3780.                                 nexttok();
  3781.  
  3782.                                 numpointr++;
  3783.  
  3784.                         }
  3785.  
  3786.                         if(numpointr>itok.npointr){
  3787.  
  3788.                                 unuseableinput();
  3789.  
  3790.                         }
  3791.  
  3792.                         if(tok2==tk_assign){
  3793.  
  3794.                                 hnumber=MultiAssign(razr,USEALLREG,numpointr);
  3795.  
  3796.                                 if(ofsstr){
  3797.  
  3798.                                         free(ofsstr);
  3799.  
  3800.                                         ofsstr=NULL;
  3801.  
  3802.                                 }
  3803.  
  3804.                                 next=0;
  3805.  
  3806.                                 goto getfromax;
  3807.  
  3808.                         }
  3809.  
  3810.                         if(tok==tk_pointer)cpointr(am32==TRUE?EAX:BX,numpointr);
  3811.  
  3812.                         CheckMinusNum();
  3813.  
  3814. //                      printf("tok=%d tok2=%d\n",tok,tok2);
  3815.  
  3816.                         if(itok2.type==tp_opperand){    //á«®¦­®¥ ¢ëà ¦¥­¨¥
  3817.  
  3818.                                 if(tok==tk_number){     //¯à®¢¥àª  ¨ á㬬¨à®¢ ­¨¥ ç¨á¥«
  3819.  
  3820.                                         if(OnlyNumber(rettype==tk_float?2:sign)){
  3821.  
  3822.                                                 next=0;
  3823.  
  3824.                                                 itok.flag=(unsigned char)postnumflag;
  3825.  
  3826.                                                 if(postnumflag==0)goto loadconst;
  3827.  
  3828.                                                 goto numbertovar;
  3829.  
  3830.                                         }
  3831.  
  3832.                                 }
  3833.  
  3834.                                 goto labl1;
  3835.  
  3836.                         }
  3837.  
  3838.                         else{
  3839.  
  3840. //                              if(hnumber!=EAX&&(tok==tk_reg||tok==tk_reg32)&&itok.number==EAX)goto labl1;
  3841.  
  3842. #ifdef OPTVARCONST
  3843.  
  3844.                                 CheckConstVar3(&tok,&itok,razr);
  3845.  
  3846. #endif
  3847.  
  3848.                                 switch(tok){
  3849.  
  3850.                                         case tk_number:
  3851.  
  3852. loadconst:
  3853.  
  3854.                                                 if((itok.flag&f_reloc)==0){
  3855.  
  3856. #ifdef OPTVARCONST
  3857.  
  3858.                                                         if(razr==r16)itok.lnumber&=0xffff;
  3859.  
  3860.                                                         else itok.lnumber&=0xffffffff;
  3861.  
  3862.                                                         if((initconst=Const2Var(&wtok,itok.lnumber,itok.rm))==FALSE){
  3863.  
  3864.                                                                 waralreadinitvar(wtok.name,itok.number);
  3865.  
  3866.                                                                 initconst=TRUE;
  3867.  
  3868.                                                                 break;
  3869.  
  3870.                                                         }
  3871.  
  3872. #endif
  3873.  
  3874.                                                         if(itok.number==0){
  3875.  
  3876.                                                                 CheckAllMassiv(wbuf,razr,&wstr,&wtok);
  3877.  
  3878.                                                                 op66(razr);
  3879.  
  3880.                                                                 outseg(&wtok,2);
  3881.  
  3882.                                                                 op(0x83);
  3883.  
  3884.                                                                 op(wtok.rm+0x20);
  3885.  
  3886.                                                                 outaddress(&wtok);
  3887.  
  3888.                                                                 op(0);
  3889.  
  3890.                                                                 break;
  3891.  
  3892.                                                         }
  3893.  
  3894.                                                         if((razr==r32&&itok.number==0xFFFFFFFF)||(razr==r16&&itok.number==0xFFFF)){
  3895.  
  3896.                                                                 CheckAllMassiv(wbuf,razr,&wstr,&wtok);
  3897.  
  3898.                                                                 op66(razr);
  3899.  
  3900.                                                                 outseg(&wtok,2);
  3901.  
  3902.                                                                 op(0x83);
  3903.  
  3904.                                                                 op(wtok.rm+0x8);
  3905.  
  3906.                                                                 outaddress(&wtok);
  3907.  
  3908.                                                                 op(0xFF);
  3909.  
  3910.                                                                 break;
  3911.  
  3912.                                                         }
  3913.  
  3914.                                                         if(regoverstack&&razr==r32&&short_ok(itok.number,TRUE)){
  3915.  
  3916.                                                                 CheckAllMassiv(wbuf,razr,&wstr,&wtok);
  3917.  
  3918.                                                                 op66(razr);
  3919.  
  3920.                                                                 op(0x6A);
  3921.  
  3922.                                                                 op(itok.number);        //push short number
  3923.  
  3924.                                                                 op66(razr);
  3925.  
  3926.                                                                 outseg(&wtok,2);
  3927.  
  3928.                                                                 op(0x8f);
  3929.  
  3930.                                                                 op(wtok.rm);
  3931.  
  3932.                                                                 outaddress(&wtok);
  3933.  
  3934.                                                                 break;
  3935.  
  3936.                                                         }
  3937.  
  3938.                                                 }
  3939.  
  3940.                                         case tk_postnumber:
  3941.  
  3942.                                         case tk_undefofs:
  3943.  
  3944. numbertovar:
  3945.  
  3946.                                                 CheckAllMassiv(wbuf,razr,&wstr,&wtok);
  3947.  
  3948.                                                 op66(razr);
  3949.  
  3950.                                                 outseg(&wtok,2);
  3951.  
  3952.                                                 op(0xC7);       //mov word[],number
  3953.  
  3954.                                                 op(wtok.rm);
  3955.  
  3956.                                                 outaddress(&wtok);
  3957.  
  3958.                                                 if(tok==tk_postnumber)(itok.flag&f_extern)==0?setwordpost(&itok):setwordext(&itok.number);
  3959.  
  3960.                                                 else if(tok==tk_undefofs)AddUndefOff(0,itok.name);
  3961.  
  3962.                                                 else if((itok.flag&f_reloc)!=0)AddReloc();
  3963.  
  3964.                                                 if(razr==r16){
  3965.  
  3966.                                                         if(am32!=FALSE&&tok!=tk_number)dwordvalexpected();
  3967.  
  3968.                                                         outword((unsigned int)itok.number);
  3969.  
  3970.                                                 }
  3971.  
  3972.                                                 else outdword(itok.number);
  3973.  
  3974.                                                 break;
  3975.  
  3976.                                         case tk_apioffset:
  3977.  
  3978.                                                 CheckAllMassiv(wbuf,razr,&wstr,&wtok);
  3979.  
  3980.                                                 op66(razr);
  3981.  
  3982.                                                 outseg(&wtok,2);
  3983.  
  3984.                                                 op(0xC7);       //mov word[],number
  3985.  
  3986.                                                 op(wtok.rm);
  3987.  
  3988.                                                 outaddress(&wtok);
  3989.  
  3990.                                                 AddApiToPost(itok.number);
  3991.  
  3992.                                                 break;
  3993.  
  3994.                                         case tk_reg32:
  3995.  
  3996. //                                              if(razr==r16)goto labl1;
  3997.  
  3998.                                         case tk_reg:
  3999.  
  4000.                                                 if(razr==r32&&tok==tk_reg)goto labl1;
  4001.  
  4002. regtovar:
  4003.  
  4004.                                                 if((unsigned int)itok.number==0){
  4005.  
  4006.                                                         getfromAX=1;
  4007.  
  4008.                                                         hnumber=0;
  4009.  
  4010.                                                 }
  4011.  
  4012.                                                 else{
  4013.  
  4014. //                                                      if(wbuf==0&&wstr.bufstr==NULL){
  4015.  
  4016.                                                                 KillVar(wtok.name);
  4017.  
  4018.                                                                 AddRegVar(itok.number,razr,&wtok);
  4019.  
  4020.                                                                 vop++;
  4021.  
  4022. //                                                      }
  4023.  
  4024.                                                         CheckAllMassiv(wbuf,razr,&wstr,&wtok,reg1,reg2);
  4025.  
  4026.                                                         op66(razr);
  4027.  
  4028.                                                         outseg(&wtok,2);
  4029.  
  4030.                                                         op(0x89);
  4031.  
  4032.                                                         op((unsigned int)itok.number*8+wtok.rm);
  4033.  
  4034.                                                         outaddress(&wtok);
  4035.  
  4036.                                                 }
  4037.  
  4038.                                                 break;
  4039.  
  4040.                                         case tk_seg:
  4041.  
  4042.                                                 if(razr==r32)goto labl1;
  4043.  
  4044.                                                 CheckAllMassiv(wbuf,2,&wstr,&wtok);
  4045.  
  4046.                                                 op66(r16);
  4047.  
  4048.                                                 outseg(&wtok,2);
  4049.  
  4050.                                                 op(0x8C);
  4051.  
  4052.                                                 op((unsigned int)itok.number*8+wtok.rm);
  4053.  
  4054.                                                 outaddress(&wtok);
  4055.  
  4056.                                                 if((unsigned int)itok.number==FS||(unsigned int)itok.number==GS)if(cpu<3)cpu=3;
  4057.  
  4058.                                                 break;
  4059.  
  4060.                                         case tk_string:
  4061.  
  4062.                                                 CheckAllMassiv(wbuf,1,&wstr,&wtok);
  4063.  
  4064.                                                 op66(razr);
  4065.  
  4066.                                                 outseg(&wtok,2);
  4067.  
  4068.                                                 op(0xC7);
  4069.  
  4070.                                                 op(wtok.rm);
  4071.  
  4072.                                                 outaddress(&wtok);
  4073.  
  4074.                                                 if(razr==r16){
  4075.  
  4076.                                                         if(am32)dwordvalexpected();
  4077.  
  4078.                                                         outword(addpoststring());
  4079.  
  4080.                                                 }
  4081.  
  4082.                                                 else outdword(addpoststring());
  4083.  
  4084.                                                 break;
  4085.  
  4086.                                         case tk_doublevar:
  4087.  
  4088.                                                 vop=4;
  4089.  
  4090.                                         case tk_floatvar:
  4091.  
  4092.                                                 intinstack(vop);
  4093.  
  4094.                                                 getfromAX=0;
  4095.  
  4096.                                                 CheckAllMassiv(wbuf,4,&wstr,&wtok);
  4097.  
  4098.                                                 outseg(&wtok,2);        //fistp var
  4099.  
  4100.                                                 op(razr==r16?0xDF:0xDB);
  4101.  
  4102.                                                 op(wtok.rm+0x18);
  4103.  
  4104.                                                 outaddress(&wtok);
  4105.  
  4106.                                                 if(sign==0)warningretsign();
  4107.  
  4108.                                                 fwait3();
  4109.  
  4110.                                                 hnumber=EAX;
  4111.  
  4112.                                                 break;
  4113.  
  4114.                                         case tk_new:
  4115.  
  4116.                                                 donew();
  4117.  
  4118.                                                 getfromAX=1;
  4119.  
  4120.                                                 clearregstat();
  4121.  
  4122. #ifdef OPTVARCONST
  4123.  
  4124.                                                 FreeGlobalConst();
  4125.  
  4126. #endif
  4127.  
  4128.                                                 if(ofsstr){
  4129.  
  4130.                                                         free(ofsstr);
  4131.  
  4132.                                                         ofsstr=NULL;
  4133.  
  4134.                                                 }
  4135.  
  4136.                                                 hnumber=0;
  4137.  
  4138.                                                 break;
  4139.  
  4140.                                         case tk_delete:
  4141.  
  4142.                                                 dodelete();
  4143.  
  4144.                                                 terminater=next=0;
  4145.  
  4146.                                                 getfromAX=1;
  4147.  
  4148.                                                 clearregstat();
  4149.  
  4150. #ifdef OPTVARCONST
  4151.  
  4152.                                                 FreeGlobalConst();
  4153.  
  4154. #endif
  4155.  
  4156.                                                 if(ofsstr)free(ofsstr);
  4157.  
  4158.                                                 hnumber=0;
  4159.  
  4160.                                                 break;
  4161.  
  4162.                                         case tk_longvar:
  4163.  
  4164.                                         case tk_dwordvar:
  4165.  
  4166.                                                 if((rettype==tk_long||rettype==tk_dword)&&hnumber&&regoverstack)goto pushvar;
  4167.  
  4168.                                                 goto labl1;
  4169.  
  4170.                                         case tk_intvar:
  4171.  
  4172.                                         case tk_wordvar:
  4173.  
  4174.                                                 if((rettype==tk_int||rettype==tk_word)&&hnumber&&regoverstack){
  4175.  
  4176. pushvar:
  4177.  
  4178.                                                         CheckAllMassiv(bufrm,razr,&strinf);
  4179.  
  4180.                                                         op66(razr);
  4181.  
  4182.                                                         outseg(&itok,2);
  4183.  
  4184.                                                         op(0xFF);       // PUSH [dword]
  4185.  
  4186.                                                         op(0x30+itok.rm);
  4187.  
  4188.                                                         outaddress(&itok);
  4189.  
  4190.                                                         CheckAllMassiv(wbuf,razr,&wstr,&wtok);
  4191.  
  4192.                                                         op66(razr);
  4193.  
  4194.                                                         outseg(&wtok,2);
  4195.  
  4196.                                                         op(0x8f);
  4197.  
  4198.                                                         op(wtok.rm);
  4199.  
  4200.                                                         outaddress(&wtok);
  4201.  
  4202.                                                         break;
  4203.  
  4204.                                                 }
  4205.  
  4206.                                                 goto labl1;
  4207.  
  4208.                                         default:
  4209.  
  4210. labl1:
  4211.  
  4212.                                                 getfromAX=1;
  4213.  
  4214.                                                 if(rettype==tk_char||rettype==tk_byte){
  4215.  
  4216.                                                         if(hnumber==0)retrez=doalmath(sign,&ofsstr);
  4217.  
  4218.                                                         else{
  4219.  
  4220.                                                                 retrez=getintoreg(hnumber,razr,sign,&ofsstr);
  4221.  
  4222.                                                                 posiblret=rettype;
  4223.  
  4224.                                                         }
  4225.  
  4226.                                                 }
  4227.  
  4228.                                                 else if(rettype==tk_int||rettype==tk_word){
  4229.  
  4230.                                                         if(hnumber==0)retrez=do_e_axmath(sign,r16,&ofsstr);
  4231.  
  4232.                                                         else retrez=getintoreg(hnumber,r16,sign,&ofsstr);
  4233.  
  4234.                                                 }
  4235.  
  4236.                                                 else if(rettype==tk_float||rettype==tk_double){
  4237.  
  4238.                                                         doeaxfloatmath(tk_fpust,AX,rettype==tk_float?0:4);
  4239.  
  4240.                                                         getfromAX=0;
  4241.  
  4242.                                                         CheckAllMassiv(wbuf,4,&wstr,&wtok);
  4243.  
  4244.                                                         outseg(&wtok,2);        //fistp var
  4245.  
  4246.                                                         op(razr==r16?0xDF:0xDB);
  4247.  
  4248.                                                         op(wtok.rm+0x18);
  4249.  
  4250.                                                         outaddress(&wtok);
  4251.  
  4252.                                                         if(sign==0)warningretsign();
  4253.  
  4254.                                                         fwait3();
  4255.  
  4256.                                                         hnumber=EAX;
  4257.  
  4258.                                                 }
  4259.  
  4260.                                                 else{
  4261.  
  4262.                                                         if(hnumber==0)retrez=do_e_axmath(sign,r32,&ofsstr);
  4263.  
  4264.                                                         else retrez=getintoreg(hnumber,r32,sign,&ofsstr);
  4265.  
  4266.                                                 }
  4267.  
  4268.                                                 next=0;
  4269.  
  4270.                                                 break;
  4271.  
  4272.                                 }
  4273.  
  4274.                         }
  4275.  
  4276.                         if(getfromAX){
  4277.  
  4278. getfromax:
  4279.  
  4280. #ifdef OPTVARCONST
  4281.  
  4282.                                 initconst=CheckRegToConst(hnumber,&wtok,razr);
  4283.  
  4284. #endif
  4285.  
  4286.                                 if(retrez==0)retrez=razr==r16?tk_reg:tk_reg32;
  4287.  
  4288.                                 convert_returnvalue(posiblret,rettype);
  4289.  
  4290.                                 if(addESP!=oaddESP&&am32&&ESPloc&&(wtok.type==tp_paramvar||wtok.type==tp_localvar))wtok.number+=addESP-oaddESP;
  4291.  
  4292.                                 if(wbuf==NULL&&wstr.bufstr==NULL&&hnumber==0&&
  4293.  
  4294.                                                 ((wtok.rm==rm_d16&&wtok.sib==CODE16)||
  4295.  
  4296.                                                 (wtok.rm==rm_d32&&(wtok.sib==CODE32||wtok.sib==0)))){
  4297.  
  4298.                                         op66(razr);
  4299.  
  4300.                                         outseg(&wtok,1);
  4301.  
  4302.                                         op(0xA3); // MOV [word],AX
  4303.  
  4304.                                         if(wtok.post==UNDEF_OFSET){
  4305.  
  4306.                                                 AddUndefOff(2,wtok.name);
  4307.  
  4308.                                                 wtok.post=0;
  4309.  
  4310.                                         }
  4311.  
  4312.                                         if(am32==FALSE)outword(wtok.number);    //????
  4313.  
  4314.                                         else outdword(wtok.number);
  4315.  
  4316.                                 }
  4317.  
  4318.                                 else{
  4319.  
  4320.                                         CheckAllMassiv(wbuf,razr,&wstr,&wtok,reg1,reg2);
  4321.  
  4322. //      printf("flag=%08X rm=%d num=%d post=%d sib=%d\n",wtok.flag,wtok.rm,wtok.number,wtok.post,wtok.sib);
  4323.  
  4324.                                         op66(razr);
  4325.  
  4326.                                         outseg(&wtok,2);
  4327.  
  4328.                                         op(0x89); op(wtok.rm+hnumber*8); // MOV [rmword],AX
  4329.  
  4330.                                         outaddress(&wtok);
  4331.  
  4332.                                 }
  4333.  
  4334.                                 if(ofsstr)IDZToReg(ofsstr,hnumber,razr);
  4335.  
  4336.                                 else ClearReg(hnumber);
  4337.  
  4338.                                 KillVar(wtok.name);
  4339.  
  4340.                                 AddRegVar(hnumber,razr,&wtok);
  4341.  
  4342.                         }
  4343.  
  4344.                         else{
  4345.  
  4346. //                              printf("vop=%d %s\n",vop,wtok.name);
  4347.  
  4348.                                 if(vop==0)KillVar(wtok.name);
  4349.  
  4350.                         }
  4351.  
  4352.                         if(ofsstr)free(ofsstr);
  4353.  
  4354.                         break;
  4355.  
  4356.                 case tk_minusminus: vop=0x8;
  4357.  
  4358.                 case tk_plusplus:
  4359.  
  4360. #ifdef OPTVARCONST
  4361.  
  4362.                         initconst=UpdVarConst(&wtok,1,tk_byte,tok);
  4363.  
  4364. #endif
  4365.  
  4366.                         CheckAllMassiv(wbuf,razr,&wstr,&wtok);
  4367.  
  4368.                         op66(razr);
  4369.  
  4370.                         outseg(&wtok,2);
  4371.  
  4372.                         op(0xFF); op(vop+wtok.rm);
  4373.  
  4374.                         outaddress(&wtok);
  4375.  
  4376.                         KillVar(wtok.name);
  4377.  
  4378.                         break;
  4379.  
  4380.                 case tk_cdecl:
  4381.  
  4382.                 case tk_pascal:
  4383.  
  4384.                 case tk_fastcall:
  4385.  
  4386.                 case tk_stdcall:
  4387.  
  4388.                         vop=tok;
  4389.  
  4390.                         nexttok();
  4391.  
  4392.                         if(tok!=tk_openbracket){
  4393.  
  4394.                                 expected('(');
  4395.  
  4396.                                 FindStopTok();
  4397.  
  4398.                         }
  4399.  
  4400.                 case tk_openbracket:    //¢ë§®¢ ¯à®æ¥¤ãàë ¯®  ¤à¥áã ¢ ॣ¨áâà¥
  4401.  
  4402.                         param[0]=0;
  4403.  
  4404.                         int i;
  4405.  
  4406.                         i=0;
  4407.  
  4408.                         switch ( vop ) {
  4409.  
  4410.                                 case tk_cdecl:
  4411.  
  4412.                                 case tk_stdcall:
  4413.  
  4414.                                         i=swapparam();
  4415.  
  4416.                                         break;
  4417.  
  4418.                                 case tk_pascal:
  4419.  
  4420.                                         doparams();
  4421.  
  4422.                                         break;
  4423.  
  4424.                                 case tk_fastcall:
  4425.  
  4426.                                         doregparams();
  4427.  
  4428.                                         break;
  4429.  
  4430.                                 default:
  4431.  
  4432.                                         if(comfile==file_w32)swapparam();
  4433.  
  4434.                                         else doparams();
  4435.  
  4436.                         }
  4437.  
  4438.                         if(vop!=tk_cdecl)i=0;
  4439.  
  4440.                         CheckAllMassiv(wbuf,razr,&wstr,&wtok);
  4441.  
  4442.                         outseg(&wtok,2);
  4443.  
  4444.                         op(0xFF); op(0x10+wtok.rm);
  4445.  
  4446.                         outaddress(&wtok);
  4447.  
  4448.                         clearregstat();
  4449.  
  4450. #ifdef OPTVARCONST
  4451.  
  4452.                         FreeGlobalConst();
  4453.  
  4454. #endif
  4455.  
  4456.                         if(i)CorrectStack(i);
  4457.  
  4458.                         break;
  4459.  
  4460.                 case tk_xorequals: vop+=0x08;
  4461.  
  4462.                 case tk_minusequals: vop+=0x08;
  4463.  
  4464.                 case tk_andequals: vop+=0x18;
  4465.  
  4466.                 case tk_orequals: vop+=0x08;
  4467.  
  4468.                 case tk_plusequals:
  4469.  
  4470.                         getoperand(am32==TRUE?EAX:BX);
  4471.  
  4472.                         if(tok==tk_float){
  4473.  
  4474.                                 getoperand(am32==TRUE?EAX:BX);
  4475.  
  4476.                                 doeaxfloatmath(tk_reg32,AX);
  4477.  
  4478.                                 goto axtovar;
  4479.  
  4480.                         }
  4481.  
  4482.                         if(itok2.type==tp_opperand){
  4483.  
  4484.                                 if(tok==tk_number){
  4485.  
  4486.                                         if(OnlyNumber(sign)){
  4487.  
  4488.                                                 next=0;
  4489.  
  4490.                                                 otok=tok;
  4491.  
  4492.                                                 tok=tk_number;
  4493.  
  4494.                                                 goto num;
  4495.  
  4496.                                         }
  4497.  
  4498.                                 }
  4499.  
  4500.                                 retrez=razr==r16?tk_reg:tk_reg32;
  4501.  
  4502.                                 do_e_axmath(sign,razr,&ofsstr);
  4503.  
  4504.                                 if(addESP!=oaddESP&&am32&&ESPloc&&(wtok.type==tp_paramvar||wtok.type==tp_localvar))wtok.number+=addESP-oaddESP;
  4505.  
  4506. axtovar:
  4507.  
  4508.                                 CheckAllMassiv(wbuf,razr,&wstr,&wtok);
  4509.  
  4510.                                 op66(razr);
  4511.  
  4512.                                 outseg(&wtok,2);
  4513.  
  4514.                                 op(0x01+vop); op(wtok.rm);      /* ADD [anyword],AX */
  4515.  
  4516.                                 outaddress(&wtok);
  4517.  
  4518.                                 next=0;
  4519.  
  4520.                         }
  4521.  
  4522.                         else{
  4523.  
  4524.                                 switch(tok){
  4525.  
  4526.                                         case tk_number:
  4527.  
  4528.                                         case tk_postnumber:
  4529.  
  4530.                                         case tk_undefofs:
  4531.  
  4532. num:
  4533.  
  4534. #ifdef OPTVARCONST
  4535.  
  4536.                                                 if(tok==tk_number&&(itok.flag&f_reloc)==0){
  4537.  
  4538.                                                         initconst=UpdVarConst(&wtok,itok.lnumber,itok.rm,operand);
  4539.  
  4540.                                                 }
  4541.  
  4542. #endif
  4543.  
  4544.                                                 CheckAllMassiv(wbuf,razr,&wstr,&wtok);
  4545.  
  4546.                                                 op66(razr);
  4547.  
  4548.                                                 outseg(&wtok,2);
  4549.  
  4550.                                                 if(tok==tk_number&&(itok.flag&f_reloc)==0&&itok.number==1&&(vop==0||vop==0x28)){
  4551.  
  4552.                                                         if(vop)vop=8;
  4553.  
  4554.                                                         op(0xFF); op(vop+wtok.rm);
  4555.  
  4556.                                                         outaddress(&wtok);
  4557.  
  4558.                                                 }
  4559.  
  4560.                                                 else if(tok!=tk_undefofs&&tok!=tk_postnumber&&(itok.flag&f_reloc)==0&&
  4561.  
  4562.                                                                 short_ok(itok.number,razr/2-1)){
  4563.  
  4564.                                                         op(0x83);
  4565.  
  4566.                                                         op(vop+wtok.rm);
  4567.  
  4568.                                                         outaddress(&wtok);
  4569.  
  4570.                                                         op((unsigned int)itok.number);
  4571.  
  4572.                                                 }
  4573.  
  4574.                                                 else{
  4575.  
  4576.                                                         op(0x81);
  4577.  
  4578.                                                         op(vop+wtok.rm);
  4579.  
  4580.                                                         outaddress(&wtok);
  4581.  
  4582.                                                         if(tok==tk_postnumber)(itok.flag&f_extern)==0?setwordpost(&itok):setwordext(&itok.number);
  4583.  
  4584.                                                         else if(tok==tk_undefofs)AddUndefOff(0,itok.name);
  4585.  
  4586.                                                         else if((itok.flag&f_reloc)!=0)AddReloc();
  4587.  
  4588.                                                         razr==r16?outword(itok.number):outdword(itok.number);
  4589.  
  4590.                                                 }
  4591.  
  4592.                                                 if(next==0)tok=otok;
  4593.  
  4594.                                                 break;
  4595.  
  4596.                                         case tk_apioffset:
  4597.  
  4598.                                                 CheckAllMassiv(wbuf,razr,&wstr,&wtok);
  4599.  
  4600.                                                 op66(razr);
  4601.  
  4602.                                                 outseg(&wtok,2);
  4603.  
  4604.                                                 op(0x81);
  4605.  
  4606.                                                 op(vop+wtok.rm);
  4607.  
  4608.                                                 outaddress(&wtok);
  4609.  
  4610.                                                 AddApiToPost(itok.number);
  4611.  
  4612.                                                 break;
  4613.  
  4614.                                         case tk_reg32:
  4615.  
  4616.                                                 if(razr==r16)goto defxor;
  4617.  
  4618.                                         case tk_reg:
  4619.  
  4620.                                                 if(tok==tk_reg&&razr==r32)goto defxor;
  4621.  
  4622. #ifdef OPTVARCONST
  4623.  
  4624.                                                 initconst=CheckUpdRegToConst(itok.number,&wtok,operand,razr);
  4625.  
  4626. #endif
  4627.  
  4628.                                                 CheckAllMassiv(wbuf,razr,&wstr,&wtok);
  4629.  
  4630.                                                 op66(razr);
  4631.  
  4632.                                                 outseg(&wtok,2);
  4633.  
  4634.                                                 op(0x01+vop); op((unsigned int)itok.number*8+wtok.rm);
  4635.  
  4636.                                                 outaddress(&wtok);
  4637.  
  4638.                                                 break;
  4639.  
  4640.                                         default:
  4641.  
  4642. defxor:
  4643.  
  4644.                                                 retrez=razr==r16?tk_reg:tk_reg32;
  4645.  
  4646.                                                 do_e_axmath(sign,razr,&ofsstr);
  4647.  
  4648.                                                 if(addESP!=oaddESP&&am32&&ESPloc&&(wtok.type==tp_paramvar||wtok.type==tp_localvar))wtok.number+=addESP-oaddESP;
  4649.  
  4650.                                                 CheckAllMassiv(wbuf,razr,&wstr,&wtok);
  4651.  
  4652.                                                 op66(razr);
  4653.  
  4654.                                                 outseg(&wtok,2);
  4655.  
  4656.                                                 op(0x01+vop); op(wtok.rm);  /* ADD [anyword],AX */
  4657.  
  4658.                                                 outaddress(&wtok);
  4659.  
  4660.                                                 next=0;
  4661.  
  4662.                                                 break;
  4663.  
  4664.                                 }
  4665.  
  4666.                         }
  4667.  
  4668. //                      puts(wtok.name);
  4669.  
  4670.                         KillVar(wtok.name);
  4671.  
  4672.                         break;
  4673.  
  4674.                 case tk_multequals:
  4675.  
  4676.                         getoperand(am32==TRUE?EAX:BX);
  4677.  
  4678.                         if(itok2.type==tp_stopper){
  4679.  
  4680.                                 if(tok==tk_number){
  4681.  
  4682.                                         if(itok.number==1)break;
  4683.  
  4684.                                         if(itok.number==0){
  4685.  
  4686.                                                 ZeroReg(hnumber,razr);
  4687.  
  4688.                                                 goto getfromax;
  4689.  
  4690.                                         }
  4691.  
  4692. #ifdef OPTVARCONST
  4693.  
  4694.                                         if((itok.flag&f_reloc)==0){
  4695.  
  4696.                                                 initconst=UpdVarConst(&wtok,itok.lnumber,itok.rm,operand);
  4697.  
  4698.                                         }
  4699.  
  4700. #endif
  4701.  
  4702.                                         if(hnumber==0)getinto_e_ax(sign,otok,&wtok,wbuf,&wstr,razr,TRUE);
  4703.  
  4704.                                         else getinto_reg(otok,&wtok,wbuf,&wstr,razr,hnumber);
  4705.  
  4706.                                         vop=0;
  4707.  
  4708.                                         RegMulNum(hnumber,itok.number,razr,sign,(int *)&vop,itok.flag);
  4709.  
  4710.                                         goto getfromax;
  4711.  
  4712.                                 }
  4713.  
  4714.                         }
  4715.  
  4716.                         if(hnumber==0)do_e_axmath(sign,razr,&ofsstr);
  4717.  
  4718.                         else getintoreg(hnumber,razr,sign,&ofsstr);
  4719.  
  4720.                         if(addESP!=oaddESP&&am32&&ESPloc&&(wtok.type==tp_paramvar||wtok.type==tp_localvar)){
  4721.  
  4722.                                 wtok.number+=addESP-oaddESP;
  4723.  
  4724.                                 oaddESP=addESP;
  4725.  
  4726.                         }
  4727.  
  4728.                         CheckAllMassiv(wbuf,razr,&wstr,&wtok);
  4729.  
  4730.                         op66(razr);
  4731.  
  4732.                         if(hnumber==0){
  4733.  
  4734.                                 outseg(&wtok,2);
  4735.  
  4736.                                 op(0xF7);       // imul/mul var
  4737.  
  4738.                                 if(sign)op(0x28+wtok.rm);
  4739.  
  4740.                                 else op(0x20+wtok.rm);
  4741.  
  4742.                         }
  4743.  
  4744.                         else{
  4745.  
  4746.                                 outseg(&wtok,3);
  4747.  
  4748.                                 outword(0xaf0f);
  4749.  
  4750.                                 op(wtok.rm+hnumber*8);
  4751.  
  4752.                         }
  4753.  
  4754.                         outaddress(&wtok);
  4755.  
  4756.                         next=0;
  4757.  
  4758.                         KillVar(wtok.name);
  4759.  
  4760.                         goto getfromax;
  4761.  
  4762.                 case tk_divequals:
  4763.  
  4764.                         getoperand(am32==TRUE?EAX:BX);
  4765.  
  4766.                         hnumber=0;
  4767.  
  4768.                         if(itok2.type==tp_stopper){
  4769.  
  4770.                                 if(tok==tk_number){
  4771.  
  4772.                                         if(itok.number==1)break;
  4773.  
  4774. #ifdef OPTVARCONST
  4775.  
  4776.                                         if((itok.flag&f_reloc)==0){
  4777.  
  4778.                                                 initconst=UpdVarConst(&wtok,itok.lnumber,itok.rm,operand);
  4779.  
  4780.                                         }
  4781.  
  4782. #endif
  4783.  
  4784.                                         getinto_e_ax(sign,otok,&wtok,wbuf,&wstr,razr,TRUE);
  4785.  
  4786.                                         DivMod(0,sign,razr,0);
  4787.  
  4788.                                         next=0;
  4789.  
  4790.                                         goto getfromax;
  4791.  
  4792.                                 }
  4793.  
  4794.                                 getintoreg_32(CX,razr,sign,&ofsstr);
  4795.  
  4796.                         }
  4797.  
  4798.                         else{
  4799.  
  4800.                                 do_e_axmath(sign,razr,&ofsstr);
  4801.  
  4802.                                 if(optimizespeed)outword(0xC88B);       //mov CX,ax
  4803.  
  4804.                                 else op(0x90+ECX);      //xchg ax,Cx
  4805.  
  4806.                                 if(addESP!=oaddESP&&am32&&ESPloc&&(wtok.type==tp_paramvar||wtok.type==tp_localvar)){
  4807.  
  4808.                                         wtok.number+=addESP-oaddESP;
  4809.  
  4810.                                         oaddESP=addESP;
  4811.  
  4812.                                 }
  4813.  
  4814.                         }
  4815.  
  4816.                         getinto_e_ax(sign,otok,&wtok,wbuf,&wstr,razr,TRUE);
  4817.  
  4818.                         ClearDX(razr,sign);
  4819.  
  4820.                         op66(razr);
  4821.  
  4822.                         op(0xF7);
  4823.  
  4824.                         if(sign)op(0xF8+ECX); // IDIV CX
  4825.  
  4826.                         else op(0xF0+ECX); // DIV CX
  4827.  
  4828.                         next=0;
  4829.  
  4830.                         warningreg(regs[razr/2-1][ECX]);
  4831.  
  4832.                         KillVar(wtok.name);
  4833.  
  4834.                         goto getfromax;
  4835.  
  4836.                 case tk_swap:
  4837.  
  4838.                         KillVar(wtok.name);
  4839.  
  4840.                         int regdi;
  4841.  
  4842.                         regdi=TRUE;
  4843.  
  4844.                         getoperand();
  4845.  
  4846.                         rbuf=bufrm;
  4847.  
  4848.                         bufrm=NULL;
  4849.  
  4850.                         if(am32!=FALSE&&wbuf!=NULL&&wstr.bufstr!=NULL)regdi=FALSE;
  4851.  
  4852.                         switch(tok){
  4853.  
  4854.                                 case tk_reg32:
  4855.  
  4856.                                         if(razr==r16)swaperror();
  4857.  
  4858.                                 case tk_reg:
  4859.  
  4860.                                         if(tok==tk_reg&&razr==r32)swaperror();
  4861.  
  4862. #ifdef OPTVARCONST
  4863.  
  4864.                                         initconst=SwapVarRegConst(itok.number,&wtok,razr);
  4865.  
  4866. #endif
  4867.  
  4868.                                         CheckAllMassiv(wbuf,razr,&wstr,&wtok);
  4869.  
  4870.                                         op66(razr);
  4871.  
  4872.                                         outseg(&wtok,2);
  4873.  
  4874.                                         op(0x87);
  4875.  
  4876.                                         op((unsigned int)itok.number*8+wtok.rm);
  4877.  
  4878.                                         outaddress(&wtok);
  4879.  
  4880.                                         ClearReg(itok.number);
  4881.  
  4882.                                         break;
  4883.  
  4884.                                 case tk_qwordvar:
  4885.  
  4886.                                 case tk_longvar:
  4887.  
  4888.                                 case tk_dwordvar:
  4889.  
  4890.                                         if(razr==r16)swaperror();
  4891.  
  4892.                                 case tk_intvar:
  4893.  
  4894.                                 case tk_wordvar:
  4895.  
  4896.                                         if((tok==tk_intvar||tok==tk_wordvar)&&razr==r32)swaperror();
  4897.  
  4898. #ifdef OPTVARCONST
  4899.  
  4900.                                         ClearVarByNum(&itok);
  4901.  
  4902. #endif
  4903.  
  4904.                                         if(hnumber==0)getinto_e_ax(sign,otok,&wtok,wbuf,&wstr,razr,TRUE);
  4905.  
  4906.                                         else{
  4907.  
  4908.                                                 if(regoverstack&&(!((bufrm||strinf.bufstr)&&(wbuf||wstr.bufstr)))){
  4909.  
  4910.                                                         CheckAllMassiv(bufrm,razr,&strinf);
  4911.  
  4912.                                                         op66(razr);
  4913.  
  4914.                                                         outseg(&itok,2);
  4915.  
  4916.                                                         op(0xFF);       // PUSH [dword]
  4917.  
  4918.                                                         op(0x30+itok.rm);
  4919.  
  4920.                                                         outaddress(&itok);
  4921.  
  4922.                                                         CheckAllMassiv(wbuf,razr,&wstr,&wtok);
  4923.  
  4924.                                                         op66(razr);
  4925.  
  4926.                                                         outseg(&wtok,2);
  4927.  
  4928.                                                         op(0xFF);       // PUSH [dword]
  4929.  
  4930.                                                         op(0x30+wtok.rm);
  4931.  
  4932.                                                         outaddress(&wtok);
  4933.  
  4934.  
  4935.  
  4936.                                                         CheckAllMassiv(bufrm,razr,&strinf);
  4937.  
  4938.                                                         op66(razr);
  4939.  
  4940.                                                         outseg(&itok,2);
  4941.  
  4942.                                                         op(0x8f);
  4943.  
  4944.                                                         op(itok.rm);
  4945.  
  4946.                                                         outaddress(&itok);
  4947.  
  4948.                                                         CheckAllMassiv(wbuf,razr,&wstr,&wtok);
  4949.  
  4950.                                                         op66(razr);
  4951.  
  4952.                                                         outseg(&wtok,2);
  4953.  
  4954.                                                         op(0x8f);
  4955.  
  4956.                                                         op(wtok.rm);
  4957.  
  4958.                                                         outaddress(&wtok);
  4959.  
  4960.  
  4961.  
  4962.                                                         break;
  4963.  
  4964.                                                 }
  4965.  
  4966.                                                 getinto_reg(otok,&wtok,wbuf,&wstr,razr,hnumber);
  4967.  
  4968.                                         }
  4969.  
  4970.                                         CheckAllMassiv(rbuf,razr,&strinf,&itok,regdi==FALSE?idxregs[2]:idxregs[1],idxregs[3]);
  4971.  
  4972.                                         op66(razr);
  4973.  
  4974.                                         outseg(&itok,2);
  4975.  
  4976.                                         op(0x87);  /* XCHG AX,[wloc] */
  4977.  
  4978.                                         op(itok.rm+hnumber*8);
  4979.  
  4980.                                         outaddress(&itok);
  4981.  
  4982.                                         goto getfromax;
  4983.  
  4984.                                 case tk_seg:
  4985.  
  4986.                                         if(razr==r32)swaperror();
  4987.  
  4988.                                         op66(r16);
  4989.  
  4990.                                         op(0x8C); /* MOV AX,seg */
  4991.  
  4992.                                         op(0xC0+(unsigned int)itok.number*8);
  4993.  
  4994.                                         CheckAllMassiv(wbuf,2,&wstr,&wtok);
  4995.  
  4996.                                         op66(r16);
  4997.  
  4998.                                         outseg(&wtok,2);
  4999.  
  5000.                                         op(0x87);  /* XCHG AX,[wloc] */
  5001.  
  5002.                                         op(wtok.rm);
  5003.  
  5004.                                         outaddress(&wtok);
  5005.  
  5006.                                         op66(r16);
  5007.  
  5008.                                         op(0x8E); /* MOV seg,AX */
  5009.  
  5010.                                         op(0xC0+(unsigned int)itok.number*8);
  5011.  
  5012.                                         break;
  5013.  
  5014.                                 case tk_floatvar:
  5015.  
  5016.                                         if(razr==r16)swaperror();
  5017.  
  5018.                                         if(sign==1){
  5019.  
  5020.                                                 CheckAllMassiv(wbuf,4,&wstr,&wtok);
  5021.  
  5022.                                                 outseg(&wtok,2);        //fild
  5023.  
  5024.                                                 op(0xDB);
  5025.  
  5026.                                                 op(wtok.rm);
  5027.  
  5028.                                                 outaddress(&wtok);
  5029.  
  5030.                                                 CheckAllMassiv(rbuf,4,&strinf,&itok,regdi==FALSE?idxregs[2]:idxregs[1],idxregs[3]);
  5031.  
  5032.                                                 outseg(&itok,2);        //fld val
  5033.  
  5034.                                                 op(0xd9);
  5035.  
  5036.                                                 op(itok.rm);
  5037.  
  5038.                                                 outaddress(&itok);
  5039.  
  5040.                                         }
  5041.  
  5042.                                         else{
  5043.  
  5044.                                                 CheckInitBP();
  5045.  
  5046.                                                 op66(r32);      //push 0L
  5047.  
  5048.                                                 outword(0x6a);
  5049.  
  5050.                                                 CheckAllMassiv(wbuf,4,&wstr,&wtok);
  5051.  
  5052.                                                 op66(r32);      //push var
  5053.  
  5054.                                                 if(ESPloc&&am32&&wtok.segm==SS)wtok.number+=8;
  5055.  
  5056.                                                 addESP+=8;
  5057.  
  5058.                                                 outseg(&wtok,2);
  5059.  
  5060.                                                 op(0xFF);
  5061.  
  5062.                                                 op(wtok.rm+0x30);
  5063.  
  5064.                                                 outaddress(&wtok);
  5065.  
  5066.                                                 fildq_stack();
  5067.  
  5068.                                                 CheckAllMassiv(rbuf,4,&strinf,&itok,regdi==FALSE?idxregs[2]:idxregs[1],idxregs[3]);
  5069.  
  5070.                                                 outseg(&itok,2);        //fld val
  5071.  
  5072.                                                 op(0xd9);
  5073.  
  5074.                                                 op(itok.rm);
  5075.  
  5076.                                                 outaddress(&itok);
  5077.  
  5078.                                                 RestoreBP();
  5079.  
  5080.                                                 if(optimizespeed||am32==0){
  5081.  
  5082.                                                         outword(0xC483);
  5083.  
  5084.                                                         op(8);
  5085.  
  5086.                                                 }
  5087.  
  5088.                                                 else{
  5089.  
  5090.                                                         op(0x58);       // pop EAX
  5091.  
  5092.                                                         op(0x58);       // pop EAX
  5093.  
  5094.                                                 }
  5095.  
  5096.                                                 addESP-=8;
  5097.  
  5098.                                         }
  5099.  
  5100.                                         outseg(&wtok,2);//fistp var
  5101.  
  5102.                                         op(0xDB);
  5103.  
  5104.                                         op(wtok.rm+0x18);
  5105.  
  5106.                                         outaddress(&wtok);
  5107.  
  5108.                                         outseg(&itok,2);        //fstp val
  5109.  
  5110.                                         op(0xd9);
  5111.  
  5112.                                         op(itok.rm+0x18);
  5113.  
  5114.                                         outaddress(&itok);
  5115.  
  5116.                                         fwait3();
  5117.  
  5118.                                         break;
  5119.  
  5120.                                 default: swaperror(); break;
  5121.  
  5122.                         }
  5123.  
  5124.                         break;
  5125.  
  5126.                 case tk_rrequals:
  5127.  
  5128.                         vop=8;
  5129.  
  5130.                         if(sign)vop+=0x10;
  5131.  
  5132.                 case tk_llequals:
  5133.  
  5134.                         KillVar(wtok.name);
  5135.  
  5136.                         getoperand(am32==TRUE?ECX:BX);
  5137.  
  5138.                         if(itok2.type!=tp_stopper){
  5139.  
  5140.                                 doalmath(0,&ofsstr);            // all shifts unsigned byte
  5141.  
  5142.                                 ClearReg(AX);
  5143.  
  5144.                                 ClearReg(CX);
  5145.  
  5146.                                 outword(0xC188);        // MOV CL,AL
  5147.  
  5148.                                 if(addESP!=oaddESP&&am32&&ESPloc&&(wtok.type==tp_paramvar||wtok.type==tp_localvar))wtok.number+=addESP-oaddESP;
  5149.  
  5150.                                 CheckAllMassiv(wbuf,razr,&wstr,&wtok);
  5151.  
  5152.                                 op66(razr);
  5153.  
  5154.                                 outseg(&wtok,2);
  5155.  
  5156.                                 op(0xD3);       op(0x20+vop+wtok.rm);  // SHL [rmword],CL
  5157.  
  5158.                                 outaddress(&wtok);
  5159.  
  5160.                                 warningreg(begs[1]);
  5161.  
  5162.                                 next=0;
  5163.  
  5164.                         }
  5165.  
  5166.                         else if(tok==tk_number){
  5167.  
  5168. #ifdef OPTVARCONST
  5169.  
  5170.                                 if((itok.flag&f_reloc)==0){
  5171.  
  5172.                                         initconst=UpdVarConst(&wtok,itok.lnumber,itok.rm,operand);
  5173.  
  5174.                                 }
  5175.  
  5176. #endif
  5177.  
  5178.                                 CheckAllMassiv(wbuf,razr,&wstr,&wtok);
  5179.  
  5180.                                 if((unsigned int)itok.number==1){
  5181.  
  5182.                                         op66(razr);
  5183.  
  5184.                                         outseg(&wtok,2);
  5185.  
  5186.                                         op(0xD1); op(0x20+vop+wtok.rm); /* SHL [rmword],1 */
  5187.  
  5188.                                         outaddress(&wtok);
  5189.  
  5190.                                 }
  5191.  
  5192.                                 else if((unsigned int)itok.number!=0){
  5193.  
  5194.                                         if(chip<2&&razr==r16){
  5195.  
  5196.                                                 getintobeg(CL,&ofsstr);
  5197.  
  5198.                                                 op66(r16);
  5199.  
  5200.                                                 outseg(&wtok,2);
  5201.  
  5202.                                                 op(0xD3);       op(0x20+vop+wtok.rm);  /* SHL [rmword],CL */
  5203.  
  5204.                                                 outaddress(&wtok);
  5205.  
  5206.                                                 warningreg(begs[1]);
  5207.  
  5208.                                                 ClearReg(CX);
  5209.  
  5210.                                                 next=0;
  5211.  
  5212.                                         }
  5213.  
  5214.                                         else{
  5215.  
  5216.                                                 op66(razr);
  5217.  
  5218.                                                 outseg(&wtok,2);
  5219.  
  5220.                                                 op(0xC1);       op(0x20+vop+wtok.rm);  /* SHL [rmword],imm8 */
  5221.  
  5222.                                                 outaddress(&wtok);
  5223.  
  5224.                                                 if(cpu<2)cpu=2;
  5225.  
  5226.                                         }
  5227.  
  5228.                                         op((unsigned int)itok.number);
  5229.  
  5230.                                 }
  5231.  
  5232.                         }
  5233.  
  5234.                         else{
  5235.  
  5236.                                 if(tok!=tk_beg||(unsigned int)itok.number!=CL){
  5237.  
  5238.                                         getintobeg(CL,&ofsstr);
  5239.  
  5240.                                         warningreg(begs[1]);
  5241.  
  5242.                                         ClearReg(CX);
  5243.  
  5244.                                         next=0;
  5245.  
  5246.                                 }
  5247.  
  5248.                                 CheckAllMassiv(wbuf,razr,&wstr,&wtok);
  5249.  
  5250.                                 op66(razr);
  5251.  
  5252.                                 outseg(&wtok,2);
  5253.  
  5254.                                 op(0xD3);       op(0x20+vop+wtok.rm);  /* SHL [rmword],CL */
  5255.  
  5256.                                 outaddress(&wtok);
  5257.  
  5258.                         }
  5259.  
  5260.                         break;
  5261.  
  5262.                 default: operatorexpected(); break;
  5263.  
  5264.         }
  5265.  
  5266. #ifdef OPTVARCONST
  5267.  
  5268.         if(initconst==FALSE)ClearVarByNum(&wtok);
  5269.  
  5270. #endif
  5271.  
  5272.         if(next)nexttok();
  5273.  
  5274.         if(terminater==tk_semicolon)seminext();
  5275.  
  5276.         if(razr==r32&&cpu<3)cpu=3;
  5277.  
  5278.         return retrez;
  5279.  
  5280. }
  5281.  
  5282.  
  5283.  
  5284. int dobytevar(int sign,int terminater)   // byte, char
  5285.  
  5286. {
  5287.  
  5288. unsigned char next=1,getfromAX=0;
  5289.  
  5290. unsigned int vop=0,otok,rettype,posiblret;
  5291.  
  5292. ITOK btok;
  5293.  
  5294. char *bbuf,*rbuf;
  5295.  
  5296. int retrez=0,pointr=0,hnumber=AL;
  5297.  
  5298. SINFO bstr;
  5299.  
  5300. int numpointr=0;
  5301.  
  5302. char *ofsstr=NULL;
  5303.  
  5304. #ifdef OPTVARCONST
  5305.  
  5306. int initconst=FALSE;
  5307.  
  5308. int operand;
  5309.  
  5310. #endif
  5311.  
  5312. unsigned int oaddESP=addESP;
  5313.  
  5314.         sign==0?posiblret=rettype=tk_byte:posiblret=rettype=tk_char;
  5315.  
  5316.         bstr=strinf;
  5317.  
  5318.         strinf.bufstr=NULL;
  5319.  
  5320.         btok=itok;
  5321.  
  5322.         bbuf=bufrm;
  5323.  
  5324.         bufrm=NULL;
  5325.  
  5326.         otok=tok;
  5327.  
  5328.         while(RmEqualReg(hnumber,itok.rm,itok.sib))hnumber++;
  5329.  
  5330.         nexttok();
  5331.  
  5332. #ifdef OPTVARCONST
  5333.  
  5334.         operand=tok;
  5335.  
  5336. #endif
  5337.  
  5338.         switch(tok){
  5339.  
  5340.                 case tk_assign:
  5341.  
  5342.                         if(!((tok2==tk_reg||tok2==tk_reg32||tok2==tk_beg)&&ScanTok3()==terminater)){
  5343.  
  5344.                                 ofsstr=GetLecsem(terminater);
  5345.  
  5346.                         }
  5347.  
  5348.                         if(ofsstr){
  5349.  
  5350.                                 int retreg;
  5351.  
  5352.                                 if((retreg=CheckIDZReg(ofsstr,AX,r8))!=NOINREG){
  5353.  
  5354.                                         GetEndLex(terminater);
  5355.  
  5356.                                         tok=tk_beg;
  5357.  
  5358.                                         itok.number=retreg==SKIPREG?AX:retreg;
  5359.  
  5360.                                         goto regtovar;
  5361.  
  5362.                                 }
  5363.  
  5364.                         }
  5365.  
  5366.                         nexttok();
  5367.  
  5368.                         convert_type(&sign,(int *)&rettype,&pointr);
  5369.  
  5370.                         while(tok==tk_mult){
  5371.  
  5372.                                 nexttok();
  5373.  
  5374.                                 numpointr++;
  5375.  
  5376.                         }
  5377.  
  5378.                         if(numpointr>itok.npointr)unuseableinput();
  5379.  
  5380.                         if(tok2==tk_assign){
  5381.  
  5382.                                 hnumber=MultiAssign(r8,USEALLREG,numpointr);
  5383.  
  5384.                                 if(ofsstr){
  5385.  
  5386.                                         free(ofsstr);
  5387.  
  5388.                                         ofsstr=NULL;
  5389.  
  5390.                                 }
  5391.  
  5392.                                 next=0;
  5393.  
  5394.                                 goto getfromax;
  5395.  
  5396.                         }
  5397.  
  5398.                         if(tok==tk_pointer)cpointr(am32==TRUE?EAX:BX,numpointr);
  5399.  
  5400.                         CheckMinusNum();
  5401.  
  5402.                         if(itok2.type==tp_opperand){
  5403.  
  5404.                                 if(rettype!=tk_float&&tok==tk_number){  //¯à®¢¥àª  ¨ á㬬¨à®¢ ­¨¥ ç¨á¥«
  5405.  
  5406.                                         if(OnlyNumber(sign)){
  5407.  
  5408.                                                 next=0;
  5409.  
  5410.                                                 goto numbertovar;
  5411.  
  5412.                                         }
  5413.  
  5414.                                 }
  5415.  
  5416.                                 goto labl1;
  5417.  
  5418.                         }
  5419.  
  5420.                         else{
  5421.  
  5422. #ifdef OPTVARCONST
  5423.  
  5424.                                 if(tok>=tk_charvar&&tok<=tk_doublevar&&itok.npointr==0){
  5425.  
  5426.                                         if(CheckConstVar(&itok))tok=tk_number;
  5427.  
  5428.                                 }
  5429.  
  5430. #endif
  5431.  
  5432.                                 switch(tok){
  5433.  
  5434.                                         case tk_number:
  5435.  
  5436. numbertovar:
  5437.  
  5438. #ifdef OPTVARCONST
  5439.  
  5440.                                                 if((initconst=Const2Var(&btok,itok.lnumber&0Xff,itok.rm))==FALSE){
  5441.  
  5442.                                                         waralreadinitvar(btok.name,itok.number);
  5443.  
  5444.                                                         initconst=TRUE;
  5445.  
  5446.                                                         break;
  5447.  
  5448.                                                 }
  5449.  
  5450. #endif
  5451.  
  5452.                                                 CheckAllMassiv(bbuf,1,&bstr,&btok);
  5453.  
  5454.                                                 outseg(&btok,2);
  5455.  
  5456.                                                 op(0xC6);
  5457.  
  5458.                                                 op(btok.rm);
  5459.  
  5460.                                                 outaddress(&btok);
  5461.  
  5462.                                                 op((unsigned int)itok.number);
  5463.  
  5464.                                                 break;
  5465.  
  5466.                                         case tk_reg32:
  5467.  
  5468.                                         case tk_reg:
  5469.  
  5470.                                                 if((unsigned int)itok.number>BX)goto labl1;
  5471.  
  5472.                                         case tk_beg:
  5473.  
  5474. regtovar:
  5475.  
  5476.                                                 if((unsigned int)itok.number==0){
  5477.  
  5478.                                                         getfromAX=1;
  5479.  
  5480.                                                         hnumber=0;
  5481.  
  5482.                                                 }
  5483.  
  5484.                                                 else{
  5485.  
  5486.                                                         KillVar(btok.name);
  5487.  
  5488.                                                         AddRegVar(itok.number,r8,&btok);
  5489.  
  5490.                                                         vop++;
  5491.  
  5492.                                                         CheckAllMassiv(bbuf,1,&bstr,&btok);
  5493.  
  5494.                                                         outseg(&btok,2);
  5495.  
  5496.                                                         op(0x88);
  5497.  
  5498.                                                         op((unsigned int)itok.number*8+btok.rm);
  5499.  
  5500.                                                         outaddress(&btok);
  5501.  
  5502.                                                 }
  5503.  
  5504.                                                 break;
  5505.  
  5506.                                         case tk_seg: segbyteerror(); break;
  5507.  
  5508.                                         default:
  5509.  
  5510. labl1:
  5511.  
  5512.                                                 if(rettype==tk_char||rettype==tk_byte){
  5513.  
  5514.                                                         if(hnumber==0)retrez=doalmath(sign,&ofsstr);
  5515.  
  5516.                                                         else retrez=getintobeg(hnumber,&ofsstr);
  5517.  
  5518.                                                 }
  5519.  
  5520.                                                 else if(rettype==tk_int||rettype==tk_word){
  5521.  
  5522.                                                         if(hnumber==0)retrez=do_e_axmath(sign,r16,&ofsstr);
  5523.  
  5524.                                                         else retrez=getintoreg(hnumber,r16,sign,&ofsstr);
  5525.  
  5526.                                                 }
  5527.  
  5528.                                                 else if(rettype==tk_float){
  5529.  
  5530.                                                         doeaxfloatmath(tk_reg32);
  5531.  
  5532.                                                         rettype=tk_long;
  5533.  
  5534.                                                         hnumber=0;
  5535.  
  5536.                                                 }
  5537.  
  5538.                                                 else{
  5539.  
  5540.                                                         if(hnumber==0)retrez=do_e_axmath(sign,r32,&ofsstr);
  5541.  
  5542.                                                         else retrez=getintoreg(hnumber,r32,sign,&ofsstr);
  5543.  
  5544.                                                 }
  5545.  
  5546.                                                 getfromAX=1;
  5547.  
  5548.                                                 next=0;
  5549.  
  5550.                                                 break;
  5551.  
  5552.                                 }
  5553.  
  5554.                         }
  5555.  
  5556.                         if(getfromAX){
  5557.  
  5558. getfromax:
  5559.  
  5560. #ifdef OPTVARCONST
  5561.  
  5562.                                 initconst=CheckRegToConst(hnumber,&btok,r8);
  5563.  
  5564. #endif
  5565.  
  5566.                                 if(retrez==0)retrez=tk_reg;
  5567.  
  5568.                                 convert_returnvalue(posiblret,rettype);
  5569.  
  5570.                                 if(addESP!=oaddESP&&am32&&ESPloc&&(btok.type==tp_paramvar||btok.type==tp_localvar))btok.number+=addESP-oaddESP;
  5571.  
  5572.                                 if(bbuf==NULL&&bstr.bufstr==NULL&&hnumber==0&&((btok.rm==rm_d16&&btok.sib==CODE16)||(btok.rm==rm_d32&&(btok.sib==CODE32||btok.sib==0)))){
  5573.  
  5574.                                         outseg(&btok,1);
  5575.  
  5576.                                         op(0xA2);               // MOV [byte],AL
  5577.  
  5578.                                         if(btok.post==UNDEF_OFSET){
  5579.  
  5580.                                                 AddUndefOff(2,btok.name);
  5581.  
  5582.                                                 btok.post=0;
  5583.  
  5584.                                         }
  5585.  
  5586.                                         if(am32==FALSE)outword(btok.number);
  5587.  
  5588.                                         else outdword(btok.number);
  5589.  
  5590.                                 }
  5591.  
  5592.                                 else{
  5593.  
  5594.                                         CheckAllMassiv(bbuf,1,&bstr,&btok);
  5595.  
  5596.                                         outseg(&btok,2);  // MOV [rmbyte],AL
  5597.  
  5598.                                         op(0x88);
  5599.  
  5600.                                         op(btok.rm+hnumber*8);
  5601.  
  5602.                                         outaddress(&btok);
  5603.  
  5604.                                 }
  5605.  
  5606.                                 if(ofsstr)IDZToReg(ofsstr,hnumber,r8);
  5607.  
  5608.                                 else ClearReg(hnumber);
  5609.  
  5610.                                 KillVar(btok.name);
  5611.  
  5612.                                 AddRegVar(hnumber,r8,&btok);
  5613.  
  5614.                         }
  5615.  
  5616.                         else if(vop)KillVar(btok.name);
  5617.  
  5618.                         if(ofsstr)free(ofsstr);
  5619.  
  5620.                         break;
  5621.  
  5622.                 case tk_multequals:
  5623.  
  5624.                         getoperand(am32==TRUE?EAX:BX);
  5625.  
  5626.                         if(itok2.type==tp_stopper&&tok==tk_number){
  5627.  
  5628.                                 if(itok.number==1)break;
  5629.  
  5630.                                 if(itok.number==0){
  5631.  
  5632.                                         outword(0xB0+hnumber);
  5633.  
  5634.                                         goto getfromax;
  5635.  
  5636.                                 }
  5637.  
  5638. #ifdef OPTVARCONST
  5639.  
  5640.                                 if((itok.flag&f_reloc)==0){
  5641.  
  5642.                                         initconst=UpdVarConst(&btok,itok.lnumber,itok.rm,tk_mult);
  5643.  
  5644.                                 }
  5645.  
  5646. #endif
  5647.  
  5648.                         }
  5649.  
  5650.                         doalmath(sign,&ofsstr);
  5651.  
  5652.                         hnumber=0;
  5653.  
  5654.                         if(addESP!=oaddESP&&am32&&ESPloc&&(btok.type==tp_paramvar||btok.type==tp_localvar)){
  5655.  
  5656.                                 btok.number+=addESP-oaddESP;
  5657.  
  5658.                                 oaddESP=addESP;
  5659.  
  5660.                         }
  5661.  
  5662.                         CheckAllMassiv(bbuf,1,&bstr,&btok);
  5663.  
  5664.                         outseg(&btok,2);
  5665.  
  5666.                         op(0xF6);
  5667.  
  5668.                         if(sign)op(0x28+btok.rm);
  5669.  
  5670.                         else op(0x20+btok.rm);
  5671.  
  5672.                         outaddress(&btok);
  5673.  
  5674.                         next=0;
  5675.  
  5676.                         KillVar(btok.name);
  5677.  
  5678.                         goto getfromax;
  5679.  
  5680.                 case tk_divequals:
  5681.  
  5682.                         hnumber=0;
  5683.  
  5684.                         getoperand(am32==TRUE?EAX:BX);
  5685.  
  5686.                         if(itok2.type==tp_stopper){
  5687.  
  5688.                                 if(tok==tk_number){
  5689.  
  5690.                                         if(itok.number==1)break;
  5691.  
  5692. #ifdef OPTVARCONST
  5693.  
  5694.                                         if((itok.flag&f_reloc)==0){
  5695.  
  5696.                                                 initconst=UpdVarConst(&btok,itok.lnumber,itok.rm,tk_div);
  5697.  
  5698.                                         }
  5699.  
  5700. #endif
  5701.  
  5702.                                 }
  5703.  
  5704.                                 getintobeg(CL,&ofsstr);
  5705.  
  5706.                                 warningreg(begs[1]);
  5707.  
  5708.                         }
  5709.  
  5710.                         else{
  5711.  
  5712.                                 doalmath(sign,&ofsstr);
  5713.  
  5714.                                 outword(0xC88A);        //mov Cl,al
  5715.  
  5716.                                 if(addESP!=oaddESP&&am32&&ESPloc&&(btok.type==tp_paramvar||btok.type==tp_localvar)){
  5717.  
  5718.                                         btok.number+=addESP-oaddESP;
  5719.  
  5720.                                         oaddESP=addESP;
  5721.  
  5722.                                 }
  5723.  
  5724.                         }
  5725.  
  5726.                         if(sign)cbw();
  5727.  
  5728.                         else xorAHAH();
  5729.  
  5730.                         getintoal(otok,&btok,bbuf,&bstr);
  5731.  
  5732.                         warningreg(begs[3]);
  5733.  
  5734.                         op(0xF6);
  5735.  
  5736.                         if(sign)op(0xF8+CL); // IDIV CL
  5737.  
  5738.                         else op(0xF0+CL); // DIV CL
  5739.  
  5740.                         next=0;
  5741.  
  5742.                         ClearReg(CX);
  5743.  
  5744.                         KillVar(btok.name);
  5745.  
  5746.                         goto getfromax;
  5747.  
  5748.                 case tk_minusminus: vop=0x8;
  5749.  
  5750.                 case tk_plusplus:
  5751.  
  5752. #ifdef OPTVARCONST
  5753.  
  5754.                         initconst=UpdVarConst(&btok,1,tk_byte,tok);
  5755.  
  5756. #endif
  5757.  
  5758.                         CheckAllMassiv(bbuf,1,&bstr,&btok);
  5759.  
  5760.                         outseg(&btok,2);
  5761.  
  5762.                         op(0xFE);
  5763.  
  5764.                         op(vop+btok.rm);
  5765.  
  5766.                         outaddress(&btok);
  5767.  
  5768.                         KillVar(btok.name);
  5769.  
  5770.                         break;
  5771.  
  5772.                 case tk_xorequals: vop+=0x08;
  5773.  
  5774.                 case tk_minusequals: vop+=0x08;
  5775.  
  5776.                 case tk_andequals: vop+=0x18;
  5777.  
  5778.                 case tk_orequals: vop+=0x08;
  5779.  
  5780.                 case tk_plusequals:
  5781.  
  5782.                         KillVar(btok.name);
  5783.  
  5784.                         getoperand(am32==TRUE?EAX:BX);
  5785.  
  5786.                         if(itok2.type==tp_opperand){
  5787.  
  5788.                                 if(tok==tk_number){
  5789.  
  5790.                                         if(OnlyNumber(sign)){
  5791.  
  5792.                                                 next=0;
  5793.  
  5794.                                                 otok=tok;
  5795.  
  5796.                                                 tok=tk_number;
  5797.  
  5798.                                                 goto num;
  5799.  
  5800.                                         }
  5801.  
  5802.                                 }
  5803.  
  5804.                                 doalmath(sign,&ofsstr);
  5805.  
  5806.                                 if(addESP!=oaddESP&&am32&&ESPloc&&(btok.type==tp_paramvar||btok.type==tp_localvar))btok.number+=addESP-oaddESP;
  5807.  
  5808.                                 CheckAllMassiv(bbuf,1,&bstr,&btok);
  5809.  
  5810.                                 outseg(&btok,2);
  5811.  
  5812.                                 op(vop); op(btok.rm);  // ADD [anybyte],AL
  5813.  
  5814.                                 outaddress(&btok);
  5815.  
  5816.                                 next=0;
  5817.  
  5818.                                 retrez=tk_reg;
  5819.  
  5820.                         }
  5821.  
  5822.                         else{
  5823.  
  5824.                                 switch(tok){
  5825.  
  5826.                                         case tk_number:
  5827.  
  5828. num:
  5829.  
  5830. #ifdef OPTVARCONST
  5831.  
  5832.                                                 if((itok.flag&f_reloc)==0){
  5833.  
  5834.                                                         initconst=UpdVarConst(&btok,itok.lnumber,itok.rm,operand);
  5835.  
  5836.                                                 }
  5837.  
  5838. #endif
  5839.  
  5840.                                                 CheckAllMassiv(bbuf,1,&bstr,&btok);
  5841.  
  5842.                                                 outseg(&btok,2);
  5843.  
  5844.                                                 if(itok.number==1&&(vop==0||vop==0x28)){
  5845.  
  5846.                                                         if(vop)vop=8;
  5847.  
  5848.                                                         op(0xFE);
  5849.  
  5850.                                                         op(vop+btok.rm);
  5851.  
  5852.                                                         outaddress(&btok);
  5853.  
  5854.                                                 }
  5855.  
  5856.                                                 else{
  5857.  
  5858.                                                         op(0x80);
  5859.  
  5860.                                                         op(vop+btok.rm);
  5861.  
  5862.                                                         outaddress(&btok);
  5863.  
  5864.                                                         op((unsigned int)itok.number);
  5865.  
  5866.                                                 }
  5867.  
  5868.                                                 if(next==0)tok=otok;
  5869.  
  5870.                                                 break;
  5871.  
  5872.                                         case tk_beg:
  5873.  
  5874. #ifdef OPTVARCONST
  5875.  
  5876.                                                 initconst=CheckUpdRegToConst(itok.number,&btok,operand,r8);
  5877.  
  5878. #endif
  5879.  
  5880.                                                 CheckAllMassiv(bbuf,1,&bstr,&btok);
  5881.  
  5882.                                                 outseg(&btok,2);
  5883.  
  5884.                                                 op(vop);
  5885.  
  5886.                                                 op((unsigned int)itok.number*8+btok.rm);
  5887.  
  5888.                                                 outaddress(&btok);
  5889.  
  5890.                                                 break;
  5891.  
  5892.                                         case tk_seg: segbyteerror(); break;
  5893.  
  5894.                                         default:
  5895.  
  5896.                                                 retrez=tk_reg;
  5897.  
  5898.                                                 doalmath(sign,&ofsstr);
  5899.  
  5900.                                                 CheckAllMassiv(bbuf,1,&bstr,&btok);
  5901.  
  5902.                                                 outseg(&btok,2);
  5903.  
  5904.                                                 op(vop); op(btok.rm);  /* ADD [anybyte],AL */
  5905.  
  5906.                                                 outaddress(&btok);
  5907.  
  5908.                                                 next=0;
  5909.  
  5910.                                                 break;
  5911.  
  5912.                                 }
  5913.  
  5914.                         }
  5915.  
  5916.                         break;
  5917.  
  5918.                 case tk_swap:
  5919.  
  5920.                         KillVar(btok.name);
  5921.  
  5922.                         getoperand();
  5923.  
  5924.                         rbuf=bufrm;
  5925.  
  5926.                         bufrm=NULL;
  5927.  
  5928.                         switch(tok){
  5929.  
  5930.                                 case tk_beg:
  5931.  
  5932. #ifdef OPTVARCONST
  5933.  
  5934.                                         initconst=SwapVarRegConst(itok.number,&btok,r8);
  5935.  
  5936. #endif
  5937.  
  5938.                                         CheckAllMassiv(bbuf,1,&bstr,&btok);
  5939.  
  5940.                                         outseg(&btok,2);
  5941.  
  5942.                                         op(0x86);       /* XCHG beg,[anybloc] */
  5943.  
  5944.                                         op((unsigned int)itok.number*8+btok.rm);
  5945.  
  5946.                                         outaddress(&btok);
  5947.  
  5948.                                         ClearReg(itok.number>3?itok.number-4:itok.number);
  5949.  
  5950.                                         break;
  5951.  
  5952.                                 case tk_bytevar:
  5953.  
  5954.                                 case tk_charvar:
  5955.  
  5956. #ifdef OPTVARCONST
  5957.  
  5958.                                         initconst=SwapVarConst(&itok,&btok);
  5959.  
  5960. #endif
  5961.  
  5962.                                         if(hnumber==0)getintoal(otok,&btok,bbuf,&bstr);
  5963.  
  5964.                                         else getinto_reg(otok,&btok,bbuf,&bstr,r8,hnumber);
  5965.  
  5966.                                         CheckAllMassiv(rbuf,1,&strinf,&itok,(am32!=FALSE&&bbuf!=NULL&&bstr.bufstr!=NULL)?BX:DI,DX);
  5967.  
  5968.                                         outseg(&itok,2);
  5969.  
  5970.                                         op(0x86);        /* XCHG AL,[bloc] */
  5971.  
  5972.                                         op(itok.rm+hnumber*8);
  5973.  
  5974.                                         outaddress(&itok);
  5975.  
  5976.                                         KillVar(itok.name);
  5977.  
  5978.                                         goto getfromax;
  5979.  
  5980.                                 default: swaperror(); break;
  5981.  
  5982.                         }
  5983.  
  5984.                         break;
  5985.  
  5986.                 case tk_rrequals:
  5987.  
  5988.                         vop=8;
  5989.  
  5990.                         if(sign)vop+=0x10;
  5991.  
  5992.                 case tk_llequals:
  5993.  
  5994.                         KillVar(btok.name);
  5995.  
  5996.                         getoperand(am32==TRUE?ECX:BX);
  5997.  
  5998.                         if(itok2.type!=tp_stopper){
  5999.  
  6000.                                 doalmath(0,&ofsstr);            // all shifts unsigned byte
  6001.  
  6002.                                 outword(0xC188);        // MOV CL,AL
  6003.  
  6004.                                 if(addESP!=oaddESP&&am32&&ESPloc&&(btok.type==tp_paramvar||btok.type==tp_localvar))btok.number+=addESP-oaddESP;
  6005.  
  6006.                                 CheckAllMassiv(bbuf,1,&bstr,&btok);
  6007.  
  6008.                                 outseg(&btok,2);
  6009.  
  6010.                                 op(0xD2);       op(0x20+vop+btok.rm);  /* SHL [byte],CL */
  6011.  
  6012.                                 outaddress(&btok);
  6013.  
  6014.                                 warningreg(begs[1]);
  6015.  
  6016.                                 ClearReg(CX);
  6017.  
  6018.                                 ClearReg(AX);
  6019.  
  6020.                                 next=0;
  6021.  
  6022.                         }
  6023.  
  6024.                         else if(tok==tk_number){
  6025.  
  6026. #ifdef OPTVARCONST
  6027.  
  6028.                                 if((itok.flag&f_reloc)==0){
  6029.  
  6030.                                                 initconst=UpdVarConst(&btok,itok.lnumber,itok.rm,operand);
  6031.  
  6032.                                 }
  6033.  
  6034. #endif
  6035.  
  6036.                                 if((unsigned int)itok.number==1){
  6037.  
  6038.                                         CheckAllMassiv(bbuf,1,&bstr,&btok);
  6039.  
  6040.                                         outseg(&btok,2);
  6041.  
  6042.                                         op(0xD0);       op(0x20+vop+btok.rm);  /* SHL [byte],1 */
  6043.  
  6044.                                         outaddress(&btok);
  6045.  
  6046.                                 }
  6047.  
  6048.                                 else if((unsigned int)itok.number!=0){
  6049.  
  6050.                                         CheckAllMassiv(bbuf,1,&bstr,&btok);
  6051.  
  6052.                                         if(chip<2){
  6053.  
  6054.                                                 getintobeg(CL,&ofsstr);
  6055.  
  6056.                                                 outseg(&btok,2);
  6057.  
  6058.                                                 op(0xD2);       op(0x20+vop+btok.rm);  /* SHL [byte],CL */
  6059.  
  6060.                                                 outaddress(&btok);
  6061.  
  6062.                                                 warningreg(begs[1]);
  6063.  
  6064.                                                 ClearReg(CX);
  6065.  
  6066.                                                 next=0;
  6067.  
  6068.                                         }
  6069.  
  6070.                                         else{
  6071.  
  6072.                                                 outseg(&btok,2);
  6073.  
  6074.                                                 op(0xC0);       op(0x20+vop+btok.rm);  /* SHL [byte],imm8 */
  6075.  
  6076.                                                 outaddress(&btok);
  6077.  
  6078.                                                 if(cpu<2)cpu=2;
  6079.  
  6080.                                         }
  6081.  
  6082.                                         op((unsigned int)itok.number);
  6083.  
  6084.                                 }
  6085.  
  6086.                         }
  6087.  
  6088.                         else{
  6089.  
  6090.                                 if(tok!=tk_beg||(unsigned int)itok.number!=CL){
  6091.  
  6092.                                         getintobeg(CL,&ofsstr);
  6093.  
  6094.                                         warningreg(begs[1]);
  6095.  
  6096.                                         ClearReg(CX);
  6097.  
  6098.                                         next=0;
  6099.  
  6100.                                 }
  6101.  
  6102.                                 CheckAllMassiv(bbuf,1,&bstr,&btok);
  6103.  
  6104.                                 outseg(&btok,2);
  6105.  
  6106.                                 op(0xD2);       op(0x20+vop+btok.rm);  /* SHL [byte],CL */
  6107.  
  6108.                                 outaddress(&btok);
  6109.  
  6110.                         }
  6111.  
  6112.                         break;
  6113.  
  6114.                 default: operatorexpected(); break;
  6115.  
  6116.         }
  6117.  
  6118. #ifdef OPTVARCONST
  6119.  
  6120.         if(initconst==FALSE)ClearVarByNum(&btok);
  6121.  
  6122. #endif
  6123.  
  6124.         if(next)nexttok();
  6125.  
  6126.         if(terminater==tk_semicolon)seminext();
  6127.  
  6128.         return retrez;
  6129.  
  6130. }
  6131.  
  6132.  
  6133.  
  6134. void  getinto_reg(int gtok,ITOK *gstok,char *&gbuf,SINFO *gstr,int razr,int reg)
  6135.  
  6136. {
  6137.  
  6138. unsigned int i=0;
  6139.  
  6140. int vop=0;
  6141.  
  6142. int reg1=SI,reg2=DI;
  6143.  
  6144.         switch(gtok){
  6145.  
  6146.                 case tk_dwordvar:
  6147.  
  6148.                 case tk_longvar:
  6149.  
  6150.                         i+=4;
  6151.  
  6152. longvar:
  6153.  
  6154.                         CheckAllMassiv(gbuf,i,gstr,gstok,reg1,reg2);
  6155.  
  6156.                         op66(razr);
  6157.  
  6158.                         outseg(gstok,2);
  6159.  
  6160.                         op(0x8B);
  6161.  
  6162.                         op(gstok->rm+reg*8);
  6163.  
  6164.                         outaddress(gstok);
  6165.  
  6166.                         ClearReg(reg);
  6167.  
  6168.                         break;
  6169.  
  6170.                 case tk_intvar:
  6171.  
  6172.                         vop=8;
  6173.  
  6174.                 case tk_wordvar:
  6175.  
  6176.                         i=2;
  6177.  
  6178.                         goto longvar;
  6179.  
  6180.                 case tk_bytevar:
  6181.  
  6182.                 case tk_charvar:
  6183.  
  6184.                         CheckAllMassiv(gbuf,i,gstr,gstok,reg1,reg2);
  6185.  
  6186.                         outseg(gstok,2);
  6187.  
  6188.                         op(0x8A);
  6189.  
  6190.                         op(gstok->rm+reg*8);
  6191.  
  6192.                         outaddress(gstok);
  6193.  
  6194.                         ClearReg(reg);
  6195.  
  6196.                         break;
  6197.  
  6198.         }
  6199.  
  6200. }
  6201.  
  6202.  
  6203.  
  6204. void  getinto_e_ax(int sign,int gtok,ITOK *gstok,char *&gbuf,SINFO *gstr,int razr,int useAX)
  6205.  
  6206. {
  6207.  
  6208. unsigned int i=0;
  6209.  
  6210. int vop=0;
  6211.  
  6212. int reg1=idxregs[0],reg2=idxregs[1];
  6213.  
  6214.         if(am32){
  6215.  
  6216.                 reg1=useAX==FALSE?EAX:idxregs[0];
  6217.  
  6218.                 reg2=idxregs[3];
  6219.  
  6220.         }
  6221.  
  6222. //      printf("tok=%u %s\n",gtok,gstok->name);
  6223.  
  6224.         switch(gtok){
  6225.  
  6226.                 case tk_bits:
  6227.  
  6228.                         vop=gstok->bit.siz+gstok->bit.ofs;
  6229.  
  6230.                         if(vop<=64)i=r64;
  6231.  
  6232.                         if(vop<=32)i=r32;
  6233.  
  6234.                         if(vop<=16)i=r16;
  6235.  
  6236.                         bits2reg(AX,((unsigned int)razr>i?razr:i));
  6237.  
  6238.                         break;
  6239.  
  6240.                 case tk_postnumber:
  6241.  
  6242.                         op66(razr);
  6243.  
  6244.                         op(0xB8); /* MOV EAX,# */
  6245.  
  6246.                         (gstok->flag&f_extern)==0?setwordpost(gstok):setwordext(&gstok->number);
  6247.  
  6248.                         razr==r16?outword(gstok->number):outdword(gstok->number);
  6249.  
  6250.                         ClearReg(AX);
  6251.  
  6252.                         break;
  6253.  
  6254.                 case tk_rmnumber:
  6255.  
  6256.                         CheckAllMassiv(gbuf,gstok->size,gstr,gstok,reg1,reg2);
  6257.  
  6258.                         if(gstok->rm||am32==0){
  6259.  
  6260.                                 op66(razr);
  6261.  
  6262.                                 op67(gstok->sib==CODE16?r16:r32);
  6263.  
  6264.                                 if(gstok->post==0)outseg(gstok,2);
  6265.  
  6266.                                 op(0x8D); op(gstok->rm);
  6267.  
  6268.                                 if(gstok->post!=0&&gstok->post!=UNDEF_OFSET){
  6269.  
  6270.                                         if((gstok->flag&f_extern)==0){
  6271.  
  6272.                                                 i=outptr;
  6273.  
  6274.                                                 if(am32&&gstok->rm==rm_sib)outptr++;
  6275.  
  6276.                                                 setwordpost(gstok);
  6277.  
  6278.                                                 outptr=i;
  6279.  
  6280.                                         }
  6281.  
  6282.                                         else setwordext(&gstok->number);
  6283.  
  6284.                                 }
  6285.  
  6286.                                 outaddress(gstok); /* LEA AX,[rm] */
  6287.  
  6288.                                 ClearReg(AX);
  6289.  
  6290.                         }
  6291.  
  6292.                         else nexttok();
  6293.  
  6294.                         break;
  6295.  
  6296.                 case tk_doublevar:
  6297.  
  6298.                         vop=4;
  6299.  
  6300.                 case tk_floatvar:
  6301.  
  6302.                         CheckInitBP();
  6303.  
  6304.                         if(cpu<3)cpu=3;
  6305.  
  6306.                         op66(r32);
  6307.  
  6308.                         op(0x50);  //push EAX
  6309.  
  6310.                         if(ESPloc&&am32&&gstok->segm==SS)gstok->number+=4;
  6311.  
  6312.                         addESP+=4;
  6313.  
  6314.                         CheckAllMassiv(gbuf,4,gstr,gstok,reg1,reg2);
  6315.  
  6316.                         outseg(gstok,2);        //fld floatvar
  6317.  
  6318.                         op(0xd9+vop);
  6319.  
  6320.                         op(gstok->rm);
  6321.  
  6322.                         outaddress(gstok);
  6323.  
  6324.                         fistp_stack();
  6325.  
  6326.                         op66(r32);
  6327.  
  6328.                         op(0x58);       //pop EAX
  6329.  
  6330.                         addESP-=4;
  6331.  
  6332.                         RestoreBP();
  6333.  
  6334.                         ClearReg(AX);
  6335.  
  6336.                         break;
  6337.  
  6338.                 case tk_qwordvar:
  6339.  
  6340.                         i=4;
  6341.  
  6342.                 case tk_dwordvar:
  6343.  
  6344.                 case tk_longvar:
  6345.  
  6346.                         i+=4;
  6347.  
  6348. longvar:
  6349.  
  6350.                         if((gstok->rm==rm_d16&&gstok->sib==CODE16)||(gstok->rm==rm_d32&&(gstok->sib==CODE32||gstok->sib==0))){
  6351.  
  6352.                                 op66(razr);
  6353.  
  6354.                                 outseg(gstok,1);
  6355.  
  6356.                                 op(0xA1);
  6357.  
  6358.                                 if(gstok->post==UNDEF_OFSET)AddUndefOff(2,gstok->name);
  6359.  
  6360.                                 if(am32==FALSE)outword((unsigned int)gstok->number);
  6361.  
  6362.                                 else outdword(gstok->number);
  6363.  
  6364.                         }
  6365.  
  6366.                         else{
  6367.  
  6368.                                 CheckAllMassiv(gbuf,i,gstr,gstok,reg1,reg2);
  6369.  
  6370.                                 op66(razr);
  6371.  
  6372.                                 outseg(gstok,2);
  6373.  
  6374.                                 op(0x8B);
  6375.  
  6376.                                 op(gstok->rm);
  6377.  
  6378.                                 outaddress(gstok);
  6379.  
  6380.                         }
  6381.  
  6382.                         ClearReg(AX);
  6383.  
  6384.                         break;
  6385.  
  6386.                 case tk_intvar:
  6387.  
  6388.                         vop=8;
  6389.  
  6390.                 case tk_wordvar:
  6391.  
  6392.                         i=2;
  6393.  
  6394.                         if(razr==r16)goto longvar;
  6395.  
  6396.                         i=1;
  6397.  
  6398.                         if(optimizespeed&&vop==0&&chip>3&&chip<7)goto optpent;
  6399.  
  6400. movxx:
  6401.  
  6402.                         CheckAllMassiv(gbuf,1+i,gstr,gstok,reg1,reg2);
  6403.  
  6404.                         op66(razr);
  6405.  
  6406.                         outseg(gstok,3);        /* MOVSX EAX,[charvar] */
  6407.  
  6408.                         op(0x0F); op(0xB6+vop+i); op(gstok->rm);
  6409.  
  6410.                         outaddress(gstok);
  6411.  
  6412.                         ClearReg(AX);
  6413.  
  6414.                         break;
  6415.  
  6416.                 case tk_charvar:
  6417.  
  6418.                         vop=8;
  6419.  
  6420.                         if(razr==r16){
  6421.  
  6422.                                 if((gstok->rm==rm_d16&&gstok->sib==CODE16)||(gstok->rm==rm_d32&&(gstok->sib==CODE32||gstok->sib==0))){
  6423.  
  6424.                                         outseg(gstok,1);
  6425.  
  6426.                                         op(0xA0);
  6427.  
  6428.                                         if(am32==FALSE)outword(gstok->number);
  6429.  
  6430.                                         else outdword(gstok->number);
  6431.  
  6432.                                 }
  6433.  
  6434.                                 else{
  6435.  
  6436.                                         CheckAllMassiv(gbuf,1,gstr,gstok,reg1,reg2);
  6437.  
  6438.                                         outseg(gstok,2);
  6439.  
  6440.                                         op(0x8A); op(gstok->rm);
  6441.  
  6442.                                         outaddress(gstok);
  6443.  
  6444.                                 }
  6445.  
  6446.                                 cbw();
  6447.  
  6448.                                 ClearReg(AX);
  6449.  
  6450.                                 break;
  6451.  
  6452.                         }
  6453.  
  6454.                         goto movxx;
  6455.  
  6456.                 case tk_bytevar:
  6457.  
  6458. optpent:
  6459.  
  6460.                         if((gstok->rm==rm_d16&&gstok->sib==CODE16)||(gstok->rm==rm_d32&&(gstok->sib==CODE32||gstok->sib==0))){
  6461.  
  6462.                                 ZeroReg(EAX,razr);
  6463.  
  6464.                                 if(i)op66(r16);
  6465.  
  6466.                                 outseg(gstok,1);
  6467.  
  6468.                                 op(0xA0+i);
  6469.  
  6470.                                 if(am32==FALSE)outword(gstok->number);
  6471.  
  6472.                                 else outdword(gstok->number);
  6473.  
  6474.                                 ClearReg(AX);
  6475.  
  6476.                                 break;
  6477.  
  6478.                         }
  6479.  
  6480.                         if((chip>=3&&(!optimizespeed))||RmEqualReg(AX,gstok->rm,gstok->sib))goto movxx;
  6481.  
  6482.                         ZeroReg(EAX,razr);
  6483.  
  6484.                         CheckAllMassiv(gbuf,1+i,gstr,gstok,SI,reg2);
  6485.  
  6486.                         if(i)op66(r16);
  6487.  
  6488.                         outseg(gstok,2);
  6489.  
  6490.                         op(0x8A+i); op(gstok->rm);
  6491.  
  6492.                         outaddress(gstok);
  6493.  
  6494.                         break;
  6495.  
  6496.                 case tk_beg:
  6497.  
  6498.                         if(gstok->number==AL&&(!sign)&&razr==r16){
  6499.  
  6500.                                 xorAHAH();
  6501.  
  6502.                                 ClearReg(AX);
  6503.  
  6504.                                 break;
  6505.  
  6506.                         }
  6507.  
  6508.                         if(optimizespeed&&chip>3&&chip<7){
  6509.  
  6510.                                 if(sign){
  6511.  
  6512.                                         if(razr==r32)goto movxxr;
  6513.  
  6514.                                         if(gstok->number!=AL){
  6515.  
  6516.                                                 op(0x88);
  6517.  
  6518.                                                 op(0xC0+gstok->number*8);       //mov al,beg
  6519.  
  6520.                                         }
  6521.  
  6522.                                         if(gstok->number!=AH)outword(0xC488);   //mov ah,al
  6523.  
  6524.                                         outword(0xFCC0);        //sar ah,7
  6525.  
  6526.                                         op(7);
  6527.  
  6528.                                 }
  6529.  
  6530.                                 else{
  6531.  
  6532.                                         if(razr==r32&&(gstok->number==AL||gstok->number==AH)){
  6533.  
  6534.                                                 /*if(chip==4)*/goto movxxr;
  6535.  
  6536. /*                                              op(0x88);
  6537.  
  6538.                                                 op(0xC1+gstok->number*8);       //mov cl,beg
  6539.  
  6540.                                                 xorEAXEAX();
  6541.  
  6542.                                                 outword(0xC888);        // mov al,cl
  6543.  
  6544.                                                 warningreg(begs[1]);
  6545.  
  6546.                                                 break;*/
  6547.  
  6548.                                         }
  6549.  
  6550.                                         if(gstok->number==AH)outdword(0xE430E088);      //mov al,ah xor ah,ah
  6551.  
  6552.                                         else{
  6553.  
  6554.                                                 ZeroReg(EAX,razr);
  6555.  
  6556.                                                 op(0x88);
  6557.  
  6558.                                                 op(0xC0+gstok->number*8);       //mov al,beg
  6559.  
  6560.                                         }
  6561.  
  6562.                                 }
  6563.  
  6564.                                 ClearReg(AX);
  6565.  
  6566.                                 break;
  6567.  
  6568.                         }
  6569.  
  6570. movxxr:
  6571.  
  6572.                         if(chip>2||razr==r32){
  6573.  
  6574.                                 op66(razr);
  6575.  
  6576.                                 if(sign)outword(0xBE0F);
  6577.  
  6578.                                 else outword(0xB60F);
  6579.  
  6580.                                 op(0xC0+(unsigned int)gstok->number); // MOVxX AX,beg
  6581.  
  6582.                         }
  6583.  
  6584.                         else{
  6585.  
  6586.                                 op(0x88);
  6587.  
  6588.                                 op(0xC0+gstok->number*8);
  6589.  
  6590.                                 if(sign)cbw();
  6591.  
  6592.                                 else xorAHAH();
  6593.  
  6594.                         }
  6595.  
  6596.                         ClearReg(AX);
  6597.  
  6598.                         break;
  6599.  
  6600.                 case tk_reg:
  6601.  
  6602.                         if(razr==r32){
  6603.  
  6604.                                 if(tok2==tk_openbracket){       //¢ë§®¢ ¯à®æ¥¤ãàë ¯®  ¤à¥áã ¢ ॣ¨áâà¥
  6605.  
  6606.                                         reg1=gstok->number;
  6607.  
  6608.                                         nexttok();
  6609.  
  6610.                                         param[0]=0;
  6611.  
  6612.                                         if(comfile==file_w32)swapparam();
  6613.  
  6614.                                         else doparams();
  6615.  
  6616.                                         op66(r16);
  6617.  
  6618.                                         op(0xFF);
  6619.  
  6620.                                         op(0xD0+reg1);  /* CALL reg with stack params */
  6621.  
  6622. #ifdef OPTVARCONST
  6623.  
  6624.                                         FreeGlobalConst();
  6625.  
  6626. #endif
  6627.  
  6628.                                         clearregstat();
  6629.  
  6630.                                         break;
  6631.  
  6632.                                 }
  6633.  
  6634.                                 if(optimizespeed&&(!sign)&&chip>3&&chip<7){
  6635.  
  6636.                                         if(gstok->number==AX){
  6637.  
  6638.                                                 goto movxr;
  6639.  
  6640. /*                                              op66(r16);
  6641.  
  6642.                                                 outword(0xC189);        //mov cx,AX
  6643.  
  6644.                                                 xorEAXEAX();
  6645.  
  6646.                                                 op66(r16);
  6647.  
  6648.                                                 outword(0xC889);        //mov aX,cX
  6649.  
  6650.                                                 warningreg(regs[0][1]);*/
  6651.  
  6652.                                         }
  6653.  
  6654.                                         else{
  6655.  
  6656.                                                 xorEAXEAX();
  6657.  
  6658.                                                 op66(r16);
  6659.  
  6660.                                                 op(0x89);
  6661.  
  6662.                                                 op(0xC0+gstok->number*8);       //mov ax,reg
  6663.  
  6664.                                         }
  6665.  
  6666.                                 }
  6667.  
  6668.                                 else{
  6669.  
  6670. movxr:
  6671.  
  6672.                                         op66(r32);
  6673.  
  6674.                                         op(0x0F);       /* MOVSX or MOVZX EAX,reg */
  6675.  
  6676.                                         if(sign)op(0xBF);
  6677.  
  6678.                                         else op(0xB7);
  6679.  
  6680.                                         op(0xC0+gstok->number);
  6681.  
  6682.                                 }
  6683.  
  6684.                                 RegToReg(AX,gstok->number,razr);
  6685.  
  6686.                                 break;
  6687.  
  6688.                         }
  6689.  
  6690.                 case tk_reg32:
  6691.  
  6692.                         if(tok2==tk_openbracket){       //¢ë§®¢ ¯à®æ¥¤ãàë ¯®  ¤à¥áã ¢ ॣ¨áâà¥
  6693.  
  6694.                                 reg1=gstok->number;
  6695.  
  6696.                                 nexttok();
  6697.  
  6698.                                 param[0]=0;
  6699.  
  6700.                                 if(comfile==file_w32)swapparam();
  6701.  
  6702.                                 else doparams();
  6703.  
  6704.                                 op66(razr);
  6705.  
  6706.                                 op(0xFF);
  6707.  
  6708.                                 op(0xD0+reg1);  /* CALL reg with stack params */
  6709.  
  6710.                                 clearregstat();
  6711.  
  6712. #ifdef OPTVARCONST
  6713.  
  6714.                                 FreeGlobalConst();
  6715.  
  6716. #endif
  6717.  
  6718.                                 break;
  6719.  
  6720.                         }
  6721.  
  6722.                         if(gstok->number!=AX){
  6723.  
  6724.                                 op66(razr);
  6725.  
  6726.                                 op(0x89);
  6727.  
  6728.                                 op(0xC0+gstok->number*8);
  6729.  
  6730.                                 RegToReg(AX,gstok->number,razr);
  6731.  
  6732.                         }
  6733.  
  6734.                         break;
  6735.  
  6736.                 case tk_seg:
  6737.  
  6738.                         if(razr==r32)op66(r32);
  6739.  
  6740.                         op(0x8C);       //mov var,SS
  6741.  
  6742.                         op(0xC0+gstok->number*8);
  6743.  
  6744.                         ClearReg(AX);
  6745.  
  6746.                         break;
  6747.  
  6748.                 case tk_string:
  6749.  
  6750.                         op66(razr);
  6751.  
  6752.                         op(0xB8);
  6753.  
  6754.                         if(razr==r16){
  6755.  
  6756.                                 if(am32)dwordvalexpected();
  6757.  
  6758.                                 outword(addpoststring(CS,gstok->number,gstok->flag));
  6759.  
  6760.                         }
  6761.  
  6762.                         else outdword(addpoststring(CS,gstok->number,gstok->flag));
  6763.  
  6764.                         ClearReg(AX);
  6765.  
  6766.                         break;
  6767.  
  6768.                 default: valueexpected();       break;
  6769.  
  6770.         }
  6771.  
  6772.         if(razr==r32&&cpu<3)cpu=3;
  6773.  
  6774. }
  6775.  
  6776.  
  6777.  
  6778. int caselong(unsigned long val)
  6779.  
  6780. {
  6781.  
  6782. int vop=0;
  6783.  
  6784. unsigned long num;
  6785.  
  6786.         for(;vop<NUMNUM;vop++){
  6787.  
  6788.                 num=li[vop];
  6789.  
  6790.                 if(val==num)break;
  6791.  
  6792.                 if(val<num)return NUMNUM;
  6793.  
  6794.         }
  6795.  
  6796.         return vop;
  6797.  
  6798. }
  6799.  
  6800.  
  6801.  
  6802. int caselonglong(unsigned long long val)
  6803.  
  6804. {
  6805.  
  6806. int vop=0;
  6807.  
  6808. unsigned long long num;
  6809.  
  6810.         for(;vop<NUMNUM64;vop++){
  6811.  
  6812.                 num=li[vop];
  6813.  
  6814.                 if(val==num)break;
  6815.  
  6816.                 if(val<num)return NUMNUM64;
  6817.  
  6818.         }
  6819.  
  6820.         return vop;
  6821.  
  6822. }
  6823.  
  6824.  
  6825.  
  6826. int do_e_axmath(int sign,int razr,char **ofsstr)
  6827.  
  6828. {
  6829.  
  6830. int negflag=0,next=0;
  6831.  
  6832. int expand=FALSE,rettype;
  6833.  
  6834. unsigned int i=0;
  6835.  
  6836. unsigned long holdnumber=0;
  6837.  
  6838. int loop=0,otok;
  6839.  
  6840.         rettype=(razr==r16?tk_reg:tk_reg32);
  6841.  
  6842.         if(tok==tk_minus){
  6843.  
  6844.                 if(CheckMinusNum()==FALSE){
  6845.  
  6846.                         negflag=1;
  6847.  
  6848.                         getoperand(am32==TRUE?EAX:BX);
  6849.  
  6850.                 }
  6851.  
  6852.         }
  6853.  
  6854.         if(uselea){
  6855.  
  6856.                 if(razr==r32){
  6857.  
  6858.                         if(Reg32ToLea(EAX)){
  6859.  
  6860.                                 goto contloop;  //®¯â¨¬¨§ æ¨ï á«®¦¥­¨ï 32-¡¨â­ëå ॣ¨áâ஢ ¢ LEA
  6861.  
  6862.                         }
  6863.  
  6864.                 }
  6865.  
  6866.                 else if(Reg16ToLea(AX)){
  6867.  
  6868.                         goto contloop;  //®¯â¨¬¨§ æ¨ï á«®¦¥­¨ï 32-¡¨â­ëå ॣ¨áâ஢
  6869.  
  6870.                 }
  6871.  
  6872.         }
  6873.  
  6874. loopswitch:
  6875.  
  6876.         otok=tok;
  6877.  
  6878. //      printf("tok=%d %s\n",tok,itok.name);
  6879.  
  6880. #ifdef OPTVARCONST
  6881.  
  6882.         CheckConstVar3(&tok,&itok,razr);
  6883.  
  6884.         if(tok==tk_number)calcnumber=TRUE;
  6885.  
  6886. #endif
  6887.  
  6888.         switch(tok){
  6889.  
  6890.                 case tk_number:
  6891.  
  6892.                         holdnumber=CalcNumber(sign);
  6893.  
  6894.                         if(loop==0)i=postnumflag;
  6895.  
  6896.                         else i^=postnumflag;
  6897.  
  6898.                         loop++;
  6899.  
  6900.                         if(tok==tk_mult&&(optimizespeed||razr==r32)&&
  6901.  
  6902.                                         (!((tok2==tk_reg32||tok2==tk_reg)&&itok2.number==EAX))&&expandvar()==FALSE){
  6903.  
  6904.                                 getoperand(am32==TRUE?EAX:BX);
  6905.  
  6906.                                 next=1;
  6907.  
  6908.                                 goto loopswitch;
  6909.  
  6910.                         }
  6911.  
  6912.                         if(tok==tk_plus&&tok2==tk_postnumber){
  6913.  
  6914.                                 nexttok();
  6915.  
  6916.                                 goto loopswitch;
  6917.  
  6918.                         }
  6919.  
  6920.                         MovRegNum(razr,i&f_reloc,holdnumber,EAX);
  6921.  
  6922.                         next=0;
  6923.  
  6924.                         break;
  6925.  
  6926.                 case tk_apioffset:
  6927.  
  6928.                         op66(razr);
  6929.  
  6930.                         op(0xB8);                       /* MOV AX,# */
  6931.  
  6932.                         AddApiToPost(itok.number);
  6933.  
  6934.                         nexttok();
  6935.  
  6936.                         break;
  6937.  
  6938.                 case tk_postnumber:
  6939.  
  6940.                 case tk_undefofs:
  6941.  
  6942.                         if(next==0){
  6943.  
  6944.                                 op66(razr);
  6945.  
  6946.                                 op(0xB8);                       /* MOV AX,# */
  6947.  
  6948.                                 next=1;
  6949.  
  6950.                         }
  6951.  
  6952.                         if(tok==tk_undefofs){
  6953.  
  6954.                                 AddUndefOff(2,itok.name);
  6955.  
  6956. //                              AddUndefOff(0,itok.name);       //22.11.04 20:52
  6957.  
  6958. //                              itok.flag=0;    //new 07.07.04 23:57
  6959.  
  6960.                         }
  6961.  
  6962.                         else (itok.flag&f_extern)==0?setwordpost(&itok):setwordext(&itok.number);
  6963.  
  6964.                         tok=tk_number;
  6965.  
  6966.                         holdnumber+=doconstdwordmath();
  6967.  
  6968.                         if(otok!=tk_postnumber){
  6969.  
  6970.                                 if(loop==0)i=postnumflag;
  6971.  
  6972.                                 else i^=postnumflag;
  6973.  
  6974.                                 loop++;
  6975.  
  6976.                         }
  6977.  
  6978.                         if(tok==tk_plus&&tok2==tk_postnumber){
  6979.  
  6980.                                 nexttok();
  6981.  
  6982.                                 goto loopswitch;
  6983.  
  6984.                         }
  6985.  
  6986.                         if((i&f_reloc)!=0)AddReloc();
  6987.  
  6988.                         next=0;
  6989.  
  6990.                         if(razr==r16)outword(holdnumber);
  6991.  
  6992.                         else outdword(holdnumber);
  6993.  
  6994.                         ClearReg(AX);
  6995.  
  6996.                         break;
  6997.  
  6998.                 case tk_rmnumber:
  6999.  
  7000. int reg1,reg2;
  7001.  
  7002.                         reg1=am32==FALSE?idxregs[0]:EAX;
  7003.  
  7004.                         reg2=am32==FALSE?idxregs[1]:ECX;
  7005.  
  7006.                         CheckAllMassiv(bufrm,itok.size,&strinf,&itok,reg1,reg2);
  7007.  
  7008.                         if(itok.rm||am32==0){
  7009.  
  7010.                                 op66(razr);
  7011.  
  7012.                                 op67(itok.sib==CODE16?r16:r32);
  7013.  
  7014.                                 if((itok.rm&0x3F)==0&&am32&&itok.post==0&&(short_ok(itok.number,TRUE)==FALSE||((itok.rm&rm_mod11)==rm_mod10))){ //add
  7015.  
  7016.                                         outseg(&itok,1);
  7017.  
  7018.                                         op(5);  //add
  7019.  
  7020.                                 }
  7021.  
  7022.                                 else{   //lea
  7023.  
  7024.                                         if(itok.post==0)outseg(&itok,2);
  7025.  
  7026.                                         op(0x8D); op(itok.rm);
  7027.  
  7028.                                 }
  7029.  
  7030. //                              if(itok.post==0)outseg(&itok,2);
  7031.  
  7032. //                              op(0x8D); op(itok.rm);
  7033.  
  7034.                                 if(itok.post!=0&&itok.post!=UNDEF_OFSET){
  7035.  
  7036.                                         if((itok.flag&f_extern)==0){
  7037.  
  7038.                                                 i=outptr;
  7039.  
  7040.                                                 if(am32&&itok.rm==rm_sib)outptr++;
  7041.  
  7042.                                                 setwordpost(&itok);
  7043.  
  7044.                                                 outptr=i;
  7045.  
  7046.                                         }
  7047.  
  7048.                                         else setwordext(&itok.number);
  7049.  
  7050.                                 }
  7051.  
  7052. ITOK oitok;
  7053.  
  7054.                                 oitok=itok;
  7055.  
  7056.                                 tok=tk_number;
  7057.  
  7058.                                 itok.rm=tk_dword;
  7059.  
  7060.                                 oitok.number=doconstdwordmath();
  7061.  
  7062. //                      oitok.flag|=postnumflag;
  7063.  
  7064.                                 outaddress(&oitok); // LEA AX,[rm]
  7065.  
  7066.                                 ClearReg(AX);
  7067.  
  7068.                         }
  7069.  
  7070.                         else nexttok();
  7071.  
  7072.                         break;
  7073.  
  7074.                 case tk_at:
  7075.  
  7076.                         getoperand(am32==TRUE?EAX:BX);
  7077.  
  7078.                         i++;
  7079.  
  7080.                 case tk_ID:
  7081.  
  7082.                 case tk_id:
  7083.  
  7084.                 case tk_proc:
  7085.  
  7086.                 case tk_apiproc:
  7087.  
  7088.                 case tk_undefproc:
  7089.  
  7090.                 case tk_declare:
  7091.  
  7092.                         if(itok.flag&f_retproc)rettype=(itok.flag&f_retproc)/256+tk_overflowflag-1;
  7093.  
  7094.                         if((!i)||
  7095.  
  7096.                                         macros(sign!=0?(razr==r16?tk_int:tk_long):(razr==r16?tk_word:tk_dword))==0){
  7097.  
  7098.                                 procdo(sign!=0?(razr==r16?tk_int:tk_long):(razr==r16?tk_word:tk_dword));
  7099.  
  7100.                         }
  7101.  
  7102.                         nexttok();
  7103.  
  7104.                         if(*ofsstr){
  7105.  
  7106.                                 free(*ofsstr);
  7107.  
  7108.                                 *ofsstr=NULL;
  7109.  
  7110.                         }
  7111.  
  7112.                         break;
  7113.  
  7114.                 case tk_new:
  7115.  
  7116.                         donew();
  7117.  
  7118.                         clearregstat();
  7119.  
  7120. #ifdef OPTVARCONST
  7121.  
  7122.                         FreeGlobalConst();
  7123.  
  7124. #endif
  7125.  
  7126.                         if(*ofsstr){
  7127.  
  7128.                                 free(*ofsstr);
  7129.  
  7130.                                 *ofsstr=NULL;
  7131.  
  7132.                         }
  7133.  
  7134.                         nexttok();
  7135.  
  7136.                         break;
  7137.  
  7138.                 default:
  7139.  
  7140.                         SINFO wstr=strinf;
  7141.  
  7142.                         ITOK witok=itok;
  7143.  
  7144.                         char *wbuf=bufrm;
  7145.  
  7146.                         bufrm=NULL;
  7147.  
  7148.                         strinf.bufstr=NULL;
  7149.  
  7150.                         getinto_e_ax(sign,tok,&witok,wbuf,&wstr,razr);
  7151.  
  7152.                         nexttok(); break;
  7153.  
  7154.         }
  7155.  
  7156. contloop:
  7157.  
  7158.         if(negflag){
  7159.  
  7160.                 NegReg(razr,EAX);
  7161.  
  7162.                 setzeroflag=TRUE;
  7163.  
  7164.         }
  7165.  
  7166. #ifdef OPTVARCONST
  7167.  
  7168.         calcnumber=FALSE;
  7169.  
  7170. #endif
  7171.  
  7172.         if(next)RegMulNum(AX,holdnumber,razr,sign,&expand,i);
  7173.  
  7174. //      printf("tok=%d type=%d name=%s\n",tok,itok.type,itok.name);
  7175.  
  7176.         if(itok.type!=tp_stopper&&tok!=tk_eof&&itok.type!=tp_compare){
  7177.  
  7178.                 do_e_axmath2(sign,razr,expand);
  7179.  
  7180.                 rettype=(razr==r16?tk_reg:tk_reg32);
  7181.  
  7182.         }
  7183.  
  7184.         return rettype;
  7185.  
  7186. }
  7187.  
  7188.  
  7189.  
  7190. void do_e_axmath2(int sign,int razr,int expand)
  7191.  
  7192. {
  7193.  
  7194. int vop,negflag=0,next;
  7195.  
  7196. int optnum=FALSE;
  7197.  
  7198. unsigned int i;
  7199.  
  7200. char *ofsstr=NULL;
  7201.  
  7202. unsigned char oaddstack;
  7203.  
  7204.         while(itok.type!=tp_stopper&&tok!=tk_eof&&itok.type!=tp_compare){
  7205.  
  7206.                 next=1;
  7207.  
  7208.                 vop=0;
  7209.  
  7210.                 i=0;
  7211.  
  7212. // !!! new
  7213.  
  7214. #ifdef OPTVARCONST
  7215.  
  7216.                 CheckConstVar3(&tok2,&itok2,razr);
  7217.  
  7218.                 if(tok2==tk_number)calcnumber=TRUE;
  7219.  
  7220. #endif
  7221.  
  7222.                 if(uselea&&razr==r32){
  7223.  
  7224.                         if(Reg32ToLea2(EAX))continue;   //®¯â¨¬¨§ æ¨ï á«®¦¥­¨ï 32-¡¨â­ëå ॣ¨áâ஢ ¢ LEA
  7225.  
  7226.                         if(itok.type==tp_stopper||tok==tk_eof||itok.type==tp_compare)break;
  7227.  
  7228.                 }
  7229.  
  7230.  
  7231.  
  7232.                 if(tok2==tk_number)optnum=OptimNum();
  7233.  
  7234.                 int oldtok=tok;
  7235.  
  7236.                 switch(tok){
  7237.  
  7238.                         case tk_xor: vop+=0x08;
  7239.  
  7240.                         case tk_minus: vop+=0x08;
  7241.  
  7242.                         case tk_and: vop+=0x18;
  7243.  
  7244.                         case tk_or: vop+=0x08;
  7245.  
  7246.                         case tk_plus:
  7247.  
  7248.                           if(optnum==FALSE)getoperand();
  7249.  
  7250.                                 else{
  7251.  
  7252.                                         tok=tk_number;
  7253.  
  7254.                                         optnum=FALSE;
  7255.  
  7256.                                 }
  7257.  
  7258.                                 switch(tok){
  7259.  
  7260.                                         case tk_number:
  7261.  
  7262.                                                 if((itok.flag&f_reloc)==0){
  7263.  
  7264.                                                         if(optnumadd(itok.number,0,razr,vop))break;
  7265.  
  7266.                                                 }
  7267.  
  7268.                                         case tk_undefofs:
  7269.  
  7270.                                         case tk_postnumber:
  7271.  
  7272.                                                 op66(razr);
  7273.  
  7274.                                           op(0x05+vop);
  7275.  
  7276.                                                 if(tok==tk_postnumber)(itok.flag&f_extern)==0?setwordpost(&itok):setwordext(&itok.number);
  7277.  
  7278.                                                 else if(tok==tk_undefofs)AddUndefOff(0,itok.name);
  7279.  
  7280.                                                 else if((itok.flag&f_reloc)!=0)AddReloc();
  7281.  
  7282.                                                 razr==r16?outword((unsigned int)itok.number):outdword(itok.number);
  7283.  
  7284.                                                 setzeroflag=TRUE;
  7285.  
  7286.                                                 break;
  7287.  
  7288.                                         case tk_apioffset:
  7289.  
  7290.                                                 op66(razr);
  7291.  
  7292.                                           op(0x05+vop);
  7293.  
  7294.                                                 AddApiToPost(itok.number);
  7295.  
  7296.                                                 setzeroflag=TRUE;
  7297.  
  7298.                                                 break;
  7299.  
  7300.                                         case tk_qwordvar:
  7301.  
  7302.                                         case tk_longvar:
  7303.  
  7304.                                         case tk_dwordvar:
  7305.  
  7306.                                                 i=2;
  7307.  
  7308.                                         case tk_intvar:
  7309.  
  7310.                                         case tk_wordvar:
  7311.  
  7312.                                                 if(razr==r32&&(tok==tk_intvar||tok==tk_wordvar))goto defxor;
  7313.  
  7314.                                                 i+=2;
  7315.  
  7316.                                                 CheckAllMassiv(bufrm,i,&strinf);
  7317.  
  7318.                                                 op66(razr);
  7319.  
  7320.                                                 outseg(&itok,2);
  7321.  
  7322.                                                 op(0x03+vop);
  7323.  
  7324.                                                 op(itok.rm);
  7325.  
  7326.                                                 outaddress(&itok);
  7327.  
  7328.                                                 setzeroflag=TRUE;
  7329.  
  7330.                                                 break;
  7331.  
  7332.                                         case tk_doublevar:
  7333.  
  7334.                                                 i=4;
  7335.  
  7336.                                         case tk_floatvar:
  7337.  
  7338.                                                 Float2reg32(EDX,i);
  7339.  
  7340.                                                 itok.number=EDX;
  7341.  
  7342.                                                 warningreg(regs[1][EDX]);
  7343.  
  7344.                                                 goto defreg32;
  7345.  
  7346.                                         case tk_ID:
  7347.  
  7348.                                         case tk_id:
  7349.  
  7350.                                         case tk_proc:
  7351.  
  7352.                                         case tk_apiproc:
  7353.  
  7354.                                         case tk_undefproc:
  7355.  
  7356.                                         case tk_declare:
  7357.  
  7358.                                                 op66(razr);
  7359.  
  7360.                                                 op(0x50);       //push AX
  7361.  
  7362.                                                 addESP+=razr==r16?2:4;
  7363.  
  7364.                                                 oaddstack=addstack;
  7365.  
  7366.                                                 addstack=FALSE;
  7367.  
  7368.                                                 procdo(razr==r16?(sign==0?tk_word:tk_int):(sign==0?tk_dword:tk_long));
  7369.  
  7370.                                                 addstack=oaddstack;
  7371.  
  7372.                                                 addESP-=razr==r16?2:4;
  7373.  
  7374.                                                 op66(razr);
  7375.  
  7376.                                                 op(0x58+EDX);
  7377.  
  7378.                                                 itok.number=EDX;
  7379.  
  7380.                                                 warningreg(regs[razr/2-1][EDX]);
  7381.  
  7382.                                                 if(vop>0x20){
  7383.  
  7384.                                                         op66(razr);
  7385.  
  7386.                                                         op(0x90+EDX);   //xchg ax,dx
  7387.  
  7388.                                                 }
  7389.  
  7390.                                                 goto defreg32;
  7391.  
  7392.                                         case tk_bits:
  7393.  
  7394.                                                 int vops;
  7395.  
  7396.                                                 i=itok.bit.siz+itok.bit.ofs;
  7397.  
  7398.                                                 if(i<=64)vops=r64;
  7399.  
  7400.                                                 if(i<=32)vops=r32;
  7401.  
  7402.                                                 if(i<=16)vops=r16;
  7403.  
  7404.                                                 bits2reg(CX,(razr<vops?vops:razr));
  7405.  
  7406.                                                 itok.number=CX;
  7407.  
  7408.                                                 if(vops==r64)vops=r32;
  7409.  
  7410.                                                 warningreg(regs[vops/2-1][ECX]);
  7411.  
  7412.                                                 goto defreg32;
  7413.  
  7414.                                         case tk_reg:
  7415.  
  7416.                                                 if(razr==r32)goto defxor;
  7417.  
  7418.                                         case tk_reg32:
  7419.  
  7420. defreg32:
  7421.  
  7422.                                                 op66(razr);
  7423.  
  7424.                                                 op(0x01+vop);
  7425.  
  7426.                                                 op(0xC0+(unsigned int)itok.number*8);
  7427.  
  7428.                                                 setzeroflag=TRUE;
  7429.  
  7430.                                                 break;
  7431.  
  7432.                                         case tk_rmnumber:
  7433.  
  7434.                                         case tk_charvar:
  7435.  
  7436.                                         case tk_beg:
  7437.  
  7438.                                         case tk_bytevar:
  7439.  
  7440. defxor:
  7441.  
  7442.                                                 getintoreg_32(CX,razr,sign,&ofsstr,FALSE);
  7443.  
  7444.                                                 op66(razr);
  7445.  
  7446.                                                 op(0x01+vop);
  7447.  
  7448.                                                 op(0xC8);       /* OPT AX,CX */
  7449.  
  7450.                                                 warningreg(regs[razr/2-1][1]);
  7451.  
  7452.                                                 next=0;
  7453.  
  7454.                                                 setzeroflag=TRUE;
  7455.  
  7456.                                                 break;
  7457.  
  7458.                                         default: valueexpected(); break;
  7459.  
  7460.                                 }
  7461.  
  7462.                                 if(expand==TRUE){
  7463.  
  7464.                                         op66(razr);
  7465.  
  7466.                                         op(0x83);
  7467.  
  7468.                                         if(oldtok==tk_plus)outword(0x00d2);     //adc dx,0
  7469.  
  7470.                                         else if(oldtok==tk_minus)outword(0x00da);       //sbb dx,0
  7471.  
  7472.                                         setzeroflag=TRUE;
  7473.  
  7474.                                 }
  7475.  
  7476.                                 break;
  7477.  
  7478.                         case tk_modminus: negflag=1;
  7479.  
  7480.                         case tk_mod: negflag=1-negflag; vop=1;
  7481.  
  7482.                         case tk_divminus: negflag=1-negflag;
  7483.  
  7484.                         case tk_div:
  7485.  
  7486.                           if(optnum==FALSE)getoperand();
  7487.  
  7488.                                 else{
  7489.  
  7490.                                         tok=tk_number;
  7491.  
  7492.                                         optnum=FALSE;
  7493.  
  7494.                                 }
  7495.  
  7496.                                 if(tok==tk_number){
  7497.  
  7498.                                         if(negflag){
  7499.  
  7500.                                                 itok.number=-itok.number;
  7501.  
  7502.                                                 negflag=0;
  7503.  
  7504.                                         }
  7505.  
  7506.                                 }
  7507.  
  7508.                                 DivMod(vop,sign,razr,expand);
  7509.  
  7510.                                 if(vop==1&&setzeroflag==0){
  7511.  
  7512.                                         op66(razr);
  7513.  
  7514.                                         if(optimizespeed)outword(0xC28B);       //mov ax,dx
  7515.  
  7516.                                         else op(0x92);  //xchg ax,dx
  7517.  
  7518.                                 }
  7519.  
  7520.                                 next=0;
  7521.  
  7522.                                 expand=FALSE;
  7523.  
  7524.                                 break;
  7525.  
  7526.                         case tk_multminus: negflag=1;
  7527.  
  7528.                         case tk_mult:
  7529.  
  7530.                                 expand=expandvar();     //¢®§¬®¦­®áâì à áè¨à¥­¨ï à §à來®áâ¨
  7531.  
  7532.                           if(optnum==FALSE)getoperand();
  7533.  
  7534.                                 else{
  7535.  
  7536.                                         tok=tk_number;
  7537.  
  7538.                                         optnum=FALSE;
  7539.  
  7540.                                 }
  7541.  
  7542.                                 if(negflag&&tok==tk_number){
  7543.  
  7544.                                         itok.number=-itok.number;
  7545.  
  7546.                                         negflag=0;
  7547.  
  7548.                                 }
  7549.  
  7550.                                 switch(tok){
  7551.  
  7552.                                         case tk_number:
  7553.  
  7554.                                                 RegMulNum(AX,itok.number,razr,sign,&expand,itok.flag);
  7555.  
  7556.                                                 break;
  7557.  
  7558.                                         case tk_qwordvar:
  7559.  
  7560.                                         case tk_longvar:
  7561.  
  7562.                                         case tk_dwordvar:
  7563.  
  7564.                                                 i=2;
  7565.  
  7566.                                         case tk_intvar:
  7567.  
  7568.                                         case tk_wordvar:
  7569.  
  7570.                                                 if(razr==r32&&(tok==tk_intvar||tok==tk_wordvar))goto defmul;
  7571.  
  7572.                                                 i+=2;
  7573.  
  7574.                                                 CheckAllMassiv(bufrm,i,&strinf);
  7575.  
  7576.                                                 op66(razr);
  7577.  
  7578.                                                 outseg(&itok,2);
  7579.  
  7580.                                                 op(0xF7);       //imul var
  7581.  
  7582.                                                 if(sign)op(0x28+itok.rm);
  7583.  
  7584.                                                 else op(0x20+itok.rm);
  7585.  
  7586.                                                 outaddress(&itok);
  7587.  
  7588.                                                 setzeroflag=FALSE;
  7589.  
  7590.                                                 break;
  7591.  
  7592.                                         case tk_doublevar:
  7593.  
  7594.                                                 i=4;
  7595.  
  7596.                                         case tk_floatvar:
  7597.  
  7598.                                                 Float2reg32(EDX,i);
  7599.  
  7600.                                                 op66(razr);
  7601.  
  7602.                                                 op(0xF7);
  7603.  
  7604.                                                 op(0xE8+EDX); // IMUL EDX
  7605.  
  7606.                                                 setzeroflag=FALSE;
  7607.  
  7608.                                                 warningreg(regs[1][EDX]);
  7609.  
  7610.                                                 break;
  7611.  
  7612.                                         case tk_ID:
  7613.  
  7614.                                         case tk_id:
  7615.  
  7616.                                         case tk_proc:
  7617.  
  7618.                                         case tk_apiproc:
  7619.  
  7620.                                         case tk_undefproc:
  7621.  
  7622.                                         case tk_declare:
  7623.  
  7624.                                                 op66(razr);
  7625.  
  7626.                                                 op(0x50);       //push AX
  7627.  
  7628.                                                 addESP+=razr==r16?2:4;
  7629.  
  7630.                                                 oaddstack=addstack;
  7631.  
  7632.                                                 addstack=FALSE;
  7633.  
  7634.                                                 procdo(razr==r16?(sign==0?tk_word:tk_int):(sign==0?tk_dword:tk_long));
  7635.  
  7636.                                                 addstack=oaddstack;
  7637.  
  7638.                                                 addESP-=razr==r16?2:4;
  7639.  
  7640.                                                 op66(razr);
  7641.  
  7642.                                                 op(0x58+EDX);
  7643.  
  7644.                                                 itok.number=EDX;
  7645.  
  7646.                                                 warningreg(regs[razr/2-1][EDX]);
  7647.  
  7648.                                                 goto mulreg32;
  7649.  
  7650.                                         case tk_bits:
  7651.  
  7652.                                                 int vops;
  7653.  
  7654.                                                 i=itok.bit.siz+itok.bit.ofs;
  7655.  
  7656.                                                 if(i<=64)vops=r64;
  7657.  
  7658.                                                 if(i<=32)vops=r32;
  7659.  
  7660.                                                 if(i<=16)vops=r16;
  7661.  
  7662.                                                 bits2reg(CX,(razr<vops?vops:razr));
  7663.  
  7664.                                                 itok.number=CX;
  7665.  
  7666.                                                 if(vops==r64)vops=r32;
  7667.  
  7668.                                                 warningreg(regs[vops/2-1][ECX]);
  7669.  
  7670.                                                 goto mulreg32;
  7671.  
  7672.                                         case tk_reg:
  7673.  
  7674.                                                 i=itok.number;
  7675.  
  7676.                                                 if(razr==r32)goto mulreg;
  7677.  
  7678.                                         case tk_reg32:
  7679.  
  7680. mulreg32:
  7681.  
  7682.                                                 op66(razr);
  7683.  
  7684.                                                 op(0xF7);
  7685.  
  7686.                                                 if(sign)op(0xE8+(unsigned int)itok.number);
  7687.  
  7688.                                                 else op(0xE0+(unsigned int)itok.number);
  7689.  
  7690.                                                 setzeroflag=FALSE;
  7691.  
  7692.                                                 break;
  7693.  
  7694.                                         case tk_postnumber:
  7695.  
  7696.                                         case tk_undefofs:
  7697.  
  7698.                                                 op66(razr);
  7699.  
  7700.                                                 op(0x69);
  7701.  
  7702.                                                 op(0xc0);
  7703.  
  7704.                                                 if(tok==tk_postnumber)(itok.flag&f_extern)==0?setwordpost(&itok):setwordext(&itok.number);
  7705.  
  7706.                                                 else if(tok==tk_undefofs)AddUndefOff(0,itok.name);
  7707.  
  7708.                                                 razr==r16?outword(itok.number):outdword(itok.number);
  7709.  
  7710.                                                 setzeroflag=FALSE;
  7711.  
  7712.                                                 break;
  7713.  
  7714.                                         case tk_apioffset:
  7715.  
  7716.                                                 op66(razr);
  7717.  
  7718.                                                 op(0x69);
  7719.  
  7720.                                                 op(0xc0);
  7721.  
  7722.                                                 AddApiToPost(itok.number);
  7723.  
  7724.                                                 setzeroflag=FALSE;
  7725.  
  7726.                                                 break;
  7727.  
  7728.                                         case tk_seg:
  7729.  
  7730.                                         case tk_charvar:
  7731.  
  7732.                                         case tk_beg:
  7733.  
  7734.                                         case tk_bytevar:
  7735.  
  7736.                                         case tk_rmnumber:
  7737.  
  7738. defmul:
  7739.  
  7740.                                                 i=EDX;
  7741.  
  7742. mulreg:
  7743.  
  7744.                                                 getintoreg_32(i,razr,sign,&ofsstr,FALSE);
  7745.  
  7746.                                                 op66(razr);
  7747.  
  7748.                                                 op(0xF7);
  7749.  
  7750.                                                 if(sign)op(0xE8+i);  /* IMUL i */
  7751.  
  7752.                                                 else op(0xE0+i); /* MUL i */
  7753.  
  7754.                                                 next=0;
  7755.  
  7756.                                                 setzeroflag=FALSE;
  7757.  
  7758.                                                 warningreg(regs[razr/2-1][2]);
  7759.  
  7760.                                                 if(i!=EDX)warningreg(regs[razr/2-1][i]);
  7761.  
  7762.                                                 break;
  7763.  
  7764.                                         default: valueexpected();       break;
  7765.  
  7766.                                 }
  7767.  
  7768.                                 break;
  7769.  
  7770.                         case tk_xorminus: vop+=0x10;
  7771.  
  7772.                         case tk_andminus: vop+=0x18;
  7773.  
  7774.                         case tk_orminus: vop+=0x08;
  7775.  
  7776.                           getoperand();
  7777.  
  7778.                                 if(tok==tk_number){
  7779.  
  7780.                                         itok.number=-itok.number;
  7781.  
  7782.                                         op66(razr);
  7783.  
  7784.                                         op(0x05+vop);
  7785.  
  7786.                                         if((itok.flag&f_reloc)!=0)AddReloc();
  7787.  
  7788.                                         razr==r16?outword((unsigned int)itok.number):outdword(itok.number);
  7789.  
  7790.                                 }
  7791.  
  7792.                                 else{
  7793.  
  7794.                                         getintoreg_32(CX,razr,sign,&ofsstr,FALSE);
  7795.  
  7796.                                         NegReg(razr,ECX);
  7797.  
  7798.                                         op66(razr);
  7799.  
  7800.                                         op(0x01+vop);   /* opt AX,CX */
  7801.  
  7802.                                         op(0xC8);
  7803.  
  7804.                                         warningreg(regs[razr/2-1][1]);
  7805.  
  7806.                                         next=0;
  7807.  
  7808.                                 }
  7809.  
  7810.                                 setzeroflag=TRUE;
  7811.  
  7812.                                 break;
  7813.  
  7814.                         case tk_ll:
  7815.  
  7816.                           getoperand();
  7817.  
  7818.                                 if(tok==tk_number){
  7819.  
  7820.                                         if(expand==TRUE){
  7821.  
  7822.                                                 if(chip>2||razr==r32){
  7823.  
  7824.                                                         op66(razr);
  7825.  
  7826.                                                         op(0x0f);
  7827.  
  7828.                                                         outword(0xC2a4);        //SHLD DX,AX,num
  7829.  
  7830.                                                         op(itok.number);
  7831.  
  7832.                                                 }
  7833.  
  7834.                                                 else{
  7835.  
  7836.                                                         if((unsigned int)itok.number==1)outdword(0xd213c001);   //ADD AX,AX ADC DX,DX
  7837.  
  7838.                                                         else if((unsigned int)itok.number!=0){
  7839.  
  7840.                                                                 getintobeg(CL,&ofsstr);
  7841.  
  7842.                                                                 outdword(0xd213c001);   //ADD AX,AX ADC DX,DX
  7843.  
  7844.                                                                 outword(0xfae2);  //LOOP -6
  7845.  
  7846.                                                                 warningreg(begs[1]);
  7847.  
  7848.                                                                 next=0;
  7849.  
  7850.                                                         }
  7851.  
  7852.                                                         break;
  7853.  
  7854.                                                 }
  7855.  
  7856.                                         }
  7857.  
  7858.                                         lshiftmul(itok.number,razr);
  7859.  
  7860.                                         setzeroflag=TRUE;
  7861.  
  7862.                                 }
  7863.  
  7864.                                 else goto llminus;
  7865.  
  7866.                                 break;
  7867.  
  7868.                         case tk_llminus:
  7869.  
  7870.                                 tok=tk_minus;   // do optimization 286+ here later
  7871.  
  7872. llminus:
  7873.  
  7874.                                 if(!((tok==tk_beg||tok==tk_reg||tok==tk_reg32)&&itok.number==1)){
  7875.  
  7876.                                         getintobeg(CL,&ofsstr);
  7877.  
  7878.                                         warningreg(begs[1]);
  7879.  
  7880.                                 }
  7881.  
  7882.                                 else getoperand();
  7883.  
  7884.                                 next=0;
  7885.  
  7886.                                 if(expand==TRUE){
  7887.  
  7888.                                         if(chip>2||razr==r32){
  7889.  
  7890.                                                 op66(razr);
  7891.  
  7892.                                                 op(0x0f);
  7893.  
  7894.                                                 outword(0xC2a5);        //SHLD DX,AX,CL
  7895.  
  7896.                                         }
  7897.  
  7898.                                         else
  7899.  
  7900.                                                 outdword(0xd213c001);   //ADD AX,AX ADC DX,DX
  7901.  
  7902.                                                 outword(0xfae2);  //LOOP -6
  7903.  
  7904.                                                 break;
  7905.  
  7906.                                 }
  7907.  
  7908.                                 op66(razr);
  7909.  
  7910.                                 outword(0xE0D3);        /* SHL AX,CL */
  7911.  
  7912.                                 setzeroflag=TRUE;
  7913.  
  7914.                                 break;
  7915.  
  7916.                         case tk_rr:
  7917.  
  7918.                                 if(sign)vop=0x10;
  7919.  
  7920.                                 getoperand();
  7921.  
  7922.                                 if(expand==TRUE){
  7923.  
  7924.                                         if(tok==tk_number){
  7925.  
  7926.                                                 if((unsigned int)itok.number==1){
  7927.  
  7928.                                                         op66(razr);
  7929.  
  7930.                                                         outword(0xead1);        //shr dx,1 ror ax,1
  7931.  
  7932.                                                         op66(razr);
  7933.  
  7934.                                                         outword(0xc8d1);        //shr dx,1 ror ax,1
  7935.  
  7936.                                                         setzeroflag=TRUE;
  7937.  
  7938.                                                 }
  7939.  
  7940.                                                 else if((unsigned int)itok.number!=0){
  7941.  
  7942.                                                         if(chip>2||razr==r32){
  7943.  
  7944.                                                                 op66(razr);
  7945.  
  7946.                                                                 op(0x0f);
  7947.  
  7948.                                                                 outword(0xd0ac);        //shrd ax,dx,num
  7949.  
  7950.                                                                 op(itok.number);
  7951.  
  7952.                                                                 op66(razr);
  7953.  
  7954.                                                                 op(0xc1); op(0xea+vop);//s?r dx,num
  7955.  
  7956.                                                                 op(itok.number);
  7957.  
  7958.                                                                 setzeroflag=TRUE;
  7959.  
  7960.                                                         }
  7961.  
  7962.                                                         else{
  7963.  
  7964.                                                                 next=0;
  7965.  
  7966.                                                                 getintobeg(CL,&ofsstr);
  7967.  
  7968.                                                                 warningreg(begs[1]);
  7969.  
  7970.                                                                 op(0xd1); op(0xea+vop);//s?r dx,1
  7971.  
  7972.                                                                 outdword(0xfae2d8d1);  //rcr ax,1 LOOP -6
  7973.  
  7974.                                                                 setzeroflag=FALSE;
  7975.  
  7976.                                                         }
  7977.  
  7978.                                                 }
  7979.  
  7980.                                         }
  7981.  
  7982.                                         else goto rrminus;
  7983.  
  7984.                                 }
  7985.  
  7986.                                 else{
  7987.  
  7988.                                         RshiftReg(razr,EAX,vop);
  7989.  
  7990.                                         setzeroflag=TRUE;
  7991.  
  7992.                                         next=0;
  7993.  
  7994.                                 }
  7995.  
  7996.                                 break;
  7997.  
  7998.                         case tk_rrminus:
  7999.  
  8000.                                 if(sign)vop=0x10;
  8001.  
  8002.                                 tok=tk_minus;  // do optimization 286+ here later
  8003.  
  8004. rrminus:
  8005.  
  8006.                                 if(!((tok==tk_beg||tok==tk_reg||tok==tk_reg32)&&itok.number==1)){
  8007.  
  8008.                                         getintobeg(CL,&ofsstr);
  8009.  
  8010.                                         warningreg(begs[1]);
  8011.  
  8012.                                 }
  8013.  
  8014.                                 else getoperand();
  8015.  
  8016.                                 if(expand==TRUE){
  8017.  
  8018.                                         if(chip>2||razr==r32){
  8019.  
  8020.                                                 op66(razr);
  8021.  
  8022.                                                 op(0x0f);
  8023.  
  8024.                                                 outword(0xd0ad);        //shrd ax,dx,cl
  8025.  
  8026.                                                 op66(razr);
  8027.  
  8028.                                                 op(0xd3); op(0xea+vop);//s?r dx,num
  8029.  
  8030.                                                 setzeroflag=TRUE;
  8031.  
  8032.                                         }
  8033.  
  8034.                                         else{
  8035.  
  8036.                                                 op(0xd1); op(0xea+vop);//s?r dx,1
  8037.  
  8038.                                                 outdword(0xfae2d8d1);  //rcr ax,1 //LOOP -6
  8039.  
  8040.                                                 setzeroflag=FALSE;
  8041.  
  8042.                                         }
  8043.  
  8044.                                 }
  8045.  
  8046.                                 else{
  8047.  
  8048.                                         op66(razr);
  8049.  
  8050.                                         op(0xD3);       op(0xE8+vop);  /* SR AX,CL */
  8051.  
  8052.                                         setzeroflag=TRUE;
  8053.  
  8054.                                 }
  8055.  
  8056.                                 next=0;
  8057.  
  8058.                                 break;
  8059.  
  8060.                         default: operatorexpected(); break;
  8061.  
  8062.                 }
  8063.  
  8064.                 calcnumber=FALSE;
  8065.  
  8066.                 ClearReg(EAX);
  8067.  
  8068.                 if(negflag){
  8069.  
  8070.                         NegReg(razr,EAX);
  8071.  
  8072.                         setzeroflag=TRUE;
  8073.  
  8074.                         negflag=0;
  8075.  
  8076.                 }
  8077.  
  8078.                 if(next)nexttok();
  8079.  
  8080.         }
  8081.  
  8082.         calcnumber=FALSE;
  8083.  
  8084.         ClearReg(EAX);
  8085.  
  8086.         if(tok==tk_eof)unexpectedeof();
  8087.  
  8088.         if(razr==r32&&cpu<3)cpu=3;
  8089.  
  8090. }
  8091.  
  8092.  
  8093.  
  8094. void  getintoal(int gtok,ITOK *gstok,char *&gbuf,SINFO *gstr) // AH may also be changed
  8095.  
  8096. {
  8097.  
  8098. unsigned int i=0;
  8099.  
  8100.         switch(gtok){
  8101.  
  8102.                 case tk_bits:
  8103.  
  8104.                         int razr;
  8105.  
  8106.                         i=gstok->bit.siz+gstok->bit.ofs;
  8107.  
  8108.                         if(i<=64)razr=r64;
  8109.  
  8110.                         if(i<=32)razr=r32;
  8111.  
  8112.                         if(i<=16)razr=r16;
  8113.  
  8114.                         if(i<=8)razr=r8;
  8115.  
  8116.                         bits2reg(AL,razr);
  8117.  
  8118.                         break;
  8119.  
  8120.                 case tk_number:
  8121.  
  8122.                         op(0xB0);       /* MOV AL,# */
  8123.  
  8124.                         op(gstok->number);
  8125.  
  8126.                         ConstToReg(gstok->number,AL,r8);
  8127.  
  8128.                         break;
  8129.  
  8130.                 case tk_rmnumber:
  8131.  
  8132.                         CheckAllMassiv(gbuf,gstok->size,gstr,gstok);
  8133.  
  8134.                         op66(r16);
  8135.  
  8136.                         op67(gstok->sib==CODE16?r16:r32);
  8137.  
  8138.                         if(gstok->post==0)outseg(gstok,2);
  8139.  
  8140.                         op(0x8D);       /* LEA AX,[rm] */
  8141.  
  8142.                         op(gstok->rm);
  8143.  
  8144.                         if(gstok->post!=0&&gstok->post!=UNDEF_OFSET){
  8145.  
  8146.                                 if((gstok->flag&f_extern)==0){
  8147.  
  8148.                                         i=outptr;
  8149.  
  8150.                                         if(am32&&gstok->rm==rm_sib)outptr++;
  8151.  
  8152.                                         setwordpost(gstok);
  8153.  
  8154.                                         outptr=i;
  8155.  
  8156.                                 }
  8157.  
  8158.                                 else setwordext(&gstok->number);
  8159.  
  8160.                         }
  8161.  
  8162.                         outaddress(gstok);
  8163.  
  8164.                         ClearReg(AL);
  8165.  
  8166.                         break;
  8167.  
  8168.                 case tk_postnumber:
  8169.  
  8170.                         op66(r16);
  8171.  
  8172.                         op(0xB8);       /* MOV AX,# */
  8173.  
  8174.                         (gstok->flag&f_extern)==0?setwordpost(gstok):setwordext(&gstok->number);
  8175.  
  8176.                         outword(gstok->number);
  8177.  
  8178.                         ClearReg(AL);
  8179.  
  8180.                         break;
  8181.  
  8182.                 case tk_floatvar:
  8183.  
  8184.                         if(cpu<3)cpu=3;
  8185.  
  8186.                         CheckInitBP();
  8187.  
  8188.                         op66(r32);
  8189.  
  8190.                         outword(0x6a);  //push 0
  8191.  
  8192.                         if(ESPloc&&am32&&gstok->segm==SS)gstok->number+=4;
  8193.  
  8194.                         addESP+=4;
  8195.  
  8196.                         CheckAllMassiv(gbuf,4,gstr,gstok);
  8197.  
  8198.                         outseg(gstok,2);        //fld floatvar
  8199.  
  8200.                         op(0xd9);
  8201.  
  8202.                         op(gstok->rm);
  8203.  
  8204.                         outaddress(gstok);
  8205.  
  8206.                         fistp_stack();
  8207.  
  8208.                         op66(r32);
  8209.  
  8210.                         op(0x58);       //pop EAX
  8211.  
  8212.                         addESP-=4;
  8213.  
  8214.                         RestoreBP();
  8215.  
  8216.                         ClearReg(AL);
  8217.  
  8218.                         break;
  8219.  
  8220.                 case tk_qwordvar:
  8221.  
  8222.                         i=4;
  8223.  
  8224.                 case tk_longvar:
  8225.  
  8226.                 case tk_dwordvar:
  8227.  
  8228.                         i+=2;
  8229.  
  8230.                 case tk_intvar:
  8231.  
  8232.                 case tk_wordvar:
  8233.  
  8234.                         i++;
  8235.  
  8236.                 case tk_bytevar:
  8237.  
  8238.                 case tk_charvar:
  8239.  
  8240.                         i++;
  8241.  
  8242.                         if((gstok->rm==rm_d16&&gstok->sib==CODE16)||(gstok->rm==rm_d32&&(gstok->sib==CODE32||gstok->sib==0))){
  8243.  
  8244.                                 outseg(gstok,1);
  8245.  
  8246.                                 op(0xA0);       //mov AL,
  8247.  
  8248.                                 if(gstok->post==UNDEF_OFSET)AddUndefOff(2,gstok->name);
  8249.  
  8250.                                 if(am32==FALSE)outword(gstok->number);
  8251.  
  8252.                                 else outdword(gstok->number);
  8253.  
  8254.                         }
  8255.  
  8256.                         else{
  8257.  
  8258.                                 CheckAllMassiv(gbuf,i,gstr,gstok);
  8259.  
  8260.                                 outseg(gstok,2);
  8261.  
  8262.                                 op(0x8A);
  8263.  
  8264.                                 op(gstok->rm);
  8265.  
  8266.                                 outaddress(gstok);
  8267.  
  8268.                         }
  8269.  
  8270.                         ClearReg(AL);
  8271.  
  8272.                         break;
  8273.  
  8274.                 case tk_reg32:
  8275.  
  8276.                         if(gstok->number>BX){
  8277.  
  8278.                                 i=1;
  8279.  
  8280.                                 if(gstok->number!=AX)op66(r32);
  8281.  
  8282.                         }
  8283.  
  8284.                         goto beg1;
  8285.  
  8286.                 case tk_reg:
  8287.  
  8288.                         if(gstok->number>BX){
  8289.  
  8290.                                 i=1;
  8291.  
  8292.                                 if(gstok->number!=AX)op66(r16);
  8293.  
  8294.                         }
  8295.  
  8296.                 case tk_beg:
  8297.  
  8298. beg1:
  8299.  
  8300.                         if(gstok->number!=AL){
  8301.  
  8302.                                 op(0x88+i);  //mov [],AL
  8303.  
  8304.                                 op(0xC0+gstok->number*8);
  8305.  
  8306.                         }
  8307.  
  8308.                         ClearReg(AL);
  8309.  
  8310.                         break;
  8311.  
  8312.                 case tk_seg:
  8313.  
  8314.                         op66(r16);
  8315.  
  8316.                         op(0x8C); op(0xC0+gstok->number*8);
  8317.  
  8318.                         ClearReg(AL);  break;   // fix by cppcheck
  8319.  
  8320.                 default: bytevalexpected(0); break;
  8321.  
  8322.         }
  8323.  
  8324. }
  8325.  
  8326.  
  8327.  
  8328. int doalmath(int sign,char **ofsstr)
  8329.  
  8330. {
  8331.  
  8332. int negflag=0,i=0;
  8333.  
  8334. int rettype=tk_beg;
  8335.  
  8336.         if(tok==tk_minus){
  8337.  
  8338.                 if(CheckMinusNum()==FALSE){
  8339.  
  8340.                         negflag=1;
  8341.  
  8342.                         getoperand(am32==TRUE?EAX:BX);
  8343.  
  8344.                 }
  8345.  
  8346.         }
  8347.  
  8348. #ifdef OPTVARCONST
  8349.  
  8350.         if(tok>=tk_charvar&&tok<=tk_doublevar&&itok.npointr==0){
  8351.  
  8352.                 if(CheckConstVar(&itok)){
  8353.  
  8354.                         tok=tk_number;
  8355.  
  8356.                         calcnumber=TRUE;
  8357.  
  8358.                 }
  8359.  
  8360.         }
  8361.  
  8362. #endif
  8363.  
  8364.         switch(tok){
  8365.  
  8366.                 case tk_number:
  8367.  
  8368.                         op(0xB0);       //mov AL,num
  8369.  
  8370.                         i=CalcNumber(sign);
  8371.  
  8372.                         op(i);
  8373.  
  8374.                         ConstToReg(i,AL,r8);
  8375.  
  8376.                         break;
  8377.  
  8378.                 case tk_at:
  8379.  
  8380.                         getoperand(am32==TRUE?EAX:BX);
  8381.  
  8382.                         i++;
  8383.  
  8384.                 case tk_ID:
  8385.  
  8386.                 case tk_id:
  8387.  
  8388.                 case tk_proc:
  8389.  
  8390.                 case tk_apiproc:
  8391.  
  8392.                 case tk_undefproc:
  8393.  
  8394.                 case tk_declare:
  8395.  
  8396.                         if(itok.flag&f_retproc)rettype=(itok.flag&f_retproc)/256+tk_overflowflag-1;
  8397.  
  8398.                         if((!i)||macros(sign!=0?tk_char:tk_byte)==0)procdo(sign!=0?tk_char:tk_byte);
  8399.  
  8400.                         nexttok();
  8401.  
  8402.                         if(*ofsstr){
  8403.  
  8404.                                 free(*ofsstr);
  8405.  
  8406.                                 *ofsstr=NULL;
  8407.  
  8408.                         }
  8409.  
  8410.                         break;
  8411.  
  8412.                 default:
  8413.  
  8414.                         SINFO bstr=strinf;
  8415.  
  8416.                         strinf.bufstr=NULL;
  8417.  
  8418.                         ITOK btok;
  8419.  
  8420.                         char *bbuf;
  8421.  
  8422.                         btok=itok;
  8423.  
  8424.                         bbuf=bufrm;
  8425.  
  8426.                         bufrm=NULL;
  8427.  
  8428.                         getintoal(tok,&btok,bbuf,&bstr); nexttok(); break;
  8429.  
  8430.         }
  8431.  
  8432. #ifdef OPTVARCONST
  8433.  
  8434.         calcnumber=FALSE;
  8435.  
  8436. #endif
  8437.  
  8438.         if(negflag){
  8439.  
  8440.                 if(optimizespeed&&(chip==5||chip==6))outdword(0xC0FEFF34);      //xor AL,-1 AL++
  8441.  
  8442.                 else outword(0xD8F6);// NEG AL
  8443.  
  8444.                 setzeroflag=TRUE;
  8445.  
  8446.         }
  8447.  
  8448.         if(itok.type!=tp_stopper&&tok!=tk_eof&&itok.type!=tp_compare){
  8449.  
  8450.                 doalmath2(sign);
  8451.  
  8452.                 rettype=tk_beg;
  8453.  
  8454.         }
  8455.  
  8456.         return rettype;
  8457.  
  8458. }
  8459.  
  8460.  
  8461.  
  8462. void  doalmath2(int sign)
  8463.  
  8464. {
  8465.  
  8466. int vop,i,next;
  8467.  
  8468. int expand=FALSE,optnum=FALSE;
  8469.  
  8470. int negflag=0;
  8471.  
  8472. char *ofsstr=NULL;
  8473.  
  8474.         while(itok.type!=tp_stopper&&tok!=tk_eof&&itok.type!=tp_compare){
  8475.  
  8476.                 vop=0;
  8477.  
  8478.                 i=0;
  8479.  
  8480.                 next=1;
  8481.  
  8482. #ifdef OPTVARCONST
  8483.  
  8484.                 if(tok2>=tk_charvar&&tok2<=tk_doublevar&&itok2.npointr==0){
  8485.  
  8486.                         if(CheckConstVar(&itok2)){
  8487.  
  8488.                                 tok2=tk_number;
  8489.  
  8490.                                 calcnumber=TRUE;
  8491.  
  8492.                         }
  8493.  
  8494.                 }
  8495.  
  8496. #endif
  8497.  
  8498.                 if(tok2==tk_number)optnum=OptimNum();
  8499.  
  8500.                 int oldtok=tok;
  8501.  
  8502.                 switch(tok){
  8503.  
  8504.                         case tk_xor: vop+=0x08;
  8505.  
  8506.                         case tk_minus: vop+=0x08;
  8507.  
  8508.                         case tk_and: vop+=0x18;
  8509.  
  8510.                         case tk_or: vop+=0x08;
  8511.  
  8512.                         case tk_plus:
  8513.  
  8514.                           if(optnum==FALSE)getoperand();
  8515.  
  8516.                                 else{
  8517.  
  8518.                                         tok=tk_number;
  8519.  
  8520.                                         optnum=FALSE;
  8521.  
  8522.                                 }
  8523.  
  8524.                                 switch(tok){
  8525.  
  8526.                                         case tk_number:
  8527.  
  8528.                                                 if(itok.number==0&&oldtok!=tk_and)break;
  8529.  
  8530.                                                 if(itok.number==255&&oldtok==tk_and)break;
  8531.  
  8532.                                           op(0x04+vop);
  8533.  
  8534.                                                 op((unsigned int)itok.number); /* OPT AL,num */
  8535.  
  8536.                                                 break;
  8537.  
  8538.                                         case tk_rmnumber:
  8539.  
  8540.                                                 CheckAllMassiv(bufrm,itok.size,&strinf);
  8541.  
  8542.                                                 op66(r16);
  8543.  
  8544.                                                 op67(itok.sib==CODE16?r16:r32);
  8545.  
  8546.                                                 if(itok.post==0)outseg(&itok,2);
  8547.  
  8548.                                                 op(0x8D); /* LEA CX,[rm] */
  8549.  
  8550.                                                 op(0x8+itok.rm);
  8551.  
  8552.                                                 if(itok.post!=0&&itok.post!=UNDEF_OFSET){
  8553.  
  8554.                                                         if((itok.flag&f_extern)==0){
  8555.  
  8556.                                                                 unsigned int ooutptr=outptr;
  8557.  
  8558.                                                                 if(am32&&itok.rm==rm_sib)outptr++;
  8559.  
  8560.                                                                 setwordpost(&itok);
  8561.  
  8562.                                                                 outptr=ooutptr;
  8563.  
  8564.                                                         }
  8565.  
  8566.                                                         else setwordext(&itok.number);
  8567.  
  8568.                                                 }
  8569.  
  8570.                                                 outaddress(&itok);
  8571.  
  8572.                                                 op(vop); /* OPT AL,CL */
  8573.  
  8574.                                                 op(0xC8);
  8575.  
  8576.                                                 warningreg(regs[0][1]);
  8577.  
  8578.                                                 break;
  8579.  
  8580.                                         case tk_postnumber:
  8581.  
  8582.                                                 op66(r16);
  8583.  
  8584.                                                 op(0x05+vop); /* OPT AX,# */
  8585.  
  8586.                                                 (itok.flag&f_extern)==0?setwordpost(&itok):setwordext(&itok.number);
  8587.  
  8588.                                                 outword((unsigned int)itok.number);
  8589.  
  8590.                                                 break;
  8591.  
  8592.                                         case tk_qwordvar:
  8593.  
  8594.                                                 i=4;
  8595.  
  8596.                                         case tk_longvar:
  8597.  
  8598.                                         case tk_dwordvar:
  8599.  
  8600.                                                 i+=2;
  8601.  
  8602.                                         case tk_intvar:
  8603.  
  8604.                                         case tk_wordvar:
  8605.  
  8606.                                                 i++;
  8607.  
  8608.                                         case tk_charvar:
  8609.  
  8610.                                         case tk_bytevar:
  8611.  
  8612.                                                 i++;
  8613.  
  8614.                                                 CheckAllMassiv(bufrm,i,&strinf);
  8615.  
  8616.                                                 outseg(&itok,2);
  8617.  
  8618.                                                 op(0x02+vop);   op(itok.rm);
  8619.  
  8620.                                                 outaddress(&itok);
  8621.  
  8622.                                                 break;
  8623.  
  8624.                                         case tk_ID:
  8625.  
  8626.                                         case tk_id:
  8627.  
  8628.                                         case tk_proc:
  8629.  
  8630.                                         case tk_apiproc:
  8631.  
  8632.                                         case tk_undefproc:
  8633.  
  8634.                                         case tk_declare:
  8635.  
  8636.                                                 op66(r16);
  8637.  
  8638.                                                 op(0x50);       //push AX
  8639.  
  8640.                                                 addESP+=2;
  8641.  
  8642. unsigned char oaddstack;
  8643.  
  8644.                                                 oaddstack=addstack;
  8645.  
  8646.                                                 addstack=FALSE;
  8647.  
  8648.                                                 procdo(sign!=0?tk_char:tk_byte);
  8649.  
  8650.                                                 addstack=oaddstack;
  8651.  
  8652.                                                 addESP-=2;
  8653.  
  8654.                                                 op66(r16);
  8655.  
  8656.                                                 op(0x58+CX);
  8657.  
  8658.                                                 itok.number=CX;
  8659.  
  8660.                                                 warningreg(regs[0][CX]);
  8661.  
  8662.                                                 if(vop>0x20){
  8663.  
  8664.                                                         op66(r16);
  8665.  
  8666.                                                         op(0x90+CX);    //xchg ax,Cx
  8667.  
  8668.                                                 }
  8669.  
  8670.                                                 goto defbeg;
  8671.  
  8672.                                         case tk_bits:
  8673.  
  8674.                                                 int razr;
  8675.  
  8676.                                                 i=itok.bit.siz+itok.bit.ofs;
  8677.  
  8678.                                                 if(i<=64)razr=r64;
  8679.  
  8680.                                                 if(i<=32)razr=r32;
  8681.  
  8682.                                                 if(i<=16)razr=r16;
  8683.  
  8684.                                                 if(i<=8)razr=r8;
  8685.  
  8686.                                                 bits2reg(CL,razr);
  8687.  
  8688.                                                 itok.number=CL;
  8689.  
  8690.                                                 if(razr==r64)razr=r32;
  8691.  
  8692.                                                 warningreg(razr==r8?begs[1]:(regs[razr/2-1][1]));
  8693.  
  8694.                                                 goto defbeg;
  8695.  
  8696.                                         case tk_doublevar:
  8697.  
  8698.                                                 i=4;
  8699.  
  8700.                                         case tk_floatvar:
  8701.  
  8702.                                                 Float2reg32(EAX,i);
  8703.  
  8704.                                                 itok.number=0;
  8705.  
  8706.                                         case tk_beg:
  8707.  
  8708. defbeg:
  8709.  
  8710.                                                 op(vop);
  8711.  
  8712.                                                 op(0xC0+(unsigned int)itok.number*8);
  8713.  
  8714.                                                 break;
  8715.  
  8716.                                         case tk_reg32:
  8717.  
  8718.                                         case tk_reg:
  8719.  
  8720.                                                 if((unsigned int)itok.number>BX){
  8721.  
  8722.                                                         op66(r16);
  8723.  
  8724.                                                         op(0x89);       /* MOV CX,reg */
  8725.  
  8726.                                                         warningreg(regs[0][1]);
  8727.  
  8728.                                                 op(0xC1+(unsigned int)itok.number*8); /* MOV instr */
  8729.  
  8730.                                                 itok.number=CL;
  8731.  
  8732.                                                 }
  8733.  
  8734.                                                 goto defbeg;
  8735.  
  8736.                                         default: valueexpected(); break;
  8737.  
  8738.                                 }
  8739.  
  8740.                                 setzeroflag=TRUE;
  8741.  
  8742.                                 if(expand==TRUE){
  8743.  
  8744.                                         if(oldtok==tk_plus){
  8745.  
  8746.                                                 outword(0xd480);        //ADC AH,0
  8747.  
  8748.                                                 op(0);
  8749.  
  8750.                                         }
  8751.  
  8752.                                         else if(oldtok==tk_minus){
  8753.  
  8754.                                                 outword(0xdc80);        //SBB AH,0
  8755.  
  8756.                                                 op(0);
  8757.  
  8758.                                         }
  8759.  
  8760.                                         setzeroflag=FALSE;
  8761.  
  8762.                                 }
  8763.  
  8764.                                 break;
  8765.  
  8766.                         case tk_modminus: negflag=1;
  8767.  
  8768.                         case tk_mod: negflag=1-negflag; vop=1;
  8769.  
  8770.                         case tk_divminus: negflag=1-negflag;
  8771.  
  8772.                         case tk_div:
  8773.  
  8774.                           if(optnum==FALSE)getoperand();
  8775.  
  8776.                                 else{
  8777.  
  8778.                                         tok=tk_number;
  8779.  
  8780.                                         optnum=FALSE;
  8781.  
  8782.                                 }
  8783.  
  8784.                                 if(tok==tk_number){
  8785.  
  8786.                                         if(negflag){
  8787.  
  8788.                                                 itok.number=-itok.number;
  8789.  
  8790.                                                 negflag=0;
  8791.  
  8792.                                         }
  8793.  
  8794.                                         itok.number&=255;
  8795.  
  8796.                                         if(vop){        //%
  8797.  
  8798.                                                 if(itok.number==0)DevideZero();
  8799.  
  8800.                                                 if(caselong(itok.number)!=NUMNUM){
  8801.  
  8802.                                                         op(0x24);       /* AND AL,number-1 */
  8803.  
  8804.                                                         op((unsigned int)itok.number-1);
  8805.  
  8806.                                                         setzeroflag=TRUE;
  8807.  
  8808.                                                 }
  8809.  
  8810.                                                 else{
  8811.  
  8812.                                                         if(expand==FALSE){
  8813.  
  8814.                                                                 if(sign)cbw();
  8815.  
  8816.                                                                 else xorAHAH();
  8817.  
  8818.                                                         }
  8819.  
  8820.                                                         op(0xB1); op((unsigned int)itok.number); /* MOV CL,# */
  8821.  
  8822.                                                         if(sign)outword(0xF9F6);        /* IDIV CL */
  8823.  
  8824.                                                         else outword(0xF1F6); /* DIV CL */
  8825.  
  8826.                                                         outword(0xE088);// MOV AL,AH
  8827.  
  8828.                                                         setzeroflag=FALSE;
  8829.  
  8830.                                                         warningreg(begs[1]);
  8831.  
  8832.                                                         break;
  8833.  
  8834.                                                 }
  8835.  
  8836.                                         }
  8837.  
  8838.                                         else{
  8839.  
  8840.                                                 switch((unsigned int)itok.number){
  8841.  
  8842.                                                         case 0:
  8843.  
  8844.                                                                 DevideZero();
  8845.  
  8846.                                                                 break;
  8847.  
  8848.                                                         case 1: break;
  8849.  
  8850.                                                         case 2:
  8851.  
  8852.                                                                 op(0xd0+expand);
  8853.  
  8854.                                                                 if(sign)op(0xf8);
  8855.  
  8856.                                                                 else op(0xE8);// SHR AL,1
  8857.  
  8858.                                                                 setzeroflag=TRUE;
  8859.  
  8860.                                                                 break;
  8861.  
  8862.                                                         default:
  8863.  
  8864.                                                                 vop=caselong(itok.number);
  8865.  
  8866.                                                                 if(vop!=NUMNUM){
  8867.  
  8868.                                                                         if(chip<2){
  8869.  
  8870.                                                                                 op(0xB1);       op(vop); /* MOV CL,num */
  8871.  
  8872.                                                                                 op(0xd2+expand);
  8873.  
  8874.                                                                                 if(sign)op(0xF8); // SAR AL,CL
  8875.  
  8876.                                                                                 else op(0xE8); // SHR AL,CL
  8877.  
  8878.                                                                                 warningreg(begs[1]);
  8879.  
  8880.                                                                         }
  8881.  
  8882.                                                                         else{
  8883.  
  8884.                                                                                 op(0xc0+expand);
  8885.  
  8886.                                                                                 if(sign)op(0xF8); /* SAR AL,num */
  8887.  
  8888.                                                                                 else op(0xE8); /* SHR AL,num */
  8889.  
  8890.                                                                                 op(vop);
  8891.  
  8892.                                                                                 if(cpu<2)cpu=2;
  8893.  
  8894.                                                                         }
  8895.  
  8896.                                                                         setzeroflag=TRUE;
  8897.  
  8898.                                                                 }
  8899.  
  8900.                                                                 else{
  8901.  
  8902.                                                                         if(expand==FALSE){
  8903.  
  8904.                                                                                 if(optimizespeed&&(itok.flag&f_reloc)==0&&sign==0){     //for signed needed new algoritm
  8905.  
  8906.                                                                                         //§ ¬¥­  ¤¥«¥­¨ï 㬭®¦¥­¨¥¬
  8907.  
  8908.                                                                                         itok.number=256/(unsigned int)itok.number+1;
  8909.  
  8910.                                                                                         if(chip>4){
  8911.  
  8912.                                                                                                 xorAHAH();
  8913.  
  8914.                                                                                                 op66(r16);
  8915.  
  8916.                                                                                                 outword(0xC06B);        //imul AX,num
  8917.  
  8918.                                                                                                 op(itok.number);
  8919.  
  8920.                                                                                                 warningreg(regs[0][2]);
  8921.  
  8922.                                                                                         }
  8923.  
  8924.                                                                                         else{
  8925.  
  8926.                                                                                                 op(0xB2);       //mov DL,num
  8927.  
  8928.                                                                                                 op(itok.number);
  8929.  
  8930.                                                                                                 outword(0xE2F6);        //mul DL
  8931.  
  8932.                                                                                                 warningreg(begs[2]);
  8933.  
  8934.                                                                                         }
  8935.  
  8936.                                                                                         outword(0xE088);        //mov AL.AH
  8937.  
  8938.                                                                                         setzeroflag=FALSE;
  8939.  
  8940.                                                                                         break;
  8941.  
  8942.                                                                                 }
  8943.  
  8944.                                                                                 if(sign)cbw();
  8945.  
  8946.                                                                                 else xorAHAH();
  8947.  
  8948.                                                                         }
  8949.  
  8950.                                                                         op(0xB1);  /* MOV CL,# */
  8951.  
  8952.                                                                         op((unsigned int)itok.number);
  8953.  
  8954.                                                                         if(sign)outword(0xF9F6);  /* IDIV CL */
  8955.  
  8956.                                                                         else outword(0xF1F6); /* DIV CL */
  8957.  
  8958.                                                                         setzeroflag=FALSE;
  8959.  
  8960.                                                                         warningreg(begs[1]);
  8961.  
  8962.                                                                 }
  8963.  
  8964.                                                 }
  8965.  
  8966.                                         }
  8967.  
  8968.                                 }
  8969.  
  8970.                                 else{
  8971.  
  8972.                                         case tk_doublevar:
  8973.  
  8974.                                                 i=4;
  8975.  
  8976.                                         if(tok==tk_floatvar){
  8977.  
  8978.                                                 Float2reg32(ECX,i);
  8979.  
  8980.                                                 itok.number=ECX;
  8981.  
  8982.                                                 tok=tk_beg;
  8983.  
  8984.                                                 sign=1;
  8985.  
  8986.                                         }
  8987.  
  8988.                                         if(expand==FALSE){
  8989.  
  8990.                                                 if(sign)cbw();
  8991.  
  8992.                                                 else xorAHAH();
  8993.  
  8994.                                         }
  8995.  
  8996.                                         switch(tok){
  8997.  
  8998.                                                 case tk_rmnumber:
  8999.  
  9000.                                                 case tk_postnumber:
  9001.  
  9002.                                                         getintoreg_32(CX,r16,sign,&ofsstr,FALSE);
  9003.  
  9004.                                                         if(sign)outword(0xF9F6);  // IDIV CL
  9005.  
  9006.                                                         else outword(0xF1F6);   // DIV CL
  9007.  
  9008.                                                         setzeroflag=FALSE;
  9009.  
  9010.                                                         warningreg(regs[0][1]);
  9011.  
  9012.                                                         break;
  9013.  
  9014.                                                 case tk_qwordvar:
  9015.  
  9016.                                                         i=4;
  9017.  
  9018.                                                 case tk_longvar:
  9019.  
  9020.                                                 case tk_dwordvar:
  9021.  
  9022.                                                         i+=2;
  9023.  
  9024.                                                 case tk_intvar:
  9025.  
  9026.                                                 case tk_wordvar:
  9027.  
  9028.                                                         i++;
  9029.  
  9030.                                                 case tk_charvar:
  9031.  
  9032.                                                 case tk_bytevar:
  9033.  
  9034.                                                         i++;
  9035.  
  9036.                                                         CheckAllMassiv(bufrm,i,&strinf);
  9037.  
  9038.                                                         outseg(&itok,2);
  9039.  
  9040.                                                         op(0xF6);
  9041.  
  9042.                                                         if(sign)op(0x38+itok.rm);
  9043.  
  9044.                                                         else op(0x30+itok.rm);
  9045.  
  9046.                                                         outaddress(&itok);
  9047.  
  9048.                                                         setzeroflag=FALSE;
  9049.  
  9050.                                                         break;
  9051.  
  9052.                                                 case tk_bits:
  9053.  
  9054.                                                         int razr;
  9055.  
  9056.                                                         i=itok.bit.siz+itok.bit.ofs;
  9057.  
  9058.                                                         if(i<=64)razr=r64;
  9059.  
  9060.                                                         if(i<=32)razr=r32;
  9061.  
  9062.                                                         if(i<=16)razr=r16;
  9063.  
  9064.                                                         if(i<=8)razr=r8;
  9065.  
  9066.                                                         bits2reg(CL,razr);
  9067.  
  9068.                                                         itok.number=CL;
  9069.  
  9070.                                                         if(razr==r64)razr=r32;
  9071.  
  9072.                                                         warningreg(razr==r8?begs[1]:(regs[razr/2-1][1]));
  9073.  
  9074.                                                         goto defdiv;
  9075.  
  9076.                                                 case tk_ID:
  9077.  
  9078.                                                 case tk_id:
  9079.  
  9080.                                                 case tk_proc:
  9081.  
  9082.                                                 case tk_apiproc:
  9083.  
  9084.                                                 case tk_undefproc:
  9085.  
  9086.                                                 case tk_declare:
  9087.  
  9088.                                                         op66(r16);
  9089.  
  9090.                                                         op(0x50);       //push AX
  9091.  
  9092.                                                         addESP+=2;
  9093.  
  9094. unsigned char oaddstack;
  9095.  
  9096.                                                         oaddstack=addstack;
  9097.  
  9098.                                                         addstack=FALSE;
  9099.  
  9100.                                                         procdo(sign!=0?tk_char:tk_byte);
  9101.  
  9102.                                                         addstack=oaddstack;
  9103.  
  9104.                                                         addESP-=2;
  9105.  
  9106.                                                         op66(r16);
  9107.  
  9108.                                                         op(0x58+CX);
  9109.  
  9110.                                                         itok.number=CX;
  9111.  
  9112.                                                         warningreg(regs[0][CX]);
  9113.  
  9114.                                                         op66(r16);
  9115.  
  9116.                                                         op(0x90+CX);    //xchg ax,cx
  9117.  
  9118.                                                 case tk_beg:
  9119.  
  9120. defdiv:
  9121.  
  9122.                                                         op(0xF6);
  9123.  
  9124.                                                         if(sign)op(0xF8+(unsigned int)itok.number);
  9125.  
  9126.                                                         else op(0xF0+(unsigned int)itok.number);
  9127.  
  9128.                                                         setzeroflag=FALSE;
  9129.  
  9130.                                                         break;
  9131.  
  9132.                                                 case tk_reg32:
  9133.  
  9134.                                                 case tk_reg:
  9135.  
  9136.                                                         if((unsigned int)itok.number>BX){
  9137.  
  9138.                                                                 op66(r16);
  9139.  
  9140.                                                                 op(0x89);  /* MOV CX,reg */
  9141.  
  9142.                                                                 warningreg(regs[0][1]);
  9143.  
  9144.                                                                 op(0xC1+(unsigned int)itok.number*8); /* MOV instr */
  9145.  
  9146.                                                                 itok.number=CL;
  9147.  
  9148.                                                         }
  9149.  
  9150.                                                         goto defdiv;
  9151.  
  9152.                                                 default: valueexpected();       break;
  9153.  
  9154.                                         }
  9155.  
  9156.                                         if(vop)outword(0xE088);// MOV AL,AH
  9157.  
  9158.                                 }
  9159.  
  9160.                                 expand=FALSE;
  9161.  
  9162.                                 break;
  9163.  
  9164.                         case tk_multminus: negflag=1;
  9165.  
  9166.                         case tk_mult:
  9167.  
  9168.                                 expand=expandvar();
  9169.  
  9170.                           if(optnum==FALSE)getoperand();
  9171.  
  9172.                                 else{
  9173.  
  9174.                                         tok=tk_number;
  9175.  
  9176.                                         optnum=FALSE;
  9177.  
  9178.                                 }
  9179.  
  9180.                                 switch(tok){
  9181.  
  9182.                                         case tk_number:
  9183.  
  9184.                                                 if(negflag){
  9185.  
  9186.                                                         itok.number=-itok.number;
  9187.  
  9188.                                                         negflag=0;
  9189.  
  9190.                                                 }
  9191.  
  9192.                                                 itok.number&=255;
  9193.  
  9194.                                                 switch((unsigned int)itok.number){
  9195.  
  9196.                                                         case 0: /* AL * 0 = MOV AL,0 */
  9197.  
  9198.                                                                 outword(0x00B0);
  9199.  
  9200.                                                         case 1:
  9201.  
  9202.                                                                 expand=FALSE;
  9203.  
  9204.                                                                 setzeroflag=FALSE;
  9205.  
  9206.                                                                 break; /* AL * 1 = AL */
  9207.  
  9208.                                                         case 2:
  9209.  
  9210.                                                                 if(expand==TRUE){
  9211.  
  9212.                                                                         if(sign)cbw();
  9213.  
  9214.                                                                         else xorAHAH();
  9215.  
  9216.                                                                 }
  9217.  
  9218.                                                                 outword(0xC000+expand); // AL * 2 = ADD AL,AL
  9219.  
  9220.                                                                 setzeroflag=TRUE;
  9221.  
  9222.                                                                 break;
  9223.  
  9224.                                                         default:
  9225.  
  9226.                                                                 vop=caselong(itok.number);
  9227.  
  9228.                                                                 if(vop!=NUMNUM){
  9229.  
  9230.                                                                         if(chip<1){
  9231.  
  9232.                                                                                 if(expand==TRUE){
  9233.  
  9234.                                                                                         if(optimizespeed==FALSE&&sign==FALSE)goto num_imul;
  9235.  
  9236.                                                                                         if(sign)cbw();
  9237.  
  9238.                                                                                         else xorAHAH();
  9239.  
  9240.                                                                                 }
  9241.  
  9242.                                                                                 op(0xB1); op(vop); /* MOV CL,num */
  9243.  
  9244.                                                                                 outword(0xE0D2+expand);// SHL AL,CL
  9245.  
  9246.                                                                                 warningreg(begs[1]);
  9247.  
  9248.                                                                         }
  9249.  
  9250.                                                                         else{
  9251.  
  9252.                                                                                 if(expand==TRUE){
  9253.  
  9254.                                                                                         if(optimizespeed==FALSE&&sign==FALSE)goto num_imul;
  9255.  
  9256.                                                                                         if(sign)cbw();
  9257.  
  9258.                                                                                         else xorAHAH();
  9259.  
  9260.                                                                                         op66(r16);
  9261.  
  9262.                                                                                 }
  9263.  
  9264.                                                                                 outword(0xe0c0+expand); //SHL AX/L,num
  9265.  
  9266.                                                                                 op(vop);
  9267.  
  9268.                                                                                 if(cpu<1)cpu=1;
  9269.  
  9270.                                                                         }
  9271.  
  9272.                                                                         setzeroflag=TRUE;
  9273.  
  9274.                                                                 }
  9275.  
  9276.                                                                 else if(expand==FALSE&&optimizespeed!=FALSE&&
  9277.  
  9278.                                                                                 speedmul(itok.number,r8)!=FALSE);
  9279.  
  9280.                                                                 else{
  9281.  
  9282. num_imul:
  9283.  
  9284.                                                                         op(0xB1);  /* MOV CL,# */
  9285.  
  9286.                                                                         op((unsigned int)itok.number);
  9287.  
  9288.                                                                         if(sign)outword(0xE9F6);// IMUL CL
  9289.  
  9290.                                                                         else outword(0xE1F6);   // MUL CL
  9291.  
  9292.                                                                         setzeroflag=FALSE;
  9293.  
  9294.                                                                         warningreg(begs[1]);
  9295.  
  9296.                                                                 }
  9297.  
  9298.                                                 }
  9299.  
  9300.                                                 break;
  9301.  
  9302.                                         case tk_rmnumber:
  9303.  
  9304.                                         case tk_postnumber:
  9305.  
  9306.                                                 getintoreg_32(CX,r16,sign,&ofsstr,FALSE);
  9307.  
  9308.                                                 if(sign)outword(0xE9F6); // IMUL CL
  9309.  
  9310.                                                 else outword(0xE1F6);   // MUL CL
  9311.  
  9312.                                                 setzeroflag=FALSE;
  9313.  
  9314.                                                 warningreg(regs[0][1]);
  9315.  
  9316.                                                 break;
  9317.  
  9318.                                         case tk_doublevar:
  9319.  
  9320.                                                 i=4;
  9321.  
  9322.                                         case tk_floatvar:
  9323.  
  9324.                                                 Float2reg32(ECX,i);
  9325.  
  9326.                                                 itok.number=ECX;
  9327.  
  9328.                                                 outword(0xE9F6); // IMUL CL
  9329.  
  9330.                                                 setzeroflag=FALSE;
  9331.  
  9332.                                                 warningreg(begs[1]);
  9333.  
  9334.                                                 break;
  9335.  
  9336.                                         case tk_qwordvar:
  9337.  
  9338.                                                 i=4;
  9339.  
  9340.                                         case tk_longvar:
  9341.  
  9342.                                         case tk_dwordvar:
  9343.  
  9344.                                                 i+=2;
  9345.  
  9346.                                         case tk_intvar:
  9347.  
  9348.                                         case tk_wordvar:
  9349.  
  9350.                                                 i++;
  9351.  
  9352.                                         case tk_charvar:
  9353.  
  9354.                                         case tk_bytevar:
  9355.  
  9356.                                                 i++;
  9357.  
  9358.                                                 CheckAllMassiv(bufrm,i,&strinf);
  9359.  
  9360.                                                 outseg(&itok,2);
  9361.  
  9362.                                                 op(0xF6);
  9363.  
  9364.                                                 if(sign)op(0x28+itok.rm);
  9365.  
  9366.                                                 else op(0x20+itok.rm);
  9367.  
  9368.                                                 outaddress(&itok);
  9369.  
  9370.                                                 setzeroflag=FALSE;
  9371.  
  9372.                                                 break;
  9373.  
  9374.                                         case tk_bits:
  9375.  
  9376.                                                 int razr;
  9377.  
  9378.                                                 i=itok.bit.siz+itok.bit.ofs;
  9379.  
  9380.                                                 if(i<=64)razr=r64;
  9381.  
  9382.                                                 if(i<=32)razr=r32;
  9383.  
  9384.                                                 if(i<=16)razr=r16;
  9385.  
  9386.                                                 if(i<=8)razr=r8;
  9387.  
  9388.                                                 bits2reg(CL,razr);
  9389.  
  9390.                                                 itok.number=CL;
  9391.  
  9392.                                                 if(razr==r64)razr=r32;
  9393.  
  9394.                                                 warningreg(razr==r8?begs[1]:(regs[razr/2-1][1]));
  9395.  
  9396.                                                 goto defmul;
  9397.  
  9398.                                         case tk_ID:
  9399.  
  9400.                                         case tk_id:
  9401.  
  9402.                                         case tk_proc:
  9403.  
  9404.                                         case tk_apiproc:
  9405.  
  9406.                                         case tk_undefproc:
  9407.  
  9408.                                         case tk_declare:
  9409.  
  9410.                                                 op66(r16);
  9411.  
  9412.                                                 op(0x50);       //push AX
  9413.  
  9414.                                                 addESP+=2;
  9415.  
  9416. unsigned char oaddstack;
  9417.  
  9418.                                                 oaddstack=addstack;
  9419.  
  9420.                                                 addstack=FALSE;
  9421.  
  9422.                                                 procdo(sign!=0?tk_char:tk_byte);
  9423.  
  9424.                                                 addstack=oaddstack;
  9425.  
  9426.                                                 addESP-=2;
  9427.  
  9428.                                                 op66(r16);
  9429.  
  9430.                                                 op(0x58+DX);
  9431.  
  9432.                                                 itok.number=DX;
  9433.  
  9434.                                                 warningreg(regs[0][DX]);
  9435.  
  9436.                                         case tk_beg:
  9437.  
  9438. defmul:
  9439.  
  9440.                                                 op(0xF6);
  9441.  
  9442.                                                 if(sign)op(0xE8+(unsigned int)itok.number);
  9443.  
  9444.                                                 else op(0xE0+(unsigned int)itok.number);
  9445.  
  9446.                                                 setzeroflag=FALSE;
  9447.  
  9448.                                                 break;
  9449.  
  9450.                                         case tk_reg32:
  9451.  
  9452.                                         case tk_reg:
  9453.  
  9454.                                                 if((unsigned int)itok.number>BX){
  9455.  
  9456.                                                         op66(r16);
  9457.  
  9458.                                                         op(0x89);  /* MOV CX,reg */
  9459.  
  9460.                                                         warningreg(regs[0][1]);
  9461.  
  9462.                                                         op(0xC1+(unsigned int)itok.number*8); /* MOV instr */
  9463.  
  9464.                                                         itok.number=CL;
  9465.  
  9466.                                                 }
  9467.  
  9468.                                                 goto defmul;
  9469.  
  9470.                                         default: valueexpected();       break;
  9471.  
  9472.                                 }
  9473.  
  9474.                                 break;
  9475.  
  9476.                         case tk_xorminus: vop+=0x10;
  9477.  
  9478.                         case tk_andminus: vop+=0x18;
  9479.  
  9480.                         case tk_orminus: vop+=0x08;
  9481.  
  9482.                           getoperand();
  9483.  
  9484.                                 if(tok==tk_number){
  9485.  
  9486.                                         itok.number=-itok.number;
  9487.  
  9488.                                         op(0x04+vop);
  9489.  
  9490.                                         op((unsigned int)itok.number);
  9491.  
  9492.                                 }
  9493.  
  9494.                                 else{
  9495.  
  9496.                                         getintobeg(CL,&ofsstr);
  9497.  
  9498.                                         if(optimizespeed&&(chip==5||chip==6)){
  9499.  
  9500.                                                 op(0x80);
  9501.  
  9502.                                                 outdword(0xC1FEFFE1);   //and CL,-1 inc CL
  9503.  
  9504.                                         }
  9505.  
  9506.                                         else outword(0xD9F6);  // NEG CL
  9507.  
  9508.                                         op(0x00+vop);
  9509.  
  9510.                                         op(0xC8);       /* opt AL,CL */
  9511.  
  9512.                                         warningreg(begs[1]);
  9513.  
  9514.                                         next=0;
  9515.  
  9516.                                 }
  9517.  
  9518.                                 setzeroflag=TRUE;
  9519.  
  9520.                                 break;
  9521.  
  9522.                         case tk_rr:
  9523.  
  9524.                                 vop=8;
  9525.  
  9526.                                 if(sign)vop+=0x10;
  9527.  
  9528.                         case tk_ll:
  9529.  
  9530.                           getoperand();
  9531.  
  9532.                                 if(tok==tk_number){
  9533.  
  9534.                                         if((unsigned int)itok.number==1){
  9535.  
  9536.                                                 if(expand==TRUE)op66(r16);
  9537.  
  9538.                                                 op(0xD0+expand); op(0xE0+vop);  /* SR AL,1 */
  9539.  
  9540.                                         }
  9541.  
  9542.                                         else if((unsigned int)itok.number!=0){
  9543.  
  9544.                                                 if(chip<2) goto llminus;
  9545.  
  9546.                                                 else{
  9547.  
  9548.                                                         if(expand==TRUE)op66(r16);
  9549.  
  9550.                                                         op(0xC0+expand); op(0xE0+vop);  /* SR AL,imm8 */
  9551.  
  9552.                                                         op((unsigned int)itok.number);
  9553.  
  9554.                                                         if(cpu<2)cpu=2;
  9555.  
  9556.                                                 }
  9557.  
  9558.                                         }
  9559.  
  9560.                                         setzeroflag=TRUE;
  9561.  
  9562.                                 }
  9563.  
  9564.                                 else goto llminus;
  9565.  
  9566.                                 break;
  9567.  
  9568.                         case tk_rrminus:
  9569.  
  9570.                                 vop=8;
  9571.  
  9572.                                 if(sign)vop+=0x10;
  9573.  
  9574.                         case tk_llminus:
  9575.  
  9576.                                 tok=tk_minus;   // need 286+ opt some time
  9577.  
  9578. llminus:
  9579.  
  9580.                                 if(!((tok==tk_beg||tok==tk_reg||tok==tk_reg32)&&itok.number==1)){
  9581.  
  9582.                                         getintobeg(CL,&ofsstr);
  9583.  
  9584.                                         warningreg(begs[1]);
  9585.  
  9586.                                 }
  9587.  
  9588.                                 else getoperand();
  9589.  
  9590.                                 if(expand==TRUE)op66(r16);
  9591.  
  9592.                                 op(0xD2+expand); op(0xE0+vop);
  9593.  
  9594.                                 setzeroflag=TRUE;
  9595.  
  9596.                                 next=0;
  9597.  
  9598.                                 break;
  9599.  
  9600.                         default: operatorexpected(); break;
  9601.  
  9602.                 }
  9603.  
  9604.                 if(negflag){
  9605.  
  9606.                         if(optimizespeed&&(chip==5||chip==6))outdword(0xC0FEFF34);      //xor AL,-1 AL++
  9607.  
  9608.                         else outword(0xD8F6);// NEG AL
  9609.  
  9610.                         negflag=0;
  9611.  
  9612.                         setzeroflag=TRUE;
  9613.  
  9614.                 }
  9615.  
  9616.                 if(next)nexttok();
  9617.  
  9618.                 ClearReg(AX);
  9619.  
  9620.         }
  9621.  
  9622. #ifdef OPTVARCONST
  9623.  
  9624.         calcnumber=FALSE;
  9625.  
  9626. #endif
  9627.  
  9628.         if(tok==tk_eof)unexpectedeof();
  9629.  
  9630. }
  9631.  
  9632.  
  9633.  
  9634. /* =============== doreg_32(), dobeg(), doseg() ===============*/
  9635.  
  9636.  
  9637.  
  9638. int doreg_32(int reg,int razr,int terminater)
  9639.  
  9640. {
  9641.  
  9642. unsigned char next=1;
  9643.  
  9644. int vop=0,sign=0;
  9645.  
  9646. int i;
  9647.  
  9648. int reg1=idxregs[0],reg2=idxregs[1];
  9649.  
  9650. unsigned long ii;
  9651.  
  9652. int rettype=tk_reg;
  9653.  
  9654. int rrettype,pointr=0;
  9655.  
  9656. int numpointr=0;
  9657.  
  9658. char *ofsstr=NULL;
  9659.  
  9660.         if(reg==reg1){
  9661.  
  9662.                 reg1=idxregs[1];
  9663.  
  9664.                 reg2=idxregs[2];
  9665.  
  9666.         }
  9667.  
  9668.         if(reg==reg2)reg2=idxregs[2];
  9669.  
  9670.         if(reg==ESP)RestoreStack();
  9671.  
  9672.         rrettype=razr==r16?tk_word:tk_dword;
  9673.  
  9674.         nexttok();
  9675.  
  9676.         switch(tok){
  9677.  
  9678.                 case tk_assign://=
  9679.  
  9680.                         if(am32)idxregs[4]=reg;
  9681.  
  9682.                         if(!((tok2==tk_reg||tok2==tk_reg32||tok2==tk_beg)&&ScanTok3()==terminater)){
  9683.  
  9684.                                 ofsstr=GetLecsem(terminater);
  9685.  
  9686.                         }
  9687.  
  9688.                         else{
  9689.  
  9690.                                 nexttok();
  9691.  
  9692.                                 switch(tok){
  9693.  
  9694.                                         case tk_beg:
  9695.  
  9696.                                                 i=r8;
  9697.  
  9698.                                                 break;
  9699.  
  9700.                                         case tk_reg:
  9701.  
  9702.                                                 i=r16;
  9703.  
  9704.                                                 break;
  9705.  
  9706.                                         case tk_reg32:
  9707.  
  9708.                                                 i=r32;
  9709.  
  9710.                                                 break;
  9711.  
  9712.                                 }
  9713.  
  9714.                                 if(i!=razr||RegToReg(reg,itok.number,i)==NOINREG)goto nn1;
  9715.  
  9716.                                 waralreadinitreg(regs[razr/4][itok.number],regs[razr/4][reg]);
  9717.  
  9718.                                 if(am32)idxregs[4]=255;
  9719.  
  9720.                                 break;
  9721.  
  9722.                         }
  9723.  
  9724.                         if(ofsstr){
  9725.  
  9726.                                 int retreg;
  9727.  
  9728.                                 if((retreg=CheckIDZReg(ofsstr,reg,razr))!=NOINREG){
  9729.  
  9730.                                         GetEndLex(terminater);
  9731.  
  9732.                                         if(razr==r16)tok=tk_reg;
  9733.  
  9734.                                         else tok=tk_reg32;
  9735.  
  9736.                                         itok.number=retreg==SKIPREG?reg:retreg;
  9737.  
  9738.                                         goto nn1;
  9739.  
  9740.                                 }
  9741.  
  9742.                         }
  9743.  
  9744.                         nexttok();
  9745.  
  9746.                         convert_type(&sign,&rrettype,&pointr,am32==TRUE?reg:BX);
  9747.  
  9748.                         if(rrettype==tk_float||rrettype==tk_double){
  9749.  
  9750.                                 if(am32)idxregs[4]=255;
  9751.  
  9752.                                 doeaxfloatmath(tk_reg32,reg,rrettype==tk_float?0:4);
  9753.  
  9754.                                 next=0;
  9755.  
  9756.                                 if(ofsstr){
  9757.  
  9758.                                         IDZToReg(ofsstr,reg,razr);
  9759.  
  9760.                                         free(ofsstr);
  9761.  
  9762.                                 }
  9763.  
  9764.                                 break;
  9765.  
  9766.                         }
  9767.  
  9768.                         while(tok==tk_mult){
  9769.  
  9770.                                 nexttok();
  9771.  
  9772.                                 numpointr++;
  9773.  
  9774.                         }
  9775.  
  9776.                         if(numpointr>itok.npointr)unuseableinput();
  9777.  
  9778.                         if(tok2==tk_assign){
  9779.  
  9780.                                 int hnumber=MultiAssign(razr,USEALLREG,numpointr);
  9781.  
  9782. //                              puts("end MultAssign");
  9783.  
  9784.                                 if(ofsstr){
  9785.  
  9786.                                         free(ofsstr);
  9787.  
  9788.                                         ofsstr=NULL;
  9789.  
  9790.                                 }
  9791.  
  9792.                                 if(reg!=hnumber){
  9793.  
  9794.                                         op66(razr);
  9795.  
  9796.                                         op(0x89);
  9797.  
  9798.                                         op(0xC0+reg+hnumber*8); //mov reg,AX
  9799.  
  9800.                                 }
  9801.  
  9802.                                 next=0;
  9803.  
  9804. /*                              if(ofsstr){
  9805.  
  9806.                                         IDZToReg(ofsstr,reg,razr);
  9807.  
  9808.                                         free(ofsstr);
  9809.  
  9810.                                 }*/
  9811.  
  9812.                                 if(am32)idxregs[4]=255;
  9813.  
  9814.                                 break;
  9815.  
  9816.                         }
  9817.  
  9818. //                      printf("tok=%d %s\n",tok,itok.name);
  9819.  
  9820.                         if(tok==tk_pointer)cpointr(am32==TRUE?reg:BX,numpointr);
  9821.  
  9822.                         if(tok==tk_new||tok==tk_delete){
  9823.  
  9824.                                 if(tok==tk_new)donew();
  9825.  
  9826.                                 else{
  9827.  
  9828.                                         dodelete();
  9829.  
  9830.                                         terminater=next=0;
  9831.  
  9832.                                 }
  9833.  
  9834.                                 if(am32)idxregs[4]=255;
  9835.  
  9836.                                 if(reg!=AX){
  9837.  
  9838.                                         GenRegToReg(reg,AX,(am32+1)*2);
  9839.  
  9840.                                 }
  9841.  
  9842.                                 clearregstat();
  9843.  
  9844. #ifdef OPTVARCONST
  9845.  
  9846.                                 FreeGlobalConst();
  9847.  
  9848. #endif
  9849.  
  9850.                                 if(ofsstr){
  9851.  
  9852.                                         free(ofsstr);
  9853.  
  9854.                                         ofsstr=NULL;
  9855.  
  9856.                                 }
  9857.  
  9858.                                 break;
  9859.  
  9860.                         }
  9861.  
  9862. nn1:
  9863.  
  9864.                         if(am32)idxregs[4]=255;
  9865.  
  9866.                         if(reg==AX){
  9867.  
  9868.                                 if(rrettype==tk_char||rrettype==tk_byte)rettype=doalmath(sign,&ofsstr);
  9869.  
  9870.                                 else if(rrettype==tk_int||rrettype==tk_word)rettype=do_e_axmath(sign,r16,&ofsstr);
  9871.  
  9872.                                 else rettype=do_e_axmath(sign,r32,&ofsstr);
  9873.  
  9874.                                 convert_returnvalue(razr==r16?tk_word:tk_dword,rrettype);
  9875.  
  9876.                         }
  9877.  
  9878.                         else{
  9879.  
  9880.                                 if(rrettype==tk_char||rrettype==tk_byte&&reg<=BX){
  9881.  
  9882.                                         rettype=getintobeg(reg,&ofsstr);
  9883.  
  9884.                                         if(itok.type!=tp_stopper&&tok!=tk_eof){
  9885.  
  9886.                                                 dobegmath(reg);
  9887.  
  9888.                                                 rettype=tk_beg;
  9889.  
  9890.                                         }
  9891.  
  9892.                                         op66(razr);
  9893.  
  9894.                                         op(0x0F);
  9895.  
  9896.                                         if(!sign)op(0xB6);
  9897.  
  9898.                                         else op(0xBE);
  9899.  
  9900.                                         op(0xC0+reg*9);
  9901.  
  9902.                                 }
  9903.  
  9904.                                 else{
  9905.  
  9906.                                         if(rrettype==tk_int||rrettype==tk_word)next=r16;
  9907.  
  9908.                                         else next=r32;
  9909.  
  9910.                                         rettype=getintoreg(reg,next,sign,&ofsstr);
  9911.  
  9912.                                         if(next==r16&&razr==r32){
  9913.  
  9914.                                                 op66(r32);
  9915.  
  9916.                                                 op(0x0F);
  9917.  
  9918.                                                 if(!sign)op(0xB7);
  9919.  
  9920.                                                 else op(0xBF);
  9921.  
  9922.                                                 op(0xC0+reg*9);
  9923.  
  9924.                                         }
  9925.  
  9926.                                 }
  9927.  
  9928.                         }
  9929.  
  9930.                         next=0;
  9931.  
  9932.                         if(ofsstr){
  9933.  
  9934.                                 IDZToReg(ofsstr,reg,razr);
  9935.  
  9936.                                 free(ofsstr);
  9937.  
  9938.                         }
  9939.  
  9940.                         break;
  9941.  
  9942.                 case tk_plusplus: op66(razr); op(0x40+reg);
  9943.  
  9944.                         ClearReg(reg);
  9945.  
  9946.                         break;
  9947.  
  9948.                 case tk_minusminus: op66(razr); op(0x48+reg);
  9949.  
  9950.                         ClearReg(reg);
  9951.  
  9952.                         break;
  9953.  
  9954.                 case tk_cdecl:
  9955.  
  9956.                 case tk_pascal:
  9957.  
  9958.                 case tk_fastcall:
  9959.  
  9960.                 case tk_stdcall:
  9961.  
  9962.                         vop=tok;
  9963.  
  9964.                         nexttok();
  9965.  
  9966.                         if(tok!=tk_openbracket){
  9967.  
  9968.                                 expected('(');
  9969.  
  9970.                                 FindStopTok();
  9971.  
  9972.                         }
  9973.  
  9974.                 case tk_openbracket:    //¢ë§®¢ ¯à®æ¥¤ãàë ¯®  ¤à¥áã ¢ ॣ¨áâà¥
  9975.  
  9976.                         param[0]=0;
  9977.  
  9978.                         i=0;
  9979.  
  9980.                         switch ( vop ) {
  9981.  
  9982.                                 case tk_cdecl:
  9983.  
  9984.                                 case tk_stdcall:
  9985.  
  9986.                                         i=swapparam();
  9987.  
  9988.                                         break;
  9989.  
  9990.                                 case tk_pascal:
  9991.  
  9992.                                         doparams();
  9993.  
  9994.                                         break;
  9995.  
  9996.                                 case tk_fastcall:
  9997.  
  9998.                                         doregparams();
  9999.  
  10000.                                         break;
  10001.  
  10002.                                 default:
  10003.  
  10004.                                         if(comfile==file_w32)swapparam();
  10005.  
  10006.                                         else doparams();
  10007.  
  10008.                         }
  10009.  
  10010.                         if(vop!=tk_cdecl)i=0;
  10011.  
  10012.                         op66(razr);
  10013.  
  10014.                         op(0xFF);
  10015.  
  10016.                         op(0xD0+reg);   /* CALL reg with stack params */
  10017.  
  10018.                         if(i)CorrectStack(i);
  10019.  
  10020.                         clearregstat();
  10021.  
  10022. #ifdef OPTVARCONST
  10023.  
  10024.                         FreeGlobalConst();
  10025.  
  10026. #endif
  10027.  
  10028.                         break;
  10029.  
  10030.                 case tk_swap:
  10031.  
  10032.                         getoperand(reg==BX?SI:BX);
  10033.  
  10034.                         switch(tok){
  10035.  
  10036.                                 case tk_qwordvar:
  10037.  
  10038.                                 case tk_longvar:
  10039.  
  10040.                                 case tk_dwordvar:
  10041.  
  10042.                                         if(razr==r16)swaperror();
  10043.  
  10044.                                         i=4;
  10045.  
  10046.                                         goto swapint;
  10047.  
  10048.                                 case tk_intvar:
  10049.  
  10050.                                 case tk_wordvar:
  10051.  
  10052.                                         i=2;
  10053.  
  10054.                                         if(razr==r32)swaperror();
  10055.  
  10056. swapint:
  10057.  
  10058.                                         ClearReg(reg);
  10059.  
  10060.                                         CheckAllMassiv(bufrm,i,&strinf,&itok,reg1,reg2);
  10061.  
  10062.                                         op66(razr);
  10063.  
  10064.                                         outseg(&itok,2);
  10065.  
  10066.                                         op(0x87);
  10067.  
  10068.                                         op(reg*8+itok.rm);
  10069.  
  10070.                                         outaddress(&itok);
  10071.  
  10072.                                         break;
  10073.  
  10074.                                 case tk_reg32:
  10075.  
  10076.                                         if(razr==r16)swaperror();
  10077.  
  10078.                                         goto swapreg;
  10079.  
  10080.                                 case tk_reg:
  10081.  
  10082.                                         if(razr==r32)swaperror();
  10083.  
  10084. swapreg:
  10085.  
  10086.                                         if(reg!=(int)itok.number){
  10087.  
  10088.                                                 if(RegSwapReg(reg,itok.number,razr)==NOINREG){;
  10089.  
  10090.                                                         op66(razr);
  10091.  
  10092.                                                         if(reg==AX)op(0x90+(unsigned int)itok.number);
  10093.  
  10094.                                                         else if((unsigned int)itok.number==AX)op(0x90+reg);
  10095.  
  10096.                                                         else{
  10097.  
  10098.                                                                 op(0x87);
  10099.  
  10100.                                                                 op(0xC0+(unsigned int)itok.number+reg*8);
  10101.  
  10102.                                                         }
  10103.  
  10104.                                                 }
  10105.  
  10106.                                                 else waralreadinitreg(regs[razr/4][reg],regs[razr/4][itok.number]);
  10107.  
  10108.                                         }
  10109.  
  10110.                                         break;
  10111.  
  10112.                                 default: swaperror(); break;
  10113.  
  10114.                         }
  10115.  
  10116.                         break;
  10117.  
  10118.                 case tk_xorequals: vop+=0x08;
  10119.  
  10120.                 case tk_minusequals: vop+=0x08;
  10121.  
  10122.                 case tk_andequals: vop+=0x18;
  10123.  
  10124.                 case tk_orequals: vop+=0x08;
  10125.  
  10126.                 case tk_plusequals:
  10127.  
  10128.                         ClearReg(reg);
  10129.  
  10130.                         if(am32&&uselea&&tok==tk_plusequals){
  10131.  
  10132.                                 if(RegEqualToLea(reg)){
  10133.  
  10134.                                         next=0;
  10135.  
  10136.                                         break;
  10137.  
  10138.                                 }
  10139.  
  10140.                         }
  10141.  
  10142.                         if(CheckAddOnly()){
  10143.  
  10144.                                 inptr2--;
  10145.  
  10146.                                 cha2=' ';
  10147.  
  10148.                                 if(tok==tk_plusequals)tok=tk_plus;
  10149.  
  10150.                                 else tok=tk_minus;
  10151.  
  10152.                                 if(reg==EAX)do_e_axmath2(0,razr,0);
  10153.  
  10154.                                 else doregmath_32(reg,razr,0,&ofsstr);
  10155.  
  10156.                                 next=0;
  10157.  
  10158.                                 break;
  10159.  
  10160.                         }
  10161.  
  10162.                         getoperand(reg==BX?SI:BX);
  10163.  
  10164.                         if(itok2.type==tp_opperand&&tok!=tk_number&&tok!=tk_undefofs&&tok!=tk_postnumber)goto defadd;
  10165.  
  10166.                         CheckMinusNum();
  10167.  
  10168.                         idrec *rrec;
  10169.  
  10170.                         int opost;
  10171.  
  10172.                         i=tok;
  10173.  
  10174.                         switch(tok){
  10175.  
  10176.                                 case tk_postnumber:
  10177.  
  10178.                                 case tk_undefofs:
  10179.  
  10180.                                         ii=itok.number;
  10181.  
  10182.                                         rrec=itok.rec;
  10183.  
  10184.                                         opost=itok.post;
  10185.  
  10186.                                         char uname[IDLENGTH];
  10187.  
  10188.                                         strcpy(uname,itok.name);
  10189.  
  10190.                                         if(itok.flag&f_extern)goto addnum;
  10191.  
  10192.                                         tok=tk_number;
  10193.  
  10194.                                 case tk_number:
  10195.  
  10196.                                         ii=doconstdwordmath();
  10197.  
  10198.                                         next=0;
  10199.  
  10200.                                         if(itok.type==tp_opperand){
  10201.  
  10202.                                                 if(reg==EAX){
  10203.  
  10204.                                                         sign=ECX;
  10205.  
  10206.                                                         if((tok2==tk_reg||tok2==tk_reg32)&&itok2.number==ECX)sign=EDX;
  10207.  
  10208.                                                         warningreg(regs[razr/2-1][sign]);
  10209.  
  10210.                                                 }
  10211.  
  10212.                                                 if(i==tk_postnumber||i==tk_undefofs){
  10213.  
  10214.                                                         op66(razr);
  10215.  
  10216.                                                         op(0xB8+reg);   // MOV reg,#
  10217.  
  10218.                                                         if(i==tk_postnumber)(postnumflag&f_extern)==0?setwordpost(&itok):setwordext((long *)&ii);
  10219.  
  10220.                                                         else{
  10221.  
  10222.                                                                 if((postnumflag&f_reloc)!=0)AddReloc();
  10223.  
  10224.                                                                 if(i==tk_undefofs)AddUndefOff(2,uname);
  10225.  
  10226.                                                         }
  10227.  
  10228.                                                         razr==r16?outword(ii):outdword(ii);
  10229.  
  10230.                                                 }
  10231.  
  10232.                                                 else MovRegNum(razr,postnumflag&f_reloc,ii,sign);
  10233.  
  10234.                                                 if(sign==EAX)do_e_axmath2(0,razr,0);
  10235.  
  10236.                                                 else doregmath_32(sign,razr,0,&ofsstr);
  10237.  
  10238.                                                 itok.number=sign;
  10239.  
  10240.                                                 goto addreg;
  10241.  
  10242.                                         }
  10243.  
  10244.                                         if((postnumflag&f_reloc)==0&&i!=tk_undefofs&&i!=tk_postnumber&&optnumadd(ii,reg,razr,vop))break;
  10245.  
  10246. addnum:
  10247.  
  10248.                                         op66(razr);
  10249.  
  10250.                                   if(reg==AX)op(0x05+vop);
  10251.  
  10252.                                         else{
  10253.  
  10254.                                                 op(0x81);
  10255.  
  10256.                                                 op(0xC0+vop+reg);
  10257.  
  10258.                                         }
  10259.  
  10260.                                         itok.rec=rrec;
  10261.  
  10262.                                         itok.post=opost;
  10263.  
  10264.                                         if(i==tk_postnumber)(postnumflag&f_extern)==0?setwordpost(&itok):setwordext((long *)&ii);
  10265.  
  10266.                                         else{
  10267.  
  10268.                                                 if((postnumflag&f_reloc)!=0)AddReloc();
  10269.  
  10270.                                                 if(i==tk_undefofs)AddUndefOff(2,uname);
  10271.  
  10272.                                         }
  10273.  
  10274.                                         razr==r16?outword(ii):outdword(ii);
  10275.  
  10276.                                         break;
  10277.  
  10278.                                 case tk_qwordvar:
  10279.  
  10280.                                 case tk_longvar:
  10281.  
  10282.                                 case tk_dwordvar:
  10283.  
  10284.                                         i=4;
  10285.  
  10286.                                         goto wordadd;
  10287.  
  10288.                                 case tk_intvar:
  10289.  
  10290.                                 case tk_wordvar:
  10291.  
  10292.                                         i=2;
  10293.  
  10294.                                         if(razr==r32)valueexpected();
  10295.  
  10296. wordadd:
  10297.  
  10298.                                         CheckAllMassiv(bufrm,i,&strinf,&itok,reg1,reg2);
  10299.  
  10300.                                         op66(razr);
  10301.  
  10302.                                         outseg(&itok,2);
  10303.  
  10304.                                         op(0x03+vop);
  10305.  
  10306.                                         op(reg*8+itok.rm);
  10307.  
  10308.                                         outaddress(&itok);
  10309.  
  10310.                                         break;
  10311.  
  10312.                                 case tk_reg:
  10313.  
  10314.                                         if(razr==r32)valueexpected();
  10315.  
  10316.                                 case tk_reg32:
  10317.  
  10318. addreg:
  10319.  
  10320.                                         op66(razr);
  10321.  
  10322.                                         op(0x01+vop);
  10323.  
  10324.                                         op(0xC0+reg+(unsigned int)itok.number*8);
  10325.  
  10326.                                         break;
  10327.  
  10328.                                 case tk_ID:
  10329.  
  10330.                                 case tk_id:
  10331.  
  10332.                                 case tk_proc:
  10333.  
  10334.                                 case tk_apiproc:
  10335.  
  10336.                                 case tk_undefproc:
  10337.  
  10338.                                 case tk_declare:
  10339.  
  10340. unsigned char oaddstack;
  10341.  
  10342.                                         if(reg==EAX){
  10343.  
  10344.                                                 op66(razr);
  10345.  
  10346.                                                 op(0x50);       //push AX
  10347.  
  10348.                                                 addESP+=razr==r16?2:4;
  10349.  
  10350.                                                 warningreg(regs[razr/2-1][EDX]);
  10351.  
  10352.                                                 oaddstack=addstack;
  10353.  
  10354.                                                 addstack=FALSE;
  10355.  
  10356.                                         }
  10357.  
  10358.                                         procdo(razr==r16?tk_word:tk_dword);
  10359.  
  10360.                                         if(itok2.type==tp_opperand){
  10361.  
  10362.                                                 nexttok();
  10363.  
  10364.                                                 do_e_axmath2(0,razr,0);
  10365.  
  10366.                                                 next=0;
  10367.  
  10368.                                         }
  10369.  
  10370.                                         if(reg==EAX){
  10371.  
  10372.                                                 addstack=oaddstack;
  10373.  
  10374.                                                 addESP-=razr==r16?2:4;
  10375.  
  10376.                                                 op66(razr);
  10377.  
  10378.                                                 op(0x58+EDX);   //pop dx
  10379.  
  10380.                                                 if(vop>0x20){
  10381.  
  10382.                                                         op66(razr);
  10383.  
  10384.                                                         op(0x90+EDX);   //xchg ax,dx
  10385.  
  10386.                                                 }
  10387.  
  10388.                                                 op66(razr);
  10389.  
  10390.                                                 op(0x01+vop);
  10391.  
  10392.                                                 op(0xc0+EDX*8); //add ax,dx
  10393.  
  10394.                                         }
  10395.  
  10396.                                         else{
  10397.  
  10398.                                                 op66(razr);
  10399.  
  10400.                                                 op(0x01+vop);
  10401.  
  10402.                                                 op(0xc0+reg);   //add reg,ax
  10403.  
  10404.                                         }
  10405.  
  10406.                                         break;
  10407.  
  10408.                                 case tk_seg:
  10409.  
  10410.                                         if(razr==r32)valueexpected();
  10411.  
  10412.                                 case tk_bytevar:
  10413.  
  10414.                                 case tk_charvar:
  10415.  
  10416.                                 case tk_beg:
  10417.  
  10418. defadd:
  10419.  
  10420.                                         if(reg==AX){
  10421.  
  10422.                                                 getintoreg_32(ECX,razr,sign,&ofsstr);
  10423.  
  10424.                                                 doregmath_32(ECX,razr,sign,&ofsstr);
  10425.  
  10426.                                                 sign=CX;        //sign ¨á¯ ª ª ¯à®¬ ॣ¨áâà
  10427.  
  10428.                                         }
  10429.  
  10430.                                         else{
  10431.  
  10432.                                                 do_e_axmath(0,razr,&ofsstr);
  10433.  
  10434.                                                 sign=EAX;
  10435.  
  10436.                                         }
  10437.  
  10438.                                         warningreg(regs[razr/2-1][sign]);
  10439.  
  10440.                                         op66(razr);// OPT reg32,ECX
  10441.  
  10442.                                         op(0x01+vop);
  10443.  
  10444.                                         op(0xC0+reg+sign*8);
  10445.  
  10446.                                         next=0;
  10447.  
  10448.                                         break;
  10449.  
  10450.                                 default: valueexpected(); break;
  10451.  
  10452.                         }
  10453.  
  10454.                         break;
  10455.  
  10456.                 case tk_rrequals: vop+=0x08;
  10457.  
  10458.                 case tk_llequals:
  10459.  
  10460.                         ClearReg(reg);
  10461.  
  10462.                         getoperand(am32==TRUE?ECX:reg==BX?SI:BX);
  10463.  
  10464.                         CheckMinusNum();
  10465.  
  10466.                         if(tok==tk_number){
  10467.  
  10468.                                 ii=doconstlongmath();
  10469.  
  10470.                                 next=0;
  10471.  
  10472.                                 if(itok.type==tp_opperand){
  10473.  
  10474.                                         if(reg==ECX)regshifterror();
  10475.  
  10476.                                         op(0xB0+CL); op(ii);    //mov CL,num
  10477.  
  10478.                                         dobegmath(CL);
  10479.  
  10480.                                         warningreg(begs[1]);
  10481.  
  10482.                                         ConstToReg(ii,CL,r8);
  10483.  
  10484.                                         goto shiftcl;
  10485.  
  10486.                                 }
  10487.  
  10488.                                 if(ii==1){
  10489.  
  10490.                                         op66(razr);
  10491.  
  10492.                                         op(0xD1); op(0xE0+reg+vop);
  10493.  
  10494.                                 }  /* SHL reg,1 */
  10495.  
  10496.                                 else if(ii!=0){
  10497.  
  10498.                                         if(chip<2&&razr==r16){
  10499.  
  10500.                                                 op(0xB0+CL); op(ii);    //mov CL,num
  10501.  
  10502.                                                 warningreg(begs[1]);
  10503.  
  10504.                                                 ConstToReg(ii,CL,r8);
  10505.  
  10506.                                                 goto shiftcl;
  10507.  
  10508.                                         }
  10509.  
  10510.                                         else{
  10511.  
  10512.                                                 op66(razr);
  10513.  
  10514.                                                 op(0xC1); op(0xE0+reg+vop);     /* SHL reg,imm8 */
  10515.  
  10516.                                                 op(ii);
  10517.  
  10518.                                                 if(cpu<2)cpu=2;
  10519.  
  10520.                                         }
  10521.  
  10522.                                 }
  10523.  
  10524.                         }
  10525.  
  10526.                         else if(reg!=CX){
  10527.  
  10528.                                 if(!(itok2.type==tp_stopper&&(tok==tk_beg||tok==reg||tok==tk_reg32)&&itok.number==CL)){
  10529.  
  10530.                                         getintobeg(CL,&ofsstr);
  10531.  
  10532.                                         dobegmath(CL);
  10533.  
  10534.                                         warningreg(begs[1]);
  10535.  
  10536.                                         ClearReg(CL);
  10537.  
  10538.                                         next=0;
  10539.  
  10540.                                 }
  10541.  
  10542. shiftcl:
  10543.  
  10544.                                 op66(razr);
  10545.  
  10546.                                 op(0xD3); op(0xE0+vop+reg);     /* SHL AX,CL */
  10547.  
  10548.                         }
  10549.  
  10550.                         else regshifterror();
  10551.  
  10552.                         break;
  10553.  
  10554.                 case tk_multequals:
  10555.  
  10556.                         ClearReg(reg);
  10557.  
  10558.                         getoperand(reg==BX?SI:BX);
  10559.  
  10560.                         CheckMinusNum();
  10561.  
  10562.                         if(tok==tk_number){
  10563.  
  10564.                                 ii=doconstlongmath();
  10565.  
  10566.                                 next=0;
  10567.  
  10568.                                 if(itok.type==tp_opperand){
  10569.  
  10570.                                         if(reg==EAX)sign=ECX;
  10571.  
  10572.                                         MovRegNum(razr,postnumflag&f_reloc,ii,sign);
  10573.  
  10574.                                         if(sign==EAX)do_e_axmath2(0,razr,0);
  10575.  
  10576.                                         else doregmath_32(ECX,razr,0,&ofsstr);
  10577.  
  10578.                                         ConstToReg(ii,sign,razr);
  10579.  
  10580.                                         goto mulreg;
  10581.  
  10582.                                 }
  10583.  
  10584.                                 i=0;
  10585.  
  10586.                                 RegMulNum(reg,ii,razr,0,&i,itok.flag);
  10587.  
  10588.                         }
  10589.  
  10590.                         else{
  10591.  
  10592.                                 if(itok2.type==tp_stopper)next=(unsigned char)MulReg(reg,razr);
  10593.  
  10594.                                 else{
  10595.  
  10596.                                         if(reg==AX){
  10597.  
  10598.                                                 getintoreg_32(ECX,razr,sign,&ofsstr);
  10599.  
  10600.                                                 doregmath_32(ECX,razr,sign,&ofsstr);
  10601.  
  10602.                                                 sign=CX;        //sign ¨á¯ ª ª ¯à®¬ ॣ¨áâà
  10603.  
  10604.                                         }
  10605.  
  10606.                                         else{
  10607.  
  10608.                                                 do_e_axmath(0,razr,&ofsstr);
  10609.  
  10610.                                                 sign=EAX;
  10611.  
  10612.                                         }
  10613.  
  10614. mulreg:
  10615.  
  10616.                                         warningreg(regs[razr/2-1][sign]);
  10617.  
  10618.                                         ClearReg(sign);
  10619.  
  10620.                                         op66(razr);
  10621.  
  10622.                                         outword(0xAF0F);
  10623.  
  10624.                                         op(0xC0+reg*8+sign);
  10625.  
  10626.                                         next=0;
  10627.  
  10628.                                 }
  10629.  
  10630.                         }
  10631.  
  10632.                         break;
  10633.  
  10634.                 case tk_divequals:
  10635.  
  10636.                         getoperand(reg==BX?SI:BX);
  10637.  
  10638.                         ClearReg(reg);
  10639.  
  10640.                         CheckMinusNum();
  10641.  
  10642.                         if(tok==tk_number){
  10643.  
  10644.                                 ii=doconstlongmath();
  10645.  
  10646.                                 next=0;
  10647.  
  10648.                                 if(itok.type==tp_opperand){
  10649.  
  10650.                                         op66(razr);
  10651.  
  10652.                                         op(0x50+reg);   //push reg
  10653.  
  10654.                                         addESP+=razr==r16?2:4;
  10655.  
  10656.                                         MovRegNum(razr,postnumflag&f_reloc,ii,EAX);
  10657.  
  10658.                                         do_e_axmath2(0,razr,0);
  10659.  
  10660.                                         ClearReg(AX);
  10661.  
  10662.                                         goto divreg;
  10663.  
  10664.                                 }
  10665.  
  10666.                                 if((vop=caselong(ii))!=NUMNUM&&(!(reg==ECX&&chip<2))){
  10667.  
  10668.                                         if(vop!=0){
  10669.  
  10670.                                                 if(chip<2&&razr==r16){
  10671.  
  10672.                                                         op(0xB1); op(vop); /* MOV CL,num */
  10673.  
  10674.                                                         op(0xD3);
  10675.  
  10676.                                                         op(0xE8+reg); // SHR reg,CL
  10677.  
  10678.                                                         warningreg(begs[1]);
  10679.  
  10680.                                                         ClearReg(CX);
  10681.  
  10682.                                                 }
  10683.  
  10684.                                                 else{
  10685.  
  10686.                                                         op66(razr);
  10687.  
  10688.                                                         op(0xC1);
  10689.  
  10690.                                                         op(0xE8+reg); // SHR reg,num
  10691.  
  10692.                                                         op(vop);
  10693.  
  10694.                                                 }
  10695.  
  10696.                                         }
  10697.  
  10698.                                 }
  10699.  
  10700.                                 else{
  10701.  
  10702.                                         if(reg!=EAX){
  10703.  
  10704.                                                 op66(razr);
  10705.  
  10706.                                                 op(0x90+reg);   //xchg reg,AX
  10707.  
  10708.                                         }
  10709.  
  10710.                                         DivNum(ii,razr,0);
  10711.  
  10712.                                         if(reg!=EAX){
  10713.  
  10714.                                                 op66(razr);
  10715.  
  10716.                                                 op(0x90+reg);   //xchg reg,AX
  10717.  
  10718.                                                 warningreg(regs[razr/2-1][EAX]);
  10719.  
  10720.                                                 ClearReg(AX);
  10721.  
  10722.                                         }
  10723.  
  10724.                                 }
  10725.  
  10726.                         }
  10727.  
  10728.                         else if(itok2.type==tp_stopper){
  10729.  
  10730.                                 if(reg!=EAX){
  10731.  
  10732.                                         op66(razr);
  10733.  
  10734.                                         op(0x90+reg);   //xchg reg,AX
  10735.  
  10736.                                 }
  10737.  
  10738.                                 DivMod(0,0,razr,0);
  10739.  
  10740.                                 next=0;
  10741.  
  10742.                                 if(reg!=EAX){
  10743.  
  10744.                                         op66(razr);
  10745.  
  10746.                                         op(0x90+reg);   //xchg reg,AX
  10747.  
  10748.                                         warningreg(regs[razr/2-1][EAX]);
  10749.  
  10750.                                         ClearReg(AX);
  10751.  
  10752.                                 }
  10753.  
  10754.                         }
  10755.  
  10756.                         else{
  10757.  
  10758.                                 op66(razr);
  10759.  
  10760.                                 op(0x50+reg);   //push reg
  10761.  
  10762.                                 addESP+=razr==r16?2:4;
  10763.  
  10764.                                 do_e_axmath(0,razr,&ofsstr);
  10765.  
  10766. divreg:
  10767.  
  10768.                                 op66(razr);
  10769.  
  10770.                                 sign=reg;
  10771.  
  10772.                                 if(reg==EAX){
  10773.  
  10774.                                         sign=ECX;
  10775.  
  10776.                                         warningreg(regs[razr/2-1][ECX]);
  10777.  
  10778.                                         ClearReg(CX);
  10779.  
  10780.                                 }
  10781.  
  10782.                                 addESP-=razr==r16?2:4;
  10783.  
  10784.                                 op(0x58+sign);  //pop sign
  10785.  
  10786.                                 op66(razr);
  10787.  
  10788.                                 op(0x90+sign);  //xchg AX,sign
  10789.  
  10790.                                 op66(razr);
  10791.  
  10792.                                 op(0xF7);
  10793.  
  10794.                                 op(0xF0+sign); // DIV reg
  10795.  
  10796.                                 op66(razr);
  10797.  
  10798.                                 if(reg!=EAX){
  10799.  
  10800.                                         if(optimizespeed){
  10801.  
  10802.                                                 op(0x89);
  10803.  
  10804.                                                 op(0xC0+reg);   //mov reg,AX
  10805.  
  10806.                                         }
  10807.  
  10808.                                         else op(0x90+reg);      //xchg AX,sign
  10809.  
  10810.                                 }
  10811.  
  10812.                                 warningreg(regs[razr/2-1][EAX]);
  10813.  
  10814.                                 ClearReg(AX);
  10815.  
  10816.                                 next=0;
  10817.  
  10818.                         }
  10819.  
  10820.                         break;
  10821.  
  10822.                 default: operatorexpected(); break;
  10823.  
  10824.         }
  10825.  
  10826.         if(next)nexttok();
  10827.  
  10828.         if(terminater==tk_semicolon)seminext();
  10829.  
  10830.         if(razr==r32&&cpu<3)cpu=3;
  10831.  
  10832. //      puts("return doreg_32");
  10833.  
  10834.         return rettype;
  10835.  
  10836. }
  10837.  
  10838.  
  10839.  
  10840. int optnumadd(unsigned long num,int reg,int razr,int vop)
  10841.  
  10842. {
  10843.  
  10844. int nrazr=0;
  10845.  
  10846.         if(num==0){
  10847.  
  10848.                 if(vop==0x20){  //&=
  10849.  
  10850.                         ZeroReg(reg,razr);
  10851.  
  10852.                         setzeroflag=TRUE;
  10853.  
  10854.                 }
  10855.  
  10856.                 return TRUE;            //+= -= |= ^=
  10857.  
  10858.         }
  10859.  
  10860.         if(vop==8){     //|=
  10861.  
  10862.                 if(num<65536&&razr==r32)nrazr=razr=r16;
  10863.  
  10864.                 if((unsigned short)num<256&&razr==r16&&reg<4){
  10865.  
  10866.                         if(reg==AX)op(0x0C);
  10867.  
  10868.                         else{
  10869.  
  10870.                                 op(0x80);
  10871.  
  10872.                                 op(0xc8+reg);
  10873.  
  10874.                         }
  10875.  
  10876.                         op(num);
  10877.  
  10878.                         return TRUE;
  10879.  
  10880.                 }
  10881.  
  10882.                 if(nrazr==r16){
  10883.  
  10884.                         op66(r16);
  10885.  
  10886.                         if(reg==AX)op(0x0D);
  10887.  
  10888.                         else{
  10889.  
  10890.                                 op(0x81);
  10891.  
  10892.                                 op(0xc8+reg);
  10893.  
  10894.                         }
  10895.  
  10896.                         outword(num);
  10897.  
  10898.                         return TRUE;
  10899.  
  10900.                 }
  10901.  
  10902.         }
  10903.  
  10904.         if(num==1){
  10905.  
  10906.                 if(vop==0x28){  //-=
  10907.  
  10908.                         op66(razr);
  10909.  
  10910.                         op(0x48+reg);
  10911.  
  10912.                         setzeroflag=TRUE;
  10913.  
  10914.                         return TRUE;
  10915.  
  10916.                 }
  10917.  
  10918.                 if(vop==0){     //+=
  10919.  
  10920.                         op66(razr);
  10921.  
  10922.                         op(0x40+reg);
  10923.  
  10924.                         setzeroflag=TRUE;
  10925.  
  10926.                         return TRUE;
  10927.  
  10928.                 }
  10929.  
  10930.         }
  10931.  
  10932.         if(!optimizespeed&&num==2&&((razr==r16&&am32==FALSE)||(razr==r32&&am32))){
  10933.  
  10934.                 if(vop==0x28){  //-=
  10935.  
  10936.                         op(0x48+reg);
  10937.  
  10938.                         op(0x48+reg);
  10939.  
  10940.                         setzeroflag=TRUE;
  10941.  
  10942.                         return TRUE;
  10943.  
  10944.                 }
  10945.  
  10946.                 if(vop==0){     //+=
  10947.  
  10948.                         op66(razr);
  10949.  
  10950.                         op(0x40+reg);
  10951.  
  10952.                         op66(razr);
  10953.  
  10954.                         op(0x40+reg);
  10955.  
  10956.                         setzeroflag=TRUE;
  10957.  
  10958.                         return TRUE;
  10959.  
  10960.                 }
  10961.  
  10962.         }
  10963.  
  10964.         if((razr==r16&&(unsigned short)num==0xffff)||
  10965.  
  10966.                         (razr==r32&&num==0xffffffff)){
  10967.  
  10968.                 if(vop==0x28){  //-=
  10969.  
  10970.                         op66(razr);
  10971.  
  10972.                         op(0x40+reg);
  10973.  
  10974.                         setzeroflag=TRUE;
  10975.  
  10976.                         return TRUE;
  10977.  
  10978.                 }
  10979.  
  10980.                 if(vop==0){     //+=
  10981.  
  10982.                         op66(razr);
  10983.  
  10984.                         op(0x48+reg);
  10985.  
  10986.                         setzeroflag=TRUE;
  10987.  
  10988.                         return TRUE;
  10989.  
  10990.                 }
  10991.  
  10992.                 if(vop==0x20)return TRUE;       //&=
  10993.  
  10994.                 if(vop==0x30){  //^=
  10995.  
  10996.                         if(optimizespeed&&(chip==5||chip==6))return FALSE;
  10997.  
  10998.                         op66(razr);
  10999.  
  11000.                         op(0xF7);
  11001.  
  11002.                         op(0xD0+reg);   //Not reg
  11003.  
  11004.                         setzeroflag=FALSE;
  11005.  
  11006.                         return TRUE;
  11007.  
  11008.                 }
  11009.  
  11010.         }
  11011.  
  11012.         if(vop==0x20){  //&=
  11013.  
  11014.                 if(num>=0xFFFF0000&&razr==r32)nrazr=razr=r16;
  11015.  
  11016.                 if(razr==r16&&(unsigned short)num>=0xFF00&&reg<4){
  11017.  
  11018.                         if(reg==AL)op(0x24);
  11019.  
  11020.                         else{
  11021.  
  11022.                                 op(128);
  11023.  
  11024.                                 op(0xE0+reg);
  11025.  
  11026.                         }
  11027.  
  11028.                         op(num);
  11029.  
  11030.                         return TRUE;
  11031.  
  11032.                 }
  11033.  
  11034.                 if(nrazr==r16){
  11035.  
  11036.                         op66(r16);
  11037.  
  11038.                         if(reg==AX)op(0x25);
  11039.  
  11040.                         else{
  11041.  
  11042.                                 op(129);
  11043.  
  11044.                                 op(0xE0+reg);
  11045.  
  11046.                         }
  11047.  
  11048.                         outword(num);
  11049.  
  11050.                         return TRUE;
  11051.  
  11052.                 }
  11053.  
  11054.         }
  11055.  
  11056.         if(!optimizespeed&&(razr==r16&&(unsigned short)num==0xfffe&&am32==FALSE)||
  11057.  
  11058.                         (razr==r32&&num==0xfffffffe&&am32)){
  11059.  
  11060.                 if(vop==0x28){  //-=
  11061.  
  11062.                         op(0x40+reg);
  11063.  
  11064.                         op(0x40+reg);
  11065.  
  11066.                         setzeroflag=TRUE;
  11067.  
  11068.                         return TRUE;
  11069.  
  11070.                 }
  11071.  
  11072.                 if(vop==0){     //+=
  11073.  
  11074.                         op(0x48+reg);
  11075.  
  11076.                         op(0x48+reg);
  11077.  
  11078.                         setzeroflag=TRUE;
  11079.  
  11080.                         return TRUE;
  11081.  
  11082.                 }
  11083.  
  11084.         }
  11085.  
  11086.         if(short_ok(num,razr/2-1)){
  11087.  
  11088.                 op66(razr);
  11089.  
  11090.                 op(0x83);
  11091.  
  11092.                 op(0xC0+vop+reg);
  11093.  
  11094.                 op(num);
  11095.  
  11096.                 setzeroflag=TRUE;
  11097.  
  11098.                 return TRUE;
  11099.  
  11100.         }
  11101.  
  11102.         return FALSE;
  11103.  
  11104. }
  11105.  
  11106.  
  11107.  
  11108. int dobeg(int beg,int terminater)
  11109.  
  11110. {
  11111.  
  11112. unsigned char next=1;
  11113.  
  11114. int vop=0,i=0,sign=0;
  11115.  
  11116. int rettype=tk_beg,pointr=0;;
  11117.  
  11118. int rrettype=tk_byte;
  11119.  
  11120. int numpointr=0;
  11121.  
  11122. char *ofsstr=NULL;
  11123.  
  11124.         nexttok();
  11125.  
  11126.         switch(tok){
  11127.  
  11128.                 case tk_assign:
  11129.  
  11130.                         if(!((tok2==tk_reg||tok2==tk_reg32||tok2==tk_beg)&&ScanTok3()==terminater)){
  11131.  
  11132.                                 ofsstr=GetLecsem(terminater);
  11133.  
  11134.                         }
  11135.  
  11136.                         else{
  11137.  
  11138.                                 nexttok();
  11139.  
  11140.                                 if(RegToReg(beg,itok.number,r8)==NOINREG)goto nn1;
  11141.  
  11142.                                 waralreadinitreg(begs[itok.number],begs[beg]);
  11143.  
  11144.                                 break;
  11145.  
  11146.                         }
  11147.  
  11148.                         if(ofsstr){
  11149.  
  11150.                                 int retreg;
  11151.  
  11152.                                 if((retreg=CheckIDZReg(ofsstr,beg,r8))!=NOINREG){
  11153.  
  11154.                                         GetEndLex(terminater);
  11155.  
  11156.                                         tok=tk_beg;
  11157.  
  11158.                                         itok.number=retreg==SKIPREG?beg:retreg;
  11159.  
  11160.                                         goto nn1;
  11161.  
  11162.                                 }
  11163.  
  11164.                         }
  11165.  
  11166.                         nexttok();
  11167.  
  11168.                         convert_type(&sign,&rrettype,&pointr,am32==TRUE?(beg>3?beg-4:beg):BX);
  11169.  
  11170.                         while(tok==tk_mult){
  11171.  
  11172.                                 nexttok();
  11173.  
  11174.                                 numpointr++;
  11175.  
  11176.                         }
  11177.  
  11178.                         if(numpointr>itok.npointr)unuseableinput();
  11179.  
  11180.                         if(tok2==tk_assign){
  11181.  
  11182.                                 int hnumber=MultiAssign(r8,(beg>3?beg-4:beg),numpointr);
  11183.  
  11184.                                 if(ofsstr){
  11185.  
  11186.                                         free(ofsstr);
  11187.  
  11188.                                         ofsstr=NULL;
  11189.  
  11190.                                 }
  11191.  
  11192.                                 if(beg!=hnumber){
  11193.  
  11194.                                         op(0x88);
  11195.  
  11196.                                         op(0xC0+beg+hnumber*8); //mov beg,AL
  11197.  
  11198.                                 }
  11199.  
  11200.                                 next=0;
  11201.  
  11202.                                 if(ofsstr){
  11203.  
  11204.                                         IDZToReg(ofsstr,beg,r8);
  11205.  
  11206.                                         free(ofsstr);
  11207.  
  11208.                                 }
  11209.  
  11210.                                 break;
  11211.  
  11212.                         }
  11213.  
  11214.                         if(tok==tk_pointer)cpointr(am32==TRUE?(beg>3?beg-4:beg):BX,numpointr);
  11215.  
  11216. nn1:
  11217.  
  11218.                         if(beg==AL){
  11219.  
  11220.                                 if(rrettype==tk_char||rrettype==tk_byte)rettype=doalmath(sign,&ofsstr);
  11221.  
  11222.                                 else if(rrettype==tk_int||rrettype==tk_word)rettype=do_e_axmath(sign,r16,&ofsstr);
  11223.  
  11224.                                 else rettype=do_e_axmath(sign,r32,&ofsstr);
  11225.  
  11226.                                 next=0;
  11227.  
  11228.                         }
  11229.  
  11230.                         else{
  11231.  
  11232.                                 if(rrettype==tk_char||rrettype==tk_byte||beg>BL){
  11233.  
  11234.                                         rettype=getintobeg(beg,&ofsstr);
  11235.  
  11236.                                         if(itok.type!=tp_stopper&&tok!=tk_eof){
  11237.  
  11238.                                                 dobegmath(beg);
  11239.  
  11240.                                                 rettype=tk_beg;
  11241.  
  11242.                                         }
  11243.  
  11244.                                 }
  11245.  
  11246.                                 else{
  11247.  
  11248.                                         if(rrettype==tk_int||rrettype==tk_word)next=r16;
  11249.  
  11250.                                         else next=r32;
  11251.  
  11252.                                         rettype=getintoreg(beg,next,sign,&ofsstr);
  11253.  
  11254.                                 }
  11255.  
  11256.                                 next=0;
  11257.  
  11258.                         }
  11259.  
  11260.                         if(ofsstr){
  11261.  
  11262.                                 IDZToReg(ofsstr,beg,r8);
  11263.  
  11264.                                 free(ofsstr);
  11265.  
  11266.                         }
  11267.  
  11268.                         break;
  11269.  
  11270.                 case tk_plusplus: op(0xFE); op(0xC0+beg);
  11271.  
  11272.                         ClearReg(beg>3?beg%4:beg);
  11273.  
  11274.                         break;
  11275.  
  11276.                 case tk_minusminus: op(0xFE); op(0xC8+beg);
  11277.  
  11278.                         ClearReg(beg>3?beg%4:beg);
  11279.  
  11280.                         break;
  11281.  
  11282.                 case tk_swap:
  11283.  
  11284.                         getoperand(beg==BL||beg==BH?SI:BX);
  11285.  
  11286.                         switch(tok){
  11287.  
  11288.                                 case tk_charvar:
  11289.  
  11290.                                 case tk_bytevar:
  11291.  
  11292.                                         CheckAllMassiv(bufrm,1,&strinf);
  11293.  
  11294.                                   outseg(&itok,2);
  11295.  
  11296.                                         op(0x86);
  11297.  
  11298.                                         op(beg*8+itok.rm);
  11299.  
  11300.                                         outaddress(&itok);
  11301.  
  11302.                                         KillVar(itok.name);
  11303.  
  11304.                                         ClearReg(beg>3?beg-4:beg);
  11305.  
  11306.                                         break;
  11307.  
  11308.                                 case tk_beg:
  11309.  
  11310.                                         if(beg!=(int)itok.number){
  11311.  
  11312.                                                 if(RegSwapReg(beg,itok.number,r8)==NOINREG){
  11313.  
  11314.                                                         op(0x86);
  11315.  
  11316.                                                         op(0xC0+(unsigned int)itok.number+beg*8);
  11317.  
  11318.                                                 }
  11319.  
  11320.                                                 else waralreadinitreg(begs[beg],begs[itok.number]);
  11321.  
  11322.                                         }
  11323.  
  11324.                                         break;
  11325.  
  11326.                                 default: swaperror(); break;
  11327.  
  11328.                         }
  11329.  
  11330.                         break;
  11331.  
  11332.                 case tk_xorequals: vop+=0x08;
  11333.  
  11334.                 case tk_minusequals: vop+=0x08;
  11335.  
  11336.                 case tk_andequals: vop+=0x18;
  11337.  
  11338.                 case tk_orequals: vop+=0x08;
  11339.  
  11340.                 case tk_plusequals:
  11341.  
  11342.                         ClearReg(beg>3?beg%4:beg);
  11343.  
  11344.                         if(CheckAddOnly()){
  11345.  
  11346.                                 inptr2--;
  11347.  
  11348.                                 cha2=' ';
  11349.  
  11350.                                 if(tok==tk_plusequals)tok=tk_plus;
  11351.  
  11352.                                 else tok=tk_minus;
  11353.  
  11354.                                 if(beg==AL)doalmath2(0);
  11355.  
  11356.                                 else dobegmath(beg);
  11357.  
  11358.                                 next=0;
  11359.  
  11360.                                 break;
  11361.  
  11362.                         }
  11363.  
  11364.                         getoperand(beg==BL||beg==BH?SI:BX);
  11365.  
  11366.                         if(itok2.type==tp_opperand&&tok!=tk_number){
  11367.  
  11368.                                 if(beg==AL){
  11369.  
  11370.                                         getintobeg(CL,&ofsstr);
  11371.  
  11372.                                         dobegmath(CL);
  11373.  
  11374.                                         sign=CL;        //sign ¨á¯ ª ª ¯à®¬ ॣ¨áâà
  11375.  
  11376.                                 }
  11377.  
  11378.                                 else{
  11379.  
  11380.                                         doalmath(0,&ofsstr);
  11381.  
  11382.                                         sign=EAX;
  11383.  
  11384.                                 }
  11385.  
  11386.                                 warningreg(begs[sign]);
  11387.  
  11388.                                 op(0x00+vop);
  11389.  
  11390.                                 op(0xC0+beg+sign*8);
  11391.  
  11392.                                 next=0;
  11393.  
  11394.                                 break;
  11395.  
  11396.                         }
  11397.  
  11398.                         switch(tok){
  11399.  
  11400.                                 case tk_number:
  11401.  
  11402.                                         i=doconstlongmath();
  11403.  
  11404.                                         next=0;
  11405.  
  11406.                                         if(i==0&&(vop==0||vop==0x28||vop==8))break;
  11407.  
  11408.                                         if(i==255&&vop==0x20)break;
  11409.  
  11410.                                         if(beg==AL)op(0x04+vop);
  11411.  
  11412.                                         else{
  11413.  
  11414.                                                 op(0x80);
  11415.  
  11416.                                                 op(0xC0+vop+beg);
  11417.  
  11418.                                         }
  11419.  
  11420.                                         op(i);
  11421.  
  11422.                                         break;
  11423.  
  11424.                                 case tk_qwordvar:
  11425.  
  11426.                                         i+=4;
  11427.  
  11428.                                 case tk_longvar:
  11429.  
  11430.                                 case tk_dwordvar:
  11431.  
  11432.                                         i+=2;
  11433.  
  11434.                                 case tk_wordvar:
  11435.  
  11436.                                 case tk_intvar:
  11437.  
  11438.                                         i++;
  11439.  
  11440.                                 case tk_charvar:
  11441.  
  11442.                                 case tk_bytevar:
  11443.  
  11444.                                         i++;
  11445.  
  11446.                                         CheckAllMassiv(bufrm,i,&strinf);
  11447.  
  11448.                                         outseg(&itok,2);
  11449.  
  11450.                                         op(0x02+vop);
  11451.  
  11452.                                         op(beg*8+itok.rm);
  11453.  
  11454.                                         outaddress(&itok);
  11455.  
  11456.                                         break;
  11457.  
  11458.                                 case tk_beg:
  11459.  
  11460.                                         op(0x00+vop);
  11461.  
  11462.                                         op(0xC0+beg+(unsigned int)itok.number*8);
  11463.  
  11464.                                         break;
  11465.  
  11466.                                 case tk_proc:
  11467.  
  11468.                                 case tk_apiproc:
  11469.  
  11470.                                 case tk_undefproc:
  11471.  
  11472.                                 case tk_declare:
  11473.  
  11474.                                 case tk_ID:
  11475.  
  11476.                                 case tk_id:
  11477.  
  11478.                                         op66(r16);
  11479.  
  11480.                                         i=beg<4?beg:beg-4;
  11481.  
  11482.                                         op(0x50+i);
  11483.  
  11484.                                         addESP+=2;
  11485.  
  11486.                                         warningreg(regs[0][i]);
  11487.  
  11488.                                         procdo(tk_byte);
  11489.  
  11490.                                         if(itok2.type==tp_opperand){
  11491.  
  11492.                                                 nexttok();
  11493.  
  11494.                                                 doalmath2(0);
  11495.  
  11496.                                                 next=0;
  11497.  
  11498.                                         }
  11499.  
  11500.                                         addESP-=2;
  11501.  
  11502.                                         op66(r16);
  11503.  
  11504.                                         op(0x58+(i!=AX?i:CX));
  11505.  
  11506.                                         if(i!=AX){
  11507.  
  11508.                                                 op(0x00+vop);
  11509.  
  11510.                                                 op(0xc0+beg);
  11511.  
  11512.                                         }
  11513.  
  11514.                                         else{
  11515.  
  11516.                                                 if(vop>0x20){
  11517.  
  11518.                                                         op(0x86);
  11519.  
  11520.                                                         op(0xC0+CL+beg);        //xchg al,cl
  11521.  
  11522.                                                 }
  11523.  
  11524.                                                 op(0x00+vop);
  11525.  
  11526.                                                 op(0xc0+CL*8+beg);
  11527.  
  11528.                                         }
  11529.  
  11530.                                         break;
  11531.  
  11532.                                 case tk_reg:
  11533.  
  11534.                                         if((unsigned int)itok.number<BX){
  11535.  
  11536.                                                 op(0x00+vop);
  11537.  
  11538.                                                 op(0xC0+beg+(unsigned int)itok.number*8);
  11539.  
  11540.                                         }
  11541.  
  11542.                                         else begworderror();
  11543.  
  11544.                                         break;
  11545.  
  11546.                                 case tk_seg: begworderror(); break;
  11547.  
  11548.                                 default: valueexpected();       break;
  11549.  
  11550.                         }
  11551.  
  11552.                         break;
  11553.  
  11554.                 case tk_rrequals: vop+=0x08;
  11555.  
  11556.                 case tk_llequals:
  11557.  
  11558.                         getoperand(am32==TRUE?ECX:BX);
  11559.  
  11560.                         ClearReg(beg>3?beg%4:beg);
  11561.  
  11562.                         if(itok2.type==tp_stopper&&tok==tk_number){
  11563.  
  11564.                                 if((unsigned int)itok.number==1){
  11565.  
  11566.                                         op(0xD0);       op(0xE0+beg+vop);
  11567.  
  11568.                                 }       /* SHL beg,1 */
  11569.  
  11570.                                 else if((unsigned int)itok.number!=0){
  11571.  
  11572.                                         if(chip<2)goto shiftbeg;
  11573.  
  11574.                                         else{
  11575.  
  11576.                                                 op(0xc0);
  11577.  
  11578.                                                 op(0xe0+beg+vop);
  11579.  
  11580.                                                 op((unsigned int)itok.number);
  11581.  
  11582.                                         }
  11583.  
  11584.                                 }
  11585.  
  11586.                         }
  11587.  
  11588.                         else{
  11589.  
  11590. shiftbeg:
  11591.  
  11592.                                 if(beg!=CL){
  11593.  
  11594.                                         if(itok2.type==tp_stopper&&tok==tk_beg&&itok.number==CL){
  11595.  
  11596.                                                 op(0xD2); op(0xE0+vop+beg);     /* SHL beg,CL */
  11597.  
  11598.                                         }
  11599.  
  11600.                                         else{
  11601.  
  11602.                                                 ClearReg(CL);
  11603.  
  11604.                                                 getintobeg(CL,&ofsstr);
  11605.  
  11606.                                                 dobegmath(CL);
  11607.  
  11608.                                                 next=0;
  11609.  
  11610.                                                 warningreg(begs[1]);
  11611.  
  11612.                                                 op(0xD2); op(0xE0+vop+beg);     /* SHL beg,CL */
  11613.  
  11614.                                         }
  11615.  
  11616.                                 }
  11617.  
  11618.                                 else regshifterror();
  11619.  
  11620.                         }
  11621.  
  11622.                         break;
  11623.  
  11624.                 default: operatorexpected(); break;
  11625.  
  11626.         }
  11627.  
  11628.         if(next)nexttok();
  11629.  
  11630.         if(terminater==tk_semicolon)seminext();
  11631.  
  11632.         return rettype;
  11633.  
  11634. }
  11635.  
  11636.  
  11637.  
  11638. void doseg(int seg)
  11639.  
  11640. {
  11641.  
  11642. unsigned char next=1;
  11643.  
  11644. int numpointr=0;
  11645.  
  11646. char *ofsstr=NULL;
  11647.  
  11648.         if(seg==CS)preerror("CS not used for destention");
  11649.  
  11650.         if(seg==FS||seg==GS)if(cpu<3)cpu=3;
  11651.  
  11652.         if(seg==SS)RestoreStack();
  11653.  
  11654.         nexttok();
  11655.  
  11656.         KillVar(segs[seg]);
  11657.  
  11658.         if(tok==tk_assign){
  11659.  
  11660.                 nexttok();
  11661.  
  11662.                 while(tok==tk_mult){
  11663.  
  11664.                         nexttok();
  11665.  
  11666.                         numpointr++;
  11667.  
  11668.                 }
  11669.  
  11670.                 if(numpointr>itok.npointr)unuseableinput();
  11671.  
  11672.                 if(tok2==tk_assign){
  11673.  
  11674.                         itok.number=MultiAssign(r16,USEALLREG,numpointr);
  11675.  
  11676.                         if(ofsstr){
  11677.  
  11678.                                 free(ofsstr);
  11679.  
  11680.                                 ofsstr=NULL;
  11681.  
  11682.                         }
  11683.  
  11684.                         goto getfromreg;
  11685.  
  11686.                 }
  11687.  
  11688.                 if(tok==tk_pointer)cpointr(am32==TRUE?EAX:BX,numpointr);
  11689.  
  11690.                 if(itok2.type!=tp_opperand){
  11691.  
  11692.                         switch(tok){
  11693.  
  11694.                                 case tk_reg:
  11695.  
  11696. getfromreg:
  11697.  
  11698.                                         op(0x8E);
  11699.  
  11700.                                         op(0xC0+seg*8+(unsigned int)itok.number);       /* MOV seg,reg */
  11701.  
  11702.                                         break;
  11703.  
  11704.                                 case tk_intvar:
  11705.  
  11706.                                 case tk_wordvar:
  11707.  
  11708.                                 case tk_longvar:
  11709.  
  11710.                                 case tk_dwordvar:
  11711.  
  11712.                                 case tk_qwordvar:
  11713.  
  11714.                                         CheckAllMassiv(bufrm,2,&strinf);
  11715.  
  11716.                                         op66(r16);
  11717.  
  11718.                                         outseg(&itok,2);
  11719.  
  11720.                                         op(0x8E);
  11721.  
  11722.                                         op(seg*8+itok.rm);
  11723.  
  11724.                                         outaddress(&itok);       /* MOV seg,[wordvar] */
  11725.  
  11726.                                         break;
  11727.  
  11728.                                 case tk_seg:
  11729.  
  11730.                                         if(optimizespeed==FALSE||(regoverstack&&chip>2)){
  11731.  
  11732.                                                 PushSeg((unsigned int)itok.number);
  11733.  
  11734.                                                 PopSeg(seg);
  11735.  
  11736.                                                 break;
  11737.  
  11738.                                         }
  11739.  
  11740.                                         goto segax;
  11741.  
  11742.                                 case tk_number:
  11743.  
  11744.                                         if(regoverstack&&chip>1){
  11745.  
  11746. //                                              op66(r16);
  11747.  
  11748.                                                 if(short_ok(itok.number)&&(itok.flag&f_reloc)==0){
  11749.  
  11750.                                                         op(0x6A);
  11751.  
  11752.                                                         op(itok.number);
  11753.  
  11754.                                                 }
  11755.  
  11756.                                                 else{
  11757.  
  11758.                                                         op(0x68);
  11759.  
  11760.                                                         if((itok.flag&f_reloc)!=0)AddReloc();
  11761.  
  11762.                                                         if(am32)outdword(itok.number);
  11763.  
  11764.                                                         else outword(itok.number);
  11765.  
  11766.                                                 }
  11767.  
  11768.                                                 PopSeg(seg);
  11769.  
  11770.                                                 if(cpu<2)cpu=2;
  11771.  
  11772.                                                 break;
  11773.  
  11774.                                         }
  11775.  
  11776.                                         goto segax;
  11777.  
  11778.                                 default: goto segax;
  11779.  
  11780.                         }
  11781.  
  11782.                 }
  11783.  
  11784.                 else{
  11785.  
  11786. segax:
  11787.  
  11788.                         do_e_axmath(0,r16,&ofsstr);
  11789.  
  11790.                         op(0x8E);       /* MOV SEG,AX */
  11791.  
  11792.                         op(0xC0+seg*8);
  11793.  
  11794.                         next=0;
  11795.  
  11796.                 }
  11797.  
  11798.         }
  11799.  
  11800.         else if(tok==tk_swap){
  11801.  
  11802.                 getoperand();
  11803.  
  11804.                 switch(tok){
  11805.  
  11806.                         case tk_intvar:
  11807.  
  11808.                         case tk_wordvar:
  11809.  
  11810.                                 KillVar(itok.name);
  11811.  
  11812.                                 op66(r16);
  11813.  
  11814.                                 op(0x8C);
  11815.  
  11816.                                 op(0xC0+seg*8); /* MOV AX,SEG */
  11817.  
  11818.                                 CheckAllMassiv(bufrm,2,&strinf);
  11819.  
  11820.                                 op66(r16);
  11821.  
  11822.                                 outseg(&itok,2);
  11823.  
  11824.                                 op(0x87);
  11825.  
  11826.                                 op(itok.rm);
  11827.  
  11828.                                 outaddress(&itok);      /* XCHG AX,[word] */
  11829.  
  11830.                                 op66(r16);
  11831.  
  11832.                                 op(0x8E);
  11833.  
  11834.                                 op(0xC0+seg*8); /* MOV seg,AX */
  11835.  
  11836.                                 break;
  11837.  
  11838.                         case tk_seg:
  11839.  
  11840.                                 KillVar(segs[itok.number]);
  11841.  
  11842.                                 PushSeg(seg);
  11843.  
  11844.                                 PushSeg(itok.number);
  11845.  
  11846.                                 PopSeg(seg);
  11847.  
  11848.                                 PopSeg(itok.number);
  11849.  
  11850.                                 break;
  11851.  
  11852.                         default: preerror("Only int, word variables valid for segment register ><");
  11853.  
  11854.                                 break;
  11855.  
  11856.                 }
  11857.  
  11858.         }
  11859.  
  11860.         else segoperror();
  11861.  
  11862.         if(next)nextseminext();
  11863.  
  11864.         else seminext();
  11865.  
  11866. }
  11867.  
  11868.  
  11869.  
  11870. void PushSeg(int seg)
  11871.  
  11872. {
  11873.  
  11874.         switch(seg){
  11875.  
  11876.                 case DS: op(0x1E); break;
  11877.  
  11878.                 case CS: op(0x0E); break;
  11879.  
  11880.                 case SS: op(0x16); break;
  11881.  
  11882.                 case ES: op(0x06); break;
  11883.  
  11884.                 case FS: outword(0xA00F); if(cpu<3)cpu=3; break;
  11885.  
  11886.                 case GS: outword(0xA80F); if(cpu<3)cpu=3; break;
  11887.  
  11888.         }
  11889.  
  11890. }
  11891.  
  11892.  
  11893.  
  11894. void PopSeg(int seg)
  11895.  
  11896. {
  11897.  
  11898.         switch(seg){
  11899.  
  11900.                 case DS: op(0x1F); break;
  11901.  
  11902.                 case SS: op(0x17); break;
  11903.  
  11904.                 case ES: op(0x07); break;
  11905.  
  11906.                 case FS: outword(0xA10F); if(cpu<3)cpu=3;  break;
  11907.  
  11908.                 case GS: outword(0xA90F); if(cpu<3)cpu=3;  break;
  11909.  
  11910.         }
  11911.  
  11912. }
  11913.  
  11914.  
  11915.  
  11916. // =============== doregmath_32(), dobegmath() ===============
  11917.  
  11918.  
  11919.  
  11920. void doregmath_32(int reg,int razr,int sign,char **ofsstr,int fdiv)  // math done is on all regs except AX
  11921.  
  11922. // all other registers preserved
  11923.  
  11924. {
  11925.  
  11926. int vop,i,optnum,negflag=FALSE;
  11927.  
  11928.         while(itok.type!=tp_stopper&&tok!=tk_eof){
  11929.  
  11930.                 if(negflag){
  11931.  
  11932.                         NegReg(razr,reg);
  11933.  
  11934.                         negflag=FALSE;
  11935.  
  11936.                 }
  11937.  
  11938.                 i=vop=0;
  11939.  
  11940.                 optnum=FALSE;
  11941.  
  11942. #ifdef OPTVARCONST
  11943.  
  11944.                 CheckConstVar3(&tok2,&itok2,razr);
  11945.  
  11946.                 if(tok2==tk_number)calcnumber=TRUE;
  11947.  
  11948. #endif
  11949.  
  11950.                 if(uselea){
  11951.  
  11952.                         if(razr==r32){
  11953.  
  11954.                                 if(Reg32ToLea2(reg))continue;   //®¯â¨¬¨§ æ¨ï á«®¦¥­¨ï 32-¡¨â­ëå ॣ¨áâ஢ ¢ LEA
  11955.  
  11956.                         }
  11957.  
  11958.                         else if(Reg16ToLea2(reg))continue;
  11959.  
  11960.                         if(itok.type==tp_stopper||tok==tk_eof)break;
  11961.  
  11962.                 }
  11963.  
  11964.                 if(tok2==tk_number)optnum=OptimNum();
  11965.  
  11966.                 switch(tok){
  11967.  
  11968.                         case tk_xor: vop+=0x08;
  11969.  
  11970.                         case tk_minus: vop+=0x08;
  11971.  
  11972.                         case tk_and: vop+=0x18;
  11973.  
  11974.                         case tk_or: vop+=0x08;
  11975.  
  11976.                         case tk_plus:
  11977.  
  11978.                           if(optnum==FALSE)getoperand(reg==BX?SI:BX);
  11979.  
  11980.                                 else tok=tk_number;
  11981.  
  11982.                                 switch(tok){
  11983.  
  11984.                                         case tk_number:
  11985.  
  11986.                                                 if((itok.flag&f_reloc)==0&&optnumadd(itok.number,reg,razr,vop))break;
  11987.  
  11988.                                         case tk_postnumber:
  11989.  
  11990.                                         case tk_undefofs:
  11991.  
  11992.                                                 op66(razr);
  11993.  
  11994.                                           op(0x81);
  11995.  
  11996.                                                 op(0xC0+vop+reg);
  11997.  
  11998.                                                 if(tok==tk_postnumber)(itok.flag&f_extern)==0?setwordpost(&itok):setwordext(&itok.number);
  11999.  
  12000.                                                 else if(tok==tk_undefofs)AddUndefOff(0,itok.name);
  12001.  
  12002.                                                 else if((itok.flag&f_reloc)!=0)AddReloc();
  12003.  
  12004.                                                 razr==r16?outword((unsigned int)itok.number):outdword(itok.number);
  12005.  
  12006.                                                 break;
  12007.  
  12008.                                         case tk_apioffset:
  12009.  
  12010.                                                 op66(razr);
  12011.  
  12012.                                           op(0x81);
  12013.  
  12014.                                                 op(0xC0+vop+reg);
  12015.  
  12016.                                                 AddApiToPost(itok.number);
  12017.  
  12018.                                                 break;
  12019.  
  12020.                                         case tk_doublevar:
  12021.  
  12022.                                                 i=4;
  12023.  
  12024.                                         case tk_floatvar:
  12025.  
  12026.                                                 Float2reg32(EAX,i);
  12027.  
  12028.                                                 itok.number=EAX;
  12029.  
  12030.                                                 warningreg(regs[1][EAX]);
  12031.  
  12032.                                                 goto defreg32;
  12033.  
  12034.                                         case tk_bits:
  12035.  
  12036.                                                 int vops,reg2s;
  12037.  
  12038.                                                 i=itok.bit.siz+itok.bit.ofs;
  12039.  
  12040.                                                 if(i<=64)vops=r64;
  12041.  
  12042.                                                 if(i<=32)vops=r32;
  12043.  
  12044.                                                 if(i<=16)vops=r16;
  12045.  
  12046.                                                 if(vops<razr)vops=razr;
  12047.  
  12048.                                                 reg2s=CX;
  12049.  
  12050.                                                 if(reg==CX)reg2s=DI;
  12051.  
  12052.                                                 bits2reg(reg2s,vops);
  12053.  
  12054.                                                 if(vops==r64)vops=r32;
  12055.  
  12056.                                                 warningreg(regs[vops/2-1][reg2s]);
  12057.  
  12058.                                                 itok.number=reg2s;
  12059.  
  12060.                                                 goto defreg32;
  12061.  
  12062.                                         case tk_reg:
  12063.  
  12064.                                                 if(razr==r32){
  12065.  
  12066.                                                         op66(razr);
  12067.  
  12068.                                                         outword(0xB70F);
  12069.  
  12070.                                                         if(itok.number==reg){
  12071.  
  12072.                                                                 op(0xC0+reg);
  12073.  
  12074.                                                                 itok.number=EAX;
  12075.  
  12076.                                                         }
  12077.  
  12078.                                                         else op(0xC0+itok.number*9);
  12079.  
  12080.                                                         warningreg(regs[razr/2-1][itok.number]);
  12081.  
  12082.                                                 }
  12083.  
  12084.                                         case tk_reg32:
  12085.  
  12086. defreg32:
  12087.  
  12088.                                                 op66(razr);
  12089.  
  12090.                                                 op(0x01+vop);
  12091.  
  12092.                                                 op(0xC0+reg+(unsigned int)itok.number*8);
  12093.  
  12094.                                                 break;
  12095.  
  12096.                                         case tk_qwordvar:
  12097.  
  12098.                                         case tk_longvar:
  12099.  
  12100.                                         case tk_dwordvar:
  12101.  
  12102.                                                 i=4;
  12103.  
  12104.                                                 goto wordvar;
  12105.  
  12106.                                         case tk_intvar:
  12107.  
  12108.                                         case tk_wordvar:
  12109.  
  12110.                                                 if(razr==r32)goto addchar;
  12111.  
  12112.                                                 i=2;
  12113.  
  12114. wordvar:
  12115.  
  12116.                                                 CheckAllMassiv(bufrm,i,&strinf);
  12117.  
  12118.                                                 op66(razr);
  12119.  
  12120.                                                 outseg(&itok,2);
  12121.  
  12122.                                                 op(0x03+vop);
  12123.  
  12124.                                                 op(reg*8+itok.rm);
  12125.  
  12126.                                                 outaddress(&itok);
  12127.  
  12128.                                                 break;
  12129.  
  12130.                                         case tk_charvar:
  12131.  
  12132.                                         case tk_beg:
  12133.  
  12134.                                         case tk_bytevar:
  12135.  
  12136.                                         case tk_seg:
  12137.  
  12138.                                         case tk_rmnumber:
  12139.  
  12140. addchar:
  12141.  
  12142.                                                 SINFO wstr;
  12143.  
  12144.                                                 ITOK wtok;
  12145.  
  12146.                                                 char *wbuf;
  12147.  
  12148.                                                 wstr=strinf;
  12149.  
  12150.                                                 strinf.bufstr=NULL;
  12151.  
  12152.                                                 wbuf=bufrm;
  12153.  
  12154.                                                 bufrm=NULL;
  12155.  
  12156.                                                 wtok=itok;
  12157.  
  12158.                                                 getinto_e_ax(sign,tok,&wtok,wbuf,&wstr,razr);
  12159.  
  12160.                                                 goto addax;
  12161.  
  12162.                                         case tk_ID:
  12163.  
  12164.                                         case tk_id:
  12165.  
  12166.                                         case tk_proc:
  12167.  
  12168.                                         case tk_apiproc:
  12169.  
  12170.                                         case tk_undefproc:
  12171.  
  12172.                                         case tk_declare:
  12173.  
  12174. unsigned char oaddstack;
  12175.  
  12176.                                                 if(!(comfile==file_w32&&(reg==EBX||reg==EDI||reg==ESI))){
  12177.  
  12178.                                                         op66(razr);
  12179.  
  12180.                                                         op(0x50+reg);   //push AX
  12181.  
  12182.                                                 }
  12183.  
  12184.                                                 addESP+=razr==r16?2:4;
  12185.  
  12186.                                                 oaddstack=addstack;
  12187.  
  12188.                                                 addstack=FALSE;
  12189.  
  12190.                                                 procdo(razr==r16?(sign==0?tk_word:tk_int):(sign==0?tk_dword:tk_long));
  12191.  
  12192.                                                 addstack=oaddstack;
  12193.  
  12194.                                                 addESP-=razr==r16?2:4;
  12195.  
  12196.                                                 if(!(comfile==file_w32&&(reg==EBX||reg==EDI||reg==ESI))){
  12197.  
  12198.                                                         op66(razr);
  12199.  
  12200.                                                         op(0x58+reg);
  12201.  
  12202.                                                 }
  12203.  
  12204. addax:
  12205.  
  12206.                                                 op66(razr);
  12207.  
  12208.                                                 op(0x01+vop);
  12209.  
  12210.                                                 op(0xc0+reg);
  12211.  
  12212.                                                 warningreg(regs[razr/2-1][0]);
  12213.  
  12214.                                                 break;
  12215.  
  12216.                                         default: valueexpected(); break;
  12217.  
  12218.                                 }
  12219.  
  12220.                                 break;
  12221.  
  12222.                         case tk_xorminus: vop+=0x10;
  12223.  
  12224.                         case tk_andminus: vop+=0x18;
  12225.  
  12226.                         case tk_orminus: vop+=0x08;
  12227.  
  12228.                           getoperand(reg==BX?SI:BX);
  12229.  
  12230.                                 switch(tok){
  12231.  
  12232.                                         case tk_number:
  12233.  
  12234.                                                 itok.number=-itok.number;
  12235.  
  12236.                                                 op66(razr);
  12237.  
  12238.                                                 op(0x81);
  12239.  
  12240.                                                 op(0xC0+vop+reg);
  12241.  
  12242.                                                 if((itok.flag&f_reloc)!=0)AddReloc();
  12243.  
  12244.                                                 razr==r16?outword((unsigned int)itok.number):outdword(itok.number);
  12245.  
  12246.                                                 break;
  12247.  
  12248.                                         case tk_ID:
  12249.  
  12250.                                         case tk_id:
  12251.  
  12252.                                         case tk_proc:
  12253.  
  12254.                                         case tk_apiproc:
  12255.  
  12256.                                         case tk_undefproc:
  12257.  
  12258.                                         case tk_declare:
  12259.  
  12260.                                                 procdo(razr==r16?tk_word:tk_dword);
  12261.  
  12262.                                                 i=EAX;
  12263.  
  12264.                                                 if(*ofsstr!=NULL){
  12265.  
  12266.                                                         free(*ofsstr);
  12267.  
  12268.                                                         *ofsstr=NULL;
  12269.  
  12270.                                                 }
  12271.  
  12272.                                                 goto defxormin;
  12273.  
  12274.                                         default:
  12275.  
  12276.                                                 if(reg==ECX){
  12277.  
  12278.                                                         i=EAX;
  12279.  
  12280.                                                         SINFO wstr;
  12281.  
  12282.                                                         wstr=strinf;
  12283.  
  12284.                                                         strinf.bufstr=NULL;
  12285.  
  12286.                                                         ITOK wtok;
  12287.  
  12288.                                                         char *wbuf;
  12289.  
  12290.                                                         wbuf=bufrm;
  12291.  
  12292.                                                         bufrm=NULL;
  12293.  
  12294.                                                         wtok=itok;
  12295.  
  12296.                                                         getinto_e_ax(sign,tok,&wtok,wbuf,&wstr,razr);
  12297.  
  12298.                                                 }
  12299.  
  12300.                                                 else{
  12301.  
  12302.                                                         i=ECX;
  12303.  
  12304.                                                         getintoreg_32(CX,razr,sign,ofsstr,FALSE);
  12305.  
  12306.                                                 }
  12307.  
  12308. defxormin:
  12309.  
  12310.                                                 NegReg(razr,i);
  12311.  
  12312.                                                 op66(razr);
  12313.  
  12314.                                                 op(vop+1);      /* opt AX,CX */
  12315.  
  12316.                                                 op(0xC0+i*8+reg);
  12317.  
  12318.                                                 warningreg(regs[razr/2-1][i]);
  12319.  
  12320.                                                 if(i==ECX)continue;
  12321.  
  12322.                                                 break;
  12323.  
  12324.                                 }
  12325.  
  12326.                                 break;
  12327.  
  12328.                         case tk_rrminus:
  12329.  
  12330.                                 if(reg==ECX){
  12331.  
  12332.                                         regmathoperror();
  12333.  
  12334.                                         break;
  12335.  
  12336.                                 }
  12337.  
  12338.                                 tok=tk_minus;
  12339.  
  12340.                                 getintobeg(CL,ofsstr);
  12341.  
  12342.                                 op66(razr);
  12343.  
  12344.                                 op(0xD3);
  12345.  
  12346.                                 op(0xE8+reg);   // SHL xXX,CL
  12347.  
  12348.                                 warningreg(begs[1]);
  12349.  
  12350.                                 continue;
  12351.  
  12352.                         case tk_rr:
  12353.  
  12354.                           getoperand(am32==TRUE?ECX:(reg==BX?SI:BX));
  12355.  
  12356.                                 if(RshiftReg(razr,reg,sign)==FALSE)regmathoperror();
  12357.  
  12358.                                 else continue;
  12359.  
  12360.                                 break;
  12361.  
  12362.                         case tk_llminus:
  12363.  
  12364.                                 if(reg==ECX){
  12365.  
  12366.                                         regmathoperror();
  12367.  
  12368.                                         break;
  12369.  
  12370.                                 }
  12371.  
  12372.                                 tok=tk_minus;
  12373.  
  12374.                                 goto llshift;
  12375.  
  12376.                         case tk_ll:
  12377.  
  12378.                           getoperand(am32==TRUE?ECX:(reg==BX?SI:BX));
  12379.  
  12380.                                 if(tok==tk_number){
  12381.  
  12382.                                         if(chip<2&&reg==CX){
  12383.  
  12384.                                                 regmathoperror();
  12385.  
  12386.                                                 break;
  12387.  
  12388.                                         }
  12389.  
  12390.                                         lshiftmul(itok.number,razr,reg);
  12391.  
  12392.                                 }
  12393.  
  12394.                                 else if(reg!=ECX&&(tok==tk_beg||tok==tk_reg||tok==tk_reg32)&&itok.number==CL){
  12395.  
  12396.                                         op66(razr);
  12397.  
  12398.                                         op(0xD3);
  12399.  
  12400.                                         op(0xE0+reg);   // SHL xXX,CL
  12401.  
  12402.                                 }
  12403.  
  12404.                                 else if(reg!=ECX){
  12405.  
  12406. llshift:
  12407.  
  12408.                                         getintobeg(CL,ofsstr);
  12409.  
  12410.                                         op66(razr);
  12411.  
  12412.                                         op(0xD3);
  12413.  
  12414.                                         op(0xE0+reg);   // SHL xXX,CL
  12415.  
  12416.                                         warningreg(begs[1]);
  12417.  
  12418.                                         continue;
  12419.  
  12420.                                 }
  12421.  
  12422.                                 else regmathoperror();
  12423.  
  12424.                                 break;
  12425.  
  12426.                         case tk_multminus: negflag=TRUE;
  12427.  
  12428.                         case tk_mult:
  12429.  
  12430.                           if(optnum==FALSE)getoperand(reg==BX?SI:BX);
  12431.  
  12432.                                 else tok=tk_number;
  12433.  
  12434.                                 if(negflag&&tok==tk_number){
  12435.  
  12436.                                         itok.number=-itok.number;
  12437.  
  12438.                                         negflag=FALSE;
  12439.  
  12440.                                 }
  12441.  
  12442.                                 if(MulReg(reg,razr)==0)continue;
  12443.  
  12444.                                 break;
  12445.  
  12446.                         case tk_modminus: negflag=1;
  12447.  
  12448.                         case tk_mod:
  12449.  
  12450.                                 vop=1;
  12451.  
  12452.                                 goto divcalc;
  12453.  
  12454.                         case tk_divminus: negflag=1;
  12455.  
  12456.                         case tk_div:
  12457.  
  12458. divcalc:
  12459.  
  12460.                           if(optnum==FALSE)getoperand(reg==BX?SI:BX);
  12461.  
  12462.                                 else tok=tk_number;
  12463.  
  12464.                                 if(negflag&&tok==tk_number){
  12465.  
  12466.                                         itok.number=-itok.number;
  12467.  
  12468.                                         negflag=FALSE;
  12469.  
  12470.                                 }
  12471.  
  12472.                                 if(tok==tk_number&&(i=caselong(itok.number))!=NUMNUM){
  12473.  
  12474.                                         if(vop){        //mod
  12475.  
  12476.                                                 itok.number--;
  12477.  
  12478.                                                 if(itok.number==0){
  12479.  
  12480.                                                         ZeroReg(reg,razr);
  12481.  
  12482.                                                 }
  12483.  
  12484.                                                 else if(short_ok(itok.number,razr/2-1)){
  12485.  
  12486.                                                         op66(razr);
  12487.  
  12488.                                                         op(0x83);
  12489.  
  12490.                                                         op(0xE0+reg);   //and reg,num-1
  12491.  
  12492.                                                         op(itok.number);
  12493.  
  12494.                                                 }
  12495.  
  12496.                                                 else{
  12497.  
  12498.                                                         op66(razr);
  12499.  
  12500.                                                         op(0x81);
  12501.  
  12502.                                                         op(0xE0+reg);   //and reg,num-1
  12503.  
  12504.                                                         razr==r16?outword((unsigned int)itok.number):outdword(itok.number);
  12505.  
  12506.                                                 }
  12507.  
  12508.                                         }
  12509.  
  12510.                                         else{
  12511.  
  12512.                                                 if(i!=0){
  12513.  
  12514.                                                         if(chip<2&&razr==r16){
  12515.  
  12516.                                                                 if(reg==CX)regmathoperror();
  12517.  
  12518.                                                                 op(0xB1); op(i); /* MOV CL,num */
  12519.  
  12520.                                                                 op(0xD3);
  12521.  
  12522.                                                                 op(0xE8+reg); // SHR reg,CL
  12523.  
  12524.                                                                 warningreg(begs[1]);
  12525.  
  12526.                                                         }
  12527.  
  12528.                                                         else{
  12529.  
  12530.                                                                 op66(razr);
  12531.  
  12532.                                                                 op(0xC1);
  12533.  
  12534.                                                                 op(0xE8+reg); // SHR reg,num
  12535.  
  12536.                                                                 op(i);
  12537.  
  12538.                                                         }
  12539.  
  12540.                                                 }
  12541.  
  12542.                                         }
  12543.  
  12544.                                         break;
  12545.  
  12546.                                 }
  12547.  
  12548.                                 if(fdiv!=1){
  12549.  
  12550.                                         op66(razr);
  12551.  
  12552.                                         op(0x90+reg);   //xchg AX,reg
  12553.  
  12554.                                 }
  12555.  
  12556.                                 DivMod(vop,sign,razr,0);
  12557.  
  12558.                                 if(itok.type!=tp_stopper){
  12559.  
  12560.                                         if(vop==1){
  12561.  
  12562.                                                 op66(razr);
  12563.  
  12564.                                                 if(optimizespeed)outword(0xC28B);       //mov ax,dx
  12565.  
  12566.                                                 else op(0x92);  //xchg ax,dx
  12567.  
  12568.                                         }
  12569.  
  12570.                                         do_e_axmath2(0,razr,0);
  12571.  
  12572.                                 }
  12573.  
  12574.                                 else if(vop==1){
  12575.  
  12576.                                         if(reg!=EDX){
  12577.  
  12578.                                                 op66(razr);
  12579.  
  12580.                                                 op(0x89);
  12581.  
  12582.                                                 op(128+64+EDX*8+reg);
  12583.  
  12584.                                         }
  12585.  
  12586.                                         warningreg(regs[razr/2-1][EAX]);
  12587.  
  12588.                                         continue;
  12589.  
  12590.                                 }
  12591.  
  12592.                                 op66(razr);
  12593.  
  12594.                                 if(optimizespeed){
  12595.  
  12596.                                         op(0x89);
  12597.  
  12598.                                         op(128+64+EAX*8+reg);
  12599.  
  12600.                                 }
  12601.  
  12602.                                 else op(0x90+reg);      //xchg AX,reg
  12603.  
  12604.                                 warningreg(regs[razr/2-1][EAX]);
  12605.  
  12606.                                 continue;
  12607.  
  12608.                         default: operatorexpected(); break;
  12609.  
  12610.                 }
  12611.  
  12612.                 calcnumber=FALSE;
  12613.  
  12614.                 ClearReg(reg);
  12615.  
  12616.                 nexttok();
  12617.  
  12618.         }
  12619.  
  12620.         calcnumber=FALSE;
  12621.  
  12622.         ClearReg(reg);
  12623.  
  12624.         if(razr==r32&&cpu<3)cpu=3;
  12625.  
  12626. }
  12627.  
  12628.  
  12629.  
  12630. void  dobegmath(int beg)  // math done is on all begs except AL
  12631.  
  12632. // all other registers preserved
  12633.  
  12634. {
  12635.  
  12636. int vop,i,optnum=FALSE,negflag=FALSE;
  12637.  
  12638.         while(itok.type!=tp_stopper&&tok!=tk_eof){
  12639.  
  12640.                 vop=0;
  12641.  
  12642.                 i=0;
  12643.  
  12644. #ifdef OPTVARCONST
  12645.  
  12646.                 if(tok2>=tk_charvar&&tok2<=tk_doublevar&&itok2.npointr==0){
  12647.  
  12648.                         if(CheckConstVar(&itok2)){
  12649.  
  12650.                                 tok2=tk_number;
  12651.  
  12652.                                 calcnumber=TRUE;
  12653.  
  12654.                         }
  12655.  
  12656.                 }
  12657.  
  12658. #endif
  12659.  
  12660.                 if(tok2==tk_number)optnum=OptimNum();
  12661.  
  12662.                 int oldtok=tok;
  12663.  
  12664.                 switch(tok){
  12665.  
  12666.                         case tk_xor: vop+=0x08;
  12667.  
  12668.                         case tk_minus: vop+=0x08;
  12669.  
  12670.                         case tk_and: vop+=0x18;
  12671.  
  12672.                         case tk_or: vop+=0x08;
  12673.  
  12674.                         case tk_plus:
  12675.  
  12676.                           if(optnum==FALSE)getoperand(beg==BL||beg==BH?SI:BX);
  12677.  
  12678.                                 else{
  12679.  
  12680.                                         tok=tk_number;
  12681.  
  12682.                                         optnum=FALSE;
  12683.  
  12684.                                 }
  12685.  
  12686.                                 switch(tok){
  12687.  
  12688.                                         case tk_number:
  12689.  
  12690.                                                 if(itok.number==0&&oldtok!=tk_and)break;
  12691.  
  12692.                                                 else if(itok.number==1){
  12693.  
  12694.                                                         if(oldtok==tk_plus){
  12695.  
  12696.                                                                 op(0xFE);
  12697.  
  12698.                                                                 op(0xC0+beg);
  12699.  
  12700.                                                                 break;
  12701.  
  12702.                                                         }
  12703.  
  12704.                                                         if(oldtok==tk_minus){
  12705.  
  12706.                                                                 op(0xFE);
  12707.  
  12708.                                                                 op(0xC8+beg);
  12709.  
  12710.                                                                 break;
  12711.  
  12712.                                                         }
  12713.  
  12714.                                                 }
  12715.  
  12716.                                                 else if((unsigned char)itok.number==0xff){
  12717.  
  12718.                                                         if(oldtok==tk_minus){
  12719.  
  12720.                                                                 op(0xFE);
  12721.  
  12722.                                                                 op(0xC0+beg);
  12723.  
  12724.                                                                 break;
  12725.  
  12726.                                                         }
  12727.  
  12728.                                                         if(oldtok==tk_plus){
  12729.  
  12730.                                                                 op(0xFE);
  12731.  
  12732.                                                                 op(0xC8+beg);
  12733.  
  12734.                                                                 break;
  12735.  
  12736.                                                         }
  12737.  
  12738.                                                 }
  12739.  
  12740.                                           op(0x80);
  12741.  
  12742.                                                 op(0xC0+vop+beg);
  12743.  
  12744.                                                 op((unsigned int)itok.number);
  12745.  
  12746.                                                 break;
  12747.  
  12748.                                         case tk_bits:
  12749.  
  12750.                                                 int vops,reg2s;
  12751.  
  12752.                                                 i=itok.bit.siz+itok.bit.ofs;
  12753.  
  12754.                                                 if(i<=64)vops=r64;
  12755.  
  12756.                                                 if(i<=32)vops=r32;
  12757.  
  12758.                                                 if(i<=16)vops=r16;
  12759.  
  12760.                                                 if(i<=8)vops=r8;
  12761.  
  12762.                                                 reg2s=CL;
  12763.  
  12764.                                                 if(beg==CL)reg2s=BL;
  12765.  
  12766.                                                 bits2reg(reg2s,vops);
  12767.  
  12768.                                                 if(vops==r64)vops=r32;
  12769.  
  12770.                                                 warningreg(vops==r8?begs[reg2s]:regs[vops/2-1][reg2s]);
  12771.  
  12772.                                                 itok.number=reg2s;
  12773.  
  12774.                                         case tk_beg:
  12775.  
  12776.                                                 op(0x00+vop);
  12777.  
  12778.                                                 op(0xC0+beg+(unsigned int)itok.number*8);
  12779.  
  12780.                                                 break;
  12781.  
  12782.                                         case tk_qwordvar:
  12783.  
  12784.                                                 i=4;
  12785.  
  12786.                                         case tk_longvar:
  12787.  
  12788.                                         case tk_dwordvar:
  12789.  
  12790.                                                 i+=2;
  12791.  
  12792.                                         case tk_intvar:
  12793.  
  12794.                                         case tk_wordvar:
  12795.  
  12796.                                                 i++;
  12797.  
  12798.                                         case tk_bytevar:
  12799.  
  12800.                                         case tk_charvar:
  12801.  
  12802.                                                 i++;
  12803.  
  12804.                                                 CheckAllMassiv(bufrm,i,&strinf);
  12805.  
  12806.                                                 outseg(&itok,2);
  12807.  
  12808.                                                 op(0x02+vop);
  12809.  
  12810.                                                 op(beg*8+itok.rm);
  12811.  
  12812.                                                 outaddress(&itok);
  12813.  
  12814.                                                 break;
  12815.  
  12816.                                         case tk_postnumber:
  12817.  
  12818.                                         case tk_reg:
  12819.  
  12820.                                         case tk_rmnumber: begworderror();       break;
  12821.  
  12822.                                         case tk_ID:
  12823.  
  12824.                                         case tk_id:
  12825.  
  12826.                                         case tk_proc:
  12827.  
  12828.                                         case tk_apiproc:
  12829.  
  12830.                                         case tk_undefproc:// begcallerror(); break;
  12831.  
  12832.                                         case tk_declare:
  12833.  
  12834.                                                 procdo(tk_byte);
  12835.  
  12836.                                                 if(beg!=AL){
  12837.  
  12838.                                                         op(0x00+vop);
  12839.  
  12840.                                                         op(0xc0+beg);
  12841.  
  12842.                                                 }
  12843.  
  12844.                                                 break;
  12845.  
  12846.                                         default: valueexpected(); break;
  12847.  
  12848.                                 }
  12849.  
  12850.                                 break;
  12851.  
  12852.                         case tk_xorminus: vop+=0x10;
  12853.  
  12854.                         case tk_andminus: vop+=0x18;
  12855.  
  12856.                         case tk_orminus: vop+=0x08;
  12857.  
  12858.                           getoperand(beg==BL||beg==BH?SI:BX);
  12859.  
  12860.                                 if(tok==tk_number){
  12861.  
  12862.                                         itok.number=-itok.number;
  12863.  
  12864.                                         op(0x80);
  12865.  
  12866.                                         op(0xC0+vop +beg);
  12867.  
  12868.                                         op((unsigned int)itok.number);
  12869.  
  12870.                                 }
  12871.  
  12872.                                 else negregerror();
  12873.  
  12874.                                 break;
  12875.  
  12876.                         case tk_rr:
  12877.  
  12878.                                 vop=8;
  12879.  
  12880.                         case tk_ll:
  12881.  
  12882.                                 nexttok();
  12883.  
  12884.                                 if(tok==tk_number){
  12885.  
  12886.                                         if((unsigned int)itok.number==1){
  12887.  
  12888.                                                 if(vop==0){
  12889.  
  12890.                                                         op(2);
  12891.  
  12892.                                                         op(0xC0+9*beg); // ADD reg,reg
  12893.  
  12894.                                                 }
  12895.  
  12896.                                                 else{
  12897.  
  12898.                                                         op(0xD0); op(0xE8+beg);  /* SHR reg,1 */
  12899.  
  12900.                                                 }
  12901.  
  12902.                                         }
  12903.  
  12904.                                         else if((unsigned int)itok.number!=0){
  12905.  
  12906.                                                 if(chip<2)begmathoperror();
  12907.  
  12908.                                                 else{
  12909.  
  12910.                                                         op(0xc0);
  12911.  
  12912.                                                         op(0xe0+beg+vop); // SHL reg,imm8
  12913.  
  12914.                                                         op((unsigned int)itok.number);
  12915.  
  12916.                                                         if(cpu<2)cpu=2;
  12917.  
  12918.                                                 }
  12919.  
  12920.                                         }
  12921.  
  12922.                                 }
  12923.  
  12924.                                 else if(tok==tk_beg&&itok.number==CL&&beg!=CL){
  12925.  
  12926.                                         op(0xD2);
  12927.  
  12928.                                         op(0xE0+beg+vop);       // SHL xXX,CL
  12929.  
  12930.                                 }
  12931.  
  12932.                                 else begmathoperror();
  12933.  
  12934.                                 break;
  12935.  
  12936.                         case tk_multminus: negflag=TRUE;
  12937.  
  12938.                         case tk_mult:
  12939.  
  12940.                           if(optnum==FALSE)getoperand(beg==BL||beg==BH?SI:BX);
  12941.  
  12942.                                 else{
  12943.  
  12944.                                         tok=tk_number;
  12945.  
  12946.                                         optnum=FALSE;
  12947.  
  12948.                                 }
  12949.  
  12950.                                 if(negflag&&tok==tk_number){
  12951.  
  12952.                                         itok.number=-itok.number;
  12953.  
  12954.                                         negflag=FALSE;
  12955.  
  12956.                                 }
  12957.  
  12958.                                 switch(tok){
  12959.  
  12960.                                         case tk_number:
  12961.  
  12962.                                                 itok.number&=255;
  12963.  
  12964.                                                 switch((unsigned int)itok.number){
  12965.  
  12966.                                                         case 0: // beg * 0 = MOV beg,0
  12967.  
  12968.                                                                 outword(0x00B0+beg);
  12969.  
  12970.                                                         case 1: break; //beg*1=beg
  12971.  
  12972.                                                         case 2:
  12973.  
  12974.                                                                 op(0);
  12975.  
  12976.                                                                 op(0xC0+9*beg); // beg * 2 = ADD beg,beg
  12977.  
  12978.                                                                 break;
  12979.  
  12980.                                                         default:
  12981.  
  12982.                                                                 vop=caselong(itok.number);
  12983.  
  12984.                                                                 if(vop!=NUMNUM){
  12985.  
  12986.                                                                         if(chip<1)begmathoperror();
  12987.  
  12988.                                                                         else{
  12989.  
  12990.                                                                                 op(0xc0);
  12991.  
  12992.                                                                                 op(0xe0+beg);   //SHL beg,num
  12993.  
  12994.                                                                                 op(vop);
  12995.  
  12996.                                                                                 if(cpu<1)cpu=1;
  12997.  
  12998.                                                                         }
  12999.  
  13000.                                                                 }
  13001.  
  13002.                                                                 else begmathoperror();
  13003.  
  13004.                                                 }
  13005.  
  13006.                                                 break;
  13007.  
  13008.                                         default: begmathoperror(); break;
  13009.  
  13010.                                 }
  13011.  
  13012.                                 break;
  13013.  
  13014.                         case tk_divminus:
  13015.  
  13016.                         case tk_modminus:
  13017.  
  13018.                         case tk_div:
  13019.  
  13020.                         case tk_mod:
  13021.  
  13022.                         case tk_rrminus:
  13023.  
  13024.                         case tk_llminus:
  13025.  
  13026.                                 begmathoperror();       break;
  13027.  
  13028.                         default: operatorexpected(); break;
  13029.  
  13030.                 }
  13031.  
  13032. #ifdef OPTVARCONST
  13033.  
  13034.                 calcnumber=FALSE;
  13035.  
  13036. #endif
  13037.  
  13038.                 nexttok();
  13039.  
  13040.                 ClearReg(beg%4);
  13041.  
  13042.         }
  13043.  
  13044. }
  13045.  
  13046.  
  13047.  
  13048. // ============= getintoreg_32(), getintobeg() ============
  13049.  
  13050.  
  13051.  
  13052. int getintoreg_32(int reg,int razr,int sign,char **ofsstr,int useloop)  // get into word reg (except AX) with enum
  13053.  
  13054. {
  13055.  
  13056. int negflag=0,next=1,i=0;
  13057.  
  13058. int swap=0,oflag=0;
  13059.  
  13060. unsigned long holdnumber=0;
  13061.  
  13062. int reg1=idxregs[0],reg2=idxregs[1];
  13063.  
  13064. int rettype=tk_reg;
  13065.  
  13066. int loop=0,otok;
  13067.  
  13068. //                              printf("line %d tok=%d %s\n",linenumber,tok,itok.name);
  13069.  
  13070.         if(!am32){
  13071.  
  13072.                 if(reg==idxregs[1]||reg==idxregs[2]){
  13073.  
  13074.                         reg1=reg;
  13075.  
  13076.                         if(reg==idxregs[1])reg2=idxregs[0];
  13077.  
  13078.                 }
  13079.  
  13080.         }
  13081.  
  13082.         else{
  13083.  
  13084.                 reg1=reg;
  13085.  
  13086.                 if(reg==idxregs[1])reg2=idxregs[0];
  13087.  
  13088.         }
  13089.  
  13090.         if(tok==tk_minus){
  13091.  
  13092.                 if(CheckMinusNum()==FALSE){
  13093.  
  13094.                         negflag=1;
  13095.  
  13096.                         getoperand(am32==FALSE?BX:reg);
  13097.  
  13098.                 }
  13099.  
  13100.         }
  13101.  
  13102. loopswitch:
  13103.  
  13104.  
  13105.  
  13106.         if(uselea){
  13107.  
  13108.                 if(razr==r32){
  13109.  
  13110.                         if(cpu<3)cpu=3;
  13111.  
  13112.                         if(Reg32ToLea(reg)){
  13113.  
  13114.                                 return tk_reg;
  13115.  
  13116.                         }
  13117.  
  13118.                 }
  13119.  
  13120.                 else
  13121.  
  13122.                         if(Reg16ToLea(reg)){
  13123.  
  13124.                                 return tk_reg;
  13125.  
  13126.                         }
  13127.  
  13128.         }
  13129.  
  13130. loopswitch1:
  13131.  
  13132.  
  13133.  
  13134. #ifdef OPTVARCONST
  13135.  
  13136.         CheckConstVar3(&tok,&itok,razr);
  13137.  
  13138.         if(tok==tk_number)calcnumber=TRUE;
  13139.  
  13140. #endif
  13141.  
  13142.         otok=tok;
  13143.  
  13144. //      printf("reg=%d tok=%d\n",reg,tok);
  13145.  
  13146.         switch(tok){
  13147.  
  13148.                 case tk_number:
  13149.  
  13150.                         if(useloop==FALSE)MovRegNum(razr,itok.flag&f_reloc,itok.number,reg);
  13151.  
  13152.                         else{
  13153.  
  13154.                                 holdnumber=CalcNumber(sign);
  13155.  
  13156.                                 if(loop==0)oflag=postnumflag;
  13157.  
  13158.                                 else oflag^=postnumflag;
  13159.  
  13160.                                 loop++;
  13161.  
  13162.                                 if(tok==tk_mult){
  13163.  
  13164.                                         nexttok();
  13165.  
  13166.                                         swap=1;
  13167.  
  13168.                                         goto loopswitch1;
  13169.  
  13170.                                 }
  13171.  
  13172.                                 if(tok==tk_plus&&tok2==tk_postnumber){
  13173.  
  13174.                                         nexttok();
  13175.  
  13176. //                              getoperand(am32==TRUE?EAX:BX);
  13177.  
  13178.                                         goto loopswitch1;
  13179.  
  13180.                                 }
  13181.  
  13182.                                 MovRegNum(razr,oflag&f_reloc,holdnumber,reg);
  13183.  
  13184.                                 next=0;
  13185.  
  13186.                         }
  13187.  
  13188.                         break;
  13189.  
  13190.                 case tk_postnumber:
  13191.  
  13192.                 case tk_undefofs:
  13193.  
  13194.                         if(!swap){
  13195.  
  13196.                                 op66(razr);
  13197.  
  13198.                                 op(0xB8+reg);                   /* MOV AX,# */
  13199.  
  13200.                                 swap=1;
  13201.  
  13202.                         }
  13203.  
  13204.                         if(tok==tk_undefofs){
  13205.  
  13206.                                 AddUndefOff(2,itok.name);
  13207.  
  13208. //                              AddUndefOff(0,itok.name);
  13209.  
  13210. //                              itok.flag=0;    //new 07.07.04 23:57
  13211.  
  13212.                         }
  13213.  
  13214.                         else (itok.flag&f_extern)==0?setwordpost(&itok):setwordext(&itok.number);
  13215.  
  13216.                         if(useloop==FALSE)holdnumber=itok.number;
  13217.  
  13218.                         else{
  13219.  
  13220.                                 tok=tk_number;
  13221.  
  13222.                                 holdnumber+=doconstdwordmath();
  13223.  
  13224.                                 if(otok!=tk_postnumber){
  13225.  
  13226.                                         if(loop==0)oflag=postnumflag;
  13227.  
  13228.                                         else oflag^=postnumflag;
  13229.  
  13230.                                         loop++;
  13231.  
  13232.                                 }
  13233.  
  13234.                                 if(tok==tk_plus&&tok2==tk_postnumber){
  13235.  
  13236.                                         nexttok();
  13237.  
  13238.                                         goto loopswitch1;
  13239.  
  13240.                                 }
  13241.  
  13242.                                 swap=0;
  13243.  
  13244.                                 next=0;
  13245.  
  13246.                         }
  13247.  
  13248.                         if(useloop&&(oflag&f_reloc))AddReloc();
  13249.  
  13250.                         if(razr==r16)outword(holdnumber);
  13251.  
  13252.                         else outdword(holdnumber);
  13253.  
  13254.                         ClearReg(reg);
  13255.  
  13256.                         break;
  13257.  
  13258.                 case tk_apioffset:
  13259.  
  13260.                         op66(razr);
  13261.  
  13262.                         op(0xB8+reg);                   /* MOV AX,# */
  13263.  
  13264.                         AddApiToPost(itok.number);
  13265.  
  13266.                         ClearReg(reg);
  13267.  
  13268.                         break;
  13269.  
  13270.                 case tk_rmnumber:
  13271.  
  13272.                         CheckAllMassiv(bufrm,itok.size,&strinf,&itok,reg1,reg2);
  13273.  
  13274.                         if((am32&&itok.rm==reg&&reg!=EBP&&reg!=ESP)||(am32==0&&reg==itok.rm&&
  13275.  
  13276.                                         (reg==SI||reg==DI||reg==BX)))break;
  13277.  
  13278.                         op66(razr);
  13279.  
  13280.                         op67(itok.sib==CODE16?r16:r32);
  13281.  
  13282.                         if(itok.post==0)outseg(&itok,2);
  13283.  
  13284.                         op(0x8D);                       // LEA reg,[rm]
  13285.  
  13286.                         op(reg*8+itok.rm);
  13287.  
  13288.                         if(itok.post!=0&&itok.post!=UNDEF_OFSET){
  13289.  
  13290.                                 if((itok.flag&f_extern)==0){
  13291.  
  13292.                                         unsigned int ooutptr=outptr;
  13293.  
  13294.                                         if(am32&&itok.rm==rm_sib)outptr++;
  13295.  
  13296.                                         setwordpost(&itok);
  13297.  
  13298.                                         outptr=ooutptr;
  13299.  
  13300.                                 }
  13301.  
  13302.                                 else setwordext(&itok.number);
  13303.  
  13304.                         }
  13305.  
  13306.                         if(useloop==FALSE)outaddress(&itok);
  13307.  
  13308.                         else{
  13309.  
  13310. ITOK oitok;
  13311.  
  13312.                                 oitok=itok;
  13313.  
  13314.                                 tok=tk_number;
  13315.  
  13316.                                 itok.rm=tk_dword;
  13317.  
  13318.                                 oitok.number=doconstdwordmath();
  13319.  
  13320.                                 outaddress(&oitok);
  13321.  
  13322.                                 next=0;
  13323.  
  13324.                         }
  13325.  
  13326.                         ClearReg(reg);
  13327.  
  13328.                         break;
  13329.  
  13330.                 case tk_qwordvar:
  13331.  
  13332.                         i=4;
  13333.  
  13334.                 case tk_longvar:
  13335.  
  13336.                 case tk_dwordvar:
  13337.  
  13338.                         i+=4;
  13339.  
  13340. dwordvar:
  13341.  
  13342.                         CheckAllMassiv(bufrm,i,&strinf,&itok,reg1,reg2);
  13343.  
  13344.                         op66(razr);
  13345.  
  13346.                         outseg(&itok,2);
  13347.  
  13348.                         op(0x8B);
  13349.  
  13350.                         op(reg*8+itok.rm);
  13351.  
  13352.                         outaddress(&itok);
  13353.  
  13354.                         ClearReg(reg);
  13355.  
  13356.                         break;
  13357.  
  13358.                 case tk_intvar:
  13359.  
  13360.                 case tk_wordvar:
  13361.  
  13362.                         i=2;
  13363.  
  13364.                         if(razr==r16)goto dwordvar;
  13365.  
  13366.                         CheckAllMassiv(bufrm,2,&strinf,&itok,reg1,reg2);
  13367.  
  13368.                         if(tok==tk_wordvar&&optimizespeed&&chip>3&&chip<7&&RmEqualReg(reg,itok.rm,itok.sib)==FALSE){
  13369.  
  13370.                                 ZeroReg(reg,r32);
  13371.  
  13372.                                 op66(r16);
  13373.  
  13374.                                 outseg(&itok,2);        //mov reg,var
  13375.  
  13376.                                 op(0x8B);
  13377.  
  13378.                         }
  13379.  
  13380.                         else{
  13381.  
  13382.                                 op66(r32);
  13383.  
  13384.                                 outseg(&itok,3);        //movxx reg,var
  13385.  
  13386.                                 op(0x0F); op(tok==tk_wordvar?0xB7:0xBF);
  13387.  
  13388.                         }
  13389.  
  13390.                         op(reg*8+itok.rm);
  13391.  
  13392.                         outaddress(&itok);
  13393.  
  13394.                         ClearReg(reg);
  13395.  
  13396.                         break;
  13397.  
  13398.                 case tk_doublevar:
  13399.  
  13400.                         i=4;
  13401.  
  13402.                 case tk_floatvar:
  13403.  
  13404.                         Float2reg32(reg,i,reg1,reg2);
  13405.  
  13406.                         ClearReg(reg);
  13407.  
  13408.                         break;
  13409.  
  13410.                 case tk_bytevar:
  13411.  
  13412.                 case tk_charvar:
  13413.  
  13414.                         if(chip>2||razr==r32){
  13415.  
  13416.                                 CheckAllMassiv(bufrm,1,&strinf,&itok,reg1,reg2);
  13417.  
  13418.                                 if(reg<=EBX&&tok==tk_bytevar&&optimizespeed&&chip>3&&chip<7&&RmEqualReg(reg,itok.rm,itok.sib)==FALSE){
  13419.  
  13420.                                         ZeroReg(reg,razr);
  13421.  
  13422.                                         outseg(&itok,2);
  13423.  
  13424.                                         op(0x8A);
  13425.  
  13426.                                 }
  13427.  
  13428.                                 else{
  13429.  
  13430.                                         op66(razr);
  13431.  
  13432.                                         outseg(&itok,3);
  13433.  
  13434.                                         op(0xf);
  13435.  
  13436.                                         if(tok==tk_bytevar)op(0xb6);
  13437.  
  13438.                                         else op(0xbe);
  13439.  
  13440.                                 }
  13441.  
  13442.                                 op(reg*8+itok.rm); // MOVZX regL,[byte]
  13443.  
  13444.                                 outaddress(&itok);
  13445.  
  13446.                                 ClearReg(reg);
  13447.  
  13448.                                 break;
  13449.  
  13450.                         }
  13451.  
  13452.                         if(reg<=BX){
  13453.  
  13454.                                 if(reg==AX&&itok.rm==rm_d16&&itok.sib==CODE16){
  13455.  
  13456.                                         outseg(&itok,1);
  13457.  
  13458.                                         op(0xA0); // MOV AL,[byte]
  13459.  
  13460.                                         outword((unsigned int)itok.number);
  13461.  
  13462.                                 }
  13463.  
  13464.                                 else{
  13465.  
  13466.                                         CheckAllMassiv(bufrm,1,&strinf,&itok,reg1,reg2);
  13467.  
  13468.                                         outseg(&itok,2);
  13469.  
  13470.                                         op(0x8A);
  13471.  
  13472.                                         op(reg*8+itok.rm); // MOV regL,[byte]
  13473.  
  13474.                                         outaddress(&itok);
  13475.  
  13476.                                 }
  13477.  
  13478.                                 ClearReg(reg);
  13479.  
  13480.                                 op(0x30); op(0xC0+(reg+4)*9); // XOR regH,regH
  13481.  
  13482.                         }
  13483.  
  13484.                         else regbyteerror();
  13485.  
  13486.                         break;
  13487.  
  13488.                 case tk_reg:
  13489.  
  13490.                         if(razr==r32){
  13491.  
  13492.                                 if(tok2==tk_openbracket){       //¢ë§®¢ ¯à®æ¥¤ãàë ¯®  ¤à¥áã ¢ ॣ¨áâà¥
  13493.  
  13494.                                         reg1=itok.number;
  13495.  
  13496.                                         nexttok();
  13497.  
  13498.                                         param[0]=0;
  13499.  
  13500.                                         if(comfile==file_w32)swapparam();
  13501.  
  13502.                                         else doparams();
  13503.  
  13504.                                         op66(r16);
  13505.  
  13506.                                         op(0xFF);
  13507.  
  13508.                                         op(0xD0+reg1);  /* CALL reg with stack params */
  13509.  
  13510.                                         itok.number=0;
  13511.  
  13512.                                         clearregstat();
  13513.  
  13514. #ifdef OPTVARCONST
  13515.  
  13516.                                         FreeGlobalConst();
  13517.  
  13518. #endif
  13519.  
  13520.                                 }
  13521.  
  13522.                                 if(optimizespeed&&chip>3&&chip<7&&reg!=(int)itok.number){
  13523.  
  13524.                                         ZeroReg(reg,r32);
  13525.  
  13526.                                         op(0x89);
  13527.  
  13528.                                         op(0xC0+reg+(unsigned int)itok.number*8);
  13529.  
  13530.                                 }
  13531.  
  13532.                                 else{
  13533.  
  13534.                                         op66(r32);
  13535.  
  13536.                                         outword(0xB70F);
  13537.  
  13538.                                         op(0xC0+reg*8+(unsigned int)itok.number);
  13539.  
  13540.                                 }
  13541.  
  13542.                                 RegToReg(reg,itok.number,r32);
  13543.  
  13544.                                 break;
  13545.  
  13546.                         }
  13547.  
  13548.                 case tk_reg32:
  13549.  
  13550.                         if(tok2==tk_openbracket){       //¢ë§®¢ ¯à®æ¥¤ãàë ¯®  ¤à¥áã ¢ ॣ¨áâà¥
  13551.  
  13552.                                 reg1=itok.number;
  13553.  
  13554.                                 reg2=tok==tk_reg32?r32:r16;
  13555.  
  13556.                                 nexttok();
  13557.  
  13558.                                 param[0]=0;
  13559.  
  13560.                                 if(comfile==file_w32)swapparam();
  13561.  
  13562.                                 else doparams();
  13563.  
  13564.                                 op66(reg2);
  13565.  
  13566.                                 op(0xFF);
  13567.  
  13568.                                 op(0xD0+reg1);  /* CALL reg with stack params */
  13569.  
  13570.                                 itok.number=0;
  13571.  
  13572.                                 clearregstat();
  13573.  
  13574. #ifdef OPTVARCONST
  13575.  
  13576.                                 FreeGlobalConst();
  13577.  
  13578. #endif
  13579.  
  13580.                         }
  13581.  
  13582.                         if(reg!=(int)itok.number){
  13583.  
  13584.                                 op66(razr);
  13585.  
  13586.                                 op(0x89);
  13587.  
  13588.                                 op(0xC0+reg+(unsigned int)itok.number*8);
  13589.  
  13590.                                 RegToReg(reg,itok.number,r32);
  13591.  
  13592.                         }
  13593.  
  13594.                         break;
  13595.  
  13596.                 case tk_bits:
  13597.  
  13598.                         int vops;
  13599.  
  13600.                         i=itok.bit.siz+itok.bit.ofs;
  13601.  
  13602.                         if(i<=64)vops=r64;
  13603.  
  13604.                         if(i<=32)vops=r32;
  13605.  
  13606.                         if(i<=16)vops=r16;
  13607.  
  13608.                         bits2reg(reg,(razr<vops?vops:razr));
  13609.  
  13610.                         break;
  13611.  
  13612.                 case tk_seg:
  13613.  
  13614.                         op66(razr);
  13615.  
  13616.                         op(0x8C);
  13617.  
  13618.                         op(0xC0+reg+(unsigned int)itok.number*8);
  13619.  
  13620.                         ClearReg(reg);
  13621.  
  13622.                         break;
  13623.  
  13624.                 case tk_beg:
  13625.  
  13626.                         if(chip>2||razr==r32){
  13627.  
  13628.                                 if(optimizespeed&&chip>3&&chip<7&&reg<4&&reg!=(int)(itok.number%4)){
  13629.  
  13630.                                         ZeroReg(reg,razr);
  13631.  
  13632.                                         op(0x88);
  13633.  
  13634.                                         op(0xC0+reg+(unsigned int)itok.number*8); // MOV regL,beg
  13635.  
  13636.                                 }
  13637.  
  13638.                                 else{
  13639.  
  13640.                                         op66(razr);
  13641.  
  13642.                                         outword(0xb60f);
  13643.  
  13644.                                         op(0xC0+reg*8+(unsigned int)itok.number); // MOVZX regL,beg
  13645.  
  13646.                                 }
  13647.  
  13648.                         }
  13649.  
  13650.                         else if(reg>BX)regbyteerror();
  13651.  
  13652.                         else{
  13653.  
  13654.                                 op(0x88); op(0xC0+reg+(unsigned int)itok.number*8); // MOV regL,beg
  13655.  
  13656.                                 op(0x30); op(0xC0+(reg+4)*9);   // XOR regH,regH
  13657.  
  13658.                         }
  13659.  
  13660.                         ClearReg(reg);
  13661.  
  13662.                         break;
  13663.  
  13664.                 case tk_at:
  13665.  
  13666.                         getoperand(am32==FALSE?BX:reg);
  13667.  
  13668.                         i++;
  13669.  
  13670.                 case tk_ID:
  13671.  
  13672.                 case tk_id:
  13673.  
  13674.                 case tk_proc:
  13675.  
  13676.                 case tk_apiproc:
  13677.  
  13678.                 case tk_undefproc:
  13679.  
  13680.                 case tk_declare:
  13681.  
  13682.                         if(itok.flag&f_retproc)rettype=(itok.flag&f_retproc)/256+tk_overflowflag-1;
  13683.  
  13684.                         if((!i)||macros(razr==r16?tk_word:tk_dword)==0)procdo(razr==r16?tk_word:tk_dword);
  13685.  
  13686.                         itok.number=0;
  13687.  
  13688.                         tok=(razr==r16?tk_reg:tk_reg32);
  13689.  
  13690.                         if(*ofsstr!=NULL){
  13691.  
  13692.                                 free(*ofsstr);
  13693.  
  13694.                                 ofsstr=NULL;
  13695.  
  13696.                         }
  13697.  
  13698. //              printf("tok=%d num=%d tok2=%d\n",tok,itok.number,tok2);
  13699.  
  13700.                         goto loopswitch;
  13701.  
  13702. //                      break;
  13703.  
  13704.                 case tk_string:
  13705.  
  13706.                         op66(razr);
  13707.  
  13708.                         op(0xB8+reg);
  13709.  
  13710.                         if(razr==r16){
  13711.  
  13712.                                 if(am32)dwordvalexpected();
  13713.  
  13714.                                 outword(addpoststring());
  13715.  
  13716.                         }
  13717.  
  13718.                         else outdword(addpoststring());
  13719.  
  13720.                         ClearReg(reg);
  13721.  
  13722.                         break;
  13723.  
  13724.                 default: valueexpected();       break;
  13725.  
  13726.         }
  13727.  
  13728. #ifdef OPTVARCONST
  13729.  
  13730.         calcnumber=FALSE;
  13731.  
  13732. #endif
  13733.  
  13734.         if(negflag)NegReg(razr,reg);
  13735.  
  13736.         if(swap){
  13737.  
  13738.                 negflag=0;
  13739.  
  13740.                 RegMulNum(reg,holdnumber,razr,0,&negflag,oflag);
  13741.  
  13742.                 ClearReg(reg);
  13743.  
  13744.         }
  13745.  
  13746.         if(next)nexttok();
  13747.  
  13748. //              printf("tok=%d num=%d tok2=%d\n",tok,itok.number,tok2);
  13749.  
  13750.         return rettype;
  13751.  
  13752. }
  13753.  
  13754.  
  13755.  
  13756. int getintobeg(int beg,char **ofsstr)   // get into beg (CL,DL,BL not others) with enum
  13757.  
  13758. {
  13759.  
  13760. int negflag=0,i=0;
  13761.  
  13762. int rettype=tk_beg;
  13763.  
  13764.         if(tok==tk_minus){
  13765.  
  13766.                 if(CheckMinusNum()==FALSE){
  13767.  
  13768.                         negflag=1;
  13769.  
  13770.                         getoperand(am32==TRUE?(beg>3?beg-4:beg):BX);
  13771.  
  13772.                 }
  13773.  
  13774.         }
  13775.  
  13776. #ifdef OPTVARCONST
  13777.  
  13778.         if(tok>=tk_charvar&&tok<=tk_doublevar&&itok.npointr==0){
  13779.  
  13780. //              printf("type1=%d type2=%d\n",itok.type,itok2.type);
  13781.  
  13782.                 if(CheckConstVar(&itok)){
  13783.  
  13784.                         tok=tk_number;
  13785.  
  13786.                         calcnumber=TRUE;
  13787.  
  13788.                 }
  13789.  
  13790.         }
  13791.  
  13792. #endif
  13793.  
  13794.         switch(tok){
  13795.  
  13796.                 case tk_number:
  13797.  
  13798.                         op(0xB0+beg);
  13799.  
  13800.                         i=(int)doconstlongmath();
  13801.  
  13802.                         op(i);
  13803.  
  13804.                         ConstToReg(i,beg,r8);
  13805.  
  13806.                         break;
  13807.  
  13808.                 case tk_rmnumber:
  13809.  
  13810.                         CheckAllMassiv(bufrm,itok.size,&strinf);
  13811.  
  13812.                         op66(r16);
  13813.  
  13814.                         op67(itok.sib==CODE16?r16:r32);
  13815.  
  13816.                         if(itok.post==0)outseg(&itok,2);
  13817.  
  13818.                         op(0x8D);                               // LEA reg,[rm]
  13819.  
  13820.                         op(beg*8+itok.rm);
  13821.  
  13822.                         if(itok.post!=0&&itok.post!=UNDEF_OFSET){
  13823.  
  13824.                                 if((itok.flag&f_extern)==0){
  13825.  
  13826.                                         unsigned int ooutptr=outptr;
  13827.  
  13828.                                         if(am32&&itok.rm==rm_sib)outptr++;
  13829.  
  13830.                                         setwordpost(&itok);
  13831.  
  13832.                                         outptr=ooutptr;
  13833.  
  13834.                                 }
  13835.  
  13836.                                 else setwordext(&itok.number);
  13837.  
  13838.                         }
  13839.  
  13840.                         outaddress(&itok);
  13841.  
  13842.                         ClearReg(beg%4);
  13843.  
  13844.                         break;
  13845.  
  13846.                 case tk_postnumber:
  13847.  
  13848.                         op66(r16);
  13849.  
  13850.                         op(0xB8+beg);
  13851.  
  13852.                         (itok.flag&f_extern)==0?setwordpost(&itok):setwordext(&itok.number);
  13853.  
  13854.                         outword((unsigned int)itok.number);
  13855.  
  13856.                         nexttok();
  13857.  
  13858.                         ClearReg(beg%4);
  13859.  
  13860.                         break;
  13861.  
  13862.                 case tk_qwordvar:
  13863.  
  13864.                         i=4;
  13865.  
  13866.                 case tk_longvar:
  13867.  
  13868.                 case tk_dwordvar:
  13869.  
  13870.                         i+=2;
  13871.  
  13872.                 case tk_intvar:
  13873.  
  13874.                 case tk_wordvar:
  13875.  
  13876.                         i++;
  13877.  
  13878.                 case tk_charvar:
  13879.  
  13880.                 case tk_bytevar:
  13881.  
  13882.                         i++;
  13883.  
  13884.                         CheckAllMassiv(bufrm,i,&strinf);
  13885.  
  13886.                         outseg(&itok,2);
  13887.  
  13888.                         op(0x8A);
  13889.  
  13890.                         op(beg*8+itok.rm);
  13891.  
  13892.                         outaddress(&itok);
  13893.  
  13894.                         nexttok();
  13895.  
  13896.                         ClearReg(beg%4);
  13897.  
  13898.                         break;
  13899.  
  13900.                 case tk_doublevar:
  13901.  
  13902.                         i=4;
  13903.  
  13904.                 case tk_floatvar:
  13905.  
  13906.                         Float2reg32((beg<4?beg:beg-4),i);
  13907.  
  13908.                         if(beg>3){
  13909.  
  13910.                                 op(0x88);
  13911.  
  13912.                                 op(0xC0+beg+8*(beg-4));
  13913.  
  13914.                         }
  13915.  
  13916.                         nexttok();
  13917.  
  13918.                         ClearReg(beg%4);
  13919.  
  13920.                         break;
  13921.  
  13922.                 case tk_bits:
  13923.  
  13924.                         int vops;
  13925.  
  13926.                         i=itok.bit.siz+itok.bit.ofs;
  13927.  
  13928.                         if(i<=64)vops=r64;
  13929.  
  13930.                         if(i<=32)vops=r32;
  13931.  
  13932.                         if(i<=16)vops=r16;
  13933.  
  13934.                         if(i<=8)vops=r8;
  13935.  
  13936.                         if(beg>BX&&vops!=r8){
  13937.  
  13938.                                 op66(vops==r64?r32:vops);
  13939.  
  13940.                                 op(0x50);
  13941.  
  13942.                                 if(ESPloc&&am32&&itok.segm==SS)itok.number+=4;
  13943.  
  13944.                                 addESP+=vops==r16?2:4;
  13945.  
  13946.                                 bits2reg(AX,vops);
  13947.  
  13948.                                 op(0x88);
  13949.  
  13950.                                 op(0xC0+beg);
  13951.  
  13952.                                 op66(vops==r64?r32:vops);
  13953.  
  13954.                                 addESP-=vops==r16?2:4;
  13955.  
  13956.                                 op(0x58);
  13957.  
  13958.                         }
  13959.  
  13960.                         else bits2reg(beg,vops);
  13961.  
  13962.                         nexttok();
  13963.  
  13964.                         break;
  13965.  
  13966.                 case tk_beg:
  13967.  
  13968.                         if(beg!=(int)itok.number){
  13969.  
  13970.                                 op(0x88);
  13971.  
  13972.                                 op(0xC0+beg+(unsigned int)itok.number*8);
  13973.  
  13974.                                 RegToReg(beg,itok.number,r8);
  13975.  
  13976.                         }
  13977.  
  13978.                         nexttok();
  13979.  
  13980.                         break;
  13981.  
  13982.                 case tk_reg32:
  13983.  
  13984.                 case tk_reg:
  13985.  
  13986.                         if(beg<BX){
  13987.  
  13988.                                 if(beg!=(int)itok.number){
  13989.  
  13990.                                         op66(r16);
  13991.  
  13992.                                         op(0x89);
  13993.  
  13994.                                         op(0xC0+beg+(unsigned int)itok.number*8);
  13995.  
  13996.                                         RegToReg(beg,itok.number,r8);
  13997.  
  13998.                                 }
  13999.  
  14000.                         }
  14001.  
  14002.                         else begworderror();
  14003.  
  14004.                         nexttok();
  14005.  
  14006.                         break;
  14007.  
  14008.                 case tk_seg:
  14009.  
  14010.                         op66(r16);
  14011.  
  14012.                         op(0x8C);
  14013.  
  14014.                         op(0xC0+beg+(unsigned int)itok.number*8);
  14015.  
  14016.                         nexttok();
  14017.  
  14018.                         ClearReg(beg%4);
  14019.  
  14020.                         break;
  14021.  
  14022.                 case tk_ID:
  14023.  
  14024.                 case tk_id:
  14025.  
  14026.                 case tk_proc:
  14027.  
  14028.                 case tk_apiproc:
  14029.  
  14030.                 case tk_undefproc:
  14031.  
  14032.                 case tk_declare:
  14033.  
  14034.                         if(itok.flag&f_retproc)rettype=(itok.flag&f_retproc)/256+tk_overflowflag-1;
  14035.  
  14036.                         procdo(tk_byte);
  14037.  
  14038.                         op(0x88);
  14039.  
  14040.                         op(0xc0+beg);
  14041.  
  14042.                         nexttok();
  14043.  
  14044.                         RegToReg(beg,AL,r8);
  14045.  
  14046.                         if(*ofsstr){
  14047.  
  14048.                                 free(*ofsstr);
  14049.  
  14050.                                 *ofsstr=NULL;
  14051.  
  14052.                         }
  14053.  
  14054.                         break;
  14055.  
  14056.                 default: valueexpected();       nexttok(); return 0;
  14057.  
  14058.         }
  14059.  
  14060. #ifdef OPTVARCONST
  14061.  
  14062.         calcnumber=FALSE;
  14063.  
  14064. #endif
  14065.  
  14066.         if(negflag){
  14067.  
  14068.                 if(optimizespeed&&(chip==5||chip==6)){
  14069.  
  14070.                         op(0x80);
  14071.  
  14072.                         op(0xF0+beg);
  14073.  
  14074.                         op(0xff);
  14075.  
  14076.                         op(0xFE);
  14077.  
  14078.                         op(0xC0+beg);
  14079.  
  14080.                 }
  14081.  
  14082.                 else{
  14083.  
  14084.                         op(0xF6);
  14085.  
  14086.                         op(0xD8+beg);   // NEG beg
  14087.  
  14088.                 }
  14089.  
  14090.                 ClearReg(beg%4);
  14091.  
  14092.         }
  14093.  
  14094.         return rettype;
  14095.  
  14096. }
  14097.  
  14098.  
  14099.  
  14100. void  outaddress(ITOK *outtok)
  14101.  
  14102. {
  14103.  
  14104. int rm=outtok->rm;
  14105.  
  14106.         if(outtok->sib==CODE16){
  14107.  
  14108.                 if(rm==rm_d16){
  14109.  
  14110.                         if(outtok->post==UNDEF_OFSET){
  14111.  
  14112.                                 AddUndefOff(2,outtok->name);
  14113.  
  14114.                                 outtok->post=0;
  14115.  
  14116.                         }
  14117.  
  14118.                         outword(outtok->number);
  14119.  
  14120.                 }
  14121.  
  14122.                 else{
  14123.  
  14124.                         rm&=rm_mod11;
  14125.  
  14126.                         if(rm==rm_mod11)internalerror(badadr);
  14127.  
  14128.                         else if(rm==rm_mod10){
  14129.  
  14130.                                 if(outtok->post==UNDEF_OFSET){
  14131.  
  14132.                                         AddUndefOff(2,outtok->name);
  14133.  
  14134.                                         outtok->post=0;
  14135.  
  14136.                                 }
  14137.  
  14138.                                 outword(outtok->number);
  14139.  
  14140.                         }
  14141.  
  14142.                         else if(rm!=rm_mod00)op(outtok->number);
  14143.  
  14144.                 }
  14145.  
  14146.         }
  14147.  
  14148.         else{
  14149.  
  14150.                 if(rm==rm_d32){
  14151.  
  14152.                         if(outtok->post==UNDEF_OFSET){
  14153.  
  14154.                                 AddUndefOff(2,outtok->name);
  14155.  
  14156.                                 outtok->post=0;
  14157.  
  14158.                         }
  14159.  
  14160.                         outdword(outtok->number);
  14161.  
  14162.                 }
  14163.  
  14164.                 else{
  14165.  
  14166.                         if((rm&7)==rm_sib){
  14167.  
  14168.                                 op(outtok->sib);
  14169.  
  14170.                                 if(rm==4&&(outtok->sib&7)==5){
  14171.  
  14172.                                         if(outtok->post==UNDEF_OFSET){
  14173.  
  14174.                                                 AddUndefOff(2,outtok->name);
  14175.  
  14176.                                                 outtok->post=0;
  14177.  
  14178.                                         }
  14179.  
  14180.                                         outdword(outtok->number);
  14181.  
  14182.                                 }
  14183.  
  14184.                         }
  14185.  
  14186.                         rm&=rm_mod11;
  14187.  
  14188.                         if(rm==rm_mod11)internalerror(badadr);
  14189.  
  14190.                         else if(rm==rm_mod10){
  14191.  
  14192.                                 if(outtok->post==UNDEF_OFSET){
  14193.  
  14194.                                         AddUndefOff(2,outtok->name);
  14195.  
  14196.                                         outtok->post=0;
  14197.  
  14198.                                 }
  14199.  
  14200.                                 outdword(outtok->number);
  14201.  
  14202.                         }
  14203.  
  14204.                         else if(rm==rm_mod01)op(outtok->number);
  14205.  
  14206.                 }
  14207.  
  14208.         }
  14209.  
  14210. }
  14211.  
  14212.  
  14213.  
  14214. /*-----------------05.01.00 23:37-------------------
  14215.  
  14216.  Ž¡à ¡®âª  float
  14217.  
  14218.  ®¯¥à æ¨¨ á ¯¥à¥¬¥­­ë¬¨ ⨯  float
  14219.  
  14220.  --------------------------------------------------*/
  14221.  
  14222. int dofloatvar(int addop,int retrez,int terminater)
  14223.  
  14224. {
  14225.  
  14226. unsigned char next=1, getfromEAX=0;
  14227.  
  14228. unsigned int vop=0,rettype=tk_float,posiblret=tk_float,sign=0;
  14229.  
  14230. char *wbuf,*rbuf;
  14231.  
  14232. ITOK wtok;
  14233.  
  14234. SINFO wstr;
  14235.  
  14236. int pointr=0;
  14237.  
  14238. int razr,i=0;
  14239.  
  14240. int type=tk_floatvar;
  14241.  
  14242.         if(addop){
  14243.  
  14244.                 rettype=posiblret=tk_double;
  14245.  
  14246.                 razr=8;
  14247.  
  14248.                 type=tk_doublevar;
  14249.  
  14250.         }
  14251.  
  14252.         wstr=strinf;
  14253.  
  14254.         strinf.bufstr=NULL;
  14255.  
  14256.         wtok=itok;
  14257.  
  14258.         wbuf=bufrm;
  14259.  
  14260.         bufrm=NULL;
  14261.  
  14262.         KillVar(itok.name);
  14263.  
  14264. char *ofsstr=NULL;
  14265.  
  14266.         nexttok();
  14267.  
  14268.         switch(tok){
  14269.  
  14270.                 case tk_assign: //=
  14271.  
  14272.                         getoperand(am32==TRUE?EAX:BX);
  14273.  
  14274.                         convert_type((int *)&sign,(int *)&rettype,&pointr);
  14275.  
  14276.                         if(tok2==tk_assign){
  14277.  
  14278.                                 MultiAssignFloat(type);
  14279.  
  14280.                                 next=0;
  14281.  
  14282.                                 goto getfromeax;
  14283.  
  14284.                         }
  14285.  
  14286.                         CheckMinusNum();
  14287.  
  14288.                         if(itok2.type==tp_opperand){    //á®áâ ¢­®¥
  14289.  
  14290.                                 if(tok==tk_number){     //¯à®¢¥àª  ¨ á㬬¨à®¢ ­¨¥ ç¨á¥«
  14291.  
  14292.                                         if(OnlyNumber(rettype==tk_float?2:3)){
  14293.  
  14294.                                                 next=0;
  14295.  
  14296.                                                 itok.flag=(unsigned char)postnumflag;
  14297.  
  14298.                                                 itok.rm=rettype;
  14299.  
  14300.                                                 goto numbertovar;
  14301.  
  14302.                                         }
  14303.  
  14304.                                 }
  14305.  
  14306.                                 getfromEAX=1;
  14307.  
  14308.                                 if(rettype==tk_char||rettype==tk_byte)doalmath(sign,&ofsstr);
  14309.  
  14310.                                 else if(rettype==tk_int||rettype==tk_word)do_e_axmath(sign,r16,&ofsstr);
  14311.  
  14312.                                 else if(rettype==tk_long||rettype==tk_dword)do_e_axmath(sign,r32,&ofsstr);
  14313.  
  14314.                                 else goto labl1;
  14315.  
  14316.                         }
  14317.  
  14318.                         else{
  14319.  
  14320.                                 switch(tok){
  14321.  
  14322.                                         case tk_number:
  14323.  
  14324. numbertovar:
  14325.  
  14326.                                                 if(rettype==tk_float){
  14327.  
  14328.                                                         if(itok.rm==tk_double)itok.fnumber=itok.dnumber;
  14329.  
  14330.                                                         else if(itok.rm!=tk_float){
  14331.  
  14332.                                                                 float temp=itok.number;
  14333.  
  14334.                                                                 *(float *)&itok.number=temp;
  14335.  
  14336.                                                         }
  14337.  
  14338.                                                 }
  14339.  
  14340.                                                 else{
  14341.  
  14342.                                                         if(itok.rm==tk_float)itok.dnumber=itok.fnumber;
  14343.  
  14344.                                                         else if(itok.rm!=tk_double)itok.dnumber=itok.lnumber;
  14345.  
  14346.                                                 }
  14347.  
  14348.                                                 CheckAllMassiv(wbuf,razr,&wstr,&wtok);
  14349.  
  14350.                                                 for(i=0;i<2;i++){
  14351.  
  14352.                                                         op66(r32);
  14353.  
  14354.                                                         if((itok.flag&f_reloc)==0&&itok.number==0){
  14355.  
  14356.                                                                 outseg(&wtok,2);
  14357.  
  14358.                                                                 op(0x83);
  14359.  
  14360.                                                                 op(wtok.rm+0x20);
  14361.  
  14362.                                                                 outaddress(&wtok);
  14363.  
  14364.                                                                 op(0);
  14365.  
  14366.                                                         }
  14367.  
  14368.                                                         else if(regoverstack&&short_ok(itok.number,TRUE)&&(itok.flag&f_reloc)==0){
  14369.  
  14370.                                                                 op(0x6A);
  14371.  
  14372.                                                                 op(itok.number);        //push short number
  14373.  
  14374.                                                                 op66(r32);
  14375.  
  14376.                                                                 outseg(&wtok,2);
  14377.  
  14378.                                                                 op(0x8f);
  14379.  
  14380.                                                                 op(wtok.rm);
  14381.  
  14382.                                                                 outaddress(&wtok);
  14383.  
  14384.                                                         }
  14385.  
  14386.                                                         else{
  14387.  
  14388.                                                                 outseg(&wtok,2);
  14389.  
  14390.                                                                 op(0xC7);       //mov word[],number
  14391.  
  14392.                                                                 op(wtok.rm);
  14393.  
  14394.                                                                 outaddress(&wtok);
  14395.  
  14396.                                                                 if((itok.flag&f_reloc)!=0)AddReloc();
  14397.  
  14398.                                                                 outdword(itok.number);
  14399.  
  14400.                                                         }
  14401.  
  14402.                                                         if(i==1||rettype==tk_float)break;
  14403.  
  14404.                                                         itok.lnumber>>=32;
  14405.  
  14406.                                                         wtok.number+=4;
  14407.  
  14408.                                                         compressoffset(&wtok);
  14409.  
  14410.                                                 }
  14411.  
  14412.                                                 break;
  14413.  
  14414.                                         case tk_doublevar:
  14415.  
  14416.                                         case tk_floatvar:
  14417.  
  14418.                                                 if(tok!=type)goto labl1;
  14419.  
  14420.                                                 ITOK w1tok;
  14421.  
  14422.                                                 char *w1buf;
  14423.  
  14424.                                                 w1buf=bufrm;
  14425.  
  14426.                                                 bufrm=NULL;
  14427.  
  14428.                                                 w1tok=itok;
  14429.  
  14430.                                                 SINFO w1str;
  14431.  
  14432.                                                 w1str=strinf;
  14433.  
  14434.                                                 strinf.bufstr=NULL;
  14435.  
  14436.                                                 getinto_e_ax(0,tok==tk_floatvar?tk_dwordvar:tk_qwordvar,&w1tok,w1buf,&w1str,r32);
  14437.  
  14438.                                                 if(tok==tk_doublevar){
  14439.  
  14440.                                                         if((wtok.rm==rm_d16&&wtok.sib==CODE16)||(wtok.rm==rm_d32&&wtok.sib==CODE32)){
  14441.  
  14442.                                                                 op66(r32);
  14443.  
  14444.                                                                 outseg(&wtok,1);
  14445.  
  14446.                                                                 op(0xA3);       // MOV [dword],EAX
  14447.  
  14448.                                                                 if(am32)outdword(wtok.number);
  14449.  
  14450.                                                                 else outword(wtok.number);
  14451.  
  14452.                                                         }
  14453.  
  14454.                                                         else{
  14455.  
  14456.                                                                 CheckAllMassiv(wbuf,4,&wstr,&wtok);
  14457.  
  14458.                                                                 op66(r32);
  14459.  
  14460.                                                                 outseg(&wtok,2);
  14461.  
  14462.                                                                 op(0x89); op(wtok.rm); // MOV [rmdword],EAX
  14463.  
  14464.                                                                 outaddress(&wtok);
  14465.  
  14466.                                                         }
  14467.  
  14468.                                                         itok.number+=4;
  14469.  
  14470.                                                         compressoffset(&itok);
  14471.  
  14472.                                                         wtok.number+=4;
  14473.  
  14474.                                                         compressoffset(&wtok);
  14475.  
  14476.                                                         ITOK w1tok;
  14477.  
  14478.                                                         char *w1buf;
  14479.  
  14480.                                                         w1buf=bufrm;
  14481.  
  14482.                                                         bufrm=NULL;
  14483.  
  14484.                                                         w1tok=itok;
  14485.  
  14486.                                                         SINFO w1str;
  14487.  
  14488.                                                         w1str=strinf;
  14489.  
  14490.                                                         strinf.bufstr=NULL;
  14491.  
  14492.                                                         getinto_e_ax(0,tk_qwordvar,&w1tok,w1buf,&w1str,r32);
  14493.  
  14494.                                                 }
  14495.  
  14496.                                                 getfromEAX=1;
  14497.  
  14498.                                                 break;
  14499.  
  14500.                                         default:
  14501.  
  14502. labl1:
  14503.  
  14504.                                                 if((i=doeaxfloatmath(tk_fpust))==tk_fpust||i==tk_double){
  14505.  
  14506.                                                         getfromEAX=0;
  14507.  
  14508.                                                         if(retrez==tk_floatvar||retrez==tk_doublevar){
  14509.  
  14510.                                                                 CheckAllMassiv(wbuf,razr,&wstr,&wtok);
  14511.  
  14512.                                                                 outseg(&wtok,2);
  14513.  
  14514.                                                                 op(0xd9+addop);
  14515.  
  14516.                                                                 op(wtok.rm+0x18);
  14517.  
  14518.                                                                 outaddress(&wtok);
  14519.  
  14520.                                                                 fwait3();
  14521.  
  14522.                                                         }
  14523.  
  14524.                                                         else retrez=tk_fpust;
  14525.  
  14526.                                                 }
  14527.  
  14528.                                                 else getfromEAX=1;
  14529.  
  14530.                                                 next=0;
  14531.  
  14532.                                 }
  14533.  
  14534.                         }
  14535.  
  14536.                         if(getfromEAX){
  14537.  
  14538. getfromeax:
  14539.  
  14540.                                 retrez=tk_reg32;
  14541.  
  14542.                                 convert_returnvalue(posiblret,rettype);
  14543.  
  14544.                                 if((wtok.rm==rm_d16&&wtok.sib==CODE16)||(wtok.rm==rm_d32&&wtok.sib==CODE32)){
  14545.  
  14546.                                         op66(r32);
  14547.  
  14548.                                         outseg(&wtok,1);
  14549.  
  14550.                                         op(0xA3);       // MOV [dword],EAX
  14551.  
  14552.                                         if(am32)outdword(wtok.number);
  14553.  
  14554.                                         else outword(wtok.number);
  14555.  
  14556.                                 }
  14557.  
  14558.                                 else{
  14559.  
  14560.                                         CheckAllMassiv(wbuf,4,&wstr,&wtok);
  14561.  
  14562.                                         op66(r32);
  14563.  
  14564.                                         outseg(&wtok,2);
  14565.  
  14566.                                         op(0x89); op(wtok.rm); // MOV [rmdword],EAX
  14567.  
  14568.                                         outaddress(&wtok);
  14569.  
  14570.                                 }
  14571.  
  14572.                         }
  14573.  
  14574.                         break;
  14575.  
  14576.                 case tk_minusminus:
  14577.  
  14578.                         vop=0x28;
  14579.  
  14580.                 case tk_plusplus:
  14581.  
  14582. incvar:
  14583.  
  14584.                         outword(0xe8d9);        //fld1
  14585.  
  14586.                         CheckAllMassiv(wbuf,razr,&wstr,&wtok);
  14587.  
  14588.                         outseg(&wtok,2);        //fadd var
  14589.  
  14590.                         op(0xd8+addop);
  14591.  
  14592.                         op(wtok.rm+vop);
  14593.  
  14594.                         outaddress(&wtok);
  14595.  
  14596.                         if(retrez==tk_floatvar||retrez==tk_doublevar){
  14597.  
  14598.                                 outseg(&wtok,2);        //fstp var
  14599.  
  14600.                                 op(0xd9+addop);
  14601.  
  14602.                                 op(wtok.rm+0x18);
  14603.  
  14604.                                 outaddress(&wtok);
  14605.  
  14606.                                 fwait3();
  14607.  
  14608.                         }
  14609.  
  14610.                         break;
  14611.  
  14612.                 case tk_divequals: vop+=0x10;
  14613.  
  14614.                 case tk_minusequals: vop+=0x20;
  14615.  
  14616.                 case tk_multequals: vop+=8;
  14617.  
  14618.                 case tk_plusequals:
  14619.  
  14620.                         getoperand(am32==TRUE?EAX:BX);
  14621.  
  14622.                         if(itok2.type==tp_stopper){
  14623.  
  14624.                                 if(tok==tk_number){
  14625.  
  14626.                                         if((itok.rm==tk_float&&itok.fnumber==1.0)||
  14627.  
  14628.                                                         (itok.rm==tk_double&&itok.dnumber==1.0)||
  14629.  
  14630.                                                         (itok.rm!=tk_float&&itok.rm!=tk_double&&itok.lnumber==1)){
  14631.  
  14632.                                                 if(vop==0||vop==0x28)goto incvar;
  14633.  
  14634.                                                 break;
  14635.  
  14636.                                         }
  14637.  
  14638.                                         if((itok.rm==tk_float&&itok.fnumber==0.0)||
  14639.  
  14640.                                                         (itok.rm==tk_double&&itok.dnumber==0.0)||itok.lnumber==0){
  14641.  
  14642.                                                 switch(vop){
  14643.  
  14644.                                                         case 0x38:
  14645.  
  14646.                                                                 DevideZero();
  14647.  
  14648.                                                                 break;
  14649.  
  14650.                                                         case 8:
  14651.  
  14652.                                                                 outword(0xEED9);        //FLDZ
  14653.  
  14654.                                                                 if(retrez==tk_floatvar||retrez==tk_doublevar){
  14655.  
  14656.                                                                         CheckAllMassiv(wbuf,razr,&wstr,&wtok);
  14657.  
  14658.                                                                         outseg(&wtok,2);        //fstp var
  14659.  
  14660.                                                                         op(0xd9+addop);
  14661.  
  14662.                                                                         op(wtok.rm+0x18);
  14663.  
  14664.                                                                         outaddress(&wtok);
  14665.  
  14666.                                                                         fwait3();
  14667.  
  14668.                                                                 }
  14669.  
  14670.                                                                 break;
  14671.  
  14672.                                                 }
  14673.  
  14674.                                                 break;
  14675.  
  14676.                                         }
  14677.  
  14678.                                 }
  14679.  
  14680.                         }
  14681.  
  14682.                         if(itok2.type==tp_opperand){
  14683.  
  14684.                                 doeaxfloatmath(tk_fpust);
  14685.  
  14686. endequals:
  14687.  
  14688.                                 next=0;
  14689.  
  14690. endequals1:
  14691.  
  14692.                                 CheckAllMassiv(wbuf,razr,&wstr,&wtok);
  14693.  
  14694.                                 outseg(&wtok,2);        //fsubr var
  14695.  
  14696.                                 op(0xd8+addop);
  14697.  
  14698.                                 op(wtok.rm+vop);
  14699.  
  14700.                                 outaddress(&wtok);
  14701.  
  14702.                                 if(retrez==tk_floatvar||retrez==tk_doublevar){
  14703.  
  14704.                                         outseg(&wtok,2);        //fstp var
  14705.  
  14706.                                         op(0xd9+addop);
  14707.  
  14708.                                         op(wtok.rm+0x18);
  14709.  
  14710.                                         outaddress(&wtok);
  14711.  
  14712.                                         fwait3();
  14713.  
  14714.                                 }
  14715.  
  14716.                         }
  14717.  
  14718.                         else{
  14719.  
  14720.                                 switch(tok){
  14721.  
  14722.                                         case tk_number:
  14723.  
  14724.                                                 if(rettype==tk_float){
  14725.  
  14726.                                                         if(itok.rm==tk_double)itok.fnumber=itok.dnumber;
  14727.  
  14728.                                                         else if(itok.rm!=tk_float){
  14729.  
  14730.                                                                 float temp=itok.number;
  14731.  
  14732.                                                                 *(float *)&itok.number=temp;
  14733.  
  14734.                                                         }
  14735.  
  14736.                                                 }
  14737.  
  14738.                                                 else{
  14739.  
  14740.                                                         if(itok.rm==tk_float)itok.dnumber=itok.fnumber;
  14741.  
  14742.                                                         else if(itok.rm!=tk_double)itok.dnumber=itok.lnumber;
  14743.  
  14744.                                                 }
  14745.  
  14746.  
  14747.  
  14748.                                                 if(vop==0x38){  // div 22.12.05 22:10
  14749.  
  14750.                                                         vop=8;  //mult
  14751.  
  14752.                                                         if(itok.rm==tk_float)itok.fnumber=1/itok.fnumber;
  14753.  
  14754.                                                         else itok.dnumber=1/itok.dnumber;
  14755.  
  14756.                                                 }
  14757.  
  14758.  
  14759.  
  14760.                                                 op66(r32);
  14761.  
  14762.                                                 op(0xD9+addop);
  14763.  
  14764.                                                 op((am32==FALSE?0x06:0x05));    //fld
  14765.  
  14766.                                                 AddFloatConst(itok.lnumber,rettype);
  14767.  
  14768.                                                 outword(0);
  14769.  
  14770.                                                 if(am32)outword(0);
  14771.  
  14772.                                                 CheckAllMassiv(wbuf,razr,&wstr,&wtok);
  14773.  
  14774.                                                 outseg(&wtok,2);        //fsubr var
  14775.  
  14776.                                                 op(0xd8+addop);
  14777.  
  14778.                                                 op(wtok.rm+vop);
  14779.  
  14780.                                                 outaddress(&wtok);
  14781.  
  14782.                                                 if(retrez==tk_floatvar||retrez==tk_doublevar){
  14783.  
  14784.                                                         outseg(&wtok,2);        //fstp var
  14785.  
  14786.                                                         op(0xd9+addop);
  14787.  
  14788.                                                         op(wtok.rm+0x18);
  14789.  
  14790.                                                         outaddress(&wtok);
  14791.  
  14792.                                                         fwait3();
  14793.  
  14794.                                                 }
  14795.  
  14796.                                                 break;
  14797.  
  14798.                                         case tk_longvar:
  14799.  
  14800.                                                 sign=2;
  14801.  
  14802.                                         case tk_floatvar:
  14803.  
  14804.                                                 CheckAllMassiv(bufrm,4,&strinf);
  14805.  
  14806.                                                 outseg(&itok,2);        //fld val or fild val
  14807.  
  14808.                                                 op(0xd9+sign);
  14809.  
  14810.                                                 op(itok.rm);
  14811.  
  14812.                                                 outaddress(&itok);
  14813.  
  14814.                                                 goto endequals1;
  14815.  
  14816.                                         case tk_qwordvar:
  14817.  
  14818.                                                 sign=2;
  14819.  
  14820.                                                 i=0x28;
  14821.  
  14822.                                         case tk_doublevar:
  14823.  
  14824.                                                 CheckAllMassiv(bufrm,8,&strinf);
  14825.  
  14826.                                                 outseg(&itok,2);        //fldq val or fild val
  14827.  
  14828.                                                 op(0xdd+sign);
  14829.  
  14830.                                                 op(itok.rm+i);
  14831.  
  14832.                                                 outaddress(&itok);
  14833.  
  14834.                                                 goto endequals1;
  14835.  
  14836.                                         case tk_dwordvar:
  14837.  
  14838.                                                 CheckInitBP();
  14839.  
  14840.                                                 op66(r32);              //push 0L
  14841.  
  14842.                                                 outword(0x6a);
  14843.  
  14844.                                                 if(ESPloc&&am32&&itok.segm==SS)itok.number+=4;
  14845.  
  14846.                                                 addESP+=4;
  14847.  
  14848.                                                 CheckAllMassiv(bufrm,4,&strinf);
  14849.  
  14850.                                                 op66(r32);              //push var
  14851.  
  14852.                                                 outseg(&itok,2);
  14853.  
  14854.                                                 op(0xFF);
  14855.  
  14856.                                                 op(itok.rm+0x30);
  14857.  
  14858.                                                 outaddress(&itok);
  14859.  
  14860.                                                 if(ESPloc&&am32&&wtok.segm==SS)wtok.number+=4;
  14861.  
  14862.                                                 addESP+=4;
  14863.  
  14864.                                                 fildq_stack();
  14865.  
  14866.                                                 CheckAllMassiv(wbuf,razr,&wstr,&wtok);
  14867.  
  14868.                                                 outseg(&wtok,2);        //fsubr var
  14869.  
  14870.                                                 op(0xd8+addop);
  14871.  
  14872.                                                 op(wtok.rm+vop);
  14873.  
  14874.                                                 outaddress(&wtok);
  14875.  
  14876.                                                 if(optimizespeed||am32==0){
  14877.  
  14878.                                                         outword(0xC483);
  14879.  
  14880.                                                         op(8);
  14881.  
  14882.                                                 }
  14883.  
  14884.                                                 else{
  14885.  
  14886.                                                         op(0x58);       // pop EAX
  14887.  
  14888.                                                         op(0x58);       // pop EAX
  14889.  
  14890.                                                 }
  14891.  
  14892.                                                 addESP-=8;
  14893.  
  14894.                                                 if(retrez==tk_floatvar||retrez==tk_doublevar){
  14895.  
  14896.                                                         outseg(&wtok,2);        //fstp var
  14897.  
  14898.                                                         op(0xd9+addop);
  14899.  
  14900.                                                         op(wtok.rm+0x18);
  14901.  
  14902.                                                         outaddress(&wtok);
  14903.  
  14904.                                                         fwait3();
  14905.  
  14906.                                                 }
  14907.  
  14908.                                                 RestoreBP();
  14909.  
  14910.                                                 break;
  14911.  
  14912.                                         case tk_reg32:  //¤®¡ ¢¨âì ®¡à ¡®âªã ¨­â¥à¯à¨â æ¨¨ float, long
  14913.  
  14914.                                                 CheckInitBP();
  14915.  
  14916.                                                 op66(r32);      //push 0L
  14917.  
  14918.                                                 outword(0x6a);
  14919.  
  14920.                                                 op66(r32);  //push reg32
  14921.  
  14922.                                                 op(0x50+(unsigned int)itok.number);
  14923.  
  14924.                                                 if(ESPloc&&am32&&wtok.segm==SS)wtok.number+=8;
  14925.  
  14926.                                                 addESP+=8;
  14927.  
  14928.                                                 fildq_stack();
  14929.  
  14930.                                                 CheckAllMassiv(wbuf,razr,&wstr,&wtok);
  14931.  
  14932.                                                 outseg(&wtok,2);        //fsubr var
  14933.  
  14934.                                                 op(0xd8+addop);
  14935.  
  14936.                                                 op(wtok.rm+vop);
  14937.  
  14938.                                                 outaddress(&wtok);
  14939.  
  14940.                                                 if(optimizespeed||am32==0){
  14941.  
  14942.                                                         outword(0xC483);
  14943.  
  14944.                                                         op(8);
  14945.  
  14946.                                                 }
  14947.  
  14948.                                                 else{
  14949.  
  14950.                                                         op(0x58);       // pop EAX
  14951.  
  14952.                                                         op(0x58);       // pop EAX
  14953.  
  14954.                                                 }
  14955.  
  14956.                                                 addESP-=8;
  14957.  
  14958.                                                 if(retrez==tk_floatvar||retrez==tk_doublevar){
  14959.  
  14960.                                                         outseg(&wtok,2);        //fstp var
  14961.  
  14962.                                                         op(0xd9+addop);
  14963.  
  14964.                                                         op(wtok.rm+0x18);
  14965.  
  14966.                                                         outaddress(&wtok);
  14967.  
  14968.                                                         fwait3();
  14969.  
  14970.                                                 }
  14971.  
  14972.                                                 RestoreBP();
  14973.  
  14974.                                                 break;
  14975.  
  14976.                                         default:
  14977.  
  14978.                                                 if(doeaxfloatmath(tk_fpust)==tk_assign){
  14979.  
  14980.                                                         CheckInitBP();
  14981.  
  14982.                                                         op66(r32);  //push EAX
  14983.  
  14984.                                                         op(0x50);
  14985.  
  14986.                                                         op(0xD9+addop);
  14987.  
  14988.                                                         fld_stack(4+localsize);
  14989.  
  14990.                                                         fwait3();
  14991.  
  14992.                                                         RestoreBP();
  14993.  
  14994.                                                         op66(r32);
  14995.  
  14996.                                                         op(0x58);
  14997.  
  14998.                                                 }
  14999.  
  15000.                                                 goto endequals;
  15001.  
  15002.                                 }
  15003.  
  15004.                         }
  15005.  
  15006.                         break;
  15007.  
  15008.                 case tk_swap:
  15009.  
  15010.                         int regdi;
  15011.  
  15012.                         regdi=TRUE;
  15013.  
  15014.                         getoperand();
  15015.  
  15016.                         rbuf=bufrm;
  15017.  
  15018.                         bufrm=NULL;
  15019.  
  15020.                         if(am32!=FALSE&&wbuf!=NULL&&wstr.bufstr!=NULL)regdi=FALSE;
  15021.  
  15022.                         switch(tok){
  15023.  
  15024.                                 case tk_reg32:  //¤®¡ ¢¨âì ®¡à ¡®âªã ¨­â¥à¯à¨â æ¨¨ float, long
  15025.  
  15026.                                         CheckInitBP();
  15027.  
  15028.                                         op66(r32);              //push 0L
  15029.  
  15030.                                         outword(0x6a);
  15031.  
  15032.                                         op66(r32);     //push reg32
  15033.  
  15034.                                         op(0x50+(unsigned int)itok.number);
  15035.  
  15036.                                         if(ESPloc&&am32&&wtok.segm==SS)wtok.number+=8;
  15037.  
  15038.                                         addESP+=8;
  15039.  
  15040.                                         fildq_stack();
  15041.  
  15042.                                         CheckAllMassiv(wbuf,razr,&wstr,&wtok);
  15043.  
  15044.                                         outseg(&wtok,2);        //fld val
  15045.  
  15046.                                         op(0xd9+addop);
  15047.  
  15048.                                         op(wtok.rm);
  15049.  
  15050.                                         outaddress(&wtok);
  15051.  
  15052.                                         op(0xdb);
  15053.  
  15054.                                         if(am32){
  15055.  
  15056.                                                 if(optimizespeed)outword(0x241c);       //fistp ssdword[bp-8]/ssdword[esp]
  15057.  
  15058.                                                 else{
  15059.  
  15060.                                                         outword(0x245C);
  15061.  
  15062.                                                         op(4);
  15063.  
  15064.                                                 }
  15065.  
  15066.                                         }
  15067.  
  15068.                                         else{
  15069.  
  15070.                                                 int dob;
  15071.  
  15072.                                                 dob=8;
  15073.  
  15074.                                                 if(!optimizespeed)dob=4;
  15075.  
  15076.                                                 if(short_ok(localsize+dob,FALSE)==0){
  15077.  
  15078.                                                         op(0x9E);
  15079.  
  15080.                                                         outword(-dob-localsize);
  15081.  
  15082.                                                 }
  15083.  
  15084.                                                 else{
  15085.  
  15086.                                                         op(0x5E);
  15087.  
  15088.                                                         op(-dob-localsize);
  15089.  
  15090.                                                 }
  15091.  
  15092.                                         }
  15093.  
  15094.                                         outseg(&wtok,2);//fstp val
  15095.  
  15096.                                         op(0xd9+addop);
  15097.  
  15098.                                         op(wtok.rm+0x18);
  15099.  
  15100.                                         outaddress(&wtok);
  15101.  
  15102.                                         fwait3();
  15103.  
  15104.                                         op66(r32);     // pop reg32
  15105.  
  15106.                                   op(0x58+(unsigned int)itok.number);
  15107.  
  15108.                                         if(!optimizespeed){
  15109.  
  15110.                                                 op66(r32);     // pop reg32
  15111.  
  15112.                                           op(0x58+(unsigned int)itok.number);
  15113.  
  15114.                                         }
  15115.  
  15116.                                         else{
  15117.  
  15118.                                                 outword(0xC483);
  15119.  
  15120.                                                 op(4);
  15121.  
  15122.                                         }
  15123.  
  15124.                                         addESP-=8;
  15125.  
  15126.                                         RestoreBP();
  15127.  
  15128.                                         break;
  15129.  
  15130.                                 case tk_longvar:
  15131.  
  15132.                                         CheckAllMassiv(rbuf,4,&strinf,&itok,regdi==FALSE?idxregs[2]:idxregs[1],idxregs[3]);
  15133.  
  15134.                                         outseg(&itok,2);        //fild
  15135.  
  15136.                                         op(0xDB);
  15137.  
  15138.                                         op(itok.rm);
  15139.  
  15140.                                         outaddress(&itok);
  15141.  
  15142.                                         CheckAllMassiv(wbuf,razr,&wstr,&wtok);
  15143.  
  15144.                                         outseg(&wtok,2);        //fld val
  15145.  
  15146.                                         op(0xd9+addop);
  15147.  
  15148.                                         op(wtok.rm);
  15149.  
  15150.                                         outaddress(&wtok);
  15151.  
  15152.                                         outseg(&itok,2);//fistp var
  15153.  
  15154.                                         op(0xDB);
  15155.  
  15156.                                         op(itok.rm+0x18);
  15157.  
  15158.                                         outaddress(&itok);
  15159.  
  15160.                                         outseg(&wtok,2);        //fstp val
  15161.  
  15162.                                         op(0xd9+addop);
  15163.  
  15164.                                         op(wtok.rm+0x18);
  15165.  
  15166.                                         outaddress(&wtok);
  15167.  
  15168.                                         fwait3();
  15169.  
  15170.                                         break;
  15171.  
  15172.                                 case tk_qwordvar:
  15173.  
  15174.                                         CheckAllMassiv(rbuf,8,&strinf,&itok,regdi==FALSE?idxregs[2]:idxregs[1],idxregs[3]);
  15175.  
  15176.                                         outseg(&itok,2);        //fildq val
  15177.  
  15178.                                         op(0xdd);
  15179.  
  15180.                                         op(itok.rm+0x28);
  15181.  
  15182.                                         outaddress(&itok);
  15183.  
  15184.                                         CheckAllMassiv(wbuf,razr,&wstr,&wtok);
  15185.  
  15186.                                         outseg(&wtok,2);        //fld val
  15187.  
  15188.                                         op(0xd9+addop);
  15189.  
  15190.                                         op(wtok.rm);
  15191.  
  15192.                                         outaddress(&wtok);
  15193.  
  15194.                                         outseg(&itok,2);        //fistp val
  15195.  
  15196.                                         op(0xdf);
  15197.  
  15198.                                         op(itok.rm+0x38);
  15199.  
  15200.                                         outaddress(&itok);
  15201.  
  15202.                                         outseg(&wtok,2);        //fstp val
  15203.  
  15204.                                         op(0xd9+addop);
  15205.  
  15206.                                         op(wtok.rm+0x18);
  15207.  
  15208.                                         outaddress(&wtok);
  15209.  
  15210.                                         fwait3();
  15211.  
  15212.                                         break;
  15213.  
  15214.                                 case tk_dwordvar:
  15215.  
  15216.                                         CheckInitBP();
  15217.  
  15218.                                         op66(r32);      //push 0L
  15219.  
  15220.                                         outword(0x6a);
  15221.  
  15222.                                         if(ESPloc&&am32&&itok.segm==SS)itok.number+=4;
  15223.  
  15224.                                         addESP+=4;
  15225.  
  15226.                                         CheckAllMassiv(rbuf,4,&strinf,&itok,regdi==FALSE?idxregs[2]:idxregs[1],idxregs[3]);
  15227.  
  15228.                                         op66(r32);      //push var
  15229.  
  15230.                                         outseg(&itok,2);
  15231.  
  15232.                                         op(0xFF);
  15233.  
  15234.                                         op(itok.rm+0x30);
  15235.  
  15236.                                         outaddress(&itok);
  15237.  
  15238.                                         if(ESPloc&&am32&&wtok.segm==SS)wtok.number+=4;
  15239.  
  15240.                                         addESP+=4;
  15241.  
  15242.                                         fildq_stack();
  15243.  
  15244.                                         CheckAllMassiv(wbuf,razr,&wstr,&wtok);
  15245.  
  15246.                                         outseg(&wtok,2);        //fld val
  15247.  
  15248.                                         op(0xd9+addop);
  15249.  
  15250.                                         op(wtok.rm);
  15251.  
  15252.                                         outaddress(&wtok);
  15253.  
  15254.                                         if(optimizespeed||am32==FALSE){
  15255.  
  15256.                                                 outword(0xC483);
  15257.  
  15258.                                                 op(8);
  15259.  
  15260.                                         }
  15261.  
  15262.                                         else{
  15263.  
  15264.                                                 op(0x58);       // pop EAX
  15265.  
  15266.                                                 op(0x58);       // pop EAX
  15267.  
  15268.                                         }
  15269.  
  15270.                                         addESP-=8;
  15271.  
  15272.                                         outseg(&itok,2);//fistp var
  15273.  
  15274.                                         op(0xDB);
  15275.  
  15276.                                         op(itok.rm+0x18);
  15277.  
  15278.                                         outaddress(&itok);
  15279.  
  15280.                                         outseg(&wtok,2);        //fstp val
  15281.  
  15282.                                         op(0xd9+addop);
  15283.  
  15284.                                         op(wtok.rm+0x18);
  15285.  
  15286.                                         outaddress(&wtok);
  15287.  
  15288.                                         fwait3();
  15289.  
  15290.                                         RestoreBP();
  15291.  
  15292.                                         break;
  15293.  
  15294.                                 case tk_floatvar:
  15295.  
  15296.                                         if(rettype==tk_double){
  15297.  
  15298.                                                 CheckAllMassiv(rbuf,4,&strinf,&itok,regdi==FALSE?idxregs[2]:idxregs[1],idxregs[3]);
  15299.  
  15300.                                                 outseg(&itok,2);        //fld val
  15301.  
  15302.                                                 op(0xd9);
  15303.  
  15304.                                                 op(itok.rm);
  15305.  
  15306.                                                 outaddress(&itok);
  15307.  
  15308.                                                 CheckAllMassiv(wbuf,8,&wstr,&wtok);
  15309.  
  15310.                                                 outseg(&wtok,2);        //fstp val
  15311.  
  15312.                                                 op(0xdd);
  15313.  
  15314.                                                 op(wtok.rm);
  15315.  
  15316.                                                 outaddress(&wtok);
  15317.  
  15318.                                                 outseg(&itok,2);        //fstp val
  15319.  
  15320.                                                 op(0xd9);
  15321.  
  15322.                                                 op(itok.rm+0x18);
  15323.  
  15324.                                                 outaddress(&itok);
  15325.  
  15326.                                                 outseg(&wtok,2);        //fstp val
  15327.  
  15328.                                                 op(0xdd);
  15329.  
  15330.                                                 op(wtok.rm+0x18);
  15331.  
  15332.                                                 outaddress(&wtok);
  15333.  
  15334.                                                 fwait3();
  15335.  
  15336.                                         }
  15337.  
  15338.                                         else{
  15339.  
  15340.                                                 getinto_e_ax(0,tk_dwordvar,&wtok,wbuf,&wstr,r32);
  15341.  
  15342.                                                 CheckAllMassiv(rbuf,4,&strinf,&itok,regdi==FALSE?idxregs[2]:idxregs[1],idxregs[3]);
  15343.  
  15344.                                                 op66(r32);
  15345.  
  15346.                                                 outseg(&itok,2);// XCHG EAX,[dword]
  15347.  
  15348.                                                 op(0x87); op(itok.rm);
  15349.  
  15350.                                                 outaddress(&itok);
  15351.  
  15352.                                                 goto getfromeax;
  15353.  
  15354.                                         }
  15355.  
  15356.                                         break;
  15357.  
  15358.                                 case tk_doublevar:
  15359.  
  15360.                                         if(rettype==tk_float){
  15361.  
  15362.                                                 CheckAllMassiv(rbuf,4,&strinf,&itok,regdi==FALSE?idxregs[2]:idxregs[1],idxregs[3]);
  15363.  
  15364.                                                 outseg(&itok,2);        //fldq val
  15365.  
  15366.                                                 op(0xdd);
  15367.  
  15368.                                                 op(itok.rm);
  15369.  
  15370.                                                 outaddress(&itok);
  15371.  
  15372.                                                 CheckAllMassiv(wbuf,8,&wstr,&wtok);
  15373.  
  15374.                                                 outseg(&wtok,2);        //fld val
  15375.  
  15376.                                                 op(0xd9);
  15377.  
  15378.                                                 op(wtok.rm);
  15379.  
  15380.                                                 outaddress(&wtok);
  15381.  
  15382.                                                 outseg(&itok,2);        //fstp val
  15383.  
  15384.                                                 op(0xdd);
  15385.  
  15386.                                                 op(itok.rm+0x18);
  15387.  
  15388.                                                 outaddress(&itok);
  15389.  
  15390.                                                 outseg(&wtok,2);        //fstp val
  15391.  
  15392.                                                 op(0xd9);
  15393.  
  15394.                                                 op(wtok.rm+0x18);
  15395.  
  15396.                                                 outaddress(&wtok);
  15397.  
  15398.                                                 fwait3();
  15399.  
  15400.                                         }
  15401.  
  15402.                                         else{
  15403.  
  15404.                                                 getinto_e_ax(0,tk_dwordvar,&wtok,wbuf,&wstr,r32);
  15405.  
  15406.                                                 CheckAllMassiv(rbuf,4,&strinf,&itok,regdi==FALSE?idxregs[2]:idxregs[1],idxregs[3]);
  15407.  
  15408.                                                 op66(r32);
  15409.  
  15410.                                                 outseg(&itok,2);// XCHG EAX,[dword]
  15411.  
  15412.                                                 op(0x87); op(itok.rm);
  15413.  
  15414.                                                 outaddress(&itok);
  15415.  
  15416.                                                 goto getfromeax;
  15417.  
  15418.                                         }
  15419.  
  15420.                                         break;
  15421.  
  15422.                                 case tk_fpust:
  15423.  
  15424.                                         if(itok.number>6)fpustdestroed();
  15425.  
  15426.                                         CheckAllMassiv(wbuf,razr,&wstr,&wtok);
  15427.  
  15428.                                         outseg(&wtok,2);        //fld val
  15429.  
  15430.                                         op(0xd9+addop);
  15431.  
  15432.                                         op(wtok.rm);
  15433.  
  15434.                                         outaddress(&wtok);
  15435.  
  15436.                                         op(0xD9);
  15437.  
  15438.                                         op(0xC8+itok.number+1);
  15439.  
  15440.                                         outseg(&wtok,2);        //fstp val
  15441.  
  15442.                                         op(0xd9+addop);
  15443.  
  15444.                                         op(wtok.rm+0x18);
  15445.  
  15446.                                         outaddress(&wtok);
  15447.  
  15448.                                         break;
  15449.  
  15450.                                 default: swaperror(); break;
  15451.  
  15452.                         }
  15453.  
  15454.                         break;
  15455.  
  15456.                 default: operatorexpected(); break;
  15457.  
  15458.         }
  15459.  
  15460.         if(next)nexttok();
  15461.  
  15462.         if(terminater==tk_semicolon)seminext();
  15463.  
  15464.         if(cpu<3)cpu=3;
  15465.  
  15466.         return retrez;
  15467.  
  15468. }
  15469.  
  15470.  
  15471.  
  15472. void fildq2_stack(int size)
  15473.  
  15474. {
  15475.  
  15476.         op(0xdf);
  15477.  
  15478.         if(am32)outword(0x242c);        //fildq ssdword[bp-8]/ssdword[esp]
  15479.  
  15480.         else{
  15481.  
  15482.                 if(short_ok(size,FALSE)==0){
  15483.  
  15484.                         op(0xAE);
  15485.  
  15486.                         outword(-size);
  15487.  
  15488.                 }
  15489.  
  15490.                 else{
  15491.  
  15492.                         op(0x6E);
  15493.  
  15494.                         op(-size);
  15495.  
  15496.                 }
  15497.  
  15498.         }
  15499.  
  15500. }
  15501.  
  15502.  
  15503.  
  15504. void fildq_stack()
  15505.  
  15506. {
  15507.  
  15508.         fildq2_stack(localsize+8);
  15509.  
  15510. }
  15511.  
  15512.  
  15513.  
  15514. void fistp2_stack(int size)
  15515.  
  15516. {
  15517.  
  15518.         if(am32)outword(0x241c);        //fistp ssdword[ebp+2]/ssdword[esp]
  15519.  
  15520.         else{
  15521.  
  15522.                 if(short_ok(size,FALSE)==0){
  15523.  
  15524.                         op(0x9E);
  15525.  
  15526.                         outword(-size);
  15527.  
  15528.                 }
  15529.  
  15530.                 else{
  15531.  
  15532.                         op(0x5E);
  15533.  
  15534.                         op(-size);
  15535.  
  15536.                 }
  15537.  
  15538.         }
  15539.  
  15540. }
  15541.  
  15542.  
  15543.  
  15544. void fistp_stack(int addop)
  15545.  
  15546. {
  15547.  
  15548.         op(0xDB+addop);
  15549.  
  15550.         fistp2_stack(localsize+4+addop);
  15551.  
  15552. }
  15553.  
  15554.  
  15555.  
  15556. void fld_stack(int size)
  15557.  
  15558. {
  15559.  
  15560.         if(am32)outword(0x2404);        //fld ssdword[ebp+2]/ssdword[esp]
  15561.  
  15562.         else{
  15563.  
  15564.                 if(short_ok(size,FALSE)==0){
  15565.  
  15566.                         op(0x86);
  15567.  
  15568.                         outword(-size);
  15569.  
  15570.                 }
  15571.  
  15572.                 else{
  15573.  
  15574.                         op(0x46);
  15575.  
  15576.                         op(-size);
  15577.  
  15578.                 }
  15579.  
  15580.         }
  15581.  
  15582. }
  15583.  
  15584.  
  15585.  
  15586. void FloatToNumer(int addop)
  15587.  
  15588. //ª®­¢¥àâ æ¨ï float ¢ ç¨á«®
  15589.  
  15590. {
  15591.  
  15592.         CheckInitBP();
  15593.  
  15594.         op(0xD9+addop);
  15595.  
  15596.         fld_stack(4+localsize+addop);
  15597.  
  15598.         fistp_stack();
  15599.  
  15600.         RestoreBP();
  15601.  
  15602.         fwait3();
  15603.  
  15604.         op66(r32);
  15605.  
  15606.         op(0x58);       //pop reg
  15607.  
  15608.         if(cpu<3)cpu=3;
  15609.  
  15610. }
  15611.  
  15612.  
  15613.  
  15614. void Float2reg32(int reg,int addop,int reg1,int reg2)
  15615.  
  15616. {
  15617.  
  15618.         CheckInitBP();
  15619.  
  15620.         op66(r32);
  15621.  
  15622.         op(0x50);  //push AX
  15623.  
  15624.         if(ESPloc&&am32&&itok.segm==SS)itok.number+=4;
  15625.  
  15626.         addESP+=4;
  15627.  
  15628.         CheckAllMassiv(bufrm,4+addop,&strinf,&itok,reg1,reg2);
  15629.  
  15630.         outseg(&itok,2);        //fld floatvar
  15631.  
  15632.         op(0xd9+addop);
  15633.  
  15634.         op(itok.rm);
  15635.  
  15636.         outaddress(&itok);
  15637.  
  15638.         fistp_stack();
  15639.  
  15640.         fwait3();
  15641.  
  15642.         op66(r32);
  15643.  
  15644.         op(0x58+reg);   //pop reg
  15645.  
  15646.         addESP-=4;
  15647.  
  15648.         if(cpu<3)cpu=3;
  15649.  
  15650.         RestoreBP();
  15651.  
  15652. }
  15653.  
  15654.  
  15655.  
  15656. void  byteinstack(int *numstak,int *nums)
  15657.  
  15658. {
  15659.  
  15660.         CheckInitBP();
  15661.  
  15662.         CheckAllMassiv(bufrm,1,&strinf);
  15663.  
  15664.         op66(r16);
  15665.  
  15666.         if(tok==tk_bytevar&&optimizespeed&&chip>3&&chip<7){
  15667.  
  15668.                 outword(0xC031);        //xor ax,ax
  15669.  
  15670.                 outseg(&itok,2);
  15671.  
  15672.                 op(0x8A);
  15673.  
  15674.         }
  15675.  
  15676.         else{
  15677.  
  15678.                 outseg(&itok,3);
  15679.  
  15680.                 op(0xf);
  15681.  
  15682.                 if(tok==tk_bytevar)op(0xb6);
  15683.  
  15684.                 else op(0xbe);
  15685.  
  15686.         }
  15687.  
  15688.         op(itok.rm);
  15689.  
  15690.         outaddress(&itok);
  15691.  
  15692.         op66(r16);
  15693.  
  15694.         outword(0xDF50);        //push ax
  15695.  
  15696.         *numstak+=2;
  15697.  
  15698.         addESP+=2;
  15699.  
  15700.         fld_stack(*nums+*numstak);
  15701.  
  15702. }
  15703.  
  15704.  
  15705.  
  15706. void  reginstack(int *numstak,int *nums)
  15707.  
  15708. {
  15709.  
  15710.         CheckInitBP();
  15711.  
  15712.         op66(tok==tk_reg32?r32:r16);
  15713.  
  15714.         if(tok==tk_beg){
  15715.  
  15716.                 if(optimizespeed&&chip>3&&chip<7&&itok.number!=AL&&itok.number!=AH){
  15717.  
  15718.                         xorAXAX();
  15719.  
  15720.                         op(0x88);
  15721.  
  15722.                         op(0xC0+itok.number*8); //mov al,beg
  15723.  
  15724.                 }
  15725.  
  15726.                 else if(itok.number==AL)xorAHAH();
  15727.  
  15728.                 else{
  15729.  
  15730.                         outword(0xB60F);        /* MOVZX AX,beg */
  15731.  
  15732.                         op(0xC0+itok.number);
  15733.  
  15734.                 }
  15735.  
  15736.                 itok.number=0;
  15737.  
  15738.         }
  15739.  
  15740.         else outword(0x6a);  //push 0
  15741.  
  15742.         op66(tok==tk_reg32?r32:r16);
  15743.  
  15744.         op(0x50+itok.number);   //push AX
  15745.  
  15746.         if(tok==tk_reg){
  15747.  
  15748.                 op(0xDB);
  15749.  
  15750.                 *numstak+=4;
  15751.  
  15752.                 addESP+=4;
  15753.  
  15754.                 fld_stack(*nums+*numstak);
  15755.  
  15756.         }
  15757.  
  15758.         else if(tok==tk_beg){
  15759.  
  15760.                 op(0xdf);
  15761.  
  15762.                 *numstak+=2;
  15763.  
  15764.                 addESP+=2;
  15765.  
  15766.                 fld_stack(*nums+*numstak);
  15767.  
  15768.         }
  15769.  
  15770.         else{
  15771.  
  15772.                 *numstak+=8;
  15773.  
  15774.                 addESP+=8;
  15775.  
  15776.                 fildq2_stack(*nums+*numstak);
  15777.  
  15778.         }
  15779.  
  15780. }
  15781.  
  15782.  
  15783.  
  15784. void wordinstack(int *numstak,int *nums)
  15785.  
  15786. {
  15787.  
  15788.         CheckInitBP();
  15789.  
  15790.         op66(tok==tk_wordvar?r16:r32);
  15791.  
  15792.         outword(0x6a);  //push 0
  15793.  
  15794.         if(ESPloc&&am32&&itok.segm==SS)itok.number+=4;
  15795.  
  15796.         CheckAllMassiv(bufrm,tok==tk_wordvar?2:4,&strinf);
  15797.  
  15798.         op66(tok==tk_wordvar?r16:r32);
  15799.  
  15800.         outseg(&itok,2); //push var
  15801.  
  15802.         op(0xFF);
  15803.  
  15804.         op(itok.rm+0x30);
  15805.  
  15806.         outaddress(&itok);
  15807.  
  15808.         if(tok==tk_wordvar){
  15809.  
  15810.                 op(0xDB);
  15811.  
  15812.                 addESP+=4;
  15813.  
  15814.                 *numstak+=4;
  15815.  
  15816.                 fld_stack(*nums+*numstak);
  15817.  
  15818.         }
  15819.  
  15820.         else{
  15821.  
  15822.                 addESP+=8;
  15823.  
  15824.                 *numstak+=8;
  15825.  
  15826.                 fildq2_stack(*nums+*numstak);
  15827.  
  15828.         }
  15829.  
  15830. }
  15831.  
  15832.  
  15833.  
  15834. void intinstack(int addop)
  15835.  
  15836. {
  15837.  
  15838.         CheckAllMassiv(bufrm,tok==tk_intvar?2:4+addop,&strinf);
  15839.  
  15840.         outseg(&itok,2);        //fild intvar
  15841.  
  15842.         if(tok==tk_intvar||tok==tk_qwordvar)op(0xDF);
  15843.  
  15844.         else if(tok==tk_floatvar||tok==tk_doublevar)op(0xd9+addop);
  15845.  
  15846.         else op(0xDB);
  15847.  
  15848.         op(itok.rm+(tok==tk_qwordvar?0x28:0));
  15849.  
  15850.         outaddress(&itok);
  15851.  
  15852. }
  15853.  
  15854.  
  15855.  
  15856. int doeaxfloatmath(int itreturn,int reg,int addop)
  15857.  
  15858. {
  15859.  
  15860. int vop,negflag=0,next,numstak=0;
  15861.  
  15862. static int nums=0;
  15863.  
  15864. int i=0;
  15865.  
  15866. long long lnumber;
  15867.  
  15868. int ols;
  15869.  
  15870.         ols=localsize;
  15871.  
  15872.         nums+=localsize;
  15873.  
  15874.         next=1;
  15875.  
  15876.         if(tok==tk_minus){
  15877.  
  15878.                 if(CheckMinusNum()==FALSE){
  15879.  
  15880.                         negflag=1;
  15881.  
  15882.                         getoperand(am32==TRUE?EAX:BX);
  15883.  
  15884.                 }
  15885.  
  15886.         }
  15887.  
  15888.         if(tok==tk_number){
  15889.  
  15890. //              printf("rm=%d %e %e %08X\n",itok.rm,itok.fnumber,itok.dnumber,itok.number);
  15891.  
  15892.                 if(addop==0/*itok.rm==tk_float*/){
  15893.  
  15894.                         itok.number=doconstfloatmath();
  15895.  
  15896.                         itok.rm=tk_float;
  15897.  
  15898.                 }
  15899.  
  15900.                 else{
  15901.  
  15902.                         itok.lnumber=doconstdoublemath();
  15903.  
  15904.                         itok.rm=tk_double;
  15905.  
  15906.                 }
  15907.  
  15908.                 next=0;
  15909.  
  15910.                 if(itok.type==tp_stopper){
  15911.  
  15912. //                      if(itok.rm==tk_float&&addop==4)itok.dnumber=itok.fnumber;
  15913.  
  15914. //                      if(itok.rm==tk_double&&addop==0)itok.fnumber=itok.dnumber;
  15915.  
  15916.                         if(itreturn==tk_stackstart){
  15917.  
  15918.                                 if(itok.rm==tk_double){
  15919.  
  15920.                                         lnumber=itok.lnumber;
  15921.  
  15922.                                         itok.lnumber=lnumber>>32;
  15923.  
  15924.                                 }
  15925.  
  15926.                                 for(i=0;i<2;i++){
  15927.  
  15928.                                         op66(r32);
  15929.  
  15930.                                         if(short_ok(itok.number,TRUE)){ //PUSH number
  15931.  
  15932.                                                 op(0x6A);
  15933.  
  15934.                                                 op(itok.number);
  15935.  
  15936.                                         }
  15937.  
  15938.                                         else{
  15939.  
  15940.                                                 op(0x68);
  15941.  
  15942.                                                 outdword(itok.number);
  15943.  
  15944.                                         }
  15945.  
  15946.                                         if(itok.rm!=tk_double)break;
  15947.  
  15948.                                         if(i==1)break;
  15949.  
  15950.                                         itok.number=lnumber;
  15951.  
  15952.                                 }
  15953.  
  15954.                                 return itreturn;
  15955.  
  15956.                         }
  15957.  
  15958.                         if(itreturn==tk_reg32){
  15959.  
  15960.                                 MovRegNum(r32,0,itok.number,reg);
  15961.  
  15962.                                 return itreturn;
  15963.  
  15964.                         }
  15965.  
  15966.                         if(itreturn==tk_reg64){
  15967.  
  15968.                                 MovRegNum(r32,0,itok.number,reg&255);
  15969.  
  15970.                                 MovRegNum(r32,0,itok.lnumber>>=32,reg/256);
  15971.  
  15972.                                 return itreturn;
  15973.  
  15974.                         }
  15975.  
  15976.                 }
  15977.  
  15978.         }
  15979.  
  15980.         if(itreturn==tk_stackstart&&(!am32)){
  15981.  
  15982.                 op66(r32);
  15983.  
  15984.                 op(0x50);       //push eax
  15985.  
  15986.                 if(addop){
  15987.  
  15988.                         op66(r32);
  15989.  
  15990.                         op(0x50);       //push eax
  15991.  
  15992.                 }
  15993.  
  15994.                 op(0x55);       //push bp
  15995.  
  15996.                 outword(0xe589);//mov bp,sp
  15997.  
  15998.                 if(initBP>1)initBP++;
  15999.  
  16000.                 localsize=-6-addop;
  16001.  
  16002.         }
  16003.  
  16004.         if(next==0)goto casenumber;
  16005.  
  16006.         switch(tok){
  16007.  
  16008.                 case tk_number:
  16009.  
  16010. casenumber:
  16011.  
  16012. //              printf("rm=%d %e %e %08X\n",itok.rm,itok.fnumber,itok.dnumber,itok.number);
  16013.  
  16014.                         if((itok.rm==tk_float&&itok.fnumber==1.0)||
  16015.  
  16016.                                         (itok.rm==tk_double&&itok.dnumber==1.0)||
  16017.  
  16018.                                         (itok.rm!=tk_float&&itok.rm!=tk_double&&itok.lnumber==1)){
  16019.  
  16020.                                 outword(0xE8D9);        //FLD1
  16021.  
  16022.                                 break;
  16023.  
  16024.                         }
  16025.  
  16026.                         if((itok.rm==tk_float&&itok.fnumber==0.0)||
  16027.  
  16028.                                         (itok.rm==tk_double&&itok.dnumber==0.0)||itok.lnumber==0){
  16029.  
  16030.                                 outword(0xEED9);        //FLDZ
  16031.  
  16032.                                 break;
  16033.  
  16034.                         }
  16035.  
  16036.                         op(0xD9+(itok.rm==tk_float?0:4));
  16037.  
  16038.                         op((am32==FALSE?0x06:0x05));    //fld
  16039.  
  16040.                         AddFloatConst(itok.lnumber,itok.rm);
  16041.  
  16042.                         outword(0);
  16043.  
  16044.                         if(am32)outword(0);
  16045.  
  16046.                         break;
  16047.  
  16048.                 case tk_at:
  16049.  
  16050.                         getoperand(am32==TRUE?EAX:BX);
  16051.  
  16052.                         macros(tk_fpust);
  16053.  
  16054.                         break;
  16055.  
  16056.                 case tk_ID:
  16057.  
  16058.                 case tk_id:
  16059.  
  16060.                 case tk_proc:
  16061.  
  16062.                 case tk_apiproc:
  16063.  
  16064.                 case tk_declare:
  16065.  
  16066.                 case tk_undefproc:
  16067.  
  16068. int onums;
  16069.  
  16070.                         onums=nums;
  16071.  
  16072.                         nums=-(int)localsize;
  16073.  
  16074.                         vop=procdo(tk_fpust);   //¢®§¢à ¨§ ¯à®æ¥¤ãà
  16075.  
  16076.                         nums=onums;
  16077.  
  16078.                         if(tok2==tk_semicolon&&vop!=tk_fpust&&vop!=tk_double){
  16079.  
  16080.                                 nexttok();
  16081.  
  16082.                                 return tk_assign;
  16083.  
  16084.                         }
  16085.  
  16086.                         break;
  16087.  
  16088.                 case tk_qwordvar:
  16089.  
  16090.                 case tk_doublevar:
  16091.  
  16092.                         i=4;
  16093.  
  16094.                 case tk_floatvar:
  16095.  
  16096.                 case tk_longvar:
  16097.  
  16098.                 case tk_intvar:
  16099.  
  16100.                         intinstack(i);
  16101.  
  16102.                         break;
  16103.  
  16104.                 case tk_dwordvar:
  16105.  
  16106.                 case tk_wordvar:
  16107.  
  16108.                         wordinstack(&numstak,&nums);
  16109.  
  16110.                         break;
  16111.  
  16112.                 case tk_charvar:
  16113.  
  16114.                 case tk_bytevar:
  16115.  
  16116.                         byteinstack(&numstak,&nums);
  16117.  
  16118.                         break;
  16119.  
  16120.                 case tk_beg:
  16121.  
  16122.                 case tk_reg32:
  16123.  
  16124.                 case tk_reg:
  16125.  
  16126.                         reginstack(&numstak,&nums);
  16127.  
  16128.                         break;
  16129.  
  16130.                 case tk_fpust:
  16131.  
  16132.                         if(itok.number){
  16133.  
  16134.                                 op(0xD9);
  16135.  
  16136.                                 op(0xC8+itok.number);
  16137.  
  16138.                         }
  16139.  
  16140.                         break;
  16141.  
  16142.                 default: valueexpected();       break;
  16143.  
  16144.         }
  16145.  
  16146.         if(negflag){
  16147.  
  16148.                 outword(0xe0d9);        //fchs
  16149.  
  16150.                 negflag=0;
  16151.  
  16152.         }
  16153.  
  16154.         if(next==1)nexttok();
  16155.  
  16156.         while(itok.type!=tp_stopper&&tok!=tk_eof&&itok.type!=tp_compare){
  16157.  
  16158.                 next=1;
  16159.  
  16160.                 vop=0;
  16161.  
  16162.                 i=0;
  16163.  
  16164.                 switch(tok){
  16165.  
  16166.                         case tk_multminus: negflag=1; goto mult;
  16167.  
  16168.                         case tk_divminus: negflag=1;
  16169.  
  16170.                         case tk_div: vop+=0x10;
  16171.  
  16172.                         case tk_minus: vop+=0x20;
  16173.  
  16174. mult:
  16175.  
  16176.                         case tk_mult: vop+=8;
  16177.  
  16178.                         case tk_plus:
  16179.  
  16180.                                 getoperand();
  16181.  
  16182.                                 switch(tok){
  16183.  
  16184.                                         case tk_number:
  16185.  
  16186.                                                 if(itok.rm!=tk_float&&itok.rm!=tk_double){
  16187.  
  16188.                                                         itok.dnumber=itok.lnumber;
  16189.  
  16190.                                                         itok.rm=tk_double;
  16191.  
  16192.                                                 }
  16193.  
  16194.                                                 if((itok.rm==tk_float&&itok.fnumber==1.0)||
  16195.  
  16196.                                                                 (itok.rm==tk_double&&itok.dnumber==1.0)){
  16197.  
  16198. num1:
  16199.  
  16200.                                                         if(vop==0||vop==0x28){  // + -
  16201.  
  16202.                                                                 outword(0xE8D9);        //FLD1
  16203.  
  16204.                                                                 op(0xDE);
  16205.  
  16206.                                                                 op(0xC1+vop);
  16207.  
  16208.                                                         }
  16209.  
  16210.                                                         break;
  16211.  
  16212.                                                 }
  16213.  
  16214.                                                 op(0xd8+(itok.rm==tk_float?0:4));
  16215.  
  16216.  
  16217.  
  16218.                                                 if(vop==0x38){  // div 22.12.05 22:10
  16219.  
  16220.                                                         vop=8;  //mult
  16221.  
  16222.                                                         if(itok.rm==tk_float)itok.fnumber=1/itok.fnumber;
  16223.  
  16224.                                                         else itok.dnumber=1/itok.dnumber;
  16225.  
  16226.                                                 }
  16227.  
  16228.                                                 if(/*vop==0x38||*/vop==0x28)vop-=8;
  16229.  
  16230.  
  16231.  
  16232.                                                 op((am32==FALSE?0x06:0x05)+vop);
  16233.  
  16234.                                                 AddFloatConst(itok.lnumber,itok.rm);
  16235.  
  16236.                                                 outword(0);
  16237.  
  16238.                                                 if(am32)outword(0);
  16239.  
  16240.                                                 break;
  16241.  
  16242.                                         case tk_doublevar:
  16243.  
  16244.                                                 i=4;
  16245.  
  16246.                                         case tk_floatvar:
  16247.  
  16248.                                                 if(vop==0x38||vop==0x28)vop-=8;
  16249.  
  16250.                                                 CheckAllMassiv(bufrm,4+i,&strinf);
  16251.  
  16252.                                                 outseg(&itok,2);        //fsubr var
  16253.  
  16254.                                                 op(0xd8+i);
  16255.  
  16256.                                                 op(itok.rm+vop);
  16257.  
  16258.                                                 outaddress(&itok);
  16259.  
  16260.                                                 break;
  16261.  
  16262.                                         case tk_longvar:
  16263.  
  16264.                                         case tk_intvar:
  16265.  
  16266.                                                 CheckAllMassiv(bufrm,4,&strinf);
  16267.  
  16268.                                                 outseg(&itok,2);        //fsubr var
  16269.  
  16270.                                                 op(tok==tk_intvar?0xDE:0xDA);
  16271.  
  16272.                                                 if(vop==0x38||vop==0x28)vop-=8;
  16273.  
  16274.                                                 op(itok.rm+vop);
  16275.  
  16276.                                                 outaddress(&itok);
  16277.  
  16278.                                                 break;
  16279.  
  16280.                                         case tk_qwordvar:
  16281.  
  16282.                                                 intinstack(4);
  16283.  
  16284.                                                 op(0xde);
  16285.  
  16286.                                                 op(0xC1+vop);//fsubpr st1
  16287.  
  16288.                                                 break;
  16289.  
  16290.                                         case tk_dwordvar:
  16291.  
  16292.                                         case tk_wordvar:
  16293.  
  16294.                                                 wordinstack(&numstak,&nums);
  16295.  
  16296.                                                 op(0xde);
  16297.  
  16298.                                                 op(0xC1+vop);//fsubpr st1
  16299.  
  16300.                                                 break;
  16301.  
  16302.                                         case tk_beg:
  16303.  
  16304.                                         case tk_reg32:
  16305.  
  16306.                                         case tk_reg:
  16307.  
  16308.                                                 reginstack(&numstak,&nums);
  16309.  
  16310.                                                 op(0xde);
  16311.  
  16312.                                                 op(0xC1+vop);//fsubpr st1
  16313.  
  16314.                                                 break;
  16315.  
  16316.                                         case tk_charvar:
  16317.  
  16318.                                         case tk_bytevar:
  16319.  
  16320.                                                 byteinstack(&numstak,&nums);
  16321.  
  16322.                                                 op(0xde);
  16323.  
  16324.                                                 op(0xC1+vop);//fsubpr st1
  16325.  
  16326.                                                 break;
  16327.  
  16328.                                         case tk_fpust:
  16329.  
  16330.                                                 if(vop==0x38||vop==0x28)vop-=8;
  16331.  
  16332.                                                 op(0xd8);
  16333.  
  16334.                                                 op(0xC0+vop+itok.number);//fsubpr st
  16335.  
  16336.                                                 break;
  16337.  
  16338.                                         default: valueexpected(); break;
  16339.  
  16340.                                 }
  16341.  
  16342.                                 break;
  16343.  
  16344.                         default: illegalfloat(); break;
  16345.  
  16346.                 }
  16347.  
  16348.                 if(negflag){
  16349.  
  16350.                         outword(0xe0d9);        //fchs
  16351.  
  16352.                         negflag=0;
  16353.  
  16354.                 }
  16355.  
  16356.                 if(next)nexttok();
  16357.  
  16358.         }
  16359.  
  16360.         if(tok==tk_eof)unexpectedeof();
  16361.  
  16362.         if(itreturn==tk_stackstart){
  16363.  
  16364.                 if(!am32){
  16365.  
  16366.                         op(0xD9+addop);
  16367.  
  16368.                         outword(0x025e);        //fstp ssdword[bp+2]
  16369.  
  16370.                         numstak-=2;
  16371.  
  16372.                 }
  16373.  
  16374.                 else{
  16375.  
  16376.                         if(numstak<4){
  16377.  
  16378.                                 op66(r32);
  16379.  
  16380.                                 op(0x50);       //push eax
  16381.  
  16382.                                 addESP+=4;
  16383.  
  16384.                         }
  16385.  
  16386.                         else numstak-=4;
  16387.  
  16388.                         if(addop){
  16389.  
  16390.                                 if(numstak<4){
  16391.  
  16392.                                         op66(r32);
  16393.  
  16394.                                         op(0x50);       //push eax
  16395.  
  16396.                                         addESP+=4;
  16397.  
  16398.                                 }
  16399.  
  16400.                                 else numstak-=4;
  16401.  
  16402.                         }
  16403.  
  16404.                         op(0xD9+addop);
  16405.  
  16406.                         if(numstak==0)outword(0x241C);  //fstp ssdword[esp]
  16407.  
  16408.                         else{
  16409.  
  16410.                                 outword(0x245C);        //fstp ssdword[esp+numstak]
  16411.  
  16412.                                 op(numstak);
  16413.  
  16414.                         }
  16415.  
  16416.                 }
  16417.  
  16418.                 fwait3();
  16419.  
  16420.         }
  16421.  
  16422.         else if(itreturn==tk_reg32||itreturn==tk_reg64){
  16423.  
  16424.                 i=4;
  16425.  
  16426.                 if(itreturn==tk_reg64)i=8;
  16427.  
  16428.                 if(numstak<i){
  16429.  
  16430.                         op66(r32);
  16431.  
  16432.                         op(0x50);       //push eax
  16433.  
  16434.                         if(itreturn==tk_reg64){
  16435.  
  16436.                                 op66(r32);
  16437.  
  16438.                                 op(0x50);       //push eax
  16439.  
  16440.                         }
  16441.  
  16442.                         numstak+=i;
  16443.  
  16444.                         addESP+=i;
  16445.  
  16446.                 }
  16447.  
  16448.                 op(itreturn==tk_reg32?0xDB:0xDF);
  16449.  
  16450. //              op(itreturn==tk_reg32?0xD9:0xDB);
  16451.  
  16452.                 fistp2_stack(localsize+numstak);
  16453.  
  16454.                 fwait3();
  16455.  
  16456.                 if(itreturn==tk_reg64){
  16457.  
  16458.                         op66(r32);
  16459.  
  16460.                         op(0x58);       //pop EAX
  16461.  
  16462.                         op66(r32);
  16463.  
  16464.                         op(0x58+EDX);   //pop EDX
  16465.  
  16466.                 }
  16467.  
  16468.                 else{
  16469.  
  16470.                         op66(r32);
  16471.  
  16472.                         op(0x58+reg);   //pop reg
  16473.  
  16474.                 }
  16475.  
  16476.                 numstak-=i;
  16477.  
  16478.                 addESP-=i;
  16479.  
  16480.         }
  16481.  
  16482.         if(localsize!=(unsigned int)ols){
  16483.  
  16484.                 localsize=ols;
  16485.  
  16486.                 Leave();
  16487.  
  16488.                 initBP--;
  16489.  
  16490.         }
  16491.  
  16492.         else if(numstak){
  16493.  
  16494.                 if(numstak<128){
  16495.  
  16496.                         outword(0xC483);
  16497.  
  16498.                         op(numstak);
  16499.  
  16500.                 }
  16501.  
  16502.                 else{
  16503.  
  16504.                         outword(0xC481);
  16505.  
  16506.                         outword(numstak);
  16507.  
  16508.                 }
  16509.  
  16510.                 addESP-=numstak;
  16511.  
  16512.         }
  16513.  
  16514.         RestoreBP();
  16515.  
  16516.         nums-=localsize;
  16517.  
  16518.         return itreturn;
  16519.  
  16520. }
  16521.  
  16522.  
  16523.  
  16524. void float2stack(int num)
  16525.  
  16526. {
  16527.  
  16528.         outword(0xC0DD);
  16529.  
  16530.         if(tok!=tk_fpust)outword(0xf7d9);       //fincstp
  16531.  
  16532. //      if(num>6)fpustdestroed();
  16533.  
  16534. //      outword(0xf6d9);        //fdecstp
  16535.  
  16536.         doeaxfloatmath(tk_fpust);
  16537.  
  16538.         if(num){
  16539.  
  16540.                 op(0xD9);
  16541.  
  16542.                 op(0xC8+num);
  16543.  
  16544.         }
  16545.  
  16546. }
  16547.  
  16548.  
  16549.  
  16550. void dofloatstack(int num)
  16551.  
  16552. {
  16553.  
  16554. int vop=0;
  16555.  
  16556.         nexttok();
  16557.  
  16558.         switch(tok){
  16559.  
  16560.                 case tk_assign: //=
  16561.  
  16562.                         getoperand(am32==TRUE?EAX:BX);
  16563.  
  16564.                         float2stack(num);
  16565.  
  16566.                         break;
  16567.  
  16568.                 case tk_divequals: vop+=0x10;
  16569.  
  16570.                 case tk_minusequals: vop+=0x20;
  16571.  
  16572.                 case tk_multequals: vop+=8;
  16573.  
  16574.                 case tk_plusequals:
  16575.  
  16576.                         getoperand(am32==TRUE?EAX:BX);
  16577.  
  16578.                         float2stack(0);
  16579.  
  16580. //                      doeaxfloatmath(tk_fpust);
  16581.  
  16582.                         op(0xdc);
  16583.  
  16584.                         op(0xC0+vop+num);//fsubpr st
  16585.  
  16586.                         break;
  16587.  
  16588.                 case tk_swap:
  16589.  
  16590.                         getoperand(am32==TRUE?EAX:BX);
  16591.  
  16592.                         switch(tok){
  16593.  
  16594.                                 case tk_fpust:
  16595.  
  16596.                                         op(0xD9);
  16597.  
  16598.                                         op(0xC8+num);
  16599.  
  16600.                                         op(0xD9);
  16601.  
  16602.                                         op(0xC8+itok.number);
  16603.  
  16604.                                         op(0xD9);
  16605.  
  16606.                                         op(0xC8+num);
  16607.  
  16608.                                         break;
  16609.  
  16610.                                 case tk_doublevar:
  16611.  
  16612.                                         vop=4;
  16613.  
  16614.                                 case tk_floatvar:
  16615.  
  16616.                                         CheckAllMassiv(bufrm,4,&strinf);
  16617.  
  16618.                                         outseg(&itok,2);        //fld val
  16619.  
  16620.                                         op(0xd9+vop);
  16621.  
  16622.                                         op(itok.rm);
  16623.  
  16624.                                         outaddress(&itok);
  16625.  
  16626.                                         op(0xD9);
  16627.  
  16628.                                         op(0xC8+num+1);
  16629.  
  16630.                                         outseg(&itok,2);        //fstp val
  16631.  
  16632.                                         op(0xd9+vop);
  16633.  
  16634.                                         op(itok.rm+0x18);
  16635.  
  16636.                                         outaddress(&itok);
  16637.  
  16638.                                         break;
  16639.  
  16640.                                 default:
  16641.  
  16642.                                         swaperror();
  16643.  
  16644.                                         break;
  16645.  
  16646.                         }
  16647.  
  16648.                         nexttok();
  16649.  
  16650.                         break;
  16651.  
  16652.                 default:
  16653.  
  16654.                         illegalfloat(); break;
  16655.  
  16656.         }
  16657.  
  16658. }
  16659.  
  16660.  
  16661.  
  16662. void RestoreBP()
  16663.  
  16664. {
  16665.  
  16666.         if(am32==0&&initBP==2){
  16667.  
  16668.                 Leave();
  16669.  
  16670.                 initBP=0;
  16671.  
  16672.         }
  16673.  
  16674. }
  16675.  
  16676.  
  16677.  
  16678. void CheckInitBP()
  16679.  
  16680. {
  16681.  
  16682.         if(am32==0&&initBP==0){
  16683.  
  16684.                 op(0x55);       //push bp
  16685.  
  16686.                 outword(0xe589);//mov bp,sp
  16687.  
  16688.                 initBP=2;
  16689.  
  16690.         }
  16691.  
  16692. }
  16693.  
  16694.  
  16695.  
  16696. void AddReloc(int segm)
  16697.  
  16698. {
  16699.  
  16700.         if(FixUp!=FALSE){
  16701.  
  16702.                 CheckPosts();
  16703.  
  16704.                 if(segm==DS){
  16705.  
  16706.                         (postbuf+posts)->type=(unsigned short)(am32==FALSE?FIX_VAR:FIX_VAR32);
  16707.  
  16708.                         (postbuf+posts)->loc=outptrdata;
  16709.  
  16710.                 }
  16711.  
  16712.                 else{
  16713.  
  16714.                         (postbuf+posts)->type=(unsigned short)(am32==FALSE?FIX_CODE:FIX_CODE32);
  16715.  
  16716.                         (postbuf+posts)->loc=outptr;
  16717.  
  16718.                 }
  16719.  
  16720.                 posts++;
  16721.  
  16722.         }
  16723.  
  16724.         postnumflag&=(~f_reloc);
  16725.  
  16726. }
  16727.  
  16728.  
  16729.  
  16730. void fwait3()
  16731.  
  16732. {
  16733.  
  16734.         if(chip<4&&tok2!=tk_floatvar&&tok2!=tk_doublevar&&tok2!=tk_float&&tok2!=tk_double)op(0x9B);
  16735.  
  16736. }
  16737.  
  16738.  
  16739.  
  16740. void AddFloatConst(long long fnumber,int type)
  16741.  
  16742. {
  16743.  
  16744. unsigned int i;
  16745.  
  16746. unsigned int ofs;
  16747.  
  16748.         for(i=0;i<numfloatconst;i++){
  16749.  
  16750.                 if(type==(floatnum+i)->type){
  16751.  
  16752.                         ofs=(floatnum+i)->ofs;
  16753.  
  16754.                         if(type==tk_float){
  16755.  
  16756.                                 if(*(long *)&fnumber==(floatnum+i)->num[0])goto endp;
  16757.  
  16758.                         }
  16759.  
  16760.                         else if(*(double *)&fnumber==(floatnum+i)->dnum)goto endp;
  16761.  
  16762.                 }
  16763.  
  16764.         }
  16765.  
  16766.         if(numfloatconst==0){
  16767.  
  16768.                 floatnum=(LISTFLOAT *)MALLOC(sizeof(LISTFLOAT)*STEPFLOATCONST);
  16769.  
  16770.                 maxnumfloatconst=STEPFLOATCONST;
  16771.  
  16772. //              memset(floatnum,0,sizeof(LISTFLOAT)*STEPFLOATCONST);
  16773.  
  16774.         }
  16775.  
  16776.         else if((numfloatconst+1)==maxnumfloatconst){
  16777.  
  16778.                 floatnum=(LISTFLOAT *)REALLOC(floatnum,(maxnumfloatconst+STEPFLOATCONST)*sizeof(LISTFLOAT));
  16779.  
  16780.                 maxnumfloatconst+=STEPFLOATCONST;
  16781.  
  16782.         }
  16783.  
  16784.         numfloatconst++;
  16785.  
  16786.         (floatnum+i)->type=type;
  16787.  
  16788.         ofs=(floatnum+i)->ofs=ofsfloatlist;
  16789.  
  16790.         if(type==tk_float)(floatnum+i)->num[0]=*(unsigned long *)&fnumber;
  16791.  
  16792.         else (floatnum+i)->dnum=*(double *)&fnumber;
  16793.  
  16794.         ofsfloatlist+=(type==tk_float?4:8);
  16795.  
  16796. endp:
  16797.  
  16798.         CheckPosts();
  16799.  
  16800.         (postbuf+posts)->type=POST_FLOATNUM;
  16801.  
  16802.         (postbuf+posts)->loc=outptrdata;
  16803.  
  16804.         (postbuf+posts)->num=ofs;
  16805.  
  16806.         posts++;
  16807.  
  16808. }
  16809.  
  16810.  
  16811.  
  16812. void setwordext(long *id)
  16813.  
  16814. {
  16815.  
  16816.         CheckPosts();
  16817.  
  16818.         (postbuf+posts)->type=EXT_VAR;
  16819.  
  16820.         (postbuf+posts)->loc=outptr;
  16821.  
  16822.         (postbuf+posts)->num=*id&0xFFFF;        //id ­®¬¥à ¢­¥è­¥© ¯¥à¥¬¥­­®©
  16823.  
  16824.         *id>>=16;       //¥¥ §­ ç¥­¨¥
  16825.  
  16826.         posts++;
  16827.  
  16828. }
  16829.  
  16830.  
  16831.  
  16832. void setwordpost(ITOK *stok)                                            /* for post word num setting */
  16833.  
  16834. {
  16835.  
  16836.         CheckPosts();
  16837.  
  16838.         if(stok->post==USED_DIN_VAR){
  16839.  
  16840.                 (postbuf+posts)->type=(unsigned short)(am32==0?DIN_VAR:DIN_VAR32);
  16841.  
  16842. //                      printf("Add tok=%d %s\n",stok->rec->rectok,stok->rec->recid);
  16843.  
  16844. //              printf("rec=%08X\n",stok->rec);
  16845.  
  16846.                 if(stok->rec->rectok==tk_structvar&&stok->rec->recsib==tp_gvar){
  16847.  
  16848.                         (postbuf+posts)->num=(int)stok->rec;//02.09.05 17:11 ->right;
  16849.  
  16850.                 }
  16851.  
  16852.                 else (postbuf+posts)->num=(int)stok->rec;
  16853.  
  16854.         }
  16855.  
  16856.         else if(stok->post>=CODE_SIZE&&stok->post<=STACK_SIZE32)(postbuf+posts)->type=stok->post;
  16857.  
  16858.         else (postbuf+posts)->type=(unsigned short)(am32==FALSE?POST_VAR:POST_VAR32);
  16859.  
  16860.         (postbuf+posts)->loc=outptr;
  16861.  
  16862.         posts++;
  16863.  
  16864. }
  16865.  
  16866.  
  16867.  
  16868. void MovRegNum(int razr,int relocf,unsigned long number,int reg)
  16869.  
  16870. {
  16871.  
  16872. unsigned long num;
  16873.  
  16874. int nreg;
  16875.  
  16876.         op66(razr);
  16877.  
  16878.         if(relocf==0){
  16879.  
  16880.                 if(number!=0&&GetRegNumber(reg,&num,razr)==reg){
  16881.  
  16882.                         ConstToReg(number,reg,razr);
  16883.  
  16884.                         if(num==number)return;
  16885.  
  16886.                         else if(num<number){
  16887.  
  16888.                                 num=number-num;
  16889.  
  16890.                                 if(num==1){
  16891.  
  16892.                                         op(0x40+reg);   //inc reg
  16893.  
  16894.                                         return;
  16895.  
  16896.                                 }
  16897.  
  16898.                                 if(num==2){
  16899.  
  16900.                                         op(0x40+reg);   //inc reg
  16901.  
  16902.                                         op66(razr);
  16903.  
  16904.                                         op(0x40+reg);   //inc reg
  16905.  
  16906.                                         return;
  16907.  
  16908.                                 }
  16909.  
  16910.                                 if(razr==r32&&short_ok(num,TRUE)){
  16911.  
  16912.                                         op(0x83);
  16913.  
  16914.                                         op(0xC0+reg);
  16915.  
  16916.                                         op(num);
  16917.  
  16918.                                         return;
  16919.  
  16920.                                 }
  16921.  
  16922.                         }
  16923.  
  16924.                         else{
  16925.  
  16926.                                 num=num-number;
  16927.  
  16928.                                 if(num==1){
  16929.  
  16930.                                         op(0x48+reg);   //dec reg
  16931.  
  16932.                                         return;
  16933.  
  16934.                                 }
  16935.  
  16936.                                 if(num==2){
  16937.  
  16938.                                         op(0x48+reg);   //dec reg
  16939.  
  16940.                                         op66(razr);
  16941.  
  16942.                                         op(0x48+reg);   //dec reg
  16943.  
  16944.                                         return;
  16945.  
  16946.                                 }
  16947.  
  16948.                                 if(razr==r32&&short_ok(num,TRUE)){
  16949.  
  16950.                                         op(0x83);
  16951.  
  16952.                                         op(0xE8+reg);
  16953.  
  16954.                                         op(num);
  16955.  
  16956.                                         return;
  16957.  
  16958.                                 }
  16959.  
  16960.                         }
  16961.  
  16962.                 }
  16963.  
  16964.                 if((nreg=GetNumberR(reg,&num,razr,number))!=NOINREG){
  16965.  
  16966.                         ConstToReg(number,reg,razr);
  16967.  
  16968.                         if(num==number){
  16969.  
  16970.                                 op(0x89);
  16971.  
  16972.                                 op(128+64+nreg*8+reg);
  16973.  
  16974.                                 return;
  16975.  
  16976.                         }
  16977.  
  16978.                         else if((number-num)==1){
  16979.  
  16980.                                 op(0x89);
  16981.  
  16982.                                 op(128+64+nreg*8+reg);
  16983.  
  16984.                                 op66(razr);
  16985.  
  16986.                                 op(0x40+reg);   //inc reg
  16987.  
  16988.                                 return;
  16989.  
  16990.                         }
  16991.  
  16992.                         else{
  16993.  
  16994.                                 if((num-number)==1){
  16995.  
  16996.                                         op(0x89);
  16997.  
  16998.                                         op(128+64+nreg*8+reg);
  16999.  
  17000.                                         op66(razr);
  17001.  
  17002.                                         op(0x48+reg);   //dec reg
  17003.  
  17004.                                         return;
  17005.  
  17006.                                 }
  17007.  
  17008.                         }
  17009.  
  17010.                 }
  17011.  
  17012.                 ConstToReg(number,reg,razr);
  17013.  
  17014.                 if(number==0){
  17015.  
  17016.                         op(0x31); op(0xC0+reg*9);
  17017.  
  17018.                 }  // XOR reg,reg
  17019.  
  17020.                 else if((long)number==-1&&razr==r32){
  17021.  
  17022.                         op(0x83);       //or reg,-1
  17023.  
  17024.                         op(0xC8+reg);
  17025.  
  17026.                         op(0xFF);
  17027.  
  17028.                 }
  17029.  
  17030.                 else if(number==1&&razr==r32){
  17031.  
  17032.                         op(0x31); op(0xC0+reg*9);       //xor reg,reg
  17033.  
  17034.                         op66(razr);
  17035.  
  17036.                         op(0x40+reg);   //inc reg
  17037.  
  17038.                 }
  17039.  
  17040.                 else if(regoverstack&&razr==r32&&short_ok(number,TRUE)){
  17041.  
  17042.                         op(0x6A);
  17043.  
  17044.                         op(number);     //push short number
  17045.  
  17046.                         op66(razr);
  17047.  
  17048.                   op(0x58+reg);
  17049.  
  17050.                 }
  17051.  
  17052.                 else goto stdmov;
  17053.  
  17054.         }
  17055.  
  17056.         else{
  17057.  
  17058. stdmov:
  17059.  
  17060.                 op(0xB8+reg);   // MOV reg,#
  17061.  
  17062.                 if(relocf)AddReloc();
  17063.  
  17064.                 razr==r16?outword(number):outdword(number);
  17065.  
  17066.                 ClearReg(reg);
  17067.  
  17068.         }
  17069.  
  17070. }
  17071.  
  17072.  
  17073.  
  17074. void NegReg(int razr,int reg)
  17075.  
  17076. {
  17077.  
  17078.         op66(razr);
  17079.  
  17080.         if(optimizespeed&&(chip==5||chip==6)){
  17081.  
  17082.                 op(0x83);       //and reg,-1
  17083.  
  17084.                 op(0xF0+reg);
  17085.  
  17086.                 op(0xFF);
  17087.  
  17088.                 op66(razr);
  17089.  
  17090.                 op(0x40+reg);   //inc reg
  17091.  
  17092.         }
  17093.  
  17094.         else{
  17095.  
  17096.                 op(0xF7);
  17097.  
  17098.                 op(0xD8+reg);  // NEG reg
  17099.  
  17100.         }
  17101.  
  17102.         ClearReg(reg);
  17103.  
  17104. }
  17105.  
  17106.  
  17107.  
  17108. int RshiftReg(int razr,int reg,int sign)
  17109.  
  17110. {
  17111.  
  17112. char *ofsstr=NULL;
  17113.  
  17114.         if(tok==tk_number){
  17115.  
  17116.                 if((unsigned int)itok.number==1){
  17117.  
  17118.                         op66(razr);
  17119.  
  17120.                         op(0xD1); op(0xE8+reg+sign);  // SHR reg,1
  17121.  
  17122.                 }
  17123.  
  17124.                 else if((unsigned int)itok.number!=0){
  17125.  
  17126.                         if(chip<2&&razr==r16){
  17127.  
  17128.                                 if(reg==ECX)return FALSE;
  17129.  
  17130.                                 goto rrshift;
  17131.  
  17132.                         }
  17133.  
  17134.                         else{
  17135.  
  17136.                                 op66(razr);
  17137.  
  17138.                                 op(0xc1);
  17139.  
  17140.                                 op(0xe8+reg+sign); // SHR reg,imm8
  17141.  
  17142.                                 op((unsigned int)itok.number);
  17143.  
  17144.                                 if(cpu<2)cpu=2;
  17145.  
  17146.                         }
  17147.  
  17148.                 }
  17149.  
  17150.                 nexttok();
  17151.  
  17152.         }
  17153.  
  17154.         else if(reg==ECX)return FALSE;
  17155.  
  17156.         else if((tok==tk_beg||tok==tk_reg||tok==tk_reg32)&&itok.number==CL){
  17157.  
  17158.                 nexttok();
  17159.  
  17160.                 goto rshift;
  17161.  
  17162.         }
  17163.  
  17164.         else{
  17165.  
  17166. rrshift:
  17167.  
  17168.                 getintobeg(CL,&ofsstr);
  17169.  
  17170.                 warningreg(begs[1]);
  17171.  
  17172. rshift:
  17173.  
  17174.                 op66(razr);
  17175.  
  17176.                 op(0xD3);
  17177.  
  17178.                 op(0xE8+reg+sign);      // SHL xXX,CL
  17179.  
  17180.         }
  17181.  
  17182.         return TRUE;
  17183.  
  17184. }
  17185.  
  17186.  
  17187.  
  17188. int CheckMinusNum()
  17189.  
  17190. {
  17191.  
  17192.         if(tok==tk_minus&&tok2==tk_number){
  17193.  
  17194.                 nexttok();
  17195.  
  17196.                 if(itok.rm==tk_float)itok.number|=0x80000000;
  17197.  
  17198.                 else if(itok.rm==tk_double)itok.lnumber|=0x8000000000000000LL;
  17199.  
  17200.                 else itok.lnumber=-itok.lnumber;
  17201.  
  17202.                 return TRUE;
  17203.  
  17204.         }
  17205.  
  17206.         return FALSE;
  17207.  
  17208. }
  17209.  
  17210.  
  17211.  
  17212. int MulReg(int reg,int razr)
  17213.  
  17214. {
  17215.  
  17216. int next=1,i=0;
  17217.  
  17218. int ii=0;
  17219.  
  17220. char *ofsstr=NULL;
  17221.  
  17222.         switch(tok){
  17223.  
  17224.                 case tk_number:
  17225.  
  17226.                         RegMulNum(reg,itok.number,razr,0,&i,itok.flag);
  17227.  
  17228.                         break;
  17229.  
  17230.                 case tk_postnumber:
  17231.  
  17232.                 case tk_undefofs:
  17233.  
  17234.                         if(chip<2&&razr==r16)regmathoperror();
  17235.  
  17236.                         op66(razr);
  17237.  
  17238.                         op(0x69);
  17239.  
  17240.                         op(0xc0+reg*9);
  17241.  
  17242.                         if(tok==tk_postnumber)(itok.flag&f_extern)==0?setwordpost(&itok):setwordext(&itok.number);
  17243.  
  17244.                         else AddUndefOff(0,itok.name);
  17245.  
  17246.                         razr==r16?outword(itok.number):outdword(itok.number);
  17247.  
  17248.                         break;
  17249.  
  17250.                 case tk_apioffset:
  17251.  
  17252.                         if(chip<2&&razr==r16)regmathoperror();
  17253.  
  17254.                         op66(razr);
  17255.  
  17256.                         op(0x69);
  17257.  
  17258.                         op(0xc0+reg*9);
  17259.  
  17260.                         AddApiToPost(itok.number);
  17261.  
  17262.                         break;
  17263.  
  17264.                 case tk_doublevar:
  17265.  
  17266.                         ii=4;
  17267.  
  17268.                 case tk_floatvar:
  17269.  
  17270.                         if(reg!=EDX)i=EDX;
  17271.  
  17272.                         Float2reg32(i,ii);
  17273.  
  17274.                         op66(razr);
  17275.  
  17276.                         outword(0xAF0F);
  17277.  
  17278.                         op(0xC0+reg*8+i); // IMUL reg,EDX/EAX
  17279.  
  17280.                         warningreg(regs[1][i]);
  17281.  
  17282.                         break;
  17283.  
  17284.                 case tk_qwordvar:
  17285.  
  17286.                         i=4;
  17287.  
  17288.                 case tk_longvar:
  17289.  
  17290.                 case tk_dwordvar:
  17291.  
  17292.                         i+=4;
  17293.  
  17294.                         goto mulword;
  17295.  
  17296.                 case tk_intvar:
  17297.  
  17298.                 case tk_wordvar:
  17299.  
  17300.                         if(chip<2)regmathoperror();
  17301.  
  17302.                         if(razr==r32)goto defmul1;
  17303.  
  17304.                         i=2;
  17305.  
  17306. mulword:
  17307.  
  17308.                         CheckAllMassiv(bufrm,i,&strinf);
  17309.  
  17310.                         op66(razr);
  17311.  
  17312.                         outseg(&itok,3);
  17313.  
  17314.                         outword(0xAF0F);
  17315.  
  17316.                         op(reg*8+itok.rm);
  17317.  
  17318.                         outaddress(&itok);
  17319.  
  17320.                         break;
  17321.  
  17322.                 case tk_bits:
  17323.  
  17324.                         int vops,reg2s;
  17325.  
  17326.                         i=itok.bit.siz+itok.bit.ofs;
  17327.  
  17328.                         if(i<=64)vops=r64;
  17329.  
  17330.                         if(i<=32)vops=r32;
  17331.  
  17332.                         if(i<=16)vops=r16;
  17333.  
  17334.                         if(vops<razr)vops=razr;
  17335.  
  17336.                         reg2s=CX;
  17337.  
  17338.                         if(reg==CX)reg2s=DI;
  17339.  
  17340.                         bits2reg(reg2s,vops);
  17341.  
  17342.                         if(vops==r64)vops=r32;
  17343.  
  17344.                         warningreg(regs[vops/2-1][reg2s]);
  17345.  
  17346.                         itok.number=reg2s;
  17347.  
  17348.                         goto defreg32;
  17349.  
  17350.                 case tk_reg:
  17351.  
  17352.                         if(chip<2)regmathoperror();
  17353.  
  17354.                         if(razr==r32){
  17355.  
  17356.                                 op66(r32);
  17357.  
  17358.                                 outword(0xB70F);
  17359.  
  17360.                                 if(itok.number==reg){
  17361.  
  17362.                                         op(0xC0+reg);
  17363.  
  17364.                                         itok.number=EAX;
  17365.  
  17366.                                 }
  17367.  
  17368.                                 else op(0xC0+itok.number*9);
  17369.  
  17370.                                 warningreg(regs[razr/2-1][itok.number]);
  17371.  
  17372.                         }
  17373.  
  17374.                 case tk_reg32:
  17375.  
  17376. defreg32:
  17377.  
  17378.                         op66(razr);
  17379.  
  17380.                         outword(0xAF0F);
  17381.  
  17382.                         op(0xC0+reg*8+(unsigned int)itok.number);
  17383.  
  17384.                         break;
  17385.  
  17386.                 case tk_ID:
  17387.  
  17388.                 case tk_id:
  17389.  
  17390.                 case tk_proc:
  17391.  
  17392.                 case tk_apiproc:
  17393.  
  17394.                 case tk_undefproc:
  17395.  
  17396.                 case tk_declare:
  17397.  
  17398.                         procdo(razr==r16?tk_word:tk_dword);
  17399.  
  17400.                         i=EAX;
  17401.  
  17402.                         goto defmul;
  17403.  
  17404.                 case tk_seg:
  17405.  
  17406.                 case tk_charvar:
  17407.  
  17408.                 case tk_beg:
  17409.  
  17410.                 case tk_bytevar:
  17411.  
  17412.                 case tk_rmnumber:
  17413.  
  17414. defmul1:
  17415.  
  17416.                         i=EDX;
  17417.  
  17418.                         if(reg==EDX)i=ECX;
  17419.  
  17420.                         getintoreg_32(i,razr,0,&ofsstr,FALSE);
  17421.  
  17422. defmul:
  17423.  
  17424.                         op66(razr);
  17425.  
  17426.                         outword(0xAF0F);
  17427.  
  17428.                         op(0xC0+reg*8+i);
  17429.  
  17430.                         warningreg(regs[razr/2-1][2]);
  17431.  
  17432.                         if(i!=EDX)warningreg(regs[razr/2-1][i]);
  17433.  
  17434.                         if(i!=EAX)next=0;
  17435.  
  17436.                         break;
  17437.  
  17438.                 default: regmathoperror(); break;
  17439.  
  17440.         }
  17441.  
  17442.         return next;
  17443.  
  17444. }
  17445.  
  17446.  
  17447.  
  17448. void DivMod(int vop,int sign,int razr,int expand)
  17449.  
  17450. {
  17451.  
  17452. int i,next;
  17453.  
  17454. char *ofsstr=NULL;
  17455.  
  17456.         if(tok==tk_bits){
  17457.  
  17458.                 i=itok.bit.siz+itok.bit.ofs;
  17459.  
  17460.                 if(i<=64)next=r64;
  17461.  
  17462.                 if(i<=32)next=r32;
  17463.  
  17464.                 if(i<=16)next=r16;
  17465.  
  17466.                 bits2reg(CX,(razr<next?next:razr));
  17467.  
  17468.                 itok.number=CX;
  17469.  
  17470.                 if(next==r64)next=r32;
  17471.  
  17472.                 ClearReg(CX);
  17473.  
  17474.                 warningreg(regs[next/2-1][ECX]);
  17475.  
  17476.                 tok=(razr==r16?tk_reg:tk_reg32);
  17477.  
  17478.         }
  17479.  
  17480.         i=0;
  17481.  
  17482.         next=1;
  17483.  
  17484.         if(tok==tk_number){
  17485.  
  17486.                 if(razr==r16)itok.number&=0xffff;
  17487.  
  17488.                 if(vop){        //%
  17489.  
  17490.                         if((itok.flag&f_reloc)!=0)goto defal;
  17491.  
  17492.                         if(itok.number==0)DevideZero();
  17493.  
  17494.                         if(caselong(itok.number)!=NUMNUM){
  17495.  
  17496.                                 itok.number--;
  17497.  
  17498.                                 if(itok.number==0)ZeroReg(EAX,razr);
  17499.  
  17500.                                 else if(short_ok(itok.number,razr/2-1)){
  17501.  
  17502.                                         op66(razr);
  17503.  
  17504.                                         outword(0xE083);
  17505.  
  17506.                                         op(itok.number);
  17507.  
  17508.                                 }
  17509.  
  17510.                                 else{
  17511.  
  17512.                                         op66(razr);
  17513.  
  17514.                                         op(0x25); // AND EAX,number-1
  17515.  
  17516.                                         razr==r16?outword((unsigned int)itok.number):outdword(itok.number);
  17517.  
  17518.                                 }
  17519.  
  17520.                                 setzeroflag=TRUE;
  17521.  
  17522.                         }
  17523.  
  17524.                         else{
  17525.  
  17526. defal:
  17527.  
  17528.                                 if(!expand)ClearDX(razr,sign);
  17529.  
  17530.                                 DivNum2(itok.number,razr,sign);
  17531.  
  17532.                                 setzeroflag=FALSE;
  17533.  
  17534.                         }
  17535.  
  17536.                 }
  17537.  
  17538.                 else{   //¤¥«¥­¨¥
  17539.  
  17540.                         if((itok.flag&f_reloc)!=0)goto divin;
  17541.  
  17542.                         switch(itok.number){
  17543.  
  17544.                                 case 0:
  17545.  
  17546.                                         DevideZero();
  17547.  
  17548.                                         break;
  17549.  
  17550.                                 case 1: break;
  17551.  
  17552.                                 case 2:
  17553.  
  17554.                                         if(expand==TRUE){
  17555.  
  17556.                                                 op66(razr);
  17557.  
  17558.                                                 if((chip>2||razr==r32)&&chip!=5&&chip!=6){
  17559.  
  17560.                                                         outdword(0x01d0ac0f);   //shrd ax,dx,1
  17561.  
  17562.                                                         setzeroflag=TRUE;
  17563.  
  17564.                                                 }
  17565.  
  17566.                                                 else{
  17567.  
  17568.                                                         outword(0xead1);        //shr dx,1 rcr ax,1
  17569.  
  17570.                                                         op66(razr);
  17571.  
  17572.                                                         outword(0xd8d1);
  17573.  
  17574.                                                         setzeroflag=FALSE;
  17575.  
  17576.                                                 }
  17577.  
  17578.                                                 ClearReg(AX);
  17579.  
  17580.                                                 ClearReg(DX);
  17581.  
  17582.                                                 break;
  17583.  
  17584.                                         }
  17585.  
  17586.                                         op66(razr);
  17587.  
  17588.                                   if(sign)outword(0xF8D1);// SAR AX,1
  17589.  
  17590.                                         else outword(0xE8D1);   // SHR AX,1
  17591.  
  17592.                                         setzeroflag=TRUE;
  17593.  
  17594.                                         ClearReg(AX);
  17595.  
  17596.                                         break;
  17597.  
  17598.                                 default:
  17599.  
  17600.                                         vop=caselong(itok.number);
  17601.  
  17602.                                         if(vop!=NUMNUM){
  17603.  
  17604.                                                 if(expand==TRUE){
  17605.  
  17606.                                                         if(chip>2||razr==r32){
  17607.  
  17608.                                                                 op66(razr);
  17609.  
  17610.                                                                 op(0x0f);
  17611.  
  17612.                                                                 outword(0xd0ac);        //shrd ax,dx,vop
  17613.  
  17614.                                                                 op(vop);
  17615.  
  17616.                                                                 setzeroflag=TRUE;
  17617.  
  17618.                                                                 ClearReg(AX);
  17619.  
  17620.                                                                 ClearReg(DX);
  17621.  
  17622.                                                         }
  17623.  
  17624.                                                         else{
  17625.  
  17626.                                                                 if(optimizespeed==FALSE)goto divin;
  17627.  
  17628.                                                                 op(0xB1); op(vop); /* MOV CL,num */
  17629.  
  17630.                                                                 if(sign)outword(0xFad1); // SAR AX,1
  17631.  
  17632.                                                                 else outword(0xEad1); // SHR AX,1
  17633.  
  17634.                                                                 outdword(0xfae2d8d1);  //rcr ax,1  LOOP -6
  17635.  
  17636.                                                                 warningreg(begs[1]);
  17637.  
  17638.                                                                 setzeroflag=FALSE;
  17639.  
  17640.                                                                 ClearReg(AX);
  17641.  
  17642.                                                                 ConstToReg(vop,CL,r8);
  17643.  
  17644.                                                         }
  17645.  
  17646.                                                 }
  17647.  
  17648.                                                 else{
  17649.  
  17650.                                                         if(chip<2&&razr==r16){
  17651.  
  17652.                                                                 op(0xB1); op(vop); /* MOV CL,num */
  17653.  
  17654.                                                                 if(sign)outword(0xF8D3); // SAR AX,CL
  17655.  
  17656.                                                                 else outword(0xE8D3); // SHR AX,CL
  17657.  
  17658.                                                                 warningreg(begs[1]);
  17659.  
  17660.                                                                 ClearReg(AX);
  17661.  
  17662.                                                                 ConstToReg(vop,CL,r8);
  17663.  
  17664.                                                         }
  17665.  
  17666.                                                         else{
  17667.  
  17668.                                                                 op66(razr);
  17669.  
  17670.                                                                 if(sign)outword(0xF8C1); // SAR AX,num
  17671.  
  17672.                                                                 else outword(0xE8C1); // SHR AX,num
  17673.  
  17674.                                                                 op(vop);
  17675.  
  17676.                                                                 ClearReg(AX);
  17677.  
  17678.                                                         }
  17679.  
  17680.                                                         setzeroflag=TRUE;
  17681.  
  17682.                                                 }
  17683.  
  17684.                                         }
  17685.  
  17686.                                         else{
  17687.  
  17688.                                                 if(expand==FALSE)DivNum(itok.number,razr,sign);
  17689.  
  17690.                                                 else{
  17691.  
  17692. divin:
  17693.  
  17694.  
  17695.  
  17696.                                                         if(!expand)ClearDX(razr,sign);
  17697.  
  17698.                                                         DivNum2(itok.number,razr,sign);
  17699.  
  17700.                                                 }
  17701.  
  17702.                                         }
  17703.  
  17704.                         }
  17705.  
  17706.                 }
  17707.  
  17708.         }
  17709.  
  17710.         else{
  17711.  
  17712.                 if(tok==tk_doublevar){
  17713.  
  17714.                         i=4;
  17715.  
  17716.                         tok=tk_floatvar;
  17717.  
  17718.                 }
  17719.  
  17720.                 if(tok==tk_floatvar){
  17721.  
  17722.                         Float2reg32(ECX,i);
  17723.  
  17724.                         warningreg(regs[razr/2-1][1]);
  17725.  
  17726.                         itok.number=ECX;
  17727.  
  17728.                         tok=(razr==r16?tk_reg:tk_reg32);
  17729.  
  17730.                         sign=1;
  17731.  
  17732.                 }
  17733.  
  17734.                 switch(tok){
  17735.  
  17736.                         case tk_qwordvar:
  17737.  
  17738.                                 i=4;
  17739.  
  17740.                         case tk_longvar:
  17741.  
  17742.                         case tk_dwordvar:
  17743.  
  17744.                                 i+=2;
  17745.  
  17746.                         case tk_intvar:
  17747.  
  17748.                         case tk_wordvar:
  17749.  
  17750.                                 if(razr==r32&&(tok==tk_intvar||tok==tk_wordvar))goto defdiv;
  17751.  
  17752.                                 i+=2;
  17753.  
  17754.                                 CheckAllMassiv(bufrm,i,&strinf);
  17755.  
  17756.                                 if(expand==FALSE)ClearDX(razr,sign);
  17757.  
  17758.                                 op66(razr);
  17759.  
  17760.                                 outseg(&itok,2);
  17761.  
  17762.                                 op(0xF7);
  17763.  
  17764.                                 if(sign)op(0x38+itok.rm); /* IDIV word ptr [#] */
  17765.  
  17766.                                 else op(0x30+itok.rm); /* DIV word ptr [#] */
  17767.  
  17768.                                 outaddress(&itok);
  17769.  
  17770.                                 ClearReg(AX);
  17771.  
  17772.                                 break;
  17773.  
  17774.                         case tk_reg:
  17775.  
  17776.                                 if(razr==r32){
  17777.  
  17778.                                         i=itok.number;
  17779.  
  17780.                                         getintoreg_32(i,r32,0,&ofsstr,FALSE);
  17781.  
  17782.                                         if(expand==FALSE)ClearDX(razr,sign);
  17783.  
  17784.                                         op66(r32);
  17785.  
  17786.                                         op(0xF7);
  17787.  
  17788.                                         if(sign)op(0xF8+i);  /* IDIV ECX */
  17789.  
  17790.                                         else op(0xF0+i); /* DIV ECX */
  17791.  
  17792.                                         next=0;
  17793.  
  17794.                                         warningreg(regs[1][2]);
  17795.  
  17796.                                 ClearReg(AX);
  17797.  
  17798.                                 ClearReg(CX);
  17799.  
  17800.                                         break;
  17801.  
  17802.                                 }
  17803.  
  17804.                         case tk_reg32:
  17805.  
  17806.                                 if(expand==FALSE)ClearDX(razr,sign);
  17807.  
  17808.                                 op66(razr);
  17809.  
  17810.                                 op(0xF7);
  17811.  
  17812.                                 if(sign)op(0xF8+(unsigned int)itok.number);
  17813.  
  17814.                                 else op(0xF0+(unsigned int)itok.number);
  17815.  
  17816.                                 ClearReg(AX);
  17817.  
  17818.                                 break;
  17819.  
  17820.                         case tk_ID:
  17821.  
  17822.                         case tk_id:
  17823.  
  17824.                         case tk_proc:
  17825.  
  17826.                         case tk_apiproc:
  17827.  
  17828.                         case tk_undefproc:
  17829.  
  17830.                         case tk_declare:
  17831.  
  17832.                                 op66(razr);
  17833.  
  17834.                                 op(0x50);       //push AX
  17835.  
  17836.                                 addESP+=razr==r16?2:4;
  17837.  
  17838. unsigned char oaddstack;
  17839.  
  17840.                                 oaddstack=addstack;
  17841.  
  17842.                                 addstack=FALSE;
  17843.  
  17844.                                 procdo(razr==r16?(sign==0?tk_word:tk_int):(sign==0?tk_dword:tk_long));
  17845.  
  17846.                                 addstack=oaddstack;
  17847.  
  17848.                                 addESP-=razr==r16?2:4;
  17849.  
  17850.                                 op66(razr);
  17851.  
  17852.                                 op(0x90+ECX);   //xchg AX,CX
  17853.  
  17854.                                 op66(razr);
  17855.  
  17856.                                 op(0x58);       //pop AX
  17857.  
  17858.                                 if(expand==FALSE)ClearDX(razr,sign);
  17859.  
  17860.                                 op66(razr);
  17861.  
  17862.                                 op(0xF7);
  17863.  
  17864.                                 if(sign)op(0xF8+ECX);  /* IDIV ECX */
  17865.  
  17866.                                 else op(0xF0+ECX); /* DIV ECX */
  17867.  
  17868.                                 warningreg(regs[razr/2-1][ECX]);
  17869.  
  17870.                                 break;
  17871.  
  17872.                         case tk_undefofs:
  17873.  
  17874.                         case tk_seg:
  17875.  
  17876.                         case tk_charvar:
  17877.  
  17878.                         case tk_beg:
  17879.  
  17880.                         case tk_bytevar:
  17881.  
  17882.                         case tk_rmnumber:
  17883.  
  17884.                         case tk_postnumber:
  17885.  
  17886.                         case tk_apioffset:
  17887.  
  17888. defdiv:
  17889.  
  17890.                                 getintoreg_32(CX,razr,0,&ofsstr,FALSE);
  17891.  
  17892.                                 if(expand==FALSE)ClearDX(razr,sign);
  17893.  
  17894.                                 op66(razr);
  17895.  
  17896.                                 if(sign)outword(0xF9F7);  /* IDIV CX */
  17897.  
  17898.                                 else outword(0xF1F7); /* DIV CX */
  17899.  
  17900.                                 next=0;
  17901.  
  17902.                                 warningreg(regs[razr/2-1][ECX]);
  17903.  
  17904.                                 ClearReg(CX);
  17905.  
  17906.                                 ClearReg(AX);
  17907.  
  17908.                                 break;
  17909.  
  17910.                         default: valueexpected();       break;
  17911.  
  17912.                 }
  17913.  
  17914.                 setzeroflag=FALSE;
  17915.  
  17916. /*              if(vop){
  17917.  
  17918.                         op66(razr);
  17919.  
  17920.                         if(optimizespeed)outword(0xC28B);       //mov ax,dx
  17921.  
  17922.                         else op(0x92);  //xchg ax,dx
  17923.  
  17924.                 }*/
  17925.  
  17926.         }
  17927.  
  17928.         if(next)nexttok();
  17929.  
  17930. }
  17931.  
  17932.  
  17933.  
  17934. void DivNum(unsigned long num,int razr,int sign)
  17935.  
  17936. {
  17937.  
  17938. /*int i;
  17939.  
  17940. unsigned long num2;
  17941.  
  17942.         if(num<65536&&optimizespeed&&(itok.flag&f_reloc)==0&&sign==0){  //for signed needed new algoritm
  17943.  
  17944.                 if(razr==r16&&chip>2){
  17945.  
  17946.                         num2=65536/(unsigned int)num+1;
  17947.  
  17948.                         if((65535/num2)!=num)goto stddiv;
  17949.  
  17950.                         op66(r32);
  17951.  
  17952.                         op(0x25);
  17953.  
  17954.                         outdword(0xffff);       //and EAX,ffff
  17955.  
  17956.                         if(short_ok(num2,FALSE))i=2;    //ª®à®âª ï ä®à¬ 
  17957.  
  17958.                         op66(r32);
  17959.  
  17960.                         op(0x69+i);     //imul EAX,num
  17961.  
  17962.                         op(0xc0);
  17963.  
  17964.                         if(i==2)op(num2);
  17965.  
  17966.                         else outdword(num2);
  17967.  
  17968.                         op66(r32);
  17969.  
  17970.                         outword(0xE8C1);
  17971.  
  17972.                         op(0x10);       //shr EAX,16
  17973.  
  17974.                         setzeroflag=TRUE;
  17975.  
  17976.                 }
  17977.  
  17978.                 else{
  17979.  
  17980.                         if(razr==r32)num=(unsigned long)0xFFFFFFFFL/num+1;
  17981.  
  17982.                         else num=65536/(unsigned int)num+1;
  17983.  
  17984.                         op66(razr);
  17985.  
  17986.                         op(0xBA);       //mov DX,num
  17987.  
  17988.                         if(razr==r16)outword(num);
  17989.  
  17990.                         else outdword(num);
  17991.  
  17992.                         op66(razr);
  17993.  
  17994.                         outword(0xE2F7);        //mul DX
  17995.  
  17996.                         op66(razr);
  17997.  
  17998.                         outword(0xD089);  //mov AX,DX
  17999.  
  18000.                         setzeroflag=FALSE;
  18001.  
  18002.                         warningreg(regs[razr/2-1][2]);
  18003.  
  18004.                 }
  18005.  
  18006.                 return;
  18007.  
  18008.         }
  18009.  
  18010. stddiv:*/
  18011.  
  18012.         ClearDX(razr,sign);
  18013.  
  18014.         DivNum2(num,razr,sign);
  18015.  
  18016. }
  18017.  
  18018.  
  18019.  
  18020. void ClearDX(int razr,int sign)
  18021.  
  18022. {
  18023.  
  18024.         if(sign)cwdq(razr);
  18025.  
  18026.         else{
  18027.  
  18028.                 op66(razr);
  18029.  
  18030.                 outword(0xD231);
  18031.  
  18032.         }
  18033.  
  18034.         warningreg(regs[razr/2-1][EDX]);
  18035.  
  18036.         ClearReg(DX);
  18037.  
  18038. }
  18039.  
  18040.  
  18041.  
  18042. void DivNum2(unsigned long num,int razr,int sign)
  18043.  
  18044. {
  18045.  
  18046.         MovRegNum(razr,itok.flag&f_reloc,num,ECX);
  18047.  
  18048.         op66(razr);
  18049.  
  18050.         if(sign)outword(0xF9F7);  /* IDIV CX */
  18051.  
  18052.         else outword(0xF1F7); /* DIV CX */
  18053.  
  18054.         warningreg(regs[razr/2-1][ECX]);
  18055.  
  18056.         ClearReg(CX);
  18057.  
  18058.         ClearReg(AX);
  18059.  
  18060. }
  18061.  
  18062.  
  18063.  
  18064. int getintoreg(int reg,int razr,int sign,char **ofsstr)
  18065.  
  18066. {
  18067.  
  18068. ITOK oitok,oitok2;
  18069.  
  18070. int oline,oendinptr;
  18071.  
  18072. int oinptr,otok,otok2;
  18073.  
  18074. unsigned char *oinput;
  18075.  
  18076. unsigned char ocha;
  18077.  
  18078. int useeax=FALSE;
  18079.  
  18080. int operand=tk_plus;
  18081.  
  18082. int rettype=tk_reg;
  18083.  
  18084. char *obuf;
  18085.  
  18086. SINFO ostr;
  18087.  
  18088. int i=0;
  18089.  
  18090. int j=0;
  18091.  
  18092. int onlynum=FALSE;
  18093.  
  18094. COM_MOD *bmod;
  18095.  
  18096.         switch(tok){
  18097.  
  18098.                 case tk_ID:
  18099.  
  18100.                 case tk_id:
  18101.  
  18102.                 case tk_proc:
  18103.  
  18104.                 case tk_apiproc:
  18105.  
  18106.                 case tk_undefproc:
  18107.  
  18108.                 case tk_declare:
  18109.  
  18110.                         break;
  18111.  
  18112.                 default:
  18113.  
  18114. //                      if(cur_mod)break;       //10.08.04 22:50 ¨§-§  define ¯à¥ªà â¨âì
  18115.  
  18116.                         obuf=bufrm;
  18117.  
  18118.                         bufrm=NULL;
  18119.  
  18120.                         ostr=strinf;
  18121.  
  18122.                         strinf.bufstr=NULL;
  18123.  
  18124.                         oitok=itok;
  18125.  
  18126.                         oitok2=itok2;
  18127.  
  18128.                         otok=tok;
  18129.  
  18130.                         otok2=tok2;
  18131.  
  18132.                         oline=linenum2;
  18133.  
  18134.                         oinptr=inptr2;
  18135.  
  18136.                         oinput=input;
  18137.  
  18138.                         oendinptr=endinptr;
  18139.  
  18140.                         bmod=cur_mod;
  18141.  
  18142.                         while(bmod){
  18143.  
  18144.                                 bmod->freze=TRUE;
  18145.  
  18146.                                 bmod=bmod->next;
  18147.  
  18148.                         }
  18149.  
  18150.                         bmod=cur_mod;
  18151.  
  18152.                         ocha=cha2;
  18153.  
  18154. //                      printf("input=%08X inptr=%08X %s\n",input,inptr2,input+inptr2);
  18155.  
  18156.                         if(tok==tk_number)onlynum=TRUE;
  18157.  
  18158.                         while((!useeax)&&itok.type!=tp_stopper&&tok!=tk_eof){
  18159.  
  18160.                                 nexttok();
  18161.  
  18162.                                 if(itok.type==tp_stopper)break;
  18163.  
  18164.                                 if(itok.type==tp_opperand)operand=tok;
  18165.  
  18166.                                 else{
  18167.  
  18168.                                         i++;
  18169.  
  18170.                                         if(bufrm){
  18171.  
  18172.                                                 free(bufrm);
  18173.  
  18174.                                                 bufrm=NULL;
  18175.  
  18176.                                         }
  18177.  
  18178.                                         if(strinf.bufstr)free(strinf.bufstr);
  18179.  
  18180.                                         switch(operand){
  18181.  
  18182.                                                 case tk_div:
  18183.  
  18184.                                                 case tk_mod:
  18185.  
  18186.                                                 case tk_divminus:
  18187.  
  18188.                                                 case tk_modminus:
  18189.  
  18190.                                                         if(j==0)j=1;
  18191.  
  18192.                                                         if((tok==tk_reg||tok==tk_reg32)&&itok.number==reg)useeax=TRUE;
  18193.  
  18194.                                                         if(j==1){
  18195.  
  18196.                                                                 if(tok==tk_number){
  18197.  
  18198.                                                                         if(onlynum==FALSE&&caselong(itok.number)==NUMNUM)j++;
  18199.  
  18200.                                                                 }
  18201.  
  18202.                                                                 else{
  18203.  
  18204.                                                                         j++;
  18205.  
  18206.                                                                         onlynum=FALSE;
  18207.  
  18208.                                                                 }
  18209.  
  18210.                                                         }
  18211.  
  18212.                                                         break;
  18213.  
  18214.                                         }
  18215.  
  18216.                                 }
  18217.  
  18218.                         }
  18219.  
  18220.                         if(bmod!=cur_mod){
  18221.  
  18222.                                 if(bmod&&bmod->freze){
  18223.  
  18224.                                         cur_mod=bmod;
  18225.  
  18226.                                         while(bmod){
  18227.  
  18228.                                                 bmod->freze=FALSE;
  18229.  
  18230.                                                 bmod=bmod->next;
  18231.  
  18232.                                         }
  18233.  
  18234.                                 }
  18235.  
  18236.                                 else{
  18237.  
  18238.                                         do{
  18239.  
  18240.                                                 COM_MOD *temp=cur_mod;
  18241.  
  18242.                                                 cur_mod=cur_mod->next;
  18243.  
  18244. //                                              printf("bmod=%08X cur_mod=%08X\n",bmod,cur_mod);
  18245.  
  18246.                                                 if(temp->paramdef)free(temp->paramdef);
  18247.  
  18248.                                                 free(temp);
  18249.  
  18250.                                         }while(bmod!=cur_mod);
  18251.  
  18252.                                         while(bmod){
  18253.  
  18254.                                                 bmod->freze=FALSE;
  18255.  
  18256.                                                 bmod=bmod->next;
  18257.  
  18258.                                         }
  18259.  
  18260.                                 }
  18261.  
  18262.                                 input=oinput;
  18263.  
  18264.                         }
  18265.  
  18266.                         endinptr=oendinptr;
  18267.  
  18268.                         itok=oitok;
  18269.  
  18270.                         itok2=oitok2;
  18271.  
  18272.                         tok=otok;
  18273.  
  18274.                         tok2=otok2;
  18275.  
  18276.                         linenum2=oline;
  18277.  
  18278.                         inptr2=oinptr;
  18279.  
  18280.                         cha2=ocha;
  18281.  
  18282.                         endoffile=0;
  18283.  
  18284. //                      printf("input=%08X inptr=%08X %s\n",input,inptr2,input+inptr2);
  18285.  
  18286. //                      if(bufrm) { free(bufrm); bufrm=NULL; }
  18287.  
  18288. //                      if(strinf.bufstr)free(strinf.bufstr);
  18289.  
  18290.                         bufrm=obuf;
  18291.  
  18292.                         strinf=ostr;
  18293.  
  18294.                         break;
  18295.  
  18296.         }
  18297.  
  18298.         if(useeax){
  18299.  
  18300.                 op66(razr);
  18301.  
  18302.                 op(0x50);
  18303.  
  18304.                 addESP+=razr==r16?2:4;
  18305.  
  18306.                 do_e_axmath(0,razr,ofsstr);
  18307.  
  18308.                 op66(razr);
  18309.  
  18310.                 if(optimizespeed){
  18311.  
  18312.                         op(0x89);
  18313.  
  18314.                         op(0xC0+reg);
  18315.  
  18316.                 }
  18317.  
  18318.                 else op(0x90+reg);
  18319.  
  18320.                 op66(razr);
  18321.  
  18322.                 addESP-=razr==r16?2:4;
  18323.  
  18324.                 op(0x58);
  18325.  
  18326.         }
  18327.  
  18328.         else{
  18329.  
  18330.                 if(i==1&&j>=2){
  18331.  
  18332.                         i=EAX;
  18333.  
  18334.                         j=1;
  18335.  
  18336.                 }
  18337.  
  18338.                 else i=reg;
  18339.  
  18340.                 rettype=getintoreg_32(i,razr,sign,ofsstr);
  18341.  
  18342.                 if(itok.type!=tp_stopper&&itok.type!=tp_compare&&tok!=tk_eof){
  18343.  
  18344.                         doregmath_32(reg,razr,sign,ofsstr,j);
  18345.  
  18346.                         rettype=tk_reg;
  18347.  
  18348.                 }
  18349.  
  18350.         }
  18351.  
  18352.         return rettype;
  18353.  
  18354. }
  18355.  
  18356.  
  18357.  
  18358. void dobits()
  18359.  
  18360. {
  18361.  
  18362. ITOK wtok;
  18363.  
  18364. char *wbuf;
  18365.  
  18366. SINFO wstr;
  18367.  
  18368. int razr,i,sign=0,posiblret,pointr=0;
  18369.  
  18370. unsigned int rettype;
  18371.  
  18372. int numpointr=0;
  18373.  
  18374. char *ofsstr=NULL;
  18375.  
  18376.         posiblret=rettype=tk_dword;
  18377.  
  18378.         razr=r32;
  18379.  
  18380.         i=itok.bit.siz+itok.bit.ofs;
  18381.  
  18382.         if(i<9){
  18383.  
  18384.                 razr=r8;
  18385.  
  18386.                 posiblret=rettype=tk_byte;
  18387.  
  18388.         }
  18389.  
  18390.         else if(i<17){
  18391.  
  18392.                 posiblret=rettype=tk_word;
  18393.  
  18394.                 razr=r16;
  18395.  
  18396.         }
  18397.  
  18398.         else if(i>32)razr=r64;
  18399.  
  18400.         if(tok2==tk_assign){
  18401.  
  18402.                 wstr=strinf;
  18403.  
  18404.                 strinf.bufstr=NULL;
  18405.  
  18406.                 wtok=itok;
  18407.  
  18408.                 wbuf=bufrm;
  18409.  
  18410.                 bufrm=NULL;
  18411.  
  18412.                 nexttok();
  18413.  
  18414.                 nexttok();
  18415.  
  18416.                 convert_type(&sign,(int *)&rettype,&pointr);
  18417.  
  18418.                 while(tok==tk_mult){
  18419.  
  18420.                         nexttok();
  18421.  
  18422.                         numpointr++;
  18423.  
  18424.                 }
  18425.  
  18426.                 if(numpointr>itok.npointr)unuseableinput();
  18427.  
  18428.                 if(tok2==tk_assign){
  18429.  
  18430.                         MultiAssign(razr,EAX,numpointr);
  18431.  
  18432.                         goto axtobit;
  18433.  
  18434.                 }
  18435.  
  18436.                 if(tok==tk_pointer)cpointr(am32==TRUE?EAX:BX,numpointr);
  18437.  
  18438.                 CheckMinusNum();
  18439.  
  18440.                 if(tok==tk_number){
  18441.  
  18442.                         if(itok2.type==tp_opperand){    //á«®¦­®¥ ¢ëà ¦¥­¨¥
  18443.  
  18444.                                 if(!OnlyNumber(0))goto labl1;
  18445.  
  18446.                                 itok.flag=(unsigned char)postnumflag;
  18447.  
  18448.                         }
  18449.  
  18450.                         else{
  18451.  
  18452.                                 unsigned long num=itok.number;
  18453.  
  18454.                                 nexttok();
  18455.  
  18456.                                 itok.number=num;
  18457.  
  18458.                         }
  18459.  
  18460.                         CheckAllMassiv(wbuf,razr,&wstr,&wtok);
  18461.  
  18462.                         if(razr!=r64)num2bits(&wtok,itok.number,razr);
  18463.  
  18464.                         else{
  18465.  
  18466.                                 int siz=wtok.bit.siz;
  18467.  
  18468.                                 wtok.bit.siz=32-wtok.bit.ofs;
  18469.  
  18470.                                 num2bits(&wtok,itok.number,r32);
  18471.  
  18472.                                 wtok.bit.siz=siz+wtok.bit.ofs-32;
  18473.  
  18474.                                 wtok.bit.ofs=0;
  18475.  
  18476.                                 itok.number=itok.number>>(32-wtok.bit.siz);
  18477.  
  18478.                                 wtok.number+=4;
  18479.  
  18480.                                 num2bits(&wtok,itok.number,r8);
  18481.  
  18482.                         }
  18483.  
  18484.                 }
  18485.  
  18486.                 else{
  18487.  
  18488. labl1:
  18489.  
  18490.                         if(rettype==tk_char||rettype==tk_byte)doalmath(sign,&ofsstr);
  18491.  
  18492.                         else if(rettype==tk_int||rettype==tk_word)do_e_axmath(sign,r16,&ofsstr);
  18493.  
  18494.                         else if(rettype==tk_float)doeaxfloatmath(tk_reg32,AX);
  18495.  
  18496.                         else do_e_axmath(sign,r32,&ofsstr);
  18497.  
  18498.                         convert_returnvalue(posiblret,rettype);
  18499.  
  18500.                         CheckAllMassiv(wbuf,razr,&wstr,&wtok);
  18501.  
  18502. axtobit:
  18503.  
  18504.                         if(razr!=r64)reg2bits(&wtok,razr);
  18505.  
  18506.                         else{
  18507.  
  18508.                                 int siz=wtok.bit.siz;
  18509.  
  18510.                                 op66(r32);
  18511.  
  18512.                                 op(0x50);       //push eax
  18513.  
  18514.                                 if(ESPloc&&am32&&wtok.segm==SS)wtok.number+=4;
  18515.  
  18516.                                 addESP+=4;
  18517.  
  18518.                                 wtok.bit.siz=32-wtok.bit.ofs;
  18519.  
  18520.                                 reg2bits(&wtok,r32);
  18521.  
  18522.                                 op66(r32);
  18523.  
  18524.                                 op(0x58);       //pop eax
  18525.  
  18526.                                 addESP-=4;
  18527.  
  18528.                                 op66(r32);      //shr eax,size
  18529.  
  18530.                                 outword(0xE8C1);
  18531.  
  18532.                                 op(wtok.bit.siz);
  18533.  
  18534.                                 wtok.bit.siz=siz+wtok.bit.ofs-32;
  18535.  
  18536.                                 wtok.bit.ofs=0;
  18537.  
  18538.                                 wtok.number+=4;
  18539.  
  18540.                                 reg2bits(&wtok,r8);
  18541.  
  18542.                         }
  18543.  
  18544.                         return;
  18545.  
  18546.                 }
  18547.  
  18548.         }
  18549.  
  18550.         else{
  18551.  
  18552.                 bits2reg(AX,razr);
  18553.  
  18554.                 wstr=strinf;
  18555.  
  18556.                 strinf.bufstr=NULL;
  18557.  
  18558.                 wtok=itok;
  18559.  
  18560.                 wbuf=bufrm;
  18561.  
  18562.                 bufrm=NULL;
  18563.  
  18564.                 switch(razr){
  18565.  
  18566.                         case r8:
  18567.  
  18568.                                 dobeg(AL);
  18569.  
  18570.                                 break;
  18571.  
  18572.                         case r16:
  18573.  
  18574.                         case r32:
  18575.  
  18576.                                 doreg_32(AX,razr);
  18577.  
  18578.                                 break;
  18579.  
  18580.                         case r64:
  18581.  
  18582.                                 doreg_32(AX,r32);
  18583.  
  18584.                                 break;
  18585.  
  18586.                 }
  18587.  
  18588.                 goto axtobit;
  18589.  
  18590.         }
  18591.  
  18592.         seminext();
  18593.  
  18594. }
  18595.  
  18596.  
  18597.  
  18598. void bits2reg(int reg,int razr)
  18599.  
  18600. {
  18601.  
  18602. int i,j,skip66=FALSE;
  18603.  
  18604.         i=itok.bit.siz+itok.bit.ofs;
  18605.  
  18606.         j=~GetBitMask(itok.bit.ofs,itok.bit.siz);
  18607.  
  18608.         ITOK wtok;
  18609.  
  18610.         char *wbuf;
  18611.  
  18612.         wbuf=bufrm;
  18613.  
  18614.         bufrm=NULL;
  18615.  
  18616.         wtok=itok;
  18617.  
  18618.         SINFO wstr;
  18619.  
  18620.         wstr=strinf;
  18621.  
  18622.         strinf.bufstr=NULL;
  18623.  
  18624.         switch(razr){
  18625.  
  18626.                 case r8:
  18627.  
  18628.                         if(reg==AL){
  18629.  
  18630.                                 getintoal(tk_bytevar,&wtok,wbuf,&wstr);
  18631.  
  18632.                                 if(i!=8){
  18633.  
  18634.                                         op(4+0x20);     //and al,j
  18635.  
  18636.                                         op(j);
  18637.  
  18638.                                 }
  18639.  
  18640.                         }
  18641.  
  18642.                         else{
  18643.  
  18644.                                 CheckAllMassiv(bufrm,1,&strinf);
  18645.  
  18646.                                 outseg(&itok,2);
  18647.  
  18648.                                 op(0x8A);
  18649.  
  18650.                                 op(reg*8+itok.rm);
  18651.  
  18652.                                 outaddress(&itok);
  18653.  
  18654.                                 if(i!=8){
  18655.  
  18656.                                         op(128);
  18657.  
  18658.                                         op(128+64+reg+0x20);
  18659.  
  18660.                                         op(j);
  18661.  
  18662.                                 }
  18663.  
  18664.                         }
  18665.  
  18666.                         if(itok.bit.ofs){       //shr al,ofs
  18667.  
  18668.                                 if(itok.bit.ofs==1){
  18669.  
  18670.                                         op(0xD0);
  18671.  
  18672.                                         op(0xE8+reg);
  18673.  
  18674.                                 }
  18675.  
  18676.                                 else{
  18677.  
  18678.                                         op(0xC0);
  18679.  
  18680.                                         op(0xE8+reg);
  18681.  
  18682.                                         op(itok.bit.ofs);
  18683.  
  18684.                                 }
  18685.  
  18686.                         }
  18687.  
  18688.                         break;
  18689.  
  18690.                 case r16:
  18691.  
  18692.                 case r32:
  18693.  
  18694.                         if(reg==AX){
  18695.  
  18696.                                 getinto_e_ax(0,(razr==r16?tk_wordvar:tk_dwordvar),&wtok,wbuf,&wstr,razr);
  18697.  
  18698.                                 if(razr==r16&&i!=16){
  18699.  
  18700.                                         op66(razr);     //and (e)ax,j
  18701.  
  18702.                                         op(4+1+0x20);
  18703.  
  18704.                                         outword(j);
  18705.  
  18706.                                 }
  18707.  
  18708.                                 else if(razr==r32&&i!=32){
  18709.  
  18710.                                         op66(razr);     //and (e)ax,j
  18711.  
  18712.                                         if(short_ok(j,TRUE)){
  18713.  
  18714.                                                 op(128+2+1);
  18715.  
  18716.                                                 op(128+64+0x20);
  18717.  
  18718.                                                 op((int)j);
  18719.  
  18720.                                         }
  18721.  
  18722.                                         else{
  18723.  
  18724.                                                 op(4+1+0x20);
  18725.  
  18726.                                                 outdword(j);
  18727.  
  18728.                                         }
  18729.  
  18730.                                 }
  18731.  
  18732.                                 if(j<65536&&razr==r32)skip66=TRUE;
  18733.  
  18734.                                 if(itok.bit.ofs){       //shr (e)ax,ofs
  18735.  
  18736.                                         if(!skip66)op66(razr);
  18737.  
  18738.                                         if(itok.bit.ofs==1)outword(0xE8D1);
  18739.  
  18740.                                         else{
  18741.  
  18742.                                                 outword(0xE8C1);
  18743.  
  18744.                                                 op(itok.bit.ofs);
  18745.  
  18746.                                         }
  18747.  
  18748.                                 }
  18749.  
  18750.                         }
  18751.  
  18752.                         else{
  18753.  
  18754. int reg1=idxregs[0],reg2=idxregs[1];
  18755.  
  18756.                                 if(!am32){
  18757.  
  18758.                                         if(reg==idxregs[2]||reg==idxregs[1]){
  18759.  
  18760.                                                 reg1=reg;
  18761.  
  18762.                                                 if(reg==idxregs[1])reg2=idxregs[0];
  18763.  
  18764.                                         }
  18765.  
  18766.                                 }
  18767.  
  18768.                                 else{
  18769.  
  18770.                                         reg1=reg;
  18771.  
  18772.                                         if(reg==idxregs[1])reg2=idxregs[0];
  18773.  
  18774.                                 }
  18775.  
  18776.                                 CheckAllMassiv(bufrm,razr==r32?4:2,&strinf,&itok,reg1,reg2);
  18777.  
  18778.                                 op66(razr);
  18779.  
  18780.                                 outseg(&itok,2);
  18781.  
  18782.                                 op(0x8B);
  18783.  
  18784.                                 op(reg*8+itok.rm);
  18785.  
  18786.                                 outaddress(&itok);
  18787.  
  18788.                                 if((razr==r16&&i!=16)||(razr==r32&&i!=32)){
  18789.  
  18790.                                         op66(razr);     //and reg,j
  18791.  
  18792.                                         if(short_ok(j,razr==r16?FALSE:TRUE)){
  18793.  
  18794.                                                 op(128+2+1);
  18795.  
  18796.                                                 op(128+64+reg+0x20);
  18797.  
  18798.                                                 op(j);
  18799.  
  18800.                                         }
  18801.  
  18802.                                         else{
  18803.  
  18804.                                                 op(128+1);
  18805.  
  18806.                                                 op(128+64+reg+0x20);
  18807.  
  18808.                                                 if(razr==r16)outword(j);
  18809.  
  18810.                                                 else outdword(j);
  18811.  
  18812.                                         }
  18813.  
  18814.                                 }
  18815.  
  18816.                                 if(itok.bit.ofs){       //shr reg,ofs
  18817.  
  18818.                                         op66(razr);
  18819.  
  18820.                                         if(itok.bit.ofs==1){
  18821.  
  18822.                                                 op(0xD1);
  18823.  
  18824.                                                 op(0xE8+reg);
  18825.  
  18826.                                         }
  18827.  
  18828.                                         else{
  18829.  
  18830.                                                 op(0xC1);
  18831.  
  18832.                                                 op(0xE8+reg);
  18833.  
  18834.                                                 op(itok.bit.ofs);
  18835.  
  18836.                                         }
  18837.  
  18838.                                 }
  18839.  
  18840.                         }
  18841.  
  18842.                         break;
  18843.  
  18844.                 case r64:
  18845.  
  18846.                         if(reg==AX){
  18847.  
  18848.                                 getinto_e_ax(0,tk_dwordvar,&wtok,wbuf,&wstr,r32);
  18849.  
  18850.                                 itok.number+=4;
  18851.  
  18852.                                 outseg(&itok,2);
  18853.  
  18854.                                 op(0x8B);
  18855.  
  18856.                                 op(DX*8+itok.rm);
  18857.  
  18858.                                 outaddress(&itok);
  18859.  
  18860.                                 if(itok.bit.siz!=32){
  18861.  
  18862.                                         op(128);
  18863.  
  18864.                                         op(128+64+DL+0x20);
  18865.  
  18866.                                         op(li[itok.bit.siz+itok.bit.ofs-32]-1);
  18867.  
  18868.                                 }
  18869.  
  18870.                                 op66(r32);
  18871.  
  18872.                                 outword(0xAC0F);        //shrd edx,eax,ofs
  18873.  
  18874.                                 op(0xC2);
  18875.  
  18876.                                 op(itok.bit.ofs);
  18877.  
  18878.                                 itok.number-=4;
  18879.  
  18880.                                 warningreg(regs[1][EDX]);
  18881.  
  18882.                         }
  18883.  
  18884.                         else{
  18885.  
  18886.                                 int reg1=DX;
  18887.  
  18888.                                 if(reg==DX)reg1=CX;
  18889.  
  18890.                                 CheckAllMassiv(bufrm,4,&strinf,&itok);
  18891.  
  18892.                                 op66(r32);
  18893.  
  18894.                                 outseg(&itok,2);
  18895.  
  18896.                                 op(0x8B);
  18897.  
  18898.                                 op(reg*8+itok.rm);
  18899.  
  18900.                                 outaddress(&itok);
  18901.  
  18902.                                 itok.number+=4;
  18903.  
  18904.                                 outseg(&itok,2);
  18905.  
  18906.                                 op(0x8B);
  18907.  
  18908.                                 op(reg1*8+itok.rm);
  18909.  
  18910.                                 outaddress(&itok);
  18911.  
  18912.                                 if(itok.bit.siz!=32){
  18913.  
  18914.                                         op(128+(reg1<4?0:3));
  18915.  
  18916.                                         op(128+64+reg1+0x20);
  18917.  
  18918.                                         op(li[itok.bit.siz+itok.bit.ofs-32]-1);
  18919.  
  18920.                                 }
  18921.  
  18922.                                 itok.number-=4;
  18923.  
  18924.                                 op66(r32);
  18925.  
  18926.                                 outword(0xAC0F);        //shrd edx,eax,ofs
  18927.  
  18928.                                 op(0xc0+reg1+reg*8);
  18929.  
  18930.                                 op(itok.bit.ofs);
  18931.  
  18932.                                 warningreg(regs[1][reg1]);
  18933.  
  18934.                         }
  18935.  
  18936.                         ClearReg(DX);
  18937.  
  18938.                         break;
  18939.  
  18940.         }
  18941.  
  18942.         ClearReg(AX);
  18943.  
  18944.         ClearReg(reg);
  18945.  
  18946. }
  18947.  
  18948.  
  18949.  
  18950. void num2bits(ITOK *gtok,unsigned long num,int razr)
  18951.  
  18952. {
  18953.  
  18954. unsigned int j,mask;
  18955.  
  18956.         mask=GetBitMask(gtok->bit.ofs,gtok->bit.siz);
  18957.  
  18958.         j=li[gtok->bit.siz]-1;
  18959.  
  18960.         if((num&j)!=j){
  18961.  
  18962.                 if(razr!=r8){
  18963.  
  18964.                         op66(razr);     //and bits,mask
  18965.  
  18966.                         outseg(gtok,2);
  18967.  
  18968.                         if((postnumflag&f_reloc)==0&&short_ok(mask,razr/2-1)){
  18969.  
  18970.                                 op(128+2+1);
  18971.  
  18972.                                 op(gtok->rm+0x20);
  18973.  
  18974.                                 outaddress(gtok);
  18975.  
  18976.                                 op(mask);
  18977.  
  18978.                         }
  18979.  
  18980.                         else{
  18981.  
  18982.                                 op(128+1);
  18983.  
  18984.                                 op(gtok->rm+0x20);
  18985.  
  18986.                                 outaddress(gtok);
  18987.  
  18988.                                 if((postnumflag&f_reloc)!=0)AddReloc();
  18989.  
  18990.                                 if(razr==r16)outword(mask);
  18991.  
  18992.                                 else outdword(mask);
  18993.  
  18994.                         }
  18995.  
  18996.                 }
  18997.  
  18998.                 else{
  18999.  
  19000.                         outseg(gtok,2);         //and bits,mask
  19001.  
  19002.                         op(128);
  19003.  
  19004.                         op(gtok->rm+0x20);
  19005.  
  19006.                         outaddress(gtok);
  19007.  
  19008.                         op(mask);
  19009.  
  19010.                 }
  19011.  
  19012.         }
  19013.  
  19014.         num=(num&j)<<gtok->bit.ofs;     //or bits,mask
  19015.  
  19016.         if(num<65536&&razr==r32)razr=r16;
  19017.  
  19018.         if(num<256&&razr==r16)razr=r8;
  19019.  
  19020.         if(razr!=r8){
  19021.  
  19022.                 op66(razr);
  19023.  
  19024.                 outseg(gtok,2);
  19025.  
  19026.                 if((postnumflag&f_reloc)==0&&short_ok(num,razr/2-1)){
  19027.  
  19028.                         op(128+2+1);
  19029.  
  19030.                         op(gtok->rm+8);
  19031.  
  19032.                         outaddress(gtok);
  19033.  
  19034.                         op(num);
  19035.  
  19036.                 }
  19037.  
  19038.                 else{
  19039.  
  19040.                         op(128+1);
  19041.  
  19042.                         op(gtok->rm+8);
  19043.  
  19044.                         outaddress(gtok);
  19045.  
  19046.                         if((postnumflag&f_reloc)!=0)AddReloc();
  19047.  
  19048.                         if(razr==r16)outword(num);
  19049.  
  19050.                         else outdword(num);
  19051.  
  19052.                 }
  19053.  
  19054.         }
  19055.  
  19056.         else{
  19057.  
  19058.                 if((unsigned char)num!=0){
  19059.  
  19060.                         outseg(gtok,2);
  19061.  
  19062.                         op(128);
  19063.  
  19064.                         op(gtok->rm+8);
  19065.  
  19066.                         outaddress(gtok);
  19067.  
  19068.                         op(num);
  19069.  
  19070.                 }
  19071.  
  19072.         }
  19073.  
  19074. }
  19075.  
  19076.  
  19077.  
  19078. void reg2bits(ITOK *gtok,int razr)
  19079.  
  19080. {
  19081.  
  19082. int i,j,mask;
  19083.  
  19084.         j=li[gtok->bit.siz]-1;
  19085.  
  19086.         mask=GetBitMask(gtok->bit.ofs,gtok->bit.siz);
  19087.  
  19088.         i=gtok->bit.ofs+gtok->bit.siz;
  19089.  
  19090.         switch(razr){
  19091.  
  19092.                 case r8:
  19093.  
  19094.                         if(i!=8){
  19095.  
  19096.                                 op(4+0x20);     //and al,size
  19097.  
  19098.                                 op(j);
  19099.  
  19100.                         }
  19101.  
  19102.                         outseg(gtok,2); //and bits,mask
  19103.  
  19104.                         op(128);
  19105.  
  19106.                         op(gtok->rm+0x20);
  19107.  
  19108.                         outaddress(gtok);
  19109.  
  19110.                         op(mask);
  19111.  
  19112.                         if(gtok->bit.ofs)lshiftmul(gtok->bit.ofs,razr);
  19113.  
  19114.                         outseg(gtok,2);
  19115.  
  19116.                         op(8);
  19117.  
  19118.                         op(gtok->rm);
  19119.  
  19120.                         outaddress(gtok);
  19121.  
  19122.                         break;
  19123.  
  19124.                 case r16:
  19125.  
  19126.                 case r32:
  19127.  
  19128.                         if(razr==r16&&i!=16){
  19129.  
  19130.                                 op66(razr);     //and (e)ax,size
  19131.  
  19132.                                 op(4+1+0x20);
  19133.  
  19134.                                 outword(j);
  19135.  
  19136.                         }
  19137.  
  19138.                         else if(razr==r32&&i!=32){
  19139.  
  19140.                                 op66(razr);     //and (e)ax,size
  19141.  
  19142.                                 if(short_ok(j,TRUE)){
  19143.  
  19144.                                         op(128+2+1);
  19145.  
  19146.                                         op(128+64+0x20);
  19147.  
  19148.                                         op((int)j);
  19149.  
  19150.                                 }
  19151.  
  19152.                                 else{
  19153.  
  19154.                                         op(4+1+0x20);
  19155.  
  19156.                                         outdword(j);
  19157.  
  19158.                                 }
  19159.  
  19160.                         }
  19161.  
  19162.                         op66(razr);     //and bits,mask
  19163.  
  19164.                         outseg(gtok,2);
  19165.  
  19166.                         if(short_ok(mask,razr/2-1)){
  19167.  
  19168.                                 op(128+2+1);
  19169.  
  19170.                                 op(gtok->rm+0x20);
  19171.  
  19172.                                 outaddress(gtok);
  19173.  
  19174.                                 op(mask);
  19175.  
  19176.                         }
  19177.  
  19178.                         else{
  19179.  
  19180.                                 op(128+1);
  19181.  
  19182.                                 op(gtok->rm+0x20);
  19183.  
  19184.                                 outaddress(gtok);
  19185.  
  19186.                                 if(razr==r16)outword(mask);
  19187.  
  19188.                                 else outdword(mask);
  19189.  
  19190.                         }
  19191.  
  19192.                         if(gtok->bit.ofs)lshiftmul(gtok->bit.ofs,razr);
  19193.  
  19194.                         op66(razr);
  19195.  
  19196.                         outseg(gtok,2);
  19197.  
  19198.                         op(1+8);
  19199.  
  19200.                         op(gtok->rm);
  19201.  
  19202.                         outaddress(gtok);
  19203.  
  19204.                         break;
  19205.  
  19206.         }
  19207.  
  19208. }
  19209.  
  19210.  
  19211.  
  19212. void getoperand(int reg)
  19213.  
  19214. {
  19215.  
  19216. unsigned int numpointr=0;
  19217.  
  19218.         nexttok();
  19219.  
  19220.         while(tok==tk_mult){
  19221.  
  19222.                 nexttok();
  19223.  
  19224.                 numpointr++;
  19225.  
  19226.         }
  19227.  
  19228.         if(numpointr>itok.npointr){
  19229.  
  19230.                 unuseableinput();
  19231.  
  19232.         }
  19233.  
  19234.         if(tok==tk_pointer){
  19235.  
  19236.                 cpointr(reg,numpointr);
  19237.  
  19238.         }
  19239.  
  19240.         CheckMinusNum();
  19241.  
  19242. }
  19243.  
  19244.  
  19245.  
  19246. void cpointr(int reg,int numpointr)
  19247.  
  19248. {
  19249.  
  19250.         if(itok.type==tk_proc){
  19251.  
  19252.                 if(tok2==tk_openbracket){
  19253.  
  19254.                         tok=tk_proc;
  19255.  
  19256.                 }
  19257.  
  19258.                 else{
  19259.  
  19260.                         itok.rm=itok.sib;
  19261.  
  19262.                         if(am32){
  19263.  
  19264.                                 itok.sib=CODE32;
  19265.  
  19266.                                 tok=tk_dwordvar;
  19267.  
  19268.                         }
  19269.  
  19270.                         else{
  19271.  
  19272.                                 itok.sib=CODE16;
  19273.  
  19274.                                 tok=tk_wordvar;
  19275.  
  19276.                         }
  19277.  
  19278.                         compressoffset(&itok);
  19279.  
  19280.                 }
  19281.  
  19282.                 return;
  19283.  
  19284.         }
  19285.  
  19286.         int razr=typesize(itok.type);
  19287.  
  19288.         if(numpointr==itok.npointr){
  19289.  
  19290.                 getpointeradr(&itok,bufrm,&strinf,numpointr-1,razr,reg);
  19291.  
  19292.                 if(itok.type>=tk_char&&itok.type<=tk_float)tok=tk_charvar+itok.type-tk_char;
  19293.  
  19294.                 else tok=(am32==FALSE?tk_wordvar:tk_dwordvar);
  19295.  
  19296.         }
  19297.  
  19298.         else if(numpointr<itok.npointr){
  19299.  
  19300.                 if(numpointr)getpointeradr(&itok,bufrm,&strinf,numpointr-1,razr,reg);
  19301.  
  19302.                 tok=(am32==FALSE?tk_wordvar:tk_dwordvar);
  19303.  
  19304.         }
  19305.  
  19306.         else unuseableinput();
  19307.  
  19308. }
  19309.  
  19310.  
  19311.  
  19312. void cwpointr(ITOK *wtok,char *&wbuf,SINFO *wstr,int *otok,int npointr,int ureg)
  19313.  
  19314. {
  19315.  
  19316.         if(wtok->type==tk_proc){
  19317.  
  19318.                 wtok->rm=wtok->sib;
  19319.  
  19320.                 if(am32){
  19321.  
  19322.                         wtok->sib=CODE32;
  19323.  
  19324.                         *otok=tk_dwordvar;
  19325.  
  19326.                 }
  19327.  
  19328.                 else{
  19329.  
  19330.                         wtok->sib=CODE16;
  19331.  
  19332.                         *otok=tk_wordvar;
  19333.  
  19334.                 }
  19335.  
  19336.                 compressoffset(wtok);
  19337.  
  19338.         }
  19339.  
  19340.         else{
  19341.  
  19342.                 int razr=typesize(wtok->type);
  19343.  
  19344.                 int reg=idxregs[2];
  19345.  
  19346.                 if(reg==ureg)reg=idxregs[1];
  19347.  
  19348.                 if(npointr==wtok->npointr){
  19349.  
  19350.                         getpointeradr(wtok,wbuf,wstr,npointr-1,razr,reg);
  19351.  
  19352.                         if(wtok->type>=tk_char&&wtok->type<=tk_float)*otok=tk_charvar+wtok->type-tk_char;
  19353.  
  19354.                         else *otok=(am32==FALSE?tk_wordvar:tk_dwordvar);
  19355.  
  19356.                 }
  19357.  
  19358.                 else if(npointr<wtok->npointr){
  19359.  
  19360.                         *otok=(am32==FALSE?tk_wordvar:tk_dwordvar);
  19361.  
  19362.                         if(npointr)getpointeradr(wtok,wbuf,wstr,npointr-1,razr,reg);
  19363.  
  19364.                         else return;
  19365.  
  19366.                 }
  19367.  
  19368.                 else unuseableinput();
  19369.  
  19370.                 memcpy(wtok,&itok,sizeof(ITOK));
  19371.  
  19372.         }
  19373.  
  19374. }
  19375.  
  19376.  
  19377.  
  19378. int CheckAddOnly()
  19379.  
  19380. {
  19381.  
  19382. ITOK oitok,oitok2;
  19383.  
  19384. int oline;
  19385.  
  19386. int oinptr,otok,otok2;
  19387.  
  19388. unsigned char ocha;
  19389.  
  19390. char *obuf;
  19391.  
  19392. SINFO ostr;
  19393.  
  19394. int retval=TRUE;
  19395.  
  19396. int j=3;
  19397.  
  19398. int changesign=0;
  19399.  
  19400.         if(tok==tk_minusequals)changesign++;
  19401.  
  19402.         else if(tok!=tk_plusequals)return FALSE;
  19403.  
  19404.         if(itok2.type==tp_stopper)return FALSE;
  19405.  
  19406. newloop:
  19407.  
  19408.         obuf=bufrm;
  19409.  
  19410.         bufrm=NULL;
  19411.  
  19412.         ostr=strinf;
  19413.  
  19414.         strinf.bufstr=NULL;
  19415.  
  19416.         oitok=itok;
  19417.  
  19418.         oitok2=itok2;
  19419.  
  19420.         otok=tok;
  19421.  
  19422.         otok2=tok2;
  19423.  
  19424.         oline=linenum2;
  19425.  
  19426.         oinptr=inptr2;
  19427.  
  19428.         ocha=cha2;
  19429.  
  19430.         while(tok2==tk_minus||tok2==tk_mult)nexttok();
  19431.  
  19432.         while(itok.type!=tp_stopper&&tok!=tk_eof){
  19433.  
  19434.                 nexttok();
  19435.  
  19436.                 switch(tok){
  19437.  
  19438.                         case tk_ID:
  19439.  
  19440.                         case tk_id:
  19441.  
  19442.                         case tk_proc:
  19443.  
  19444.                         case tk_apiproc:
  19445.  
  19446.                         case tk_undefproc:
  19447.  
  19448.                         case tk_declare:
  19449.  
  19450.                                 retval=FALSE;
  19451.  
  19452.                                 itok.type=tp_stopper;
  19453.  
  19454.                                 break;
  19455.  
  19456.                 }
  19457.  
  19458.                 if(itok.type==tp_stopper)break;
  19459.  
  19460.                 if(itok.type==tp_opperand){
  19461.  
  19462.                         if(tok!=tk_plus&&tok!=tk_minus){
  19463.  
  19464.                                 retval=FALSE;
  19465.  
  19466.                                 break;
  19467.  
  19468.                         }
  19469.  
  19470.                         else if(changesign==2){
  19471.  
  19472.                                 int i=inptr2-1;
  19473.  
  19474.                                 char c;
  19475.  
  19476.                                 do{
  19477.  
  19478.                                         i--;
  19479.  
  19480.                                         c=input[i];
  19481.  
  19482.                                         i--;
  19483.  
  19484.                                 }while(c!='-'&&c!='+');
  19485.  
  19486.                                 i++;
  19487.  
  19488.                                 if(c=='-')c='+';
  19489.  
  19490.                                 else c='-';
  19491.  
  19492.                                 input[i]=c;
  19493.  
  19494.                         }
  19495.  
  19496.                         while(itok2.type==tp_opperand&&tok!=tk_eof)nexttok();
  19497.  
  19498.                 }
  19499.  
  19500.                 else{
  19501.  
  19502.                         if(tok!=tk_number&&tok!=tk_postnumber&&tok!=tk_undefofs){
  19503.  
  19504.                                 if(j>1)j=0;
  19505.  
  19506.                                 if(bufrm){
  19507.  
  19508.                                         free(bufrm);
  19509.  
  19510.                                         bufrm=NULL;
  19511.  
  19512.                                 }
  19513.  
  19514.                                 if(strinf.bufstr)free(strinf.bufstr);
  19515.  
  19516.                         }
  19517.  
  19518.                         else if(j>1)j--;
  19519.  
  19520.                 }
  19521.  
  19522.         }
  19523.  
  19524.         itok=oitok;
  19525.  
  19526.         itok2=oitok2;
  19527.  
  19528.         tok=otok;
  19529.  
  19530.         tok2=otok2;
  19531.  
  19532.         linenum2=oline;
  19533.  
  19534.         inptr2=oinptr;
  19535.  
  19536.         cha2=ocha;
  19537.  
  19538.         endoffile=0;
  19539.  
  19540.         bufrm=obuf;
  19541.  
  19542.         strinf=ostr;
  19543.  
  19544.         if(j==1)retval=FALSE;
  19545.  
  19546.         else if(changesign==1){
  19547.  
  19548.                 changesign++;
  19549.  
  19550.                 goto newloop;
  19551.  
  19552.         }
  19553.  
  19554.         return retval;
  19555.  
  19556. }
  19557.  
  19558.  
  19559.  
  19560. int doqwordvar(int terminater)  //64 bit memory variable
  19561.  
  19562. {
  19563.  
  19564. unsigned char next=1,getfromAX=0;
  19565.  
  19566. unsigned int vop=0,otok,rettype;
  19567.  
  19568. int sign,i;
  19569.  
  19570. ITOK wtok;
  19571.  
  19572. char *wbuf,*rbuf;
  19573.  
  19574. SINFO wstr;
  19575.  
  19576. int retrez=0,pointr=0;
  19577.  
  19578. int numpointr=0;
  19579.  
  19580. int reg;
  19581.  
  19582. char *ofsstr=NULL;
  19583.  
  19584. int reg1=idxregs[0],reg2=idxregs[1];
  19585.  
  19586.         rettype=tk_qword;
  19587.  
  19588.         sign=0;
  19589.  
  19590.         wstr=strinf;
  19591.  
  19592.         strinf.bufstr=NULL;
  19593.  
  19594.         wtok=itok;
  19595.  
  19596.         wbuf=bufrm;
  19597.  
  19598.         bufrm=NULL;
  19599.  
  19600.         otok=tok;
  19601.  
  19602.         nexttok();
  19603.  
  19604.         switch(tok){
  19605.  
  19606.                 case tk_assign: //=
  19607.  
  19608.                         nexttok();
  19609.  
  19610.                         convert_type(&sign,(int *)&rettype,&pointr);
  19611.  
  19612.                         while(tok==tk_mult){
  19613.  
  19614.                                 nexttok();
  19615.  
  19616.                                 numpointr++;
  19617.  
  19618.                         }
  19619.  
  19620.                         if(numpointr>itok.npointr){
  19621.  
  19622.                                 unuseableinput();
  19623.  
  19624.                         }
  19625.  
  19626.                         CheckMinusNum();
  19627.  
  19628.                         if(itok2.type==tp_opperand){    //á«®¦­®¥ ¢ëà ¦¥­¨¥
  19629.  
  19630.                                 if(tok==tk_number){     //¯à®¢¥àª  ¨ á㬬¨à®¢ ­¨¥ ç¨á¥«
  19631.  
  19632.                                         switch(rettype){
  19633.  
  19634.                                                 case tk_float: sign=2; break;
  19635.  
  19636.                                                 case tk_double: sign=3; break;
  19637.  
  19638.                                                 case tk_qword: sign=4; break;
  19639.  
  19640.                                         }
  19641.  
  19642.                                         if(OnlyNumber(sign)){
  19643.  
  19644.                                                 next=0;
  19645.  
  19646.                                                 itok.flag=(unsigned char)postnumflag;
  19647.  
  19648.                                                 goto numbertovar;
  19649.  
  19650.                                         }
  19651.  
  19652.                                 }
  19653.  
  19654.                                 goto labl1;
  19655.  
  19656.                         }
  19657.  
  19658.                         else{
  19659.  
  19660.                                 switch(tok){
  19661.  
  19662.                                         case tk_number:
  19663.  
  19664.                                                 if((itok.flag&f_reloc)==0){
  19665.  
  19666.                                                         if(itok.lnumber==0){
  19667.  
  19668.                                                                 CheckAllMassiv(wbuf,8,&wstr,&wtok);
  19669.  
  19670.                                                                 for(i=0;i<2;i++){
  19671.  
  19672.                                                                         op66(r32);
  19673.  
  19674.                                                                         outseg(&wtok,2);
  19675.  
  19676.                                                                         op(0x83);
  19677.  
  19678.                                                                         op(wtok.rm+0x20);
  19679.  
  19680.                                                                         outaddress(&wtok);
  19681.  
  19682.                                                                         op(0);
  19683.  
  19684.                                                                         if(i==1)break;
  19685.  
  19686.                                                                         wtok.number+=4;
  19687.  
  19688.                                                                         compressoffset(&wtok);
  19689.  
  19690.                                                                 }
  19691.  
  19692.                                                                 break;
  19693.  
  19694.                                                         }
  19695.  
  19696.                                                         if(itok.lnumber==0xFFFFFFFFFFFFFFFFLL){
  19697.  
  19698.                                                                 CheckAllMassiv(wbuf,8,&wstr,&wtok);
  19699.  
  19700.                                                                 for(i=0;i<2;i++){
  19701.  
  19702.                                                                         op66(r32);
  19703.  
  19704.                                                                         outseg(&wtok,2);
  19705.  
  19706.                                                                         op(0x83);
  19707.  
  19708.                                                                         op(wtok.rm+0x8);
  19709.  
  19710.                                                                         outaddress(&wtok);
  19711.  
  19712.                                                                         op(0xFF);
  19713.  
  19714.                                                                         if(i==1)break;
  19715.  
  19716.                                                                         wtok.number+=4;
  19717.  
  19718.                                                                         compressoffset(&wtok);
  19719.  
  19720.                                                                 }
  19721.  
  19722.                                                                 break;
  19723.  
  19724.                                                         }
  19725.  
  19726.                                                 }
  19727.  
  19728. numbertovar:
  19729.  
  19730.                                                 CheckAllMassiv(wbuf,8,&wstr,&wtok);
  19731.  
  19732.                                                 for(i=0;i<2;i++){
  19733.  
  19734.                                                         op66(r32);
  19735.  
  19736.                                                         if(regoverstack&&short_ok(itok.number,TRUE)&&(itok.flag&f_reloc)==0){
  19737.  
  19738.                                                                 op(0x6A);
  19739.  
  19740.                                                                 op(itok.number);        //push short number
  19741.  
  19742.                                                                 op66(r32);
  19743.  
  19744.                                                                 outseg(&wtok,2);
  19745.  
  19746.                                                                 op(0x8f);
  19747.  
  19748.                                                                 op(wtok.rm);
  19749.  
  19750.                                                                 outaddress(&wtok);
  19751.  
  19752.                                                         }
  19753.  
  19754.                                                         else{
  19755.  
  19756.                                                                 outseg(&wtok,2);
  19757.  
  19758.                                                                 op(0xC7);       //mov word[],number
  19759.  
  19760.                                                                 op(wtok.rm);
  19761.  
  19762.                                                                 outaddress(&wtok);
  19763.  
  19764.                                                                 if((itok.flag&f_reloc)!=0)AddReloc();
  19765.  
  19766.                                                                 outdword(itok.number);
  19767.  
  19768.                                                         }
  19769.  
  19770.                                                         if(i==1)break;
  19771.  
  19772.                                                         itok.lnumber>>=32;
  19773.  
  19774.                                                         wtok.number+=4;
  19775.  
  19776.                                                         compressoffset(&wtok);
  19777.  
  19778.                                                 }
  19779.  
  19780.                                                 break;
  19781.  
  19782.                                         case tk_apioffset:
  19783.  
  19784.                                         case tk_postnumber:
  19785.  
  19786.                                         case tk_undefofs:
  19787.  
  19788.                                                 CheckAllMassiv(wbuf,8,&wstr,&wtok);
  19789.  
  19790.                                                 op66(r32);
  19791.  
  19792.                                                 outseg(&wtok,2);
  19793.  
  19794.                                                 op(0xC7);       //mov word[],number
  19795.  
  19796.                                                 op(wtok.rm);
  19797.  
  19798.                                                 outaddress(&wtok);
  19799.  
  19800.                                                 if(tok==tk_apioffset)AddApiToPost(itok.number);
  19801.  
  19802.                                                 else{
  19803.  
  19804.                                                         if(tok==tk_postnumber)(itok.flag&f_extern)==0?setwordpost(&itok):setwordext(&itok.number);
  19805.  
  19806.                                                         else if(tok==tk_undefofs)AddUndefOff(0,itok.name);
  19807.  
  19808. //                                              else if((itok.flag&f_reloc)!=0)AddReloc();
  19809.  
  19810.                                                         outdword(itok.number);
  19811.  
  19812.                                                 }
  19813.  
  19814.                                                 wtok.number+=4;
  19815.  
  19816.                                                 compressoffset(&wtok);
  19817.  
  19818.                                                 op66(r32);
  19819.  
  19820.                                                 outseg(&wtok,2);
  19821.  
  19822.                                                 op(0x83);
  19823.  
  19824.                                                 op(wtok.rm+0x20);
  19825.  
  19826.                                                 outaddress(&wtok);
  19827.  
  19828.                                                 op(0);
  19829.  
  19830.                                                 break;
  19831.  
  19832.                                         case tk_reg64:
  19833.  
  19834.                                                 goto getfromreg;
  19835.  
  19836.                                         case tk_reg32:
  19837.  
  19838.                                                 if(itok.number==AX&&wbuf==NULL&&wstr.bufstr==NULL&&
  19839.  
  19840.                                                         ((wtok.rm==rm_d16&&wtok.sib==CODE16)||
  19841.  
  19842.                                                         (wtok.rm==rm_d32&&(wtok.sib==CODE32||wtok.sib==0)))){
  19843.  
  19844.                                                         op66(r32);
  19845.  
  19846.                                                         outseg(&wtok,1);
  19847.  
  19848.                                                         op(0xA3); // MOV [word],AX
  19849.  
  19850.                                                         if(wtok.post==UNDEF_OFSET){
  19851.  
  19852.                                                                 AddUndefOff(2,wtok.name);
  19853.  
  19854.                                                                 wtok.post=0;
  19855.  
  19856.                                                         }
  19857.  
  19858.                                                         if(am32==FALSE)outword(wtok.number);
  19859.  
  19860.                                                         else outdword(wtok.number);
  19861.  
  19862.                                                 }
  19863.  
  19864.                                                 else{
  19865.  
  19866.                                                         CheckAllMassiv(wbuf,8,&wstr,&wtok,reg1,reg2);
  19867.  
  19868.                                                         op66(r32);
  19869.  
  19870.                                                         outseg(&wtok,2);
  19871.  
  19872.                                                         op(0x89);
  19873.  
  19874.                                                         op((unsigned int)itok.number*8+wtok.rm);
  19875.  
  19876.                                                         outaddress(&wtok);
  19877.  
  19878.                                                 }
  19879.  
  19880.                                                 wtok.number+=4;
  19881.  
  19882.                                                 compressoffset(&wtok);
  19883.  
  19884.                                                 op66(r32);
  19885.  
  19886.                                                 outseg(&wtok,2);
  19887.  
  19888.                                                 op(0x83);
  19889.  
  19890.                                                 op(wtok.rm+0x20);
  19891.  
  19892.                                                 outaddress(&wtok);
  19893.  
  19894.                                                 op(0);
  19895.  
  19896.                                                 break;
  19897.  
  19898.                                         case tk_string:
  19899.  
  19900.                                                 CheckAllMassiv(wbuf,8,&wstr,&wtok);
  19901.  
  19902.                                                 op66(r32);
  19903.  
  19904.                                                 outseg(&wtok,2);
  19905.  
  19906.                                                 op(0xC7);
  19907.  
  19908.                                                 op(wtok.rm);
  19909.  
  19910.                                                 outaddress(&wtok);
  19911.  
  19912.                                                 outdword(addpoststring());
  19913.  
  19914.                                                 wtok.number+=4;
  19915.  
  19916.                                                 compressoffset(&wtok);
  19917.  
  19918.                                                 op66(r32);
  19919.  
  19920.                                                 outseg(&wtok,2);
  19921.  
  19922.                                                 op(0x83);
  19923.  
  19924.                                                 op(wtok.rm+0x20);
  19925.  
  19926.                                                 outaddress(&wtok);
  19927.  
  19928.                                                 op(0);
  19929.  
  19930.                                                 break;
  19931.  
  19932.                                         default:
  19933.  
  19934. labl1:
  19935.  
  19936.                                                 reg=EAX|(EDX*256);
  19937.  
  19938.                                                 getintoreg64(reg);
  19939.  
  19940.                                                 doregmath64(reg);
  19941.  
  19942.                                                 getfromAX=1;
  19943.  
  19944.                                                 next=0;
  19945.  
  19946.                                                 break;
  19947.  
  19948.                                 }
  19949.  
  19950.                         }
  19951.  
  19952.                         if(getfromAX){
  19953.  
  19954. getfromax:
  19955.  
  19956.                                 itok.number=EAX|(EDX*256);
  19957.  
  19958. getfromreg:
  19959.  
  19960.                                 reg=itok.number&255;
  19961.  
  19962.                                 for(i=0;i<2;i++){
  19963.  
  19964.                                         if(reg==AX&&wbuf==NULL&&wstr.bufstr==NULL&&
  19965.  
  19966.                                                 ((wtok.rm==rm_d16&&wtok.sib==CODE16)||
  19967.  
  19968.                                                 (wtok.rm==rm_d32&&(wtok.sib==CODE32||wtok.sib==0)))){
  19969.  
  19970.                                                 op66(r32);
  19971.  
  19972.                                                 outseg(&wtok,1);
  19973.  
  19974.                                                 op(0xA3); // MOV [word],AX
  19975.  
  19976.                                                 if(wtok.post==UNDEF_OFSET){
  19977.  
  19978.                                                         AddUndefOff(2,wtok.name);
  19979.  
  19980.                                                         wtok.post=0;
  19981.  
  19982.                                                 }
  19983.  
  19984.                                                 if(am32==FALSE)outword(wtok.number);
  19985.  
  19986.                                                 else outdword(wtok.number);
  19987.  
  19988.                                         }
  19989.  
  19990.                                         else{
  19991.  
  19992.                                                 CheckAllMassiv(wbuf,8,&wstr,&wtok,reg1,reg2);
  19993.  
  19994.                                                 op66(r32);
  19995.  
  19996.                                                 outseg(&wtok,2);
  19997.  
  19998.                                                 op(0x89);
  19999.  
  20000.                                                 op((unsigned int)reg*8+wtok.rm);
  20001.  
  20002.                                                 outaddress(&wtok);
  20003.  
  20004.                                         }
  20005.  
  20006.                                         if(i==1)break;
  20007.  
  20008.                                         wtok.number+=4;
  20009.  
  20010.                                         compressoffset(&wtok);
  20011.  
  20012.                                         reg=itok.number/256;
  20013.  
  20014.                                 }
  20015.  
  20016.                                 warningreg(regs[1][EAX]);
  20017.  
  20018.                                 warningreg(regs[1][EDX]);
  20019.  
  20020.                                 ClearReg(AX);
  20021.  
  20022.                                 ClearReg(DX);
  20023.  
  20024.                                 retrez=tk_reg64;
  20025.  
  20026.                         }
  20027.  
  20028.                         break;
  20029.  
  20030.                 case tk_minusminus: vop=0x8;
  20031.  
  20032.                 case tk_plusplus:
  20033.  
  20034.                         CheckAllMassiv(wbuf,8,&wstr,&wtok);
  20035.  
  20036.                         op66(r32);
  20037.  
  20038.                         outseg(&wtok,2);
  20039.  
  20040. incdec:
  20041.  
  20042.                         op(0xFF); op(vop+wtok.rm);
  20043.  
  20044.                         outaddress(&wtok);
  20045.  
  20046.                         wtok.number+=4;
  20047.  
  20048.                         compressoffset(&wtok);
  20049.  
  20050.                         CheckAllMassiv(wbuf,8,&wstr,&wtok);
  20051.  
  20052.                         op66(r32);
  20053.  
  20054.                         outseg(&wtok,2);
  20055.  
  20056.                         op(0x83); op(0x10+vop+wtok.rm);
  20057.  
  20058.                         outaddress(&wtok);
  20059.  
  20060.                         op(0);
  20061.  
  20062.                         break;
  20063.  
  20064.                 case tk_xorequals: vop+=0x08;
  20065.  
  20066.                 case tk_minusequals: vop+=0x08;
  20067.  
  20068.                 case tk_andequals: vop+=0x18;
  20069.  
  20070.                 case tk_orequals: vop+=0x08;
  20071.  
  20072.                 case tk_plusequals:
  20073.  
  20074.                         getoperand(am32==TRUE?EAX:BX);
  20075.  
  20076.                         if(itok2.type==tp_opperand){
  20077.  
  20078.                                 if(tok==tk_number){
  20079.  
  20080.                                         if(OnlyNumber(4)){
  20081.  
  20082.                                                 next=0;
  20083.  
  20084.                                                 otok=tok;
  20085.  
  20086.                                                 tok=tk_number;
  20087.  
  20088.                                                 goto num;
  20089.  
  20090.                                         }
  20091.  
  20092.                                 }
  20093.  
  20094.                                 goto defxor;
  20095.  
  20096.                         }
  20097.  
  20098.                         else{
  20099.  
  20100.                                 switch(tok){
  20101.  
  20102.                                         case tk_number:
  20103.  
  20104.                                         case tk_postnumber:
  20105.  
  20106.                                         case tk_undefofs:
  20107.  
  20108.                                         case tk_apioffset:
  20109.  
  20110. num:
  20111.  
  20112.                                                 for(i=0;i<2;i++){
  20113.  
  20114.                                                         CheckAllMassiv(wbuf,8,&wstr,&wtok);
  20115.  
  20116.                                                         op66(r32);
  20117.  
  20118.                                                         outseg(&wtok,2);
  20119.  
  20120.                                                         if(tok==tk_number&&(itok.flag&f_reloc)==0&&(vop==0||vop==0x28)){
  20121.  
  20122.                                                                 if(i==0&&itok.lnumber==1){
  20123.  
  20124.                                                                         if(vop)vop=8;
  20125.  
  20126.                                                                         if(next==0)tok=otok;
  20127.  
  20128.                                                                         goto incdec;
  20129.  
  20130.                                                                 }
  20131.  
  20132.                                                                 if(itok.number==1){
  20133.  
  20134.                                                                         op(0xFF); op((vop!=0?8:0)+wtok.rm);
  20135.  
  20136.                                                                         outaddress(&wtok);
  20137.  
  20138.                                                                         goto conl;
  20139.  
  20140.                                                                 }
  20141.  
  20142.                                                         }
  20143.  
  20144.                                                         if(i==1){
  20145.  
  20146.                                                                 if(vop==0)vop+=0x10;
  20147.  
  20148.                                                                 else if(vop==0x28)vop-=0x10;
  20149.  
  20150.                                                         }
  20151.  
  20152.                                                         if(tok!=tk_apioffset&&tok!=tk_undefofs&&tok!=tk_postnumber&&(itok.flag&f_reloc)==0&&
  20153.  
  20154.                                                                 short_ok(itok.number,TRUE)){
  20155.  
  20156.                                                                 op(0x83);
  20157.  
  20158.                                                                 op(vop+wtok.rm);
  20159.  
  20160.                                                                 outaddress(&wtok);
  20161.  
  20162.                                                                 op((unsigned int)itok.number);
  20163.  
  20164.                                                         }
  20165.  
  20166.                                                         else{
  20167.  
  20168.                                                                 op(0x81);
  20169.  
  20170.                                                                 op(vop+wtok.rm);
  20171.  
  20172.                                                                 outaddress(&wtok);
  20173.  
  20174.                                                                 if(tok==tk_apioffset)AddApiToPost(itok.number);
  20175.  
  20176.                                                                 else{
  20177.  
  20178.                                                                         if(tok==tk_postnumber)(itok.flag&f_extern)==0?setwordpost(&itok):setwordext(&itok.number);
  20179.  
  20180.                                                                         else if(tok==tk_undefofs)AddUndefOff(0,itok.name);
  20181.  
  20182.                                                                         else if((itok.flag&f_reloc)!=0)AddReloc();
  20183.  
  20184.                                                                         outdword(itok.number);
  20185.  
  20186.                                                                 }
  20187.  
  20188.                                                         }
  20189.  
  20190. conl:
  20191.  
  20192.                                                         wtok.number+=4;
  20193.  
  20194.                                                         compressoffset(&wtok);
  20195.  
  20196.                                                         itok.lnumber>>=32;
  20197.  
  20198.                                                 }
  20199.  
  20200.                                                 if(next==0)tok=otok;
  20201.  
  20202.                                                 break;
  20203.  
  20204.                                         case tk_reg64:
  20205.  
  20206.                                                 reg=itok.number&255;
  20207.  
  20208.                                                 for(i=0;i<2;i++){
  20209.  
  20210.                                                         if(i==1){
  20211.  
  20212.                                                                 if(vop==0)vop+=0x10;
  20213.  
  20214.                                                                 else if(vop==0x28)vop-=0x10;
  20215.  
  20216.                                                         }
  20217.  
  20218.                                                         CheckAllMassiv(wbuf,8,&wstr,&wtok);
  20219.  
  20220.                                                         op66(r32);
  20221.  
  20222.                                                         outseg(&wtok,2);
  20223.  
  20224.                                                         op(0x01+vop); op((unsigned int)reg*8+wtok.rm);
  20225.  
  20226.                                                         outaddress(&wtok);
  20227.  
  20228.                                                         if(i==1)break;
  20229.  
  20230.                                                         wtok.number+=4;
  20231.  
  20232.                                                         compressoffset(&wtok);
  20233.  
  20234.                                                         reg=itok.number/256;
  20235.  
  20236.                                                 }
  20237.  
  20238.                                                 break;
  20239.  
  20240.                                         default:
  20241.  
  20242. defxor:
  20243.  
  20244.                                                 reg=EAX|(EDX*256);
  20245.  
  20246.                                                 getintoreg64(reg);
  20247.  
  20248.                                                 doregmath64(reg);
  20249.  
  20250.                                                 CheckAllMassiv(wbuf,8,&wstr,&wtok);
  20251.  
  20252.                                                 reg=EAX;
  20253.  
  20254.                                                 for(i=0;i<2;i++){
  20255.  
  20256.                                                         op66(r32);
  20257.  
  20258.                                                         op(0x01+vop);
  20259.  
  20260.                                                         op(wtok.rm+reg*8);
  20261.  
  20262.                                                         outaddress(&wtok);
  20263.  
  20264.                                                         if(i==1)break;
  20265.  
  20266.                                                         if(vop==0)vop=0x10;
  20267.  
  20268.                                                         if(vop==0x28)vop=0x18;
  20269.  
  20270.                                                         reg=EDX;
  20271.  
  20272.                                                         wtok.number+=4;
  20273.  
  20274.                                                         compressoffset(&wtok);
  20275.  
  20276.                                                 }
  20277.  
  20278.                                                 next=0;
  20279.  
  20280.                                                 retrez=tk_reg64;
  20281.  
  20282.                                                 warningreg(regs[1][EAX]);
  20283.  
  20284.                                                 warningreg(regs[1][EDX]);
  20285.  
  20286.                                                 break;
  20287.  
  20288.                                 }
  20289.  
  20290.                         }
  20291.  
  20292.                         break;
  20293.  
  20294.                 case tk_multequals:
  20295.  
  20296.                         getoperand(am32==TRUE?EAX:BX);
  20297.  
  20298.                         if(itok2.type==tp_stopper&&tok==tk_number&&(itok.flag&f_reloc)==0){
  20299.  
  20300.                                 if(itok.lnumber==1)break;
  20301.  
  20302.                                 if(itok.lnumber==0){
  20303.  
  20304.                                         ZeroReg(EAX,r32);
  20305.  
  20306.                                         ZeroReg(EDX,r32);
  20307.  
  20308.                                         goto getfromax;
  20309.  
  20310.                                 }
  20311.  
  20312.                                 if((i=caselong(itok.number))!=NUMNUM){
  20313.  
  20314.                                         if(wbuf==NULL&&wstr.bufstr==NULL&&
  20315.  
  20316.                                                         ((wtok.rm==rm_d16&&wtok.sib==CODE16)||
  20317.  
  20318.                                                         (wtok.rm==rm_d32&&(wtok.sib==CODE32||wtok.sib==0)))){
  20319.  
  20320.                                                 op66(r32);
  20321.  
  20322.                                                 outseg(&wtok,1);
  20323.  
  20324.                                                 op(0xA1); // MOV EAX,[dword]
  20325.  
  20326.                                                 if(wtok.post==UNDEF_OFSET){
  20327.  
  20328.                                                         AddUndefOff(2,wtok.name);
  20329.  
  20330.                                                         wtok.post=0;
  20331.  
  20332.                                                 }
  20333.  
  20334.                                                 if(am32==FALSE)outword(wtok.number);
  20335.  
  20336.                                                 else outdword(wtok.number);
  20337.  
  20338.                                         }
  20339.  
  20340.                                         else{
  20341.  
  20342.                                                 CheckAllMassiv(wbuf,8,&wstr,&wtok,reg1,reg2);
  20343.  
  20344.                                                 op66(r32);
  20345.  
  20346.                                                 outseg(&wtok,2);
  20347.  
  20348.                                                 op(0x8B);
  20349.  
  20350.                                                 op(wtok.rm);
  20351.  
  20352.                                                 outaddress(&wtok);
  20353.  
  20354.                                         }
  20355.  
  20356.                                         wtok.number+=4;
  20357.  
  20358.                                         compressoffset(&wtok);
  20359.  
  20360.                                         ClearReg(AX);
  20361.  
  20362.                                         CheckAllMassiv(wbuf,8,&wstr,&wtok);
  20363.  
  20364.                                         op66(r32);
  20365.  
  20366.                                         outseg(&wtok,3);
  20367.  
  20368.                                         op(0x0F);
  20369.  
  20370.                                         op(0xA4+vop);
  20371.  
  20372.                                         op(wtok.rm);  // SHLD [rmword],CL
  20373.  
  20374.                                         outaddress(&wtok);
  20375.  
  20376.                                         op(i);
  20377.  
  20378.                                         wtok.number-=4;
  20379.  
  20380.                                         compressoffset(&wtok);
  20381.  
  20382.                                         CheckAllMassiv(wbuf,8,&wstr,&wtok);
  20383.  
  20384.                                         op66(r32);
  20385.  
  20386.                                         outseg(&wtok,2);
  20387.  
  20388.                                         op(0xC1);
  20389.  
  20390.                                         op(0x20+wtok.rm);
  20391.  
  20392.                                         outaddress(&wtok);
  20393.  
  20394.                                         op(i);
  20395.  
  20396.                                         break;
  20397.  
  20398.                                 }
  20399.  
  20400.                         }
  20401.  
  20402.                         CheckAllMassiv(wbuf,8,&wstr,&wtok);
  20403.  
  20404.                         wtok.number+=4;
  20405.  
  20406.                         compressoffset(&wtok);
  20407.  
  20408.                         for(i=0;i<2;i++){
  20409.  
  20410.                                 op66(r32);
  20411.  
  20412.                                 outseg(&wtok,2);
  20413.  
  20414.                                 op(0xFF);       op(0x30+wtok.rm);
  20415.  
  20416.                                 outaddress(&wtok);
  20417.  
  20418.                                 if(i==1)break;
  20419.  
  20420.                                 wtok.number-=4;
  20421.  
  20422.                                 compressoffset(&wtok);
  20423.  
  20424.                         }
  20425.  
  20426.                         reg=ECX|(EAX*256);
  20427.  
  20428.                         getintoreg64(reg);
  20429.  
  20430.                         doregmath64(reg);
  20431.  
  20432.                         CallExternProc("__llmul");
  20433.  
  20434.                         next=0;
  20435.  
  20436.                         goto getfromax;
  20437.  
  20438.                 case tk_divequals:
  20439.  
  20440.                         getoperand(am32==TRUE?EAX:BX);
  20441.  
  20442.                         if(itok2.type==tp_stopper&&tok==tk_number&&(itok.flag&f_reloc)==0){
  20443.  
  20444.                                 if(itok.number==0){
  20445.  
  20446.                                         DevideZero();
  20447.  
  20448.                                         break;
  20449.  
  20450.                                 }
  20451.  
  20452.                                 if(itok.number==1)break;
  20453.  
  20454.                                 if((i=caselong(itok.number))!=NUMNUM){
  20455.  
  20456.                                         wtok.number+=4;
  20457.  
  20458.                                         compressoffset(&wtok);
  20459.  
  20460.                                         if(wbuf==NULL&&wstr.bufstr==NULL&&
  20461.  
  20462.                                                         ((wtok.rm==rm_d16&&wtok.sib==CODE16)||
  20463.  
  20464.                                                         (wtok.rm==rm_d32&&(wtok.sib==CODE32||wtok.sib==0)))){
  20465.  
  20466.                                                 op66(r32);
  20467.  
  20468.                                                 outseg(&wtok,1);
  20469.  
  20470.                                                 op(0xA1); // MOV EAX,[dword]
  20471.  
  20472.                                                 if(wtok.post==UNDEF_OFSET){
  20473.  
  20474.                                                         AddUndefOff(2,wtok.name);
  20475.  
  20476.                                                         wtok.post=0;
  20477.  
  20478.                                                 }
  20479.  
  20480.                                                 if(am32==FALSE)outword(wtok.number);
  20481.  
  20482.                                                 else outdword(wtok.number);
  20483.  
  20484.                                         }
  20485.  
  20486.                                         else{
  20487.  
  20488.                                                 CheckAllMassiv(wbuf,8,&wstr,&wtok,reg1,reg2);
  20489.  
  20490.                                                 op66(r32);
  20491.  
  20492.                                                 outseg(&wtok,2);
  20493.  
  20494.                                                 op(0x8B);
  20495.  
  20496.                                                 op(wtok.rm);
  20497.  
  20498.                                                 outaddress(&wtok);
  20499.  
  20500.                                         }
  20501.  
  20502.                                         wtok.number-=4;
  20503.  
  20504.                                         compressoffset(&wtok);
  20505.  
  20506.                                         ClearReg(AX);
  20507.  
  20508.                                         CheckAllMassiv(wbuf,8,&wstr,&wtok);
  20509.  
  20510.                                         op66(r32);
  20511.  
  20512.                                         outseg(&wtok,3);
  20513.  
  20514.                                         op(0x0F);
  20515.  
  20516.                                         op(0xAC);
  20517.  
  20518.                                         op(wtok.rm);  // SHLD [rmword],CL
  20519.  
  20520.                                         outaddress(&wtok);
  20521.  
  20522.                                         op(i);
  20523.  
  20524.                                         wtok.number+=4;
  20525.  
  20526.                                         compressoffset(&wtok);
  20527.  
  20528.                                         CheckAllMassiv(wbuf,8,&wstr,&wtok);
  20529.  
  20530.                                         op66(r32);
  20531.  
  20532.                                         outseg(&wtok,2);
  20533.  
  20534.                                         op(0xC1);
  20535.  
  20536.                                         op(0x28+wtok.rm);
  20537.  
  20538.                                         outaddress(&wtok);
  20539.  
  20540.                                         op(i);
  20541.  
  20542.                                         break;
  20543.  
  20544.                                 }
  20545.  
  20546.                                 unsigned long number;
  20547.  
  20548.                                 number=itok.lnumber>>32;
  20549.  
  20550.                                 for(i=0;i<2;i++){
  20551.  
  20552.                                         op66(r32);
  20553.  
  20554.                                         if((itok.flag&f_reloc)==0&&short_ok(number,1)){
  20555.  
  20556.                                                 op(0x6A);
  20557.  
  20558.                                                 op(number);
  20559.  
  20560.                                         }
  20561.  
  20562.                                         else{
  20563.  
  20564.                                                 op(0x68);
  20565.  
  20566.                                                 if(i==0&&(itok.flag&f_reloc)!=0)AddReloc();
  20567.  
  20568.                                                 outdword(number);
  20569.  
  20570.                                         }
  20571.  
  20572.                                         if(i==1)break;
  20573.  
  20574.                                         number=itok.number;
  20575.  
  20576.                                 }
  20577.  
  20578.                                 goto divcont;
  20579.  
  20580.                         }
  20581.  
  20582.                         reg=EAX|(EDX*256);
  20583.  
  20584.                         getintoreg64(reg);
  20585.  
  20586.                         doregmath64(reg);
  20587.  
  20588.                         op66(r32);
  20589.  
  20590.                         op(0x50+EDX);
  20591.  
  20592.                         op66(r32);
  20593.  
  20594.                         op(0x50+EAX);
  20595.  
  20596.                         next=0;
  20597.  
  20598. divcont:
  20599.  
  20600.                         addESP+=8;
  20601.  
  20602.                         if(ESPloc&&am32&&wtok.segm==SS)wtok.number+=8;
  20603.  
  20604.                         reg=EAX;
  20605.  
  20606.                         for(i=0;i<2;i++){
  20607.  
  20608.                                 if(reg==AX&&wbuf==NULL&&wstr.bufstr==NULL&&
  20609.  
  20610.                                         ((wtok.rm==rm_d16&&wtok.sib==CODE16)||
  20611.  
  20612.                                         (wtok.rm==rm_d32&&(wtok.sib==CODE32||wtok.sib==0)))){
  20613.  
  20614.                                         op66(r32);
  20615.  
  20616.                                         outseg(&wtok,1);
  20617.  
  20618.                                         op(0xA1);
  20619.  
  20620.                                         if(wtok.post==UNDEF_OFSET){
  20621.  
  20622.                                                 AddUndefOff(2,wtok.name);
  20623.  
  20624.                                         }
  20625.  
  20626.                                         if(am32==FALSE)outword(wtok.number);
  20627.  
  20628.                                         else outdword(wtok.number);
  20629.  
  20630.                                 }
  20631.  
  20632.                                 else{
  20633.  
  20634.                                         CheckAllMassiv(wbuf,8,&wstr,&wtok,reg1,reg2);
  20635.  
  20636.                                         op66(r32);
  20637.  
  20638.                                         outseg(&wtok,2);
  20639.  
  20640.                                         op(0x8B);
  20641.  
  20642.                                         op(reg*8+wtok.rm);
  20643.  
  20644.                                         outaddress(&wtok);
  20645.  
  20646.                                 }
  20647.  
  20648.                                 if(i==1)break;
  20649.  
  20650.                                 wtok.number+=4;
  20651.  
  20652.                                 compressoffset(&wtok);
  20653.  
  20654.                                 reg=EDX;
  20655.  
  20656.                         }
  20657.  
  20658.                         CallExternProc("__lludiv");
  20659.  
  20660.                         addESP-=8;
  20661.  
  20662.                         wtok.number-=4;
  20663.  
  20664.                         compressoffset(&wtok);
  20665.  
  20666.                         goto getfromax;
  20667.  
  20668.                 case tk_swap:
  20669.  
  20670.                         int regdi;
  20671.  
  20672.                         regdi=TRUE;
  20673.  
  20674.                         getoperand();
  20675.  
  20676.                         rbuf=bufrm;
  20677.  
  20678.                         bufrm=NULL;
  20679.  
  20680.                         if(am32!=FALSE&&wbuf!=NULL&&wstr.bufstr!=NULL)regdi=FALSE;
  20681.  
  20682.                         switch(tok){
  20683.  
  20684.                                 case tk_reg64:
  20685.  
  20686.                                         CheckAllMassiv(wbuf,8,&wstr,&wtok);
  20687.  
  20688.                                         reg=itok.number&255;
  20689.  
  20690.                                         for(i=0;i<2;i++){
  20691.  
  20692.                                                 op66(r32);
  20693.  
  20694.                                                 outseg(&wtok,2);
  20695.  
  20696.                                                 op(0x87);
  20697.  
  20698.                                                 op(reg*8+wtok.rm);
  20699.  
  20700.                                                 outaddress(&wtok);
  20701.  
  20702.                                                 ClearReg(reg);
  20703.  
  20704.                                                 if(i==1)break;
  20705.  
  20706.                                                 reg=itok.number/256;
  20707.  
  20708.                                                 wtok.number+=4;
  20709.  
  20710.                                                 compressoffset(&wtok);
  20711.  
  20712.                                         }
  20713.  
  20714.                                         break;
  20715.  
  20716.                                 case tk_qwordvar:
  20717.  
  20718.                                         for(i=0;i<2;i++){
  20719.  
  20720.                                                 getinto_e_ax(0,tk_dwordvar,&wtok,wbuf,&wstr,r32,TRUE);
  20721.  
  20722.                                                 CheckAllMassiv(rbuf,8,&strinf,&itok,regdi==FALSE?BX:DI,DX);
  20723.  
  20724.                                                 op66(r32);
  20725.  
  20726.                                                 outseg(&itok,2);
  20727.  
  20728.                                                 op(0x87);  // XCHG AX,[wloc]
  20729.  
  20730.                                                 op(itok.rm);
  20731.  
  20732.                                                 outaddress(&itok);
  20733.  
  20734.                                                 KillVar(itok.name);
  20735.  
  20736.                                                 if(wbuf==NULL&&wstr.bufstr==NULL&&
  20737.  
  20738.                                                                 ((wtok.rm==rm_d16&&wtok.sib==CODE16)||
  20739.  
  20740.                                                                 (wtok.rm==rm_d32&&(wtok.sib==CODE32||wtok.sib==0)))){
  20741.  
  20742.                                                         op66(r32);
  20743.  
  20744.                                                         outseg(&wtok,1);
  20745.  
  20746.                                                         op(0xA3); /* MOV [word],AX */
  20747.  
  20748.                                                         if(wtok.post==UNDEF_OFSET){
  20749.  
  20750.                                                                 AddUndefOff(2,wtok.name);
  20751.  
  20752.                                                                 wtok.post=0;
  20753.  
  20754.                                                         }
  20755.  
  20756.                                                         if(am32==FALSE)outword(wtok.number);    //????
  20757.  
  20758.                                                         else outdword(wtok.number);
  20759.  
  20760.                                                 }
  20761.  
  20762.                                                 else{
  20763.  
  20764.                                                         CheckAllMassiv(wbuf,8,&wstr,&wtok,reg1,reg2);
  20765.  
  20766.                                                         op66(r32);
  20767.  
  20768.                                                         outseg(&wtok,2);
  20769.  
  20770.                                                         op(0x89); op(wtok.rm); /* MOV [rmword],AX */
  20771.  
  20772.                                                         outaddress(&wtok);
  20773.  
  20774.                                                 }
  20775.  
  20776.                                                 if(i==1)break;
  20777.  
  20778.                                                 itok.number+=4;
  20779.  
  20780.                                                 compressoffset(&itok);
  20781.  
  20782.                                                 wtok.number+=4;
  20783.  
  20784.                                                 compressoffset(&wtok);
  20785.  
  20786.                                         }
  20787.  
  20788.                                         warningreg(regs[1][EAX]);
  20789.  
  20790.                                         ClearReg(EAX);
  20791.  
  20792.                                         break;
  20793.  
  20794.                                 default: swaperror(); break;
  20795.  
  20796.                         }
  20797.  
  20798.                         break;
  20799.  
  20800.                 case tk_rrequals:
  20801.  
  20802.                         vop=8;
  20803.  
  20804.                         wtok.number+=4;
  20805.  
  20806.                         compressoffset(&wtok);
  20807.  
  20808.                 case tk_llequals:
  20809.  
  20810.                         getoperand(am32==TRUE?ECX:BX);
  20811.  
  20812.                         if(itok2.type!=tp_stopper){
  20813.  
  20814.                                 getintobeg(CL,&ofsstr);
  20815.  
  20816.                                 ClearReg(CX);
  20817.  
  20818.                                 warningreg(begs[1]);
  20819.  
  20820.                                 next=0;
  20821.  
  20822.                                 i=1;
  20823.  
  20824.                         }
  20825.  
  20826.                         else if(tok==tk_number){
  20827.  
  20828.                                 i=0;
  20829.  
  20830.                         }
  20831.  
  20832.                         else{
  20833.  
  20834.                                 if(tok!=tk_beg||(unsigned int)itok.number!=CL){
  20835.  
  20836.                                         getintobeg(CL,&ofsstr);
  20837.  
  20838.                                         ClearReg(CX);
  20839.  
  20840.                                         warningreg(begs[1]);
  20841.  
  20842.                                         next=0;
  20843.  
  20844.                                 }
  20845.  
  20846.                                 i=1;
  20847.  
  20848.                         }
  20849.  
  20850.                         if(wbuf==NULL&&wstr.bufstr==NULL&&
  20851.  
  20852.                                 ((wtok.rm==rm_d16&&wtok.sib==CODE16)||
  20853.  
  20854.                                 (wtok.rm==rm_d32&&(wtok.sib==CODE32||wtok.sib==0)))){
  20855.  
  20856.                                 op66(r32);
  20857.  
  20858.                                 outseg(&wtok,1);
  20859.  
  20860.                                 op(0xA1); // MOV EAX,[dword]
  20861.  
  20862.                                 if(wtok.post==UNDEF_OFSET){
  20863.  
  20864.                                         AddUndefOff(2,wtok.name);
  20865.  
  20866.                                         wtok.post=0;
  20867.  
  20868.                                 }
  20869.  
  20870.                                 if(am32==FALSE)outword(wtok.number);
  20871.  
  20872.                                 else outdword(wtok.number);
  20873.  
  20874.                         }
  20875.  
  20876.                         else{
  20877.  
  20878.                                 CheckAllMassiv(wbuf,8,&wstr,&wtok,reg1,reg2);
  20879.  
  20880.                                 op66(r32);
  20881.  
  20882.                                 outseg(&wtok,2);
  20883.  
  20884.                                 op(0x8B);
  20885.  
  20886.                                 op(wtok.rm);
  20887.  
  20888.                                 outaddress(&wtok);
  20889.  
  20890.                         }
  20891.  
  20892.                         if(vop)wtok.number-=4;
  20893.  
  20894.                         else wtok.number+=4;
  20895.  
  20896.                         compressoffset(&wtok);
  20897.  
  20898.                         ClearReg(AX);
  20899.  
  20900.                         warningreg(regs[1][EAX]);
  20901.  
  20902.                         CheckAllMassiv(wbuf,8,&wstr,&wtok);
  20903.  
  20904.                         op66(r32);
  20905.  
  20906.                         outseg(&wtok,3);
  20907.  
  20908.                         op(0x0F);
  20909.  
  20910.                         op(0xA4+vop+i);
  20911.  
  20912.                         op(wtok.rm);  // SHLD [rmword],CL
  20913.  
  20914.                         outaddress(&wtok);
  20915.  
  20916.                         if(i==0)op((unsigned int)itok.number);
  20917.  
  20918.                         if(vop)wtok.number+=4;
  20919.  
  20920.                         else wtok.number-=4;
  20921.  
  20922.                         compressoffset(&wtok);
  20923.  
  20924.                         CheckAllMassiv(wbuf,8,&wstr,&wtok);
  20925.  
  20926.                         op66(r32);
  20927.  
  20928.                         outseg(&wtok,2);
  20929.  
  20930.                         op(i==0?0xC1:0xD3);
  20931.  
  20932.                         op(0x20+vop+wtok.rm);
  20933.  
  20934.                         outaddress(&wtok);
  20935.  
  20936.                         if(i==0)op(itok.number);
  20937.  
  20938.                         break;
  20939.  
  20940.                 default: operatorexpected(); break;
  20941.  
  20942.         }
  20943.  
  20944.         KillVar(wtok.name);
  20945.  
  20946.         if(next)nexttok();
  20947.  
  20948.         if(terminater==tk_semicolon)seminext();
  20949.  
  20950.         if(cpu<3)cpu=3;
  20951.  
  20952.         return retrez;
  20953.  
  20954. }
  20955.  
  20956.  
  20957.  
  20958. void Select2FreeReg(int r1,int r2,int *reg1,int *reg2)
  20959.  
  20960. {
  20961.  
  20962.         *reg1=idxregs[0];
  20963.  
  20964.         *reg2=idxregs[1];
  20965.  
  20966.         if(r1==idxregs[0]){
  20967.  
  20968.                 if(r2==idxregs[1]){
  20969.  
  20970.                         *reg1=idxregs[2];
  20971.  
  20972.                         *reg2=idxregs[3];
  20973.  
  20974.                 }
  20975.  
  20976.                 else{
  20977.  
  20978.                         *reg1=idxregs[1];
  20979.  
  20980.                         if(r2==idxregs[2])*reg2=idxregs[3];
  20981.  
  20982.                         else *reg2=idxregs[2];
  20983.  
  20984.                 }
  20985.  
  20986.         }
  20987.  
  20988.         if(r1==idxregs[1]){
  20989.  
  20990.                 if(r2==idxregs[0]){
  20991.  
  20992.                         *reg1=idxregs[2];
  20993.  
  20994.                         *reg2=idxregs[3];
  20995.  
  20996.                 }
  20997.  
  20998.                 else{
  20999.  
  21000.                         *reg1=idxregs[0];
  21001.  
  21002.                         if(r2==idxregs[2])*reg2=idxregs[3];
  21003.  
  21004.                         else *reg2=idxregs[2];
  21005.  
  21006.                 }
  21007.  
  21008.         }
  21009.  
  21010. }
  21011.  
  21012.  
  21013.  
  21014. void doreg64(int reg,int terminater)
  21015.  
  21016. {
  21017.  
  21018. unsigned char next=1;
  21019.  
  21020. int vop=0,sign=0;
  21021.  
  21022. int i;
  21023.  
  21024. int reg1,reg2;
  21025.  
  21026. unsigned long long ii;
  21027.  
  21028. int r1,r2;
  21029.  
  21030. char *ofsstr=NULL;
  21031.  
  21032. int rettype;
  21033.  
  21034. int pointr=0;
  21035.  
  21036. int numpointr=0;
  21037.  
  21038.         rettype=tk_qword;
  21039.  
  21040.         r1=reg&255;
  21041.  
  21042.         r2=reg/256;
  21043.  
  21044.         Select2FreeReg(r1,r2,&reg1,&reg2);
  21045.  
  21046.         if(r1==ESP||r2==ESP)RestoreStack();
  21047.  
  21048.         nexttok();
  21049.  
  21050.         switch(tok){
  21051.  
  21052.                 case tk_assign://=
  21053.  
  21054.                         nexttok();
  21055.  
  21056.                         /*-----------------31.08.05 18:39-------------------
  21057.  
  21058.  
  21059.  
  21060.                         --------------------------------------------------*/
  21061.  
  21062.                         convert_type(&sign,(int *)&rettype,&pointr);
  21063.  
  21064.                         while(tok==tk_mult){
  21065.  
  21066.                                 nexttok();
  21067.  
  21068.                                 numpointr++;
  21069.  
  21070.                         }
  21071.  
  21072.                         if(numpointr>itok.npointr){
  21073.  
  21074.                                 unuseableinput();
  21075.  
  21076.                         }
  21077.  
  21078.                         CheckMinusNum();
  21079.  
  21080.                         if(tok==tk_number){     //¯à®¢¥àª  ¨ á㬬¨à®¢ ­¨¥ ç¨á¥«
  21081.  
  21082.                                 switch(rettype){
  21083.  
  21084.                                         case tk_float: sign=2; break;
  21085.  
  21086.                                         case tk_double: sign=3; break;
  21087.  
  21088.                                         case tk_qword: sign=4; break;
  21089.  
  21090.                                 }
  21091.  
  21092.                                 if(OnlyNumber(sign)){
  21093.  
  21094.                                         MovRegNum(r32,postnumflag&f_reloc,itok.number,r1);
  21095.  
  21096.                                         MovRegNum(r32,0,itok.lnumber>>32,r2);
  21097.  
  21098.                                         next=0;
  21099.  
  21100.                                         break;
  21101.  
  21102.                                 }
  21103.  
  21104.                         }
  21105.  
  21106.                         if(rettype==tk_float||rettype==tk_double){
  21107.  
  21108.                                 doeaxfloatmath(tk_stackstart,0,rettype==tk_float?0:4);
  21109.  
  21110.                                 op66(r32);
  21111.  
  21112.                                 op(0x58+r1);
  21113.  
  21114.                                 op66(r32);
  21115.  
  21116.                                 if(rettype==tk_float){
  21117.  
  21118.                                         op(0x31); op(0xC0+r2*9);
  21119.  
  21120.                                 }
  21121.  
  21122.                                 else op(0x58+r2);
  21123.  
  21124.                                 next=0;
  21125.  
  21126.                                 break;
  21127.  
  21128.                         }
  21129.  
  21130.                         /*-----------------31.08.05 18:39-------------------
  21131.  
  21132.  
  21133.  
  21134.                         --------------------------------------------------*/
  21135.  
  21136.                         getintoreg64(reg);
  21137.  
  21138.                         doregmath64(reg);
  21139.  
  21140.                         next=0;
  21141.  
  21142.                         break;
  21143.  
  21144.                 case tk_plusplus: op66(r32); op(0x40+r1);
  21145.  
  21146.                         op66(r32);
  21147.  
  21148.                         op(0x83);
  21149.  
  21150.                         op(0xD0+r2);
  21151.  
  21152.                         op(0);
  21153.  
  21154.                         break;
  21155.  
  21156.                 case tk_minusminus: op66(r32); op(0x48+r1);
  21157.  
  21158.                         op66(r32);
  21159.  
  21160.                         op(0x83);
  21161.  
  21162.                         op(0xD8+r2);
  21163.  
  21164.                         op(0);
  21165.  
  21166.                         break;
  21167.  
  21168.                 case tk_swap:
  21169.  
  21170.                         getoperand(reg1);
  21171.  
  21172.                         switch(tok){
  21173.  
  21174.                                 case tk_qwordvar:
  21175.  
  21176.                                         reg=r1;
  21177.  
  21178.                                         for(i=0;i<2;i++){
  21179.  
  21180.                                                 CheckAllMassiv(bufrm,8,&strinf,&itok,reg1,reg2);
  21181.  
  21182.                                                 op66(r32);
  21183.  
  21184.                                                 outseg(&itok,2);
  21185.  
  21186.                                                 op(0x87);
  21187.  
  21188.                                                 op(reg*8+itok.rm);
  21189.  
  21190.                                                 outaddress(&itok);
  21191.  
  21192.                                                 itok.number+=4;
  21193.  
  21194.                                                 compressoffset(&itok);
  21195.  
  21196.                                                 reg=r2;
  21197.  
  21198.                                         }
  21199.  
  21200.                                         break;
  21201.  
  21202.                                 case tk_reg64:
  21203.  
  21204.                                         reg=r1;
  21205.  
  21206.                                         vop=itok.number;
  21207.  
  21208.                                         itok.number&=255;
  21209.  
  21210.                                         for(i=0;i<2;i++){
  21211.  
  21212.                                                 if(reg!=(int)itok.number){
  21213.  
  21214.                                                         if(RegSwapReg(reg,itok.number,r32)==NOINREG){;
  21215.  
  21216.                                                                 op66(r32);
  21217.  
  21218.                                                                 if(reg==AX)op(0x90+(unsigned int)itok.number);
  21219.  
  21220.                                                                 else if((unsigned int)itok.number==AX)op(0x90+reg);
  21221.  
  21222.                                                                 else{
  21223.  
  21224.                                                                         op(0x87);
  21225.  
  21226.                                                                         op(0xC0+(unsigned int)itok.number+reg*8);
  21227.  
  21228.                                                                 }
  21229.  
  21230.                                                         }
  21231.  
  21232.                                                         else waralreadinitreg(regs[1][reg],regs[1][itok.number]);
  21233.  
  21234.                                                 }
  21235.  
  21236.                                                 reg=r2;
  21237.  
  21238.                                                 itok.number=vop/256;
  21239.  
  21240.                                         }
  21241.  
  21242.                                         break;
  21243.  
  21244.                                 default: swaperror(); break;
  21245.  
  21246.                         }
  21247.  
  21248.                         break;
  21249.  
  21250.                 case tk_xorequals: vop+=0x08;
  21251.  
  21252.                 case tk_minusequals: vop+=0x08;
  21253.  
  21254.                 case tk_andequals: vop+=0x18;
  21255.  
  21256.                 case tk_orequals: vop+=0x08;
  21257.  
  21258.                 case tk_plusequals:
  21259.  
  21260.                         if(CheckAddOnly()){
  21261.  
  21262.                                 inptr2--;
  21263.  
  21264.                                 cha2=' ';
  21265.  
  21266.                                 if(tok==tk_plusequals)tok=tk_plus;
  21267.  
  21268.                                 else tok=tk_minus;
  21269.  
  21270.                                 doregmath64(reg);
  21271.  
  21272.                                 next=0;
  21273.  
  21274.                                 break;
  21275.  
  21276.                         }
  21277.  
  21278.                         getoperand(reg1);
  21279.  
  21280.                         if(itok2.type==tp_opperand&&tok!=tk_number&&tok!=tk_undefofs&&
  21281.  
  21282.                                 tok!=tk_postnumber)goto defadd;
  21283.  
  21284.                         CheckMinusNum();
  21285.  
  21286.                         idrec *rrec;
  21287.  
  21288.                         int opost;
  21289.  
  21290.                         i=tok;
  21291.  
  21292.                         switch(tok){
  21293.  
  21294.                                 case tk_postnumber:
  21295.  
  21296.                                 case tk_undefofs:
  21297.  
  21298.                                         ii=itok.number;
  21299.  
  21300.                                         rrec=itok.rec;
  21301.  
  21302.                                         opost=itok.post;
  21303.  
  21304.                                         char uname[IDLENGTH];
  21305.  
  21306.                                         strcpy(uname,itok.name);
  21307.  
  21308.                                         if(itok.flag&f_extern)goto addnum;
  21309.  
  21310.                                         tok=tk_number;
  21311.  
  21312.                                 case tk_number:
  21313.  
  21314.                                         ii=doconstqwordmath();
  21315.  
  21316.                                         next=0;
  21317.  
  21318.                                         if(itok.type==tp_opperand){
  21319.  
  21320.                                                 sign=reg1|(reg2*256);
  21321.  
  21322.                                                 if(i==tk_postnumber||i==tk_undefofs){
  21323.  
  21324.                                                         op66(r32);
  21325.  
  21326.                                                         op(0xB8+r1);    // MOV reg,#
  21327.  
  21328.                                                         if(i==tk_postnumber)(postnumflag&f_extern)==0?setwordpost(&itok):setwordext((long *)&ii);
  21329.  
  21330.                                                         else{
  21331.  
  21332.                                                                 if((postnumflag&f_reloc)!=0)AddReloc();
  21333.  
  21334.                                                                 if(i==tk_undefofs)AddUndefOff(2,uname);
  21335.  
  21336.                                                         }
  21337.  
  21338.                                                         outdword(ii);
  21339.  
  21340.                                                         ZeroReg(r2,r32);
  21341.  
  21342.                                                 }
  21343.  
  21344.                                                 else{
  21345.  
  21346.                                                         MovRegNum(r32,postnumflag&f_reloc,ii,reg1);
  21347.  
  21348.                                                         MovRegNum(r32,postnumflag&f_reloc,ii>>=32,reg2);
  21349.  
  21350.                                                 }
  21351.  
  21352.                                                 doregmath64(sign);
  21353.  
  21354.                                                 itok.number=sign;
  21355.  
  21356.                                                 goto addreg;
  21357.  
  21358.                                         }
  21359.  
  21360.                                         if((postnumflag&f_reloc)==0&&i!=tk_undefofs&&i!=tk_postnumber){
  21361.  
  21362.                                                 optnumadd64(ii,r1,r2,vop);
  21363.  
  21364.                                                 break;
  21365.  
  21366.                                         }
  21367.  
  21368. addnum:
  21369.  
  21370.                                         op66(r32);
  21371.  
  21372.                                   if(r1==AX)op(0x05+vop);
  21373.  
  21374.                                         else{
  21375.  
  21376.                                                 op(0x81);
  21377.  
  21378.                                                 op(0xC0+vop+r1);
  21379.  
  21380.                                         }
  21381.  
  21382.                                         itok.rec=rrec;
  21383.  
  21384.                                         itok.post=opost;
  21385.  
  21386.                                         if(i==tk_postnumber)(postnumflag&f_extern)==0?setwordpost(&itok):setwordext((long *)&ii);
  21387.  
  21388.                                         else{
  21389.  
  21390.                                                 if((postnumflag&f_reloc)!=0)AddReloc();
  21391.  
  21392.                                                 if(i==tk_undefofs)AddUndefOff(2,uname);
  21393.  
  21394.                                         }
  21395.  
  21396.                                         outdword(ii);
  21397.  
  21398.                                         ii>>=32;
  21399.  
  21400.                                         if(vop==0)vop=0x10;
  21401.  
  21402.                                         else if(vop==0x28)vop=0x18;
  21403.  
  21404.                                         op66(r32);
  21405.  
  21406.                                   if(r2==AX)op(0x05+vop);
  21407.  
  21408.                                         else{
  21409.  
  21410.                                                 op(0x81);
  21411.  
  21412.                                                 op(0xC0+vop+r2);
  21413.  
  21414.                                         }
  21415.  
  21416.                                         outdword(ii);
  21417.  
  21418.                                         break;
  21419.  
  21420.                                 case tk_longvar:
  21421.  
  21422.                                 case tk_dwordvar:
  21423.  
  21424.                                         CheckAllMassiv(bufrm,4,&strinf,&itok,reg1,reg2);
  21425.  
  21426.                                         op66(r32);
  21427.  
  21428.                                         outseg(&itok,2);
  21429.  
  21430.                                         op(0x03+vop);
  21431.  
  21432.                                         op(r1*8+itok.rm);
  21433.  
  21434.                                         outaddress(&itok);
  21435.  
  21436.                                         if(vop==0x20){  //&=
  21437.  
  21438.                                                 ZeroReg(r2,r32);
  21439.  
  21440.                                         }
  21441.  
  21442.                                         else{
  21443.  
  21444.                                                 if(vop==0||vop==0x28){
  21445.  
  21446.                                                         if(vop)vop=8;
  21447.  
  21448.                                                         op66(r32);
  21449.  
  21450.                                                         op(0x83);
  21451.  
  21452.                                                         op(0xD0+vop+r2);
  21453.  
  21454.                                                         op(0);
  21455.  
  21456.                                                 }
  21457.  
  21458.                                         }
  21459.  
  21460.                                         break;
  21461.  
  21462.                                 case tk_qword:
  21463.  
  21464.                                         CheckAllMassiv(bufrm,4,&strinf,&itok,reg1,reg2);
  21465.  
  21466.                                         reg=r1;
  21467.  
  21468.                                         for(i=0;i<2;i++){
  21469.  
  21470.                                                 op66(r32);
  21471.  
  21472.                                                 outseg(&itok,2);
  21473.  
  21474.                                                 op(0x03+vop);
  21475.  
  21476.                                                 op(reg*8+itok.rm);
  21477.  
  21478.                                                 outaddress(&itok);
  21479.  
  21480.                                                 if(i==1)break;
  21481.  
  21482.                                                 reg=r2;
  21483.  
  21484.                                                 itok.number+=4;
  21485.  
  21486.                                                 compressoffset(&itok);
  21487.  
  21488.                                         }
  21489.  
  21490.                                         break;
  21491.  
  21492.                                 case tk_reg64:
  21493.  
  21494. addreg:
  21495.  
  21496.                                         reg=r1;
  21497.  
  21498.                                         reg2=itok.number&255;
  21499.  
  21500.                                         for(i=0;i<2;i++){
  21501.  
  21502.                                                 op66(r32);
  21503.  
  21504.                                                 op(0x01+vop);
  21505.  
  21506.                                                 op(0xC0+reg+reg2*8);
  21507.  
  21508.                                                 if(i==1)break;
  21509.  
  21510.                                                 if(vop==0)vop=0x10;
  21511.  
  21512.                                                 if(vop==0x28)vop=0x18;
  21513.  
  21514.                                                 reg2=itok.number/256;
  21515.  
  21516.                                                 reg=r2;
  21517.  
  21518.                                         }
  21519.  
  21520.                                         break;
  21521.  
  21522.                                 case tk_reg32:
  21523.  
  21524.                                         op66(r32);
  21525.  
  21526.                                         op(0x01+vop);
  21527.  
  21528.                                         op(0xC0+reg+(unsigned int)itok.number*8);
  21529.  
  21530.                                         if(vop==0x20){  //&=
  21531.  
  21532.                                                 ZeroReg(r2,r32);
  21533.  
  21534.                                         }
  21535.  
  21536.                                         else{
  21537.  
  21538.                                                 if(vop==0||vop==0x28){
  21539.  
  21540.                                                         if(vop)vop=8;
  21541.  
  21542.                                                         op66(r32);
  21543.  
  21544.                                                         op(0x83);
  21545.  
  21546.                                                         op(0xD0+vop+r2);
  21547.  
  21548.                                                         op(0);
  21549.  
  21550.                                                 }
  21551.  
  21552.                                         }
  21553.  
  21554.                                         break;
  21555.  
  21556.                                 case tk_ID:
  21557.  
  21558.                                 case tk_id:
  21559.  
  21560.                                 case tk_proc:
  21561.  
  21562.                                 case tk_apiproc:
  21563.  
  21564.                                 case tk_undefproc:
  21565.  
  21566.                                 case tk_declare:
  21567.  
  21568. unsigned char oaddstack;
  21569.  
  21570.                                         oaddstack=addstack;
  21571.  
  21572.                                         if(r1==EAX||r2==EAX){
  21573.  
  21574.                                                 op66(r32);
  21575.  
  21576.                                                 op(0x50);       //push AX
  21577.  
  21578.                                                 warningreg(regs[1][EAX]);
  21579.  
  21580.                                                 addESP+=4;
  21581.  
  21582.                                                 ClearReg(EAX);
  21583.  
  21584.                                                 addstack=FALSE;
  21585.  
  21586.                                         }
  21587.  
  21588.                                         if(r1==EDX||r2==EDX){
  21589.  
  21590.                                                 op66(r32);
  21591.  
  21592.                                                 op(0x50+EDX);   //push DX
  21593.  
  21594.                                                 addESP+=4;
  21595.  
  21596.                                                 warningreg(regs[1][EDX]);
  21597.  
  21598.                                                 ClearReg(EDX);
  21599.  
  21600.                                                 addstack=FALSE;
  21601.  
  21602.                                         }
  21603.  
  21604.                                         procdo(tk_qword);
  21605.  
  21606.                                         addstack=oaddstack;
  21607.  
  21608.                                         if(itok2.type==tp_opperand){
  21609.  
  21610.                                                 nexttok();
  21611.  
  21612.                                                 doregmath64(EAX|(EDX*256));
  21613.  
  21614.                                                 next=0;
  21615.  
  21616.                                         }
  21617.  
  21618.                                         if(r1==EDX||r2==EDX){
  21619.  
  21620.                                                 op66(r32);
  21621.  
  21622.                                                 op(0x89);
  21623.  
  21624.                                                 op(0xC0+reg2+EDX*8);    //mov reg,EDX
  21625.  
  21626.                                                 op66(r32);
  21627.  
  21628.                                                 op(0x58+EDX);   //pop dx
  21629.  
  21630.                                                 addESP-=4;
  21631.  
  21632.                                         }
  21633.  
  21634.                                         else reg2=EDX;
  21635.  
  21636.                                         if(r1==EAX||r2==EAX){
  21637.  
  21638.                                                 op66(r32);
  21639.  
  21640.                                                 op(0x89);
  21641.  
  21642.                                                 op(0xC0+reg1+EAX*8);    //mov reg,EAX
  21643.  
  21644.                                                 op66(r32);
  21645.  
  21646.                                                 op(0x58);       //pop ax
  21647.  
  21648.                                                 addESP-=4;
  21649.  
  21650.                                         }
  21651.  
  21652.                                         else reg1=EAX;
  21653.  
  21654.                                         op66(r32);
  21655.  
  21656.                                         op(0x01+vop);
  21657.  
  21658.                                         op(0xc0+r1+reg1*8);     //add reg,ax
  21659.  
  21660.                                         if(vop==0)vop=0x10;
  21661.  
  21662.                                         if(vop==0x28)vop=0x18;
  21663.  
  21664.                                         op66(r32);
  21665.  
  21666.                                         op(0x01+vop);
  21667.  
  21668.                                         op(0xc0+r2+reg2*8);     //add reg,ax
  21669.  
  21670.                                         break;
  21671.  
  21672.                                 case tk_bytevar:
  21673.  
  21674.                                 case tk_charvar:
  21675.  
  21676.                                 case tk_beg:
  21677.  
  21678.                                 case tk_reg:
  21679.  
  21680.                                 case tk_intvar:
  21681.  
  21682.                                 case tk_wordvar:
  21683.  
  21684. defadd:
  21685.  
  21686.                                         sign=reg1|(reg2*256);
  21687.  
  21688.                                         getintoreg64(sign);
  21689.  
  21690.                                         doregmath64(sign);
  21691.  
  21692.                                         warningreg(regs[1][reg1]);
  21693.  
  21694.                                         warningreg(regs[1][reg2]);
  21695.  
  21696.                                         ClearReg(reg1);
  21697.  
  21698.                                         ClearReg(reg2);
  21699.  
  21700.                                         op66(r32);
  21701.  
  21702.                                         op(0x01+vop);
  21703.  
  21704.                                         op(0xc0+r1+reg1*8);     //add reg,ax
  21705.  
  21706.                                         if(vop==0)vop=0x10;
  21707.  
  21708.                                         if(vop==0x28)vop=0x18;
  21709.  
  21710.                                         op66(r32);
  21711.  
  21712.                                         op(0x01+vop);
  21713.  
  21714.                                         op(0xc0+r2+reg2*8);     //add reg,ax
  21715.  
  21716.                                         next=0;
  21717.  
  21718.                                         break;
  21719.  
  21720.                                 default: valueexpected(); break;
  21721.  
  21722.                         }
  21723.  
  21724.                         break;
  21725.  
  21726.                 case tk_rrequals: vop+=0x08;
  21727.  
  21728.                 case tk_llequals:
  21729.  
  21730.                         getoperand(reg1);
  21731.  
  21732.                         CheckMinusNum();
  21733.  
  21734.                         if(tok==tk_number){
  21735.  
  21736.                                 ii=doconstqwordmath();
  21737.  
  21738.                                 next=0;
  21739.  
  21740.                                 if(itok.type==tp_opperand){
  21741.  
  21742.                                         if(r1==ECX||r2==ECX)regshifterror();
  21743.  
  21744.                                         op(0xB0+CL); op(ii);    //mov CL,num
  21745.  
  21746.                                         ConstToReg(ii,CL,r8);
  21747.  
  21748.                                         dobegmath(CL);
  21749.  
  21750.                                         warningreg(begs[1]);
  21751.  
  21752.                                         ClearReg(CL);
  21753.  
  21754.                                         goto shiftcl;
  21755.  
  21756.                                 }
  21757.  
  21758.                                 if(vop){
  21759.  
  21760.                                         reg=r1;
  21761.  
  21762.                                         r1=r2;
  21763.  
  21764.                                         r2=reg;
  21765.  
  21766.                                 }
  21767.  
  21768.                                 if(ii<32){
  21769.  
  21770.                                         op66(r32);
  21771.  
  21772.                                         op(0x0F);
  21773.  
  21774.                                         op(0xA4+vop);
  21775.  
  21776.                                         op(0xC0+r2+r1*8);
  21777.  
  21778.                                         op(ii);
  21779.  
  21780.                                         op66(r32);
  21781.  
  21782.                                         if(ii==1){
  21783.  
  21784.                                                 op(0xD1); op(0xE0+r1+vop);
  21785.  
  21786.                                         }
  21787.  
  21788.                                         else{
  21789.  
  21790.                                                 op(0xC1);
  21791.  
  21792.                                                 op(0xE0+r1+vop);        //shl ax,num
  21793.  
  21794.                                                 op(ii);
  21795.  
  21796.                                         }
  21797.  
  21798.                                 }
  21799.  
  21800.                                 else{
  21801.  
  21802.                                         op66(r32);
  21803.  
  21804.                                         op(0x89);
  21805.  
  21806.                                         op(0xC0+r2+r1*8);
  21807.  
  21808.                                         ii-=32;
  21809.  
  21810.                                         if(ii!=0){
  21811.  
  21812.                                                 op66(r32);
  21813.  
  21814.                                                 if(ii==1){
  21815.  
  21816.                                                         op(0xD1);
  21817.  
  21818.                                                         op(0xE0+vop+r1);        //shr ax,1
  21819.  
  21820.                                                 }
  21821.  
  21822.                                                 else{
  21823.  
  21824.                                                         op(0xC1);
  21825.  
  21826.                                                         op(0xE0+r2+vop);        //shl ax,num
  21827.  
  21828.                                                         op(ii);
  21829.  
  21830.                                                 }
  21831.  
  21832.                                         }
  21833.  
  21834.                                         ZeroReg(r1,r32);
  21835.  
  21836.                                 }
  21837.  
  21838.                         }
  21839.  
  21840.                         else if(reg!=CX){
  21841.  
  21842.                                 if(!(itok2.type==tp_stopper&&(tok==tk_beg||tok==reg||tok==tk_reg32)&&itok.number==CL)){
  21843.  
  21844.                                         getintobeg(CL,&ofsstr);
  21845.  
  21846.                                         dobegmath(CL);
  21847.  
  21848.                                         warningreg(begs[1]);
  21849.  
  21850.                                         ClearReg(CL);
  21851.  
  21852.                                         next=0;
  21853.  
  21854.                                 }
  21855.  
  21856. shiftcl:
  21857.  
  21858.                                 op66(r32);
  21859.  
  21860.                                 op(0x0F);
  21861.  
  21862.                                 op(0xA5+vop);
  21863.  
  21864.                                 if(vop){
  21865.  
  21866.                                         reg=r1;
  21867.  
  21868.                                         r1=r2;
  21869.  
  21870.                                         r2=reg;
  21871.  
  21872.                                 }
  21873.  
  21874.                                 op(0xC0+r2+r1*8);
  21875.  
  21876.                                 op66(r32);
  21877.  
  21878.                                 op(0xD3);
  21879.  
  21880.                                 op(0xE0+vop+r1);        // SHL xXX,CL
  21881.  
  21882.                         }
  21883.  
  21884.                         else regshifterror();
  21885.  
  21886.                         break;
  21887.  
  21888.                 case tk_multequals:
  21889.  
  21890.                         getoperand(reg1);
  21891.  
  21892.                         CheckMinusNum();
  21893.  
  21894.                         if(tok==tk_number){
  21895.  
  21896.                                 ii=doconstqwordmath();
  21897.  
  21898.                                 next=0;
  21899.  
  21900.                                 if(itok.type==tp_opperand){
  21901.  
  21902.                                         op66(r32);
  21903.  
  21904.                                         op(0x50+r2);
  21905.  
  21906.                                         op66(r32);
  21907.  
  21908.                                         op(0x50+r1);
  21909.  
  21910.                                         addESP+=8;
  21911.  
  21912.                                         MovRegNum(r32,postnumflag&f_reloc,ii,reg1);
  21913.  
  21914.                                         MovRegNum(r32,0,ii>>32,reg2);
  21915.  
  21916.                                         ConstToReg(ii,reg1,r32);
  21917.  
  21918.                                         ConstToReg(ii>>32,reg2,r32);
  21919.  
  21920.                                         doregmath64(reg1|(reg2*256));
  21921.  
  21922.                                         goto mul;
  21923.  
  21924.                                 }
  21925.  
  21926.                                 i=0;
  21927.  
  21928.                                 if((postnumflag&f_reloc)==0){
  21929.  
  21930.                                         if(ii==0){
  21931.  
  21932.                                                 ZeroReg(r1,r32);
  21933.  
  21934.                                                 ZeroReg(r2,r32);
  21935.  
  21936.                                                 break;
  21937.  
  21938.                                         }
  21939.  
  21940.                                         if(ii==1)break;
  21941.  
  21942.                                         if(ii==2){
  21943.  
  21944.                                                 op66(r32);
  21945.  
  21946.                                                 op(1);
  21947.  
  21948.                                                 op(0xC0+9*r1); // ADD r1,r1
  21949.  
  21950.                                                 op66(r32);
  21951.  
  21952.                                                 op(0x83);
  21953.  
  21954.                                                 op(0xC2+r2*8);  //adc r2,0
  21955.  
  21956.                                                 op(0);
  21957.  
  21958.                                                 break;
  21959.  
  21960.                                         }
  21961.  
  21962.                                         if((i=caselonglong(ii))!=NUMNUM64){
  21963.  
  21964.                                                 if(i<32){
  21965.  
  21966.                                                         op66(r32);
  21967.  
  21968.                                                         outword(0xA40F);
  21969.  
  21970.                                                         op(0xC0+r2+r1*8);
  21971.  
  21972.                                                         op(i);
  21973.  
  21974.                                                         op66(r32);
  21975.  
  21976.                                                         op(0xC1);
  21977.  
  21978.                                                         op(0xE0+r1);    //shl ax,num
  21979.  
  21980.                                                         op(i);
  21981.  
  21982.                                                 }
  21983.  
  21984.                                                 else{
  21985.  
  21986.                                                         op66(r32);
  21987.  
  21988.                                                         op(0x89);
  21989.  
  21990.                                                         op(0xC0+r2+r1*8);
  21991.  
  21992.                                                         i-=32;
  21993.  
  21994.                                                         if(i!=0){
  21995.  
  21996.                                                                 op66(r32);
  21997.  
  21998.                                                                 if(i==1){
  21999.  
  22000.                                                                         op(1);
  22001.  
  22002.                                                                         op(0xC0+r2*9);  //add reg,reg
  22003.  
  22004.                                                                 }
  22005.  
  22006.                                                                 else{
  22007.  
  22008.                                                                         op(0xC1);
  22009.  
  22010.                                                                         op(0xE0+r2);    //shl ax,num
  22011.  
  22012.                                                                         op(i);
  22013.  
  22014.                                                                 }
  22015.  
  22016.                                                         }
  22017.  
  22018.                                                         ZeroReg(r1,r32);
  22019.  
  22020.                                                 }
  22021.  
  22022.                                                 break;
  22023.  
  22024.                                         }
  22025.  
  22026.                                 }
  22027.  
  22028.                                 op66(r32);
  22029.  
  22030.                                 op(0x50+r2);
  22031.  
  22032.                                 op66(r32);
  22033.  
  22034.                                 op(0x50+r1);
  22035.  
  22036.                                 addESP+=8;
  22037.  
  22038.                                 MovRegNum(r32,postnumflag&f_reloc,ii,ECX);
  22039.  
  22040.                                 MovRegNum(r32,0,ii>>32,EAX);
  22041.  
  22042.                                 goto mul;
  22043.  
  22044.                         }
  22045.  
  22046.                         op66(r32);
  22047.  
  22048.                         op(0x50+r2);
  22049.  
  22050.                         op66(r32);
  22051.  
  22052.                         op(0x50+r1);
  22053.  
  22054.                         addESP+=8;
  22055.  
  22056.                         reg=ECX|(EAX*256);
  22057.  
  22058.                         warningreg(regs[1][ECX]);
  22059.  
  22060.                         getintoreg64(reg);
  22061.  
  22062.                         doregmath64(reg);
  22063.  
  22064. mul:
  22065.  
  22066.                         CallExternProc("__llmul");
  22067.  
  22068.                         addESP-=8;
  22069.  
  22070. endmul:
  22071.  
  22072.                         ClearReg(EAX);
  22073.  
  22074.                         warningreg(regs[1][EAX]);
  22075.  
  22076.                         ClearReg(EDX);
  22077.  
  22078.                         warningreg(regs[1][EDX]);
  22079.  
  22080.                         next=0;
  22081.  
  22082.                         if(r1!=EAX){
  22083.  
  22084.                                 if(r1==EDX){
  22085.  
  22086.                                         if(r2==EAX){
  22087.  
  22088.                                                 op66(r32);
  22089.  
  22090.                                                 op(0x90+EDX);
  22091.  
  22092.                                                 break;
  22093.  
  22094.                                         }
  22095.  
  22096.                                         op66(r32);
  22097.  
  22098.                                         op(0x89);
  22099.  
  22100.                                         op(0xC0+r2+EDX*8);      //mov reg,EDX
  22101.  
  22102.                                         op66(r32);
  22103.  
  22104.                                         op(0x89);
  22105.  
  22106.                                         op(0xC0+r1+EAX*8);      //mov reg,EAX
  22107.  
  22108.                                         break;
  22109.  
  22110.                                 }
  22111.  
  22112.                                 op66(r32);
  22113.  
  22114.                                 op(0x89);
  22115.  
  22116.                                 op(0xC0+r1+EAX*8);      //mov reg,EAX
  22117.  
  22118.                         }
  22119.  
  22120.                         if(r2!=EDX){
  22121.  
  22122.                                 op66(r32);
  22123.  
  22124.                                 op(0x89);
  22125.  
  22126.                                 op(0xC0+r2+EDX*8);      //mov reg,EDX
  22127.  
  22128.                         }
  22129.  
  22130.                         break;
  22131.  
  22132.                 case tk_divequals:
  22133.  
  22134.                         getoperand(reg1);
  22135.  
  22136.                         CheckMinusNum();
  22137.  
  22138.                         if(tok==tk_number){
  22139.  
  22140.                                 ii=doconstqwordmath();
  22141.  
  22142.                                 next=0;
  22143.  
  22144.                                 if(itok.type==tp_opperand){
  22145.  
  22146.                                         MovRegNum(r32,postnumflag&f_reloc,ii,reg1);
  22147.  
  22148.                                         MovRegNum(r32,0,ii>>32,reg2);
  22149.  
  22150.                                         ConstToReg(ii,reg1,r32);
  22151.  
  22152.                                         ConstToReg(ii>>32,reg2,r32);
  22153.  
  22154.                                         doregmath64(reg1|(reg2*256));
  22155.  
  22156.                                         op66(r32);
  22157.  
  22158.                                         op(0x50+reg2);
  22159.  
  22160.                                         op66(r32);
  22161.  
  22162.                                         op(0x50+reg1);
  22163.  
  22164.                                         addESP+=8;
  22165.  
  22166.                                         warningreg(regs[1][reg1]);
  22167.  
  22168.                                         warningreg(regs[1][reg2]);
  22169.  
  22170.                                         goto divcont;
  22171.  
  22172.                                 }
  22173.  
  22174.                                 if((postnumflag&f_reloc)==0){
  22175.  
  22176.                                         if(ii==0){
  22177.  
  22178.                                                 DevideZero();
  22179.  
  22180.                                                 break;
  22181.  
  22182.                                         }
  22183.  
  22184.                                         if(ii==1)break;
  22185.  
  22186.                                         if((i=caselonglong(ii))!=NUMNUM64){
  22187.  
  22188.                                                 if(i<32){
  22189.  
  22190.                                                         op66(r32);
  22191.  
  22192.                                                         outword(0xAC0F);
  22193.  
  22194.                                                         op(0xC0+r1+r2*8);
  22195.  
  22196.                                                         op(i);
  22197.  
  22198.                                                         op66(r32);
  22199.  
  22200.                                                         op(0xc1);
  22201.  
  22202.                                                         op(0xe8+r2); // SHR reg,imm8
  22203.  
  22204.                                                         op(i);
  22205.  
  22206.                                                 }
  22207.  
  22208.                                                 else{
  22209.  
  22210.                                                         op66(r32);
  22211.  
  22212.                                                         op(0x89);
  22213.  
  22214.                                                         op(0xC0+r1+r2*8);
  22215.  
  22216.                                                         i-=32;
  22217.  
  22218.                                                         if(i!=0){
  22219.  
  22220.                                                                 op66(r32);
  22221.  
  22222.                                                                 if(i==1){
  22223.  
  22224.                                                                         op(0xD1);
  22225.  
  22226.                                                                         op(0xE8+r1);    //shr ax,1
  22227.  
  22228.                                                                 }
  22229.  
  22230.                                                                 else{
  22231.  
  22232.                                                                         op(0xC1);
  22233.  
  22234.                                                                         op(0xE8+r1);    //shr ax,num
  22235.  
  22236.                                                                         op(i);
  22237.  
  22238.                                                                 }
  22239.  
  22240.                                                         }
  22241.  
  22242.                                                         ZeroReg(r2,r32);
  22243.  
  22244.                                                 }
  22245.  
  22246.                                                 break;
  22247.  
  22248.                                         }
  22249.  
  22250.                                 }
  22251.  
  22252.                                 unsigned long number;
  22253.  
  22254.                                 number=ii>>32;
  22255.  
  22256.                                 for(i=0;i<2;i++){
  22257.  
  22258.                                         op66(r32);
  22259.  
  22260.                                         if((postnumflag&f_reloc)==0&&short_ok(number,1)){
  22261.  
  22262.                                                 op(0x6A);
  22263.  
  22264.                                                 op(number);
  22265.  
  22266.                                         }
  22267.  
  22268.                                         else{
  22269.  
  22270.                                                 op(0x68);
  22271.  
  22272.                                                 if(i==0&&(postnumflag&f_reloc)!=0)AddReloc();
  22273.  
  22274.                                                 outdword(number);
  22275.  
  22276.                                         }
  22277.  
  22278.                                         if(i==1)break;
  22279.  
  22280.                                         number=ii;
  22281.  
  22282.                                 }
  22283.  
  22284.                                 addESP+=8;
  22285.  
  22286.                                 goto divcont;
  22287.  
  22288.                         }
  22289.  
  22290.                         reg=reg1|(reg2*256);
  22291.  
  22292.                         getintoreg64(reg);
  22293.  
  22294.                         doregmath64(reg);
  22295.  
  22296.                         op66(r32);
  22297.  
  22298.                         op(0x50+reg2);
  22299.  
  22300.                         op66(r32);
  22301.  
  22302.                         op(0x50+reg1);
  22303.  
  22304.                         addESP+=8;
  22305.  
  22306.                         warningreg(regs[1][reg1]);
  22307.  
  22308.                         warningreg(regs[1][reg2]);
  22309.  
  22310.                         next=0;
  22311.  
  22312. divcont:
  22313.  
  22314.                         if(r1!=EAX){
  22315.  
  22316.                                 if(r2==EAX){
  22317.  
  22318.                                         if(r1==EDX){
  22319.  
  22320.                                                 op66(r32);
  22321.  
  22322.                                                 op(0x90+EDX);
  22323.  
  22324.                                                 goto sdiv;
  22325.  
  22326.                                         }
  22327.  
  22328.                                         op66(r32);
  22329.  
  22330.                                         op(0x89);
  22331.  
  22332.                                         op(0xC0+EDX+r2*8);      //mov EDX,r2
  22333.  
  22334.                                         op66(r32);
  22335.  
  22336.                                         op(0x89);
  22337.  
  22338.                                         op(0xC0+EAX+r1*8);      //mov EAX,r1
  22339.  
  22340.                                         goto sdiv;
  22341.  
  22342.                                 }
  22343.  
  22344.                                 op66(r32);
  22345.  
  22346.                                 op(0x89);
  22347.  
  22348.                                 op(0xC0+EAX+r1*8);      //mov EAX,r1
  22349.  
  22350.                         }
  22351.  
  22352.                         if(r2!=EDX){
  22353.  
  22354.                                 op66(r32);
  22355.  
  22356.                                 op(0x89);
  22357.  
  22358.                                 op(0xC0+EDX+r2*8);      //mov EDX,r2
  22359.  
  22360.                         }
  22361.  
  22362. sdiv:
  22363.  
  22364.                         CallExternProc("__lludiv");
  22365.  
  22366.                         addESP-=8;
  22367.  
  22368.                         goto endmul;
  22369.  
  22370.                 default: operatorexpected(); break;
  22371.  
  22372.         }
  22373.  
  22374.         ClearReg(r1);
  22375.  
  22376.         ClearReg(r2);
  22377.  
  22378.         if(next)nexttok();
  22379.  
  22380.         if(terminater==tk_semicolon)seminext();
  22381.  
  22382.         if(cpu<3)cpu=3;
  22383.  
  22384. }
  22385.  
  22386.  
  22387.  
  22388. void optnumadd64(unsigned long long num,int r1,int r2,int vop)
  22389.  
  22390. {
  22391.  
  22392. int i,reg;
  22393.  
  22394.         if(num==0){
  22395.  
  22396.                 if(vop==0x20){  //&=
  22397.  
  22398.                         reg=r1;
  22399.  
  22400.                         for(i=0;i<2;i++){
  22401.  
  22402.                                 ZeroReg(reg,r32);
  22403.  
  22404.                                 reg=r2;
  22405.  
  22406.                         }
  22407.  
  22408.                         setzeroflag=TRUE;
  22409.  
  22410.                 }
  22411.  
  22412.                 return;         //+= -= |= ^=
  22413.  
  22414.         }
  22415.  
  22416.         if(num==1){
  22417.  
  22418.                 if(vop==0x28){  //-=
  22419.  
  22420.                         op66(r32);
  22421.  
  22422.                         op(0x48+r1);
  22423.  
  22424.                         op66(r32);
  22425.  
  22426.                         op(0x83);
  22427.  
  22428.                         op(0xD8+r2);
  22429.  
  22430.                         op(0);
  22431.  
  22432.                         setzeroflag=TRUE;
  22433.  
  22434.                         return;
  22435.  
  22436.                 }
  22437.  
  22438.                 if(vop==0){     //+=
  22439.  
  22440.                         op66(r32);
  22441.  
  22442.                         op(0x40+r1);
  22443.  
  22444.                         op66(r32);
  22445.  
  22446.                         op(0x83);
  22447.  
  22448.                         op(0xD0+r2);
  22449.  
  22450.                         op(0);
  22451.  
  22452.                         setzeroflag=TRUE;
  22453.  
  22454.                         return;
  22455.  
  22456.                 }
  22457.  
  22458.         }
  22459.  
  22460.         if(vop==8){     //|=
  22461.  
  22462.                 if(num<65536){
  22463.  
  22464.                         if((unsigned short)num<256&&r1<4){
  22465.  
  22466.                                 if(r1==AX)op(0x0C);
  22467.  
  22468.                                 else{
  22469.  
  22470.                                         op(0x80);
  22471.  
  22472.                                         op(0xc8+r1);
  22473.  
  22474.                                 }
  22475.  
  22476.                                 op(num);
  22477.  
  22478.                                 return;
  22479.  
  22480.                         }
  22481.  
  22482.                         op66(r16);
  22483.  
  22484.                         if(r1==AX)op(0x0D);
  22485.  
  22486.                         else{
  22487.  
  22488.                                 op(0x81);
  22489.  
  22490.                                 op(0xc8+r1);
  22491.  
  22492.                         }
  22493.  
  22494.                         outword(num);
  22495.  
  22496.                         return;
  22497.  
  22498.                 }
  22499.  
  22500.                 if(num<0x100000000LL){
  22501.  
  22502.                         op66(r32);
  22503.  
  22504.                         if(r1==AX)op(0x0D);
  22505.  
  22506.                         else{
  22507.  
  22508.                                 op(0x81);
  22509.  
  22510.                                 op(0xc8+r1);
  22511.  
  22512.                         }
  22513.  
  22514.                         outdword(num);
  22515.  
  22516.                         return;
  22517.  
  22518.                 }
  22519.  
  22520.         }
  22521.  
  22522.         if(vop==0x20){  //&=
  22523.  
  22524.                 if(num>=0xFFFFFFFF00000000LL){
  22525.  
  22526.                         if((unsigned long)num>=0xFFFF0000){
  22527.  
  22528.                                 if((unsigned short)num>=0xFF00&&r1<4){
  22529.  
  22530.                                         if(r1==AL)op(0x24);
  22531.  
  22532.                                         else{
  22533.  
  22534.                                                 op(128);
  22535.  
  22536.                                                 op(0xE0+r1);
  22537.  
  22538.                                         }
  22539.  
  22540.                                         op(num);
  22541.  
  22542.                                         return;
  22543.  
  22544.                                 }
  22545.  
  22546.                                 op66(r16);
  22547.  
  22548.                                 if(r1==AX)op(0x25);
  22549.  
  22550.                                 else{
  22551.  
  22552.                                         op(129);
  22553.  
  22554.                                         op(0xE0+r1);
  22555.  
  22556.                                 }
  22557.  
  22558.                                 outword(num);
  22559.  
  22560.                                 return;
  22561.  
  22562.                         }
  22563.  
  22564.                         op66(r32);
  22565.  
  22566.                         if(r1==AX)op(0x25);
  22567.  
  22568.                         else{
  22569.  
  22570.                                 op(129);
  22571.  
  22572.                                 op(0xE0+r1);
  22573.  
  22574.                         }
  22575.  
  22576.                         outdword(num);
  22577.  
  22578.                         return;
  22579.  
  22580.                 }
  22581.  
  22582.         }
  22583.  
  22584.         reg=r1;
  22585.  
  22586.         int j=0;
  22587.  
  22588.         for(i=0;i<2;i++){
  22589.  
  22590.                 if((unsigned long)num==0)j++;
  22591.  
  22592.                 if(optnumadd(num,reg,r32,vop)==FALSE){
  22593.  
  22594.                         op66(r32);
  22595.  
  22596.                         if(short_ok((unsigned long)num,TRUE)){
  22597.  
  22598.                                 op(0x83);
  22599.  
  22600.                                 op(0xC0+vop+reg);
  22601.  
  22602.                                 op(num);
  22603.  
  22604.                         }
  22605.  
  22606.                         else{
  22607.  
  22608.                                 if(reg==EAX)op(5+vop);
  22609.  
  22610.                                 else{
  22611.  
  22612.                                   op(0x81);
  22613.  
  22614.                                         op(0xC0+vop+reg);
  22615.  
  22616.                                 }
  22617.  
  22618.                                 outdword(num);
  22619.  
  22620.                         }
  22621.  
  22622.                 }
  22623.  
  22624.                 num>>=32;
  22625.  
  22626.                 if(j==0&&(vop==0||vop==0x28)){
  22627.  
  22628.                         if(vop)vop=8;
  22629.  
  22630.                         op66(r32);
  22631.  
  22632.                         if(short_ok((unsigned long)num,TRUE)){
  22633.  
  22634.                                 op(0x83);
  22635.  
  22636.                                 op(0xD0+vop+r2);
  22637.  
  22638.                                 op(num);
  22639.  
  22640.                         }
  22641.  
  22642.                         else{
  22643.  
  22644.                                 if(r2==EAX)op(0x15+vop);
  22645.  
  22646.                                 else{
  22647.  
  22648.                                   op(0x81);
  22649.  
  22650.                                         op(0xD3+vop+r2);
  22651.  
  22652.                                 }
  22653.  
  22654.                                 outdword(num);
  22655.  
  22656.                         }
  22657.  
  22658.                         break;
  22659.  
  22660.                 }
  22661.  
  22662.                 reg=r2;
  22663.  
  22664.         }
  22665.  
  22666.         setzeroflag=TRUE;
  22667.  
  22668. }
  22669.  
  22670.  
  22671.  
  22672. void doregmath64(int reg)
  22673.  
  22674. {
  22675.  
  22676. int vop,i,optnum,negflag=FALSE;
  22677.  
  22678. int r1,r2,next=1;
  22679.  
  22680. int reg1,reg2;
  22681.  
  22682. char *ofsstr=NULL;
  22683.  
  22684.         r1=reg&255;
  22685.  
  22686.         r2=reg/256;
  22687.  
  22688.         Select2FreeReg(r1,r2,&reg1,&reg2);
  22689.  
  22690.         while(itok.type!=tp_stopper&&tok!=tk_eof){
  22691.  
  22692.                 if(negflag){
  22693.  
  22694.                         op66(r32);
  22695.  
  22696.                         op(0xF7);
  22697.  
  22698.                         op(0xD8+r2);  // NEG reg
  22699.  
  22700.                         op66(r32);
  22701.  
  22702.                         op(0xF7);
  22703.  
  22704.                         op(0xD8+r1);  // NEG reg
  22705.  
  22706.                         op66(r32);
  22707.  
  22708.                         op(0x83);
  22709.  
  22710.                         op(0xD8+r2);
  22711.  
  22712.                         op(0);
  22713.  
  22714.                         ClearReg(r1);
  22715.  
  22716.                         ClearReg(r2);
  22717.  
  22718.                         negflag=FALSE;
  22719.  
  22720.                 }
  22721.  
  22722.                 vop=0;
  22723.  
  22724.                 next=1;
  22725.  
  22726.                 optnum=FALSE;
  22727.  
  22728.                 if(tok2==tk_number)optnum=OptimNum();
  22729.  
  22730.                 switch(tok){
  22731.  
  22732.                         case tk_xor: vop+=0x08;
  22733.  
  22734.                         case tk_minus: vop+=0x08;
  22735.  
  22736.                         case tk_and: vop+=0x18;
  22737.  
  22738.                         case tk_or: vop+=0x08;
  22739.  
  22740.                         case tk_plus:
  22741.  
  22742.                           if(optnum==FALSE)getoperand(reg1);
  22743.  
  22744.                                 else tok=tk_number;
  22745.  
  22746.                                 switch(tok){
  22747.  
  22748.                                         case tk_number:
  22749.  
  22750.                                                 if((itok.flag&f_reloc)==0){
  22751.  
  22752.                                                         optnumadd64(itok.lnumber,r1,r2,vop);
  22753.  
  22754.                                                         break;
  22755.  
  22756.                                                 }
  22757.  
  22758.                                         case tk_postnumber:
  22759.  
  22760.                                         case tk_undefofs:
  22761.  
  22762.                                         case tk_apioffset:
  22763.  
  22764.                                                 op66(r32);
  22765.  
  22766.                                           op(0x81);
  22767.  
  22768.                                                 op(0xC0+vop+r1);
  22769.  
  22770.                                                 if(tok==tk_apioffset)AddApiToPost(itok.number);
  22771.  
  22772.                                                 else{
  22773.  
  22774.                                                         if(tok==tk_postnumber)(itok.flag&f_extern)==0?setwordpost(&itok):setwordext(&itok.number);
  22775.  
  22776.                                                         else if(tok==tk_undefofs)AddUndefOff(0,itok.name);
  22777.  
  22778.                                                         else if((itok.flag&f_reloc)!=0)AddReloc();
  22779.  
  22780.                                                         outdword(itok.number);
  22781.  
  22782.                                                 }
  22783.  
  22784.                                                 if(vop==0x20){  //&=
  22785.  
  22786.                                                         ZeroReg(r2,r32);
  22787.  
  22788.                                                 }
  22789.  
  22790.                                                 else{
  22791.  
  22792.                                                         if(vop==0||vop==0x28){
  22793.  
  22794.                                                                 if(vop)vop=8;
  22795.  
  22796.                                                                 op66(r32);
  22797.  
  22798.                                                                 op(0x83);
  22799.  
  22800.                                                                 op(0xD0+vop+r2);
  22801.  
  22802.                                                                 op(0);
  22803.  
  22804.                                                         }
  22805.  
  22806.                                                 }
  22807.  
  22808.                                                 break;
  22809.  
  22810.                                         case tk_rmnumber:
  22811.  
  22812.                                         case tk_charvar:
  22813.  
  22814.                                         case tk_beg:
  22815.  
  22816.                                         case tk_bytevar:
  22817.  
  22818.                                                 getintoreg_32(reg2,r32,0,&ofsstr,FALSE);
  22819.  
  22820.                                                 op66(r32);
  22821.  
  22822.                                                 op(0x01+vop);
  22823.  
  22824.                                                 op(0xC0+r1+reg2*8);     /* OPT AX,CX */
  22825.  
  22826.                                                 if(vop==0x20){  //&=
  22827.  
  22828.                                                         ZeroReg(r2,r32);
  22829.  
  22830.                                                 }
  22831.  
  22832.                                                 else{
  22833.  
  22834.                                                         if(vop==0||vop==0x28){
  22835.  
  22836.                                                                 if(vop)vop=8;
  22837.  
  22838.                                                                 op66(r32);
  22839.  
  22840.                                                                 op(0x83);
  22841.  
  22842.                                                                 op(0xD0+vop+r2);
  22843.  
  22844.                                                                 op(0);
  22845.  
  22846.                                                         }
  22847.  
  22848.                                                 }
  22849.  
  22850.                                                 warningreg(regs[r32/2-1][reg2]);
  22851.  
  22852.                                                 next=0;
  22853.  
  22854.                                                 break;
  22855.  
  22856.                                 case tk_reg:
  22857.  
  22858.                                                 op66(r32);
  22859.  
  22860.                                                 outword(0xB70F);
  22861.  
  22862.                                                 if(itok.number==r1||itok.number==r2)itok.number=reg1;
  22863.  
  22864.                                                 op(0xC0+itok.number*9);
  22865.  
  22866.                                                 warningreg(regs[1][itok.number]);
  22867.  
  22868.                                         case tk_reg32:
  22869.  
  22870. defreg32:
  22871.  
  22872.                                                 op66(r32);
  22873.  
  22874.                                                 op(0x01+vop);
  22875.  
  22876.                                                 op(0xC0+r1+(unsigned int)itok.number*8);
  22877.  
  22878.                                                 if(vop==0x20){  //&=
  22879.  
  22880.                                                         ZeroReg(r2,r32);
  22881.  
  22882.                                                 }
  22883.  
  22884.                                                 else{
  22885.  
  22886.                                                         if(vop==0||vop==0x28){
  22887.  
  22888.                                                                 if(vop)vop=8;
  22889.  
  22890.                                                                 op66(r32);
  22891.  
  22892.                                                                 op(0x83);
  22893.  
  22894.                                                                 op(0xD0+vop+r2);
  22895.  
  22896.                                                                 op(0);
  22897.  
  22898.                                                         }
  22899.  
  22900.                                                 }
  22901.  
  22902.                                                 break;
  22903.  
  22904.                                         case tk_reg64:
  22905.  
  22906.                                                 int reg2;
  22907.  
  22908.                                                 reg=r1;
  22909.  
  22910.                                                 reg2=itok.number&255;
  22911.  
  22912.                                                 for(i=0;i<2;i++){
  22913.  
  22914.                                                         op66(r32);
  22915.  
  22916.                                                         op(0x01+vop);
  22917.  
  22918.                                                         op(0xC0+reg+reg2*8);
  22919.  
  22920.                                                         if(i==1)break;
  22921.  
  22922.                                                         if(vop==0)vop=0x10;
  22923.  
  22924.                                                         if(vop==0x28)vop=0x18;
  22925.  
  22926.                                                         reg2=itok.number/256;
  22927.  
  22928.                                                         reg=r2;
  22929.  
  22930.                                                 }
  22931.  
  22932.                                                 break;
  22933.  
  22934.                                         case tk_longvar:
  22935.  
  22936.                                         case tk_dwordvar:
  22937.  
  22938.                                                 CheckAllMassiv(bufrm,4,&strinf);
  22939.  
  22940.                                                 op66(r32);
  22941.  
  22942.                                                 outseg(&itok,2);
  22943.  
  22944.                                                 op(0x03+vop);
  22945.  
  22946.                                                 op(r1*8+itok.rm);
  22947.  
  22948.                                                 outaddress(&itok);
  22949.  
  22950.                                                 if(vop==0x20){  //&=
  22951.  
  22952.                                                         ZeroReg(r2,r32);
  22953.  
  22954.                                                 }
  22955.  
  22956.                                                 else{
  22957.  
  22958.                                                         if(vop==0||vop==0x28){
  22959.  
  22960.                                                                 if(vop)vop=8;
  22961.  
  22962.                                                                 op66(r32);
  22963.  
  22964.                                                                 op(0x83);
  22965.  
  22966.                                                                 op(0xD0+vop+r2);
  22967.  
  22968.                                                                 op(0);
  22969.  
  22970.                                                         }
  22971.  
  22972.                                                 }
  22973.  
  22974.                                                 break;
  22975.  
  22976.                                         case tk_qwordvar:
  22977.  
  22978.                                                 reg=r1;
  22979.  
  22980.                                                 for(i=0;i<2;i++){
  22981.  
  22982.                                                         CheckAllMassiv(bufrm,8,&strinf);
  22983.  
  22984.                                                         op66(r32);
  22985.  
  22986.                                                         outseg(&itok,2);
  22987.  
  22988.                                                         op(0x03+vop);
  22989.  
  22990.                                                         op(reg*8+itok.rm);
  22991.  
  22992.                                                         outaddress(&itok);
  22993.  
  22994.                                                         if(i==1)break;
  22995.  
  22996.                                                         if(vop==0)vop=0x10;
  22997.  
  22998.                                                         if(vop==0x28)vop=0x18;
  22999.  
  23000.                                                         itok.number+=4;
  23001.  
  23002.                                                         compressoffset(&itok);
  23003.  
  23004.                                                         reg=r2;
  23005.  
  23006.                                                 }
  23007.  
  23008.                                                 break;
  23009.  
  23010.                                         case tk_ID:
  23011.  
  23012.                                         case tk_id:
  23013.  
  23014.                                         case tk_proc:
  23015.  
  23016.                                         case tk_apiproc:
  23017.  
  23018.                                         case tk_undefproc:
  23019.  
  23020.                                         case tk_declare:
  23021.  
  23022.                                                 procdo(tk_qword);
  23023.  
  23024.                                                 op66(r32);
  23025.  
  23026.                                                 op(0x01+vop);
  23027.  
  23028.                                                 op(0xc0+r1);
  23029.  
  23030.                                                 warningreg(regs[1][0]);
  23031.  
  23032.                                                 if(vop==0)vop=0x10;
  23033.  
  23034.                                                 if(vop==0x28)vop=0x18;
  23035.  
  23036.                                                 op66(r32);
  23037.  
  23038.                                                 op(0x01+vop);
  23039.  
  23040.                                                 op(0xc0+r2+EDX*8);
  23041.  
  23042.                                                 warningreg(regs[1][EDX]);
  23043.  
  23044.                                                 break;
  23045.  
  23046.                                         default: valueexpected(); break;
  23047.  
  23048.                                 }
  23049.  
  23050.                                 break;
  23051.  
  23052.                         case tk_rrminus:
  23053.  
  23054.                                 if(r1==ECX||r2==ECX){
  23055.  
  23056.                                         regshifterror();
  23057.  
  23058.                                         break;
  23059.  
  23060.                                 }
  23061.  
  23062.                                 tok=tk_minus;
  23063.  
  23064.                                 goto rshift2;
  23065.  
  23066.                         case tk_rr:
  23067.  
  23068.                           getoperand(ECX);
  23069.  
  23070.                                 if(tok==tk_number){
  23071.  
  23072.                                         op66(r32);
  23073.  
  23074.                                         outword(0xAC0F);
  23075.  
  23076.                                         op(0xC0+r1+r2*8);
  23077.  
  23078.                                         op(itok.number);
  23079.  
  23080.                                         op66(r32);
  23081.  
  23082.                                         if((unsigned int)itok.number==1){
  23083.  
  23084.                                                 op(0xD1); op(0xE8+r2);  // SHR reg,1
  23085.  
  23086.                                         }
  23087.  
  23088.                                         else if((unsigned int)itok.number!=0){
  23089.  
  23090.                                                 op(0xc1);
  23091.  
  23092.                                                 op(0xe8+r2); // SHR reg,imm8
  23093.  
  23094.                                                 op((unsigned int)itok.number);
  23095.  
  23096.                                         }
  23097.  
  23098.                                 }
  23099.  
  23100.                                 else if(r1==ECX||r2==ECX)regshifterror();
  23101.  
  23102.                                 else if((tok==tk_beg||tok==tk_reg||tok==tk_reg32)&&itok.number==CL)goto rshift;
  23103.  
  23104.                                 else{
  23105.  
  23106. rshift2:
  23107.  
  23108.                                         getintobeg(CL,&ofsstr);
  23109.  
  23110.                                         next=0;
  23111.  
  23112.                                         warningreg(begs[1]);
  23113.  
  23114. rshift:
  23115.  
  23116.                                         op66(r32);
  23117.  
  23118.                                         outword(0xAD0F);
  23119.  
  23120.                                         op(0xC0+r1+r2*8);
  23121.  
  23122.                                         op66(r32);
  23123.  
  23124.                                         op(0xD3);
  23125.  
  23126.                                         op(0xE8+r2);    // SHL xXX,CL
  23127.  
  23128.                                 }
  23129.  
  23130.                                 break;
  23131.  
  23132.                         case tk_llminus:
  23133.  
  23134.                                 if(r1==ECX||r2==ECX){
  23135.  
  23136.                                         regshifterror();
  23137.  
  23138.                                         break;
  23139.  
  23140.                                 }
  23141.  
  23142.                                 tok=tk_minus;
  23143.  
  23144.                                 goto llshift;
  23145.  
  23146.                         case tk_ll:
  23147.  
  23148.                           getoperand(ECX);
  23149.  
  23150.                                 if(tok==tk_number){
  23151.  
  23152.                                         op66(r32);
  23153.  
  23154.                                         outword(0xA40F);
  23155.  
  23156.                                         op(0xC0+r2+r1*8);
  23157.  
  23158.                                         op(itok.number);
  23159.  
  23160.                                         op66(r32);
  23161.  
  23162.                                         if((unsigned int)itok.number==1){
  23163.  
  23164.                                                 op(1);
  23165.  
  23166.                                                 op(0xC0+r1*9);  //add reg,reg
  23167.  
  23168.                                         }
  23169.  
  23170.                                         else{
  23171.  
  23172.                                                 op(0xC1);
  23173.  
  23174.                                                 op(0xE0+r1);    //shl ax,num
  23175.  
  23176.                                                 op(itok.number);
  23177.  
  23178.                                         }
  23179.  
  23180.                                 }
  23181.  
  23182.                                 else if(r1==ECX||r2==ECX)regshifterror();
  23183.  
  23184.                                 else if((tok==tk_beg||tok==tk_reg||tok==tk_reg32)&&itok.number==CL)goto lshift;
  23185.  
  23186.                                 else{
  23187.  
  23188. llshift:
  23189.  
  23190.                                         getintobeg(CL,&ofsstr);
  23191.  
  23192.                                         next=0;
  23193.  
  23194.                                         warningreg(begs[1]);
  23195.  
  23196. lshift:
  23197.  
  23198.                                         op66(r32);
  23199.  
  23200.                                         outword(0xA50F);
  23201.  
  23202.                                         op(0xC0+r2+r1*8);
  23203.  
  23204.                                         op66(r32);
  23205.  
  23206.                                         op(0xD3);
  23207.  
  23208.                                         op(0xE0+r1);    // SHL xXX,CL
  23209.  
  23210.                                 }
  23211.  
  23212.                                 break;
  23213.  
  23214.                         case tk_multminus: negflag=TRUE;
  23215.  
  23216.                         case tk_mult:
  23217.  
  23218.                           getoperand(reg1);
  23219.  
  23220.                                 if(negflag&&tok==tk_number){
  23221.  
  23222.                                         itok.lnumber=-itok.lnumber;
  23223.  
  23224.                                         negflag=FALSE;
  23225.  
  23226.                                 }
  23227.  
  23228.                                 if(tok==tk_number&&((itok.number&f_reloc)==0)){
  23229.  
  23230.                                         if(itok.lnumber==0){
  23231.  
  23232.                                                 ZeroReg(r1,r32);
  23233.  
  23234.                                                 ZeroReg(r2,r32);
  23235.  
  23236.                                                 break;
  23237.  
  23238.                                         }
  23239.  
  23240.                                         if(itok.lnumber==1)break;
  23241.  
  23242.                                         if(itok.lnumber==2){
  23243.  
  23244.                                                 op66(r32);
  23245.  
  23246.                                                 op(1);
  23247.  
  23248.                                                 op(0xC0+9*r1); // ADD r1,r1
  23249.  
  23250.                                                 op66(r32);
  23251.  
  23252.                                                 op(0x83);
  23253.  
  23254.                                                 op(0xC2+r2*8);  //adc r2,0
  23255.  
  23256.                                                 op(0);
  23257.  
  23258.                                                 break;
  23259.  
  23260.                                         }
  23261.  
  23262.                                         if((i=caselonglong(itok.lnumber))!=NUMNUM64){
  23263.  
  23264.                                                 if(i<32){
  23265.  
  23266.                                                         op66(r32);
  23267.  
  23268.                                                         outword(0xA40F);
  23269.  
  23270.                                                         op(0xC0+r2+r1*8);
  23271.  
  23272.                                                         op(i);
  23273.  
  23274.                                                         op66(r32);
  23275.  
  23276.                                                         op(0xC1);
  23277.  
  23278.                                                         op(0xE0+r1);    //shl ax,num
  23279.  
  23280.                                                         op(i);
  23281.  
  23282.                                                 }
  23283.  
  23284.                                                 else{
  23285.  
  23286.                                                         op66(r32);
  23287.  
  23288.                                                         op(0x89);
  23289.  
  23290.                                                         op(0xC0+r2+r1*8);
  23291.  
  23292.                                                         i-=32;
  23293.  
  23294.                                                         if(i!=0){
  23295.  
  23296.                                                                 op66(r32);
  23297.  
  23298.                                                                 if(i==1){
  23299.  
  23300.                                                                         op(1);
  23301.  
  23302.                                                                         op(0xC0+r2*9);  //add reg,reg
  23303.  
  23304.                                                                 }
  23305.  
  23306.                                                                 else{
  23307.  
  23308.                                                                         op(0xC1);
  23309.  
  23310.                                                                         op(0xE0+r2);    //shl ax,num
  23311.  
  23312.                                                                         op(i);
  23313.  
  23314.                                                                 }
  23315.  
  23316.                                                         }
  23317.  
  23318.                                                         ZeroReg(r1,r32);
  23319.  
  23320.                                                 }
  23321.  
  23322.                                                 break;
  23323.  
  23324.                                         }
  23325.  
  23326.                                         op66(r32);
  23327.  
  23328.                                         op(0x50+r2);
  23329.  
  23330.                                         op66(r32);
  23331.  
  23332.                                         op(0x50+r1);
  23333.  
  23334.                                         addESP+=8;
  23335.  
  23336.                                         MovRegNum(r32,postnumflag&f_reloc,itok.number,ECX);
  23337.  
  23338.                                         MovRegNum(r32,0,itok.lnumber>>32,EAX);
  23339.  
  23340.                                         goto mul;
  23341.  
  23342.                                 }
  23343.  
  23344.                                 //¢ë§®¢ ¯à®æ¥¤ãàë __llmul
  23345.  
  23346.                                 op66(r32);
  23347.  
  23348.                                 op(0x50+r2);
  23349.  
  23350.                                 op66(r32);
  23351.  
  23352.                                 op(0x50+r1);
  23353.  
  23354.                                 addESP+=8;
  23355.  
  23356.                                 reg=ECX|(EAX*256);
  23357.  
  23358.                                 getintoreg64(reg);
  23359.  
  23360. //                              doregmath64(reg);
  23361.  
  23362.                                 next=0;
  23363.  
  23364. mul:
  23365.  
  23366.                                 CallExternProc("__llmul");
  23367.  
  23368.                                 addESP-=8;
  23369.  
  23370. endmul:
  23371.  
  23372.                                 if(r1!=EAX){
  23373.  
  23374.                                         if(r1==EDX){
  23375.  
  23376.                                                 if(r2==EAX){
  23377.  
  23378.                                                         op66(r32);
  23379.  
  23380.                                                         op(0x90+EDX);
  23381.  
  23382.                                                         break;
  23383.  
  23384.                                                 }
  23385.  
  23386.                                                 op66(r32);
  23387.  
  23388.                                                 op(0x89);
  23389.  
  23390.                                                 op(0xC0+r2+EDX*8);      //mov reg,EDX
  23391.  
  23392.                                                 op66(r32);
  23393.  
  23394.                                                 op(0x89);
  23395.  
  23396.                                                 op(0xC0+r1+EAX*8);      //mov reg,EAX
  23397.  
  23398.                                                 break;
  23399.  
  23400.                                         }
  23401.  
  23402.                                         op66(r32);
  23403.  
  23404.                                         op(0x89);
  23405.  
  23406.                                         op(0xC0+r1+EAX*8);      //mov reg,EAX
  23407.  
  23408.                                 }
  23409.  
  23410.                                 if(r2!=EDX){
  23411.  
  23412.                                         op66(r32);
  23413.  
  23414.                                         op(0x89);
  23415.  
  23416.                                         op(0xC0+r2+EDX*8);      //mov reg,EDX
  23417.  
  23418.                                 }
  23419.  
  23420.                                 break;
  23421.  
  23422.                         case tk_modminus: negflag=TRUE;
  23423.  
  23424.                         case tk_mod:
  23425.  
  23426.                                 vop=1;
  23427.  
  23428.                                 goto divcalc;;
  23429.  
  23430.                         case tk_divminus: negflag=TRUE;
  23431.  
  23432.                         case tk_div:
  23433.  
  23434. divcalc:
  23435.  
  23436.                           getoperand(reg1);
  23437.  
  23438.                                 if(negflag&&tok==tk_number){
  23439.  
  23440.                                         itok.lnumber=-itok.lnumber;
  23441.  
  23442.                                         negflag=FALSE;
  23443.  
  23444.                                 }
  23445.  
  23446.                                 if(tok==tk_number&&((itok.flag&f_reloc)==0)){
  23447.  
  23448.                                         if(itok.lnumber==0){
  23449.  
  23450.                                                 DevideZero();
  23451.  
  23452.                                                 break;
  23453.  
  23454.                                         }
  23455.  
  23456.                                         if(itok.lnumber==1){
  23457.  
  23458.                                                 if(vop){        //mod
  23459.  
  23460.                                                         ZeroReg(r1,r32);
  23461.  
  23462.                                                         ZeroReg(r2,r32);
  23463.  
  23464.                                                 }
  23465.  
  23466.                                                 break;
  23467.  
  23468.                                         }
  23469.  
  23470.                                         if((i=caselonglong(itok.lnumber))!=NUMNUM64){
  23471.  
  23472.                                                 if(vop){        //mod
  23473.  
  23474.                                                         optnumadd64(itok.lnumber-1,r1,r2,0x20);
  23475.  
  23476.                                                 }
  23477.  
  23478.                                                 else{
  23479.  
  23480.                                                         if(i<32){
  23481.  
  23482.                                                                 op66(r32);
  23483.  
  23484.                                                                 outword(0xAC0F);
  23485.  
  23486.                                                                 op(0xC0+r1+r2*8);
  23487.  
  23488.                                                                 op(i);
  23489.  
  23490.                                                                 op66(r32);
  23491.  
  23492.                                                                 op(0xc1);
  23493.  
  23494.                                                                 op(0xe8+r2); // SHR reg,imm8
  23495.  
  23496.                                                                 op(i);
  23497.  
  23498.                                                         }
  23499.  
  23500.                                                         else{
  23501.  
  23502.                                                                 op66(r32);
  23503.  
  23504.                                                                 op(0x89);
  23505.  
  23506.                                                                 op(0xC0+r1+r2*8);
  23507.  
  23508.                                                                 i-=32;
  23509.  
  23510.                                                                 if(i!=0){
  23511.  
  23512.                                                                         op66(r32);
  23513.  
  23514.                                                                         if(i==1){
  23515.  
  23516.                                                                                 op(0xD1);
  23517.  
  23518.                                                                                 op(0xE8+r1);    //shr ax,1
  23519.  
  23520.                                                                         }
  23521.  
  23522.                                                                         else{
  23523.  
  23524.                                                                                 op(0xC1);
  23525.  
  23526.                                                                                 op(0xE8+r1);    //shr ax,num
  23527.  
  23528.                                                                                 op(i);
  23529.  
  23530.                                                                         }
  23531.  
  23532.                                                                 }
  23533.  
  23534.                                                                 ZeroReg(r2,r32);
  23535.  
  23536.                                                         }
  23537.  
  23538.                                                 }
  23539.  
  23540.                                                 break;
  23541.  
  23542.                                         }
  23543.  
  23544.                                         unsigned long number;
  23545.  
  23546.                                         number=itok.lnumber>>32;
  23547.  
  23548.                                         for(i=0;i<2;i++){
  23549.  
  23550.                                                 op66(r32);
  23551.  
  23552.                                                 if((itok.flag&f_reloc)==0&&short_ok(number,1)){
  23553.  
  23554.                                                         op(0x6A);
  23555.  
  23556.                                                         op(number);
  23557.  
  23558.                                                 }
  23559.  
  23560.                                                 else{
  23561.  
  23562.                                                         op(0x68);
  23563.  
  23564.                                                         if(i==0&&(itok.flag&f_reloc)!=0)AddReloc();
  23565.  
  23566.                                                         outdword(number);
  23567.  
  23568.                                                 }
  23569.  
  23570.                                                 if(i==1)break;
  23571.  
  23572.                                                 number=itok.number;
  23573.  
  23574.                                         }
  23575.  
  23576.                                         addESP+=8;
  23577.  
  23578.                                         goto divcont;
  23579.  
  23580.                                 }
  23581.  
  23582.                                 reg=reg1|(reg2*256);
  23583.  
  23584.                                 getintoreg64(reg);
  23585.  
  23586.                                 op66(r32);
  23587.  
  23588.                                 op(0x50+reg2);
  23589.  
  23590.                                 op66(r32);
  23591.  
  23592.                                 op(0x50+reg1);
  23593.  
  23594.                                 addESP+=8;
  23595.  
  23596.                                 next=0;
  23597.  
  23598. divcont:
  23599.  
  23600.                                 if(r1!=EAX){
  23601.  
  23602.                                         if(r2==EAX){
  23603.  
  23604.                                                 if(r1==EDX){
  23605.  
  23606.                                                         op66(r32);
  23607.  
  23608.                                                         op(0x90+EDX);
  23609.  
  23610.                                                         goto sdiv;
  23611.  
  23612.                                                 }
  23613.  
  23614.                                                 op66(r32);
  23615.  
  23616.                                                 op(0x89);
  23617.  
  23618.                                                 op(0xC0+EDX+r2*8);      //mov EDX,r2
  23619.  
  23620.                                                 op66(r32);
  23621.  
  23622.                                                 op(0x89);
  23623.  
  23624.                                                 op(0xC0+EAX+r1*8);      //mov EAX,r1
  23625.  
  23626.                                                 goto sdiv;
  23627.  
  23628.                                         }
  23629.  
  23630.                                         op66(r32);
  23631.  
  23632.                                         op(0x89);
  23633.  
  23634.                                         op(0xC0+EAX+r1*8);      //mov EAX,r1
  23635.  
  23636.                                 }
  23637.  
  23638.                                 if(r2!=EDX){
  23639.  
  23640.                                         op66(r32);
  23641.  
  23642.                                         op(0x89);
  23643.  
  23644.                                         op(0xC0+EDX+r2*8);      //mov EDX,r2
  23645.  
  23646.                                 }
  23647.  
  23648. sdiv:
  23649.  
  23650.                                 CallExternProc((char*)(vop==0?"__lludiv":"__llumod"));
  23651.  
  23652.                                 addESP-=8;
  23653.  
  23654.                                 goto endmul;
  23655.  
  23656.                         default: operatorexpected(); break;
  23657.  
  23658.                 }
  23659.  
  23660.                 if(next)nexttok();
  23661.  
  23662.         }
  23663.  
  23664.         ClearReg(r1);
  23665.  
  23666.         ClearReg(r2);
  23667.  
  23668.         if(cpu<3)cpu=3;
  23669.  
  23670. }
  23671.  
  23672.  
  23673.  
  23674. void getintoreg64(int reg)
  23675.  
  23676. {
  23677.  
  23678. int negflag=0,next=1,i=0;
  23679.  
  23680. unsigned long long holdnumber=0;
  23681.  
  23682. int r1,r2;
  23683.  
  23684. int reg1,reg2;
  23685.  
  23686.         r1=reg&255;
  23687.  
  23688.         r2=reg/256;
  23689.  
  23690.         Select2FreeReg(r1,r2,&reg1,&reg2);
  23691.  
  23692.         if(tok==tk_minus){
  23693.  
  23694.                 if(CheckMinusNum()==FALSE){
  23695.  
  23696.                         negflag=1;
  23697.  
  23698.                         getoperand(am32==FALSE?BX:r1);
  23699.  
  23700.                 }
  23701.  
  23702.         }
  23703.  
  23704.         switch(tok){
  23705.  
  23706.                 case tk_number:
  23707.  
  23708.                         holdnumber=CalcNumber(4);
  23709.  
  23710.                         MovRegNum(r32,postnumflag&f_reloc,holdnumber,r1);
  23711.  
  23712.                         MovRegNum(r32,0,holdnumber>>32,r2);
  23713.  
  23714.                         next=0;
  23715.  
  23716.                         break;
  23717.  
  23718.                 case tk_postnumber:
  23719.  
  23720.                 case tk_undefofs:
  23721.  
  23722.                 case tk_apioffset:
  23723.  
  23724.                         op66(r32);
  23725.  
  23726.                         op(0xB8+r1);                    /* MOV AX,# */
  23727.  
  23728.                         if(tok==tk_apioffset)AddApiToPost(itok.number);
  23729.  
  23730.                         else{
  23731.  
  23732.                                 if(tok==tk_undefofs)AddUndefOff(0,itok.name);
  23733.  
  23734.                                 else (itok.flag&f_extern)==0?setwordpost(&itok):setwordext(&itok.number);
  23735.  
  23736.                                 tok=tk_number;
  23737.  
  23738.                                 holdnumber+=doconstdwordmath();
  23739.  
  23740.                                 outdword(holdnumber);
  23741.  
  23742.                                 MovRegNum(r32,0,holdnumber>>32,r2);
  23743.  
  23744.                                 next=0;
  23745.  
  23746.                         }
  23747.  
  23748.                         ClearReg(r1);
  23749.  
  23750.                         ClearReg(r2);
  23751.  
  23752.                         break;
  23753.  
  23754.                 case tk_rmnumber:
  23755.  
  23756.                         CheckAllMassiv(bufrm,8,&strinf,&itok,reg1,reg2);
  23757.  
  23758.                         if(!(am32&&itok.rm==r1&&r1!=EBP&&r1!=ESP)){
  23759.  
  23760.                                 op66(r32);
  23761.  
  23762.                                 op67(itok.sib==CODE16?r16:r32);
  23763.  
  23764.                                 if(itok.post==0)outseg(&itok,2);
  23765.  
  23766.                                 op(0x8D);                       // LEA reg,[rm]
  23767.  
  23768.                                 op(r1*8+itok.rm);
  23769.  
  23770.                                 if(itok.post!=0&&itok.post!=UNDEF_OFSET){
  23771.  
  23772.                                         if((itok.flag&f_extern)==0){
  23773.  
  23774.                                                 unsigned int ooutptr=outptr;
  23775.  
  23776.                                                 if(am32&&itok.rm==rm_sib)outptr++;
  23777.  
  23778.                                                 setwordpost(&itok);
  23779.  
  23780.                                                 outptr=ooutptr;
  23781.  
  23782.                                         }
  23783.  
  23784.                                         else setwordext(&itok.number);
  23785.  
  23786.                                 }
  23787.  
  23788.                                 outaddress(&itok);
  23789.  
  23790.                                 ClearReg(r1);
  23791.  
  23792.                         }
  23793.  
  23794.                         ZeroReg(r2,r32);
  23795.  
  23796.                         break;
  23797.  
  23798.                 case tk_qwordvar:
  23799.  
  23800.                         reg=r1;
  23801.  
  23802.                         for(i=0;i<2;i++){
  23803.  
  23804.                                 if(reg==EAX&&((itok.rm==rm_d16&&itok.sib==CODE16)||(itok.rm==rm_d32&&(itok.sib==CODE32||itok.sib==0)))){
  23805.  
  23806.                                         op66(r32);
  23807.  
  23808.                                         outseg(&itok,1);
  23809.  
  23810.                                         op(0xA1);
  23811.  
  23812.                                         if(itok.post==UNDEF_OFSET)AddUndefOff(2,itok.name);
  23813.  
  23814.                                         if(am32==FALSE)outword((unsigned int)itok.number);
  23815.  
  23816.                                         else outdword(itok.number);
  23817.  
  23818.                                 }
  23819.  
  23820.                                 else{
  23821.  
  23822.                                         CheckAllMassiv(bufrm,8,&strinf,&itok,reg1,reg2);
  23823.  
  23824.                                         op66(r32);
  23825.  
  23826.                                         outseg(&itok,2);
  23827.  
  23828.                                         op(0x8B);
  23829.  
  23830.                                         op(reg*8+itok.rm);
  23831.  
  23832.                                         outaddress(&itok);
  23833.  
  23834.                                 }
  23835.  
  23836.                                 ClearReg(reg);
  23837.  
  23838.                                 if(i==1)break;
  23839.  
  23840.                                 itok.number+=4;
  23841.  
  23842.                                 compressoffset(&itok);
  23843.  
  23844.                                 reg=r2;
  23845.  
  23846.                         }
  23847.  
  23848.                         break;
  23849.  
  23850.                 case tk_longvar:
  23851.  
  23852.                 case tk_dwordvar:
  23853.  
  23854.                         if(reg==EAX&&((itok.rm==rm_d16&&itok.sib==CODE16)||(itok.rm==rm_d32&&(itok.sib==CODE32||itok.sib==0)))){
  23855.  
  23856.                                 op66(r32);
  23857.  
  23858.                                 outseg(&itok,1);
  23859.  
  23860.                                 op(0xA1);
  23861.  
  23862.                                 if(itok.post==UNDEF_OFSET)AddUndefOff(2,itok.name);
  23863.  
  23864.                                 if(am32==FALSE)outword((unsigned int)itok.number);
  23865.  
  23866.                                 else outdword(itok.number);
  23867.  
  23868.                         }
  23869.  
  23870.                         else{
  23871.  
  23872.                                 CheckAllMassiv(bufrm,4,&strinf,&itok,reg1,reg2);
  23873.  
  23874.                                 op66(r32);
  23875.  
  23876.                                 outseg(&itok,2);
  23877.  
  23878.                                 op(0x8B);
  23879.  
  23880.                                 op(r1*8+itok.rm);
  23881.  
  23882.                                 outaddress(&itok);
  23883.  
  23884.                         }
  23885.  
  23886.                         ZeroReg(r2,r32);
  23887.  
  23888.                         ClearReg(r1);
  23889.  
  23890.                         break;
  23891.  
  23892.                 case tk_intvar:
  23893.  
  23894.                 case tk_wordvar:
  23895.  
  23896.                         CheckAllMassiv(bufrm,2,&strinf,&itok,reg1,reg2);
  23897.  
  23898.                         if(tok==tk_wordvar&&optimizespeed&&chip>3&&chip<7&&RmEqualReg(reg,itok.rm,itok.sib)==FALSE){
  23899.  
  23900.                                 ZeroReg(r1,r32);
  23901.  
  23902.                                 op66(r16);
  23903.  
  23904.                                 outseg(&itok,2);        //mov reg,var
  23905.  
  23906.                                 op(0x8B);
  23907.  
  23908.                         }
  23909.  
  23910.                         else{
  23911.  
  23912.                                 op66(r32);
  23913.  
  23914.                                 outseg(&itok,3);        //movxx reg,var
  23915.  
  23916.                                 op(0x0F); op(tok==tk_wordvar?0xB7:0xBF);
  23917.  
  23918.                         }
  23919.  
  23920.                         op(r1*8+itok.rm);
  23921.  
  23922.                         outaddress(&itok);
  23923.  
  23924.                         ClearReg(r1);
  23925.  
  23926.                         ZeroReg(r2,r32);
  23927.  
  23928.                         break;
  23929.  
  23930.                 case tk_bytevar:
  23931.  
  23932.                 case tk_charvar:
  23933.  
  23934.                         CheckAllMassiv(bufrm,1,&strinf,&itok,reg1,reg2);
  23935.  
  23936.                         if(reg<=EBX&&tok==tk_bytevar&&optimizespeed&&chip>3&&chip<7&&RmEqualReg(reg,itok.rm,itok.sib)==FALSE){
  23937.  
  23938.                                 ZeroReg(r1,r32);
  23939.  
  23940.                                 outseg(&itok,2);
  23941.  
  23942.                                 op(0x8A);
  23943.  
  23944.                         }
  23945.  
  23946.                         else{
  23947.  
  23948.                                 op66(r32);
  23949.  
  23950.                                 outseg(&itok,3);
  23951.  
  23952.                                 op(0xf);
  23953.  
  23954.                                 if(tok==tk_bytevar)op(0xb6);
  23955.  
  23956.                                 else op(0xbe);
  23957.  
  23958.                         }
  23959.  
  23960.                         op(r1*8+itok.rm); // MOVZX regL,[byte]
  23961.  
  23962.                         outaddress(&itok);
  23963.  
  23964.                         ClearReg(r1);
  23965.  
  23966.                         ZeroReg(r2,r32);
  23967.  
  23968.                         break;
  23969.  
  23970.                 case tk_reg:
  23971.  
  23972.                         if(tok2==tk_openbracket){       //¢ë§®¢ ¯à®æ¥¤ãàë ¯®  ¤à¥áã ¢ ॣ¨áâà¥
  23973.  
  23974.                                 reg1=itok.number;
  23975.  
  23976.                                 nexttok();
  23977.  
  23978.                                 param[0]=0;
  23979.  
  23980.                                 if(comfile==file_w32)swapparam();
  23981.  
  23982.                                 else doparams();
  23983.  
  23984.                                 op66(r16);
  23985.  
  23986.                                 op(0xFF);
  23987.  
  23988.                                 op(0xD0+reg1);  /* CALL reg with stack params */
  23989.  
  23990.                                 itok.number=0;
  23991.  
  23992.                                 clearregstat();
  23993.  
  23994. #ifdef OPTVARCONST
  23995.  
  23996.                                 FreeGlobalConst();
  23997.  
  23998. #endif
  23999.  
  24000.                         }
  24001.  
  24002.                         if(optimizespeed&&chip>3&&chip<7&&reg!=(int)itok.number){
  24003.  
  24004.                                 ZeroReg(r1,r32);
  24005.  
  24006.                                 op(0x89);
  24007.  
  24008.                                 op(0xC0+r1+(unsigned int)itok.number*8);
  24009.  
  24010.                         }
  24011.  
  24012.                         else{
  24013.  
  24014.                                 op66(r32);
  24015.  
  24016.                                 outword(0xB70F);
  24017.  
  24018.                                 op(0xC0+r1*8+(unsigned int)itok.number);
  24019.  
  24020.                         }
  24021.  
  24022.                         RegToReg(r1,itok.number,r32);
  24023.  
  24024.                         ZeroReg(r2,r32);
  24025.  
  24026.                         break;
  24027.  
  24028.                 case tk_reg32:
  24029.  
  24030.                         if(tok2==tk_openbracket){       //¢ë§®¢ ¯à®æ¥¤ãàë ¯®  ¤à¥áã ¢ ॣ¨áâà¥
  24031.  
  24032.                                 reg1=itok.number;
  24033.  
  24034.                                 nexttok();
  24035.  
  24036.                                 param[0]=0;
  24037.  
  24038.                                 if(comfile==file_w32)swapparam();
  24039.  
  24040.                                 else doparams();
  24041.  
  24042.                                 op66(r32);
  24043.  
  24044.                                 op(0xFF);
  24045.  
  24046.                                 op(0xD0+reg1);  /* CALL reg with stack params */
  24047.  
  24048.                                 itok.number=0;
  24049.  
  24050.                                 clearregstat();
  24051.  
  24052. #ifdef OPTVARCONST
  24053.  
  24054.                                 FreeGlobalConst();
  24055.  
  24056. #endif
  24057.  
  24058.                         }
  24059.  
  24060.                         if(r1!=(int)itok.number){
  24061.  
  24062.                                 op66(r32);
  24063.  
  24064.                                 op(0x89);
  24065.  
  24066.                                 op(0xC0+r1+(unsigned int)itok.number*8);
  24067.  
  24068.                                 RegToReg(r1,itok.number,r32);
  24069.  
  24070.                         }
  24071.  
  24072.                         ZeroReg(r2,r32);
  24073.  
  24074.                         break;
  24075.  
  24076.                 case tk_reg64:
  24077.  
  24078.                         reg1=itok.number&255;
  24079.  
  24080.                         reg2=itok.number/256;
  24081.  
  24082. movreg64:
  24083.  
  24084.                         if(r1==reg2){
  24085.  
  24086.                                 if(r2==reg1){
  24087.  
  24088.                                         op66(r32);
  24089.  
  24090.                                         if(r1==AX)op(0x90+r2);
  24091.  
  24092.                                         else if(r2==AX)op(0x90+r1);
  24093.  
  24094.                                         else{
  24095.  
  24096.                                                 op(0x87);
  24097.  
  24098.                                                 op(0xC0+r1+r2*8);
  24099.  
  24100.                                         }
  24101.  
  24102.                                         break;
  24103.  
  24104.                                 }
  24105.  
  24106.                                 int temp;
  24107.  
  24108.                                 temp=r2;
  24109.  
  24110.                                 r2=r1;
  24111.  
  24112.                                 r1=temp;
  24113.  
  24114.                                 temp=reg2;
  24115.  
  24116.                                 reg2=reg1;
  24117.  
  24118.                                 reg1=temp;
  24119.  
  24120.                         }
  24121.  
  24122.                         if(r2==reg1){
  24123.  
  24124.                                 int temp;
  24125.  
  24126.                                 temp=r2;
  24127.  
  24128.                                 r2=r1;
  24129.  
  24130.                                 r1=temp;
  24131.  
  24132.                                 temp=reg2;
  24133.  
  24134.                                 reg2=reg1;
  24135.  
  24136.                                 reg1=temp;
  24137.  
  24138.                         }
  24139.  
  24140.                         if(r1!=reg1){
  24141.  
  24142.                                 op66(r32);
  24143.  
  24144.                                 op(0x89);
  24145.  
  24146.                                 op(0xC0+r1+reg1*8);
  24147.  
  24148.                                 RegToReg(r1,reg1,r32);
  24149.  
  24150.                         }
  24151.  
  24152.                         if(r2!=reg2){
  24153.  
  24154.                                 op66(r32);
  24155.  
  24156.                                 op(0x89);
  24157.  
  24158.                                 op(0xC0+r2+reg2*8);
  24159.  
  24160.                                 RegToReg(r2,reg2,r32);
  24161.  
  24162.                         }
  24163.  
  24164.                         break;
  24165.  
  24166.                 case tk_bits:
  24167.  
  24168.                         int vops;
  24169.  
  24170.                         i=itok.bit.siz+itok.bit.ofs;
  24171.  
  24172.                         if(i<=64)vops=r64;
  24173.  
  24174.                         if(i<=32)vops=r32;
  24175.  
  24176.                         if(i<=16)vops=r16;
  24177.  
  24178.                         bits2reg(r1,(r32<vops?vops:r32));
  24179.  
  24180.                         ZeroReg(r2,r32);
  24181.  
  24182.                         break;
  24183.  
  24184.                 case tk_seg:
  24185.  
  24186.                         op66(r32);
  24187.  
  24188.                         op(0x8C);
  24189.  
  24190.                         op(0xC0+r1+(unsigned int)itok.number*8);
  24191.  
  24192.                         ClearReg(r1);
  24193.  
  24194.                         ZeroReg(r2,r32);
  24195.  
  24196.                         break;
  24197.  
  24198.                 case tk_beg:
  24199.  
  24200.                         if(optimizespeed&&chip>3&&chip<7&&reg<4&&reg!=(int)(itok.number%4)){
  24201.  
  24202.                                 ZeroReg(r1,r32);
  24203.  
  24204.                                 op(0x88);
  24205.  
  24206.                                 op(0xC0+r1+(unsigned int)itok.number*8); // MOV regL,beg
  24207.  
  24208.                         }
  24209.  
  24210.                         else{
  24211.  
  24212.                                 op66(r32);
  24213.  
  24214.                                 outword(0xb60f);
  24215.  
  24216.                                 op(0xC0+r1*8+(unsigned int)itok.number); // MOVZX regL,beg
  24217.  
  24218.                         }
  24219.  
  24220.                         ClearReg(reg);
  24221.  
  24222.                         ZeroReg(r2,r32);
  24223.  
  24224.                         break;
  24225.  
  24226.                 case tk_at:
  24227.  
  24228.                         getoperand(am32==FALSE?BX:reg);
  24229.  
  24230.                         i++;
  24231.  
  24232.                 case tk_ID:
  24233.  
  24234.                 case tk_id:
  24235.  
  24236.                 case tk_proc:
  24237.  
  24238.                 case tk_apiproc:
  24239.  
  24240.                 case tk_undefproc:
  24241.  
  24242.                 case tk_declare:
  24243.  
  24244.                         if((!i)||macros(tk_qword)==0)procdo(tk_qword);
  24245.  
  24246.                         reg1=EAX; reg2=EDX;
  24247.  
  24248.                         goto movreg64;
  24249.  
  24250.                 case tk_string:
  24251.  
  24252.                         op66(r32);
  24253.  
  24254.                         op(0xB8+r1);
  24255.  
  24256.                         outdword(addpoststring());
  24257.  
  24258.                         ClearReg(r1);
  24259.  
  24260.                         ZeroReg(r2,r32);
  24261.  
  24262.                         break;
  24263.  
  24264.                 default: valueexpected();       break;
  24265.  
  24266.         }
  24267.  
  24268.         if(negflag){
  24269.  
  24270.                 op66(r32);
  24271.  
  24272.                 op(0xF7);
  24273.  
  24274.                 op(0xD8+r2);  // NEG reg
  24275.  
  24276.                 op66(r32);
  24277.  
  24278.                 op(0xF7);
  24279.  
  24280.                 op(0xD8+r1);  // NEG reg
  24281.  
  24282.                 op66(r32);
  24283.  
  24284.                 op(0x83);
  24285.  
  24286.                 op(0xD8+r2);
  24287.  
  24288.                 op(0);
  24289.  
  24290.                 ClearReg(r1);
  24291.  
  24292.                 ClearReg(r2);
  24293.  
  24294.         }
  24295.  
  24296.         if(next)nexttok();
  24297.  
  24298. }
  24299.  
  24300.  
  24301.  
  24302. void CallExternProc(char *name)
  24303.  
  24304. {
  24305.  
  24306. ITOK itok4;
  24307.  
  24308. int tok4=tk_id;
  24309.  
  24310. char string4[256];
  24311.  
  24312. struct idrec *ptrs;
  24313.  
  24314.         memset(&itok4,0,sizeof(ITOK));
  24315.  
  24316.         strcpy(string4,name);
  24317.  
  24318.         searchtree(&itok4,&tok4,(unsigned char *)string4);
  24319.  
  24320.         ptrs=itok4.rec;
  24321.  
  24322.         switch(tok4){
  24323.  
  24324.                 case tk_id:
  24325.  
  24326.                         tok4=tok;
  24327.  
  24328.                         itok4=itok;
  24329.  
  24330.                         strcpy((char *)itok.name,string4);
  24331.  
  24332.                         string[0]=0;
  24333.  
  24334.                         itok.flag=tp_stdcall;
  24335.  
  24336.                         tok=tk_undefproc;
  24337.  
  24338.                         itok.number=secondcallnum;
  24339.  
  24340.                         itok.segm=NOT_DYNAMIC;
  24341.  
  24342.                         itok.rm=tk_qword;
  24343.  
  24344.                         itok.post=0;
  24345.  
  24346.                         addtotree(itok.name);
  24347.  
  24348.                         addacall(secondcallnum++,CALL_NEAR);
  24349.  
  24350.                         tok=tok4;
  24351.  
  24352.                         itok=itok4;
  24353.  
  24354.                         callloc0();
  24355.  
  24356.                         break;
  24357.  
  24358.                 case tk_declare:
  24359.  
  24360.                         ptrs->rectok=tk_undefproc;
  24361.  
  24362.                 case tk_undefproc:
  24363.  
  24364.                         addacall(itok4.number,(unsigned char)(am32!=FALSE?CALL_32:CALL_NEAR));
  24365.  
  24366.                         callloc0();             /* produce CALL [#] */
  24367.  
  24368.                         break;
  24369.  
  24370.                 case tk_proc:
  24371.  
  24372.                         if(itok4.segm==DYNAMIC)itok4.segm=ptrs->recsegm=DYNAMIC_USED;
  24373.  
  24374.                         if(itok4.segm<NOT_DYNAMIC){     //¤¨­ ¬¨ç¥áª ï ¯à®æ¥¤ãà 
  24375.  
  24376.                                 addacall(itok4.number,(unsigned char)(am32!=FALSE?CALL_32:CALL_NEAR));
  24377.  
  24378.                                 callloc0();
  24379.  
  24380.                         }
  24381.  
  24382.                         else{
  24383.  
  24384.                                 callloc(itok4.number);
  24385.  
  24386.                         }
  24387.  
  24388.                         break;
  24389.  
  24390.                 default:
  24391.  
  24392.                         sprintf(string4,"'%s' already used",name);
  24393.  
  24394.                         preerror(string4);
  24395.  
  24396.                         break;
  24397.  
  24398.         }
  24399.  
  24400. }
  24401.  
  24402. /* end of TOKB.C */
  24403.  
  24404.