Annotation of researchv9/jerq/sgs/comp/stin, revision 1.1

1.1     ! root        1: #      @(#) stin : 1.12 4/20/84
        !             2: #      stin - input description for pcc2 code generator
        !             3: #
        !             4: #
        !             5: 
        !             6: SHAPES
        !             7: 
        !             8: #      basic shapes
        !             9: 
        !            10: F:     'FREE';                 # evaluate for effects only
        !            11: CC:    'CC';                   # evaluate for condition codes (ignore value)
        !            12: 
        !            13: # Different flavors of constants
        !            14: Cplit: POSRANGE 6:0;           # 0 - 63: positive literal
        !            15: Cb:    POSRANGE 8:1;           # -128 - 127
        !            16: Cs:    SGRANGE 15:2;           # -32768 - 32767
        !            17: C: :4;                         # constant
        !            18: 
        !            19: N:     'NAME'  :8;             # including address constants
        !            20: T:     'TEMP'  :5;             # temporary
        !            21: A:     'AUTO'  :5;             # auto
        !            22: P:     'PARAM' :5;             # incoming arg
        !            23: R:     'REG'   :0;             # "register"
        !            24: 
        !            25: #      addressing modes
        !            26: 
        !            27: STK:   T, A, P;                # K(%sp) or K(%ap)
        !            28: ROFF:  R, R+C, R-C;
        !            29: OREG:  *(*ROFF):9, *STK:9, *ROFF:5;    # PCC1 "OREG" node
        !            30: AWD1:  STK, R, OREG, N;        # addressable words
        !            31: AWD:   AWD1, *N:11;            # same, including indirect of global
        !            32: AWDnR: STK, OREG, N;           # addressable words that aren't in registers
        !            33: DAWD:  STK, R, N;              # directly addressable word
        !            34: IAWD:  OREG, *N:11;            # AWD without DAWD
        !            35: 
        !            36: AAWD:  & AWD1:1;
        !            37: STAWD: AWD1, AAWD, C;          # structure AWD
        !            38: 
        !            39: BC:    'CONV' AWD[cuc];        # character converted to int or short
        !            40: SC:    'CONV' AWD[s];          # short converted to int
        !            41: USC:   'CONV' AWD[us];         # unsigned short converted to int
        !            42: 
        !            43: MEMADR:        'UAND' STK:1;           # address of stack items
        !            44: 
        !            45: BSRC:  AWD[cuc], BC[iui], Cb;  # character operand
        !            46: HSRC:  AWD[s], SC[iui], Cs;    # short operands to int operations 
        !            47: HSRCnconv: AWD[sus], Cs;       # any halfword source with no convert
        !            48:                                # used for assignment, since there 
        !            49:                                # won't be a convert.
        !            50: UHSRC: AWD[us], USC[iui], Cs;
        !            51: WSRC:  AWD[iuip], C;
        !            52: 
        !            53: WSRCnC:        AWD[iuip], C;           # no conversion
        !            54: UWSRCnC:       AWD[uip];       # unsigned
        !            55: SWSRCnC:       AWD[i], C;      # signed
        !            56: 
        !            57: BDST:  AWD[cuc];
        !            58: HDST:  AWD[sus];
        !            59: SHDST: AWD[s];
        !            60: WDST:  AWD[iuip];
        !            61: 
        !            62: SSRC:  AWD[f];                 # single
        !            63: DSRC:  AWD[d];                 # double
        !            64: SSRCconv: 'CONV' SSRC;         # converted (to double) single
        !            65: DSRCconv: 'CONV' DSRC;         # converted (to single) double
        !            66: FSRC:  SSRC, DSRC, C;
        !            67: 
        !            68: SDST:  AWD[f];
        !            69: DDST:  AWD[d];
        !            70: FDST:  SDST,DDST;
        !            71: 
        !            72: #      useful subtrees to recognize
        !            73: 
        !            74: FLD:   'FLD' AWD[cucsusiui];           # bit field
        !            75: BFLD:  'FLD' AWD[cuc];
        !            76: HFLD:  'FLD' AWD[sus];
        !            77: WFLD:  'FLD' AWD[iui];
        !            78: 
        !            79: 
        !            80: OPCODES
        !            81: 
        !            82: DCOST  :8;                     # default opcode cost
        !            83: 
        !            84: #      convert to/from double
        !            85: 
        !            86: 'CONV' [iuip] SSRC     {$1 $< $C}      "       movtsw  AL,A1\n":24;
        !            87: 'CONV' [iuip] DSRC     {$1 $l $< $C}   "       movtdw  AL,A1\n":24;
        !            88: 'CONV' [sus] SSRC      {$1 $< $C}      "\tmovtsw\tAL,A1\n\tmovtwh\tA1,A1\n":32;
        !            89: 'CONV' [sus] DSRC      {$1 $< $l $C}   "\tmovtdw\tAL,A1\n\tmovtwh\tA1,A1\n":32;
        !            90: 'CONV' [cuc] SSRC      {$1 $< $C}      "\tmovtsw\tAL,A1\n\tmovtwb\tA1,A1\n":32;
        !            91: 'CONV' [cuc] DSRC      {$1 $< $l $C}   "\tmovtdw\tAL,A1\n\tmovtwb\tA1,A1\n":32;
        !            92: 'CONV' [f] WSRC        {$1 $< $C}      "       movws   AL,A1\n":24;
        !            93: 'CONV' [d] WSRC        {$1 $P $< $C}   "       movwd   AL,A1\n":24;
        !            94: 'CONV' [d] SSRC        {$1 $P $< $C}   "       movsd   AL,A1\n":24;
        !            95: 'CONV' [f] DSRC        {$1 $l $< $C}   "       movds   AL,A1\n":24;
        !            96: 'CONV' [f] AWD[us]     {$1 $< $C}      "\tmovzhw\tAL,A1\n\tmovws\tA1,A1\n":32;
        !            97: 'CONV' [f] AWD[s]      {$1 $< $C}      "\tmovbhw\tAL,A1\n\tmovws\tA1,A1\n":32;
        !            98: 'CONV' [f] AWD[cuc]    {$1 $< $C}      "\tmovzbw\tAL,A1\n\tmovws\tA1,A1\n":32;
        !            99: 'CONV' [d] AWD[us]     {$1 $P $l $< $C} "\tmovzhw\tAL,A1\n\tmovwd\tA1,A1\n":32;
        !           100: 'CONV' [d] AWD[s]      {$1 $P $l $< $C} "\tmovbhw\tAL,A1\n\tmovwd\tA1,A1\n":32;
        !           101: 'CONV' [d] AWD[cuc]    {$1 $P $l $< $C} "\tmovzbw\tAL,A1\n\tmovwd\tA1,A1\n":32;
        !           102: 
        !           103: #      integral conversions
        !           104: 
        !           105: 'CONV'[sus] AWD[cuc]   {$1 $<}         "RL!1   movzbh  AL,A1\n":14;
        !           106: 'CONV'[sus] AWD[cuc]   {$1 $< $C}      "       movzbh  AL,A1\n":14;
        !           107: 'CONV'[iuip] AWD[cuc]  {$1 $< $C}      "       movzbw  AL,A1\n":14;
        !           108: 
        !           109: 'CONV'[iuip] AWD[s]    {$1 $< $C}      "       movbhw  AL,A1\n":14;
        !           110: 'CONV'[iuip] AWD[us]   {$1 $< $C}      "       movzhw  AL,A1\n":14;
        !           111: 
        !           112: 'CONV'[cuc] AWD[sus]   {$1 $<}         "RL!1   movthb  AL,A1\n":14;
        !           113: 'CONV'[cuc] AWD[iuip]  {$1 $<}         "RL!1   movtwb  AL,A1\n":14;
        !           114: 'CONV'[sus] AWD[iuip]  {$1 $<}         "RL!1   movtwh  AL,A1\n":14;
        !           115: 'CONV'[cuc] AWD[sus]   {$1 $< $C}      "       movthb  AL,A1\n":14;
        !           116: 'CONV'[cuc] AWD[iuip]  {$1 $< $C}      "       movtwb  AL,A1\n":14;
        !           117: 'CONV'[sus] AWD[iuip]  {$1 $< $C}      "       movtwh  AL,A1\n":14;
        !           118: 
        !           119: #      leaf nodes (Also matches some conversions of leaves)
        !           120: 
        !           121: 'FLD'  AWD             {$1 $< $C}      "       extzv   &ZHR,&SR,AL,A1\n":16;
        !           122: 
        !           123: BSRC                   {$C}            "       cmpb    AR,&0\nZb";
        !           124: HSRC                   {$C}            "       cmph    AR,&0\nZb";
        !           125: WSRC                   {$C}            "       cmpw    AR,&0\nZb";
        !           126: AWD[f]                 {$C $r}         "       fcmps   AR,&0.0\nZb":24;
        !           127: AWD[d]                 {$C $r}         "       fcmpd   AR,&0.0\nZb":24;
        !           128: 
        !           129: WSRC                   {$1 $> }        "RR!1   movw    AR,A1\n";
        !           130: HSRC                   {$1 $C $> }     "       movbhw  AR,A1\n";
        !           131: UHSRC                  {$1 $C $> }     "       movzhw  AR,A1\n";
        !           132: BSRC                   {$1 $C $> }     "       movzbw  AR,A1\n";
        !           133: AWD[f]                 {$1 $r $P $> }  "       movsd   AR,A1\n";
        !           134: DAWD[d]                        {$1 $r $P $>}   "\tmovw AR,A1\n\tmovw   ZDR,ZD1\n";
        !           135: IAWD[d]                        {$1 $r $P $>}   "       movdd   AR,A1\n";
        !           136: 
        !           137: #      constant initialization
        !           138: 
        !           139: 'INIT' [cuc]   C       {$N}            "       ZB";
        !           140: 'INIT' [sus]   C       {$N}            "       .half   CL\n";
        !           141: 'INIT' [iuip]  C       {$N}            "       .word   CL\n";
        !           142: 'INIT' [f]     C       {$N}            "       .single CL\n";
        !           143: 'INIT' [d]     C       {$N}            "       .double CL\n";
        !           144: 
        !           145: #              function arguments
        !           146: 
        !           147: 'ARG'  WSRCnC                  {$N}            "       pushw   AL\n";
        !           148: 'ARG'  AWD[s]                  {$N 1}  "\tmovbhw\tAL,A1\n\tpushw\tA1\n":16;
        !           149: 'ARG'  AWD[us]                 {$N 1}  "\tmovzhw\tAL,A1\n\tpushw\tA1\n":16;
        !           150: 'ARG'  AWD[c]                  {$N 1}  "\tmovzbw\tAL,A1\n\tpushw\tA1\n":16;
        !           151: 'ARG'  DAWD[f] {1 $P $l} "\tmovsd\tAL,A1\n\tpushw\tA1\n\tpushw\tZD1\n":24;
        !           152: 'ARG'  IAWD[f] {1 $P $l $C} "\tmovsd\tAL,A1\n\taddw2\t&8,%sp\n\tmovdd\tA1,-8(%sp)\n":32;
        !           153: 'ARG'  DAWD[d] {$N $l} "\tpushw\tAL\n\tpushw\tZDL\n":24;
        !           154: 'ARG'  IAWD[d] {$N $l} "\taddw2\t&8,%sp\n\tmovdd\tAL,-8(%sp)\n":24;
        !           155: 'ARG'  MEMADR                  {$N}    "       pushaw  A(LL)\n";
        !           156: 
        !           157: #      take address of
        !           158: 
        !           159: 'UAND' AWDnR                   {$1 $<}         "       movaw   AL,A1\n";
        !           160: 
        !           161: =      AWD,MEMADR              {$L}            "       movaw   A(RL),AL\n";
        !           162: =      AWD,MEMADR              {$R}            "       movaw   A(RL),AL\n";
        !           163: 
        !           164: #      arithmetic ops -- take advantage of mod N bit arithmetic
        !           165: 
        !           166: + BSRC,BSRC    {$1 $< $> $C}
        !           167:        "RR=1   addb2   AL,ARERL=1      addb2   AR,ALE  addb3   AR,AL,A1\n";
        !           168: + HSRC,HSRC    {$1 $< $> $C}
        !           169:        "RR=1   addh2   AL,ARERL=1      addh2   AR,ALE  addh3   AR,AL,A1\n";
        !           170: + WSRC,WSRC    {$1 $< $> $C}
        !           171:        "RR=1   addw2   AL,ARERL=1      addw2   AR,ALE  addw3   AR,AL,A1\n";
        !           172: + DSRC,DSRC    {$1 $P $l $r $< $> $C}
        !           173:        "RR=1   faddd2  AL,ARERL=1      faddd2  AR,ALE  faddd3  AR,AL,A1\n":6;
        !           174: 
        !           175: - BSRC,BSRC    {$1 $< $> $C}   "RL!1\tsubb3\tAR,AL,A1\nRL=1\tsubb2\tAR,AL\n";
        !           176: - HSRC,HSRC    {$1 $< $> $C}   "RL!1\tsubh3\tAR,AL,A1\nRL=1\tsubh2\tAR,AL\n";
        !           177: - WSRC,WSRC    {$1 $< $> $C}   "RL!1\tsubw3\tAR,AL,A1\nRL=1\tsubw2\tAR,AL\n";
        !           178: - DSRC,DSRC    {$1 $P $l $r $< $> $C}
        !           179:        "RL!1   fsubd3  AR,AL,A1\nRL=1  fsubd2  AR,AL\n":6;
        !           180: 
        !           181: 'UMINUS' BSRC                  {$1 $<}         "       \\M\\N\\E\\G\\B AL,A1\n";
        !           182: 'UMINUS' HSRC                  {$1 $<}         "       mnegh   AL,A1\n";
        !           183: 'UMINUS' WSRC                  {$1 $<}         "       mnegw   AL,A1\n";
        !           184: 'UMINUS' DSRC          {$1 $P $l $< $C}        "\tfsubd3\tAL,&0.0,A1\n":24;
        !           185: 
        !           186: # looks so gross because "expand" uses caps for itself
        !           187: # BC and SC templates are used to reach around conversions explicitly
        !           188: # because optim doesn't push down conversions around *.
        !           189: 
        !           190: * BC[iuisus],BC[iuisus] {$1 $< $> $C}
        !           191:        "R(RL)=1        \\M\\U\\L\\B2   AL,ARER(LL)=1   \\M\\U\\L\\B2   AR,ALE  \\M\\U\\L\\B3   AR,AL,A1\n":16;
        !           192: * BSRC,BSRC {$1 $< $> $C}      "       \\M\\U\\L\\B3   AR,AL,A1\n":16;
        !           193: * SC,SC {$1 $< $> $C}
        !           194:        "R(RL)=1        \\M\\U\\L\\H2   AL,ARER(LL)=1   \\M\\U\\L\\H2   AR,ALE  \\M\\U\\L\\H3   AR,AL,A1\n":16;
        !           195: * HSRC,HSRC {$1 $< $> $C}      "       \\M\\U\\L\\H3   AR,AL,A1\n":16;
        !           196: * WSRC,WSRC    {$1 $< $> $C}
        !           197:        "RR=1   mulw2   AL,ARERL=1      mulw2   AR,ALE  mulw3   AR,AL,A1\n":16;
        !           198: * DSRC,DSRC    {$1 $P $l $r $[ $] $C}
        !           199:        "RR=1   fmuld2  AL,ARERL=1      fmuld2  AR,ALE  fmuld3  AR,AL,A1\n":24;
        !           200: 
        !           201: / UWSRCnC,WSRCnC {$1 $< $> $C} "RL!1\tudivw3\tAR,AL,A1\nRL=1\tudivw2\tAR,AL\n":18;
        !           202: / WSRCnC,UWSRCnC {$1 $< $> $C} "RL!1\tudivw3\tAR,AL,A1\nRL=1\tudivw2\tAR,AL\n":18;
        !           203: / WSRCnC,WSRCnC        {$1 $< $> $C} "RL!1\tdivw3\tAR,AL,A1\nRL=1\tdivw2\tAR,AL\n":18;
        !           204: / DSRC,DSRC {$1 $P $l $r $< $> $C}
        !           205:        "RL!1   fdivd3  AR,AL,A1\nRL=1  fdivd2  AR,AL\n":32;
        !           206: 
        !           207: % UWSRCnC,WSRCnC {$1 $< $> $C} "RL!1\tumodw3\tAR,AL,A1\nRL=1\tumodw2\tAR,AL\n":18;
        !           208: % WSRCnC,UWSRCnC {$1 $< $> $C} "RL!1\tumodw3\tAR,AL,A1\nRL=1\tumodw2\tAR,AL\n":18;
        !           209: % WSRCnC,WSRCnC        {$1 $< $> $C} "RL!1\tmodw3\tAR,AL,A1\nRL=1\tmodw2\tAR,AL\n":18;
        !           210: 
        !           211: #      logical ops -- again, take advantage
        !           212: #
        !           213: #      WE 32000 versions of these instructions actually do set
        !           214: #      condition codes correctly, even though IS25 doesn't require it
        !           215: 
        !           216: & BSRC,BSRC    {$C}            "       bitb    AL,AR\n";
        !           217: & HSRC,HSRC    {$C}            "       bith    AL,AR\n";
        !           218: & WSRC,WSRC    {$C}            "       bitw    AL,AR\n";
        !           219: 
        !           220: & BSRC,BSRC    {$C $1 $> $<}
        !           221:        "RR=1   andb2   AL,ARERL=1      andb2   AR,ALE  andb3   AR,AL,A1\n";
        !           222: & HSRC,HSRC    {$C $1 $> $<}
        !           223:        "RR=1   andh2   AL,ARERL=1      andh2   AR,ALE  andh3   AR,AL,A1\n";
        !           224: & WSRC,WSRC    {$C $1 $> $<}
        !           225:        "RR=1   andw2   AL,ARERL=1      andw2   AR,ALE  andw3   AR,AL,A1\n";
        !           226: 
        !           227: | BSRC,BSRC    {$C $1 $> $<}
        !           228:        "RR=1   orb2    AL,ARERL=1      orb2    AR,ALE  orb3    AR,AL,A1\n";
        !           229: | HSRC,HSRC    {$C $1 $> $<}
        !           230:        "RR=1   orh2    AL,ARERL=1      orh2    AR,ALE  orh3    AR,AL,A1\n";
        !           231: | WSRC,WSRC    {$C $1 $> $<}
        !           232:        "RR=1   orw2    AL,ARERL=1      orw2    AR,ALE  orw3    AR,AL,A1\n";
        !           233: 
        !           234: ^ BSRC,BSRC    {$C $1 $> $<}
        !           235:        "RR=1   xorb2   AL,ARERL=1      xorb2   AR,ALE  xorb3   AR,AL,A1\n";
        !           236: ^ HSRC,HSRC    {$C $1 $> $<}
        !           237:        "RR=1   xorh2   AL,ARERL=1      xorh2   AR,ALE  xorh3   AR,AL,A1\n";
        !           238: ^ WSRC,WSRC    {$C $1 $> $<}
        !           239:        "RR=1   xorw2   AL,ARERL=1      xorw2   AR,ALE  xorw3   AR,AL,A1\n";
        !           240: 
        !           241: ~      BSRC                    {$1 $<}         "       mcomb   AL,A1\n";
        !           242: ~      HSRC                    {$1 $<}         "       mcomh   AL,A1\n";
        !           243: ~      WSRC                    {$1 $<}         "       mcomw   AL,A1\n";
        !           244: 
        !           245: #      shifts
        !           246: 
        !           247: <<     WSRCnC,WSRCnC           {$1 $> $< $C}   "\t\\L\\L\\S\\W3\tAR,AL,A1\n";
        !           248: 
        !           249: >>     WSRCnC,WSRCnC           {$1 $> $< $C}   "\t\\L\\R\\S\\W3\tAR,AL,A1\n";
        !           250: 
        !           251: #      assignment ops -- mod N bits!
        !           252: 
        !           253: +=     BDST,BSRC               {$L $C}         "       addb2   AR,AL\n";
        !           254: +=     HDST,HSRC               {$L $C}         "       addh2   AR,AL\n";
        !           255: +=     WDST,WSRC               {$L $C}         "       addw2   AR,AL\n";
        !           256: +=     DDST,DSRC               {$L $r $l $C}   "       faddd2  AR,AL\n":24;
        !           257: 
        !           258: -=     BDST,BSRC               {$L $C}         "       subb2   AR,AL\n";
        !           259: -=     HDST,HSRC               {$L $C}         "       subh2   AR,AL\n";
        !           260: -=     WDST,WSRC               {$L $C}         "       subw2   AR,AL\n";
        !           261: -=     DDST,DSRC               {$L $r $l $C}   "       fsubd2  AR,AL\n":24;
        !           262: 
        !           263: *=     BDST,BSRC       {$L $C}         "\t\\M\\U\\L\\B2\tAR,AL\n":16;
        !           264: *=     HDST,HSRC       {$L $C}         "\t\\M\\U\\L\\H2\tAR,AL\n":16;
        !           265: *=     WDST,WSRC               {$L $C}         "       mulw2   AR,AL\n":16;
        !           266: *=     DDST,DSRC               {$L $r $l $C}   "       fmuld2  AR,AL\n":32;
        !           267: 
        !           268: /=     WDST,UWSRCnC            {$L $C}         "       udivw2  AR,AL\n":18;
        !           269: /=     AWD[uip],WSRCnC         { }             "       udivw2  AR,AL\n":18;
        !           270: /=     AWD[iuip],WSRCnC        { }             "       divw2   AR,AL\n":18;
        !           271: /=     DDST,DSRC               {$L $r $l $C}   "       fdivd2  AR,AL\n":32;
        !           272: 
        !           273: %=     AWD[uip],WSRCnC         { }             "       umodw2  AR,AL\n":18;
        !           274: %=     WDST,UWSRCnC            {$L $C}         "       umodw2  AR,AL\n":18;
        !           275: %=     WDST,WSRCnC             {$L $C}         "       modw2   AR,AL\n":18;
        !           276: 
        !           277: |=     BDST,BSRC               {$L}            "       orb2    AR,AL\n";
        !           278: |=     HDST,HSRC               {$L}            "       orh2    AR,AL\n";
        !           279: |=     WDST,WSRC               {$L}            "       orw2    AR,AL\n";
        !           280: 
        !           281: &=     BDST,BSRC               {$L}            "       andb2   AR,AL\n";
        !           282: &=     HDST,HSRC               {$L}            "       andh2   AR,AL\n";
        !           283: &=     WDST,WSRC               {$L}            "       andw2   AR,AL\n";
        !           284: 
        !           285: ^=     BDST,BSRC               {$L}            "       xorb2   AR,AL\n";
        !           286: ^=     HDST,HSRC               {$L}            "       xorh2   AR,AL\n";
        !           287: ^=     WDST,WSRC               {$L}            "       xorw2   AR,AL\n";
        !           288: 
        !           289: <<=    WDST,WSRCnC             {$L $C}         "\t\\L\\L\\S\\W3\tAR,AL,AL\n";
        !           290: 
        !           291: >>=    WDST,WSRCnC             {$L $C}         "\t\\L\\R\\S\\W3\tAR,AL,AL\n";
        !           292: 
        !           293: #      comparisons
        !           294: 
        !           295: 'CMP'  WSRC,WSRC               {$C}            "       cmpw    AL,AR\nZb";
        !           296: 'CMP'  HSRC,HSRC               {$C  }          "       cmph    AL,AR\nZb";
        !           297: 'CMP'  BSRC,BSRC               {$C}            "       cmpb    AL,AR\nZb";
        !           298: 
        !           299: 'CMP'  SSRC,SSRC               {$C}            "       fcmps   AL,AR\nZb";
        !           300: 'CMP'  SSRCconv,SSRCconv       {$C}            "       fcmps   AL,AR\nZb";
        !           301: 'CMP'  DSRC,DSRC               {$C}            "       fcmpd   AL,AR\nZb";
        !           302: 
        !           303: #      post increment, decrement (rhs is amount)
        !           304: 
        !           305: ++     BDST,C  {$N}            "       addb2   &CR,AL\n";
        !           306: ++     HDST,C  {$N}            "       addh2   &CR,AL\n";
        !           307: ++     WDST,C  {$N}            "       addw2   &CR,AL\n";
        !           308: ++     DDST,C  {$l $N}         "       faddd2  &CR,AL\n":24;
        !           309: 
        !           310: ++     BDST,C  {$1 $l}         "       movb    AL,A1\n addb2   &CR,AL\n":16;
        !           311: ++     HDST,C  {$1 $l}         "       movh    AL,A1\n addh2   &CR,AL\n":16;
        !           312: ++     WDST,C  {$1 $l}         "       movw    AL,A1\n addw2   &CR,AL\n":16;
        !           313: ++     DAWD[d],C {$1 $P $l $l $l} "\tmovw\tAL,A1\n\tmovw\tZDL,ZD1\n\tfaddd2\t&CR,AL\n":20;
        !           314: ++     IAWD[d],C {$1 $P $l $l $l} "    movdd   AL,A1\n faddd2  &CR,AL\n":32;
        !           315: 
        !           316: --     BDST,C  {$N}            "       subb2   &CR,AL\n";
        !           317: --     HDST,C  {$N}            "       subh2   &CR,AL\n";
        !           318: --     WDST,C  {$N}            "       subw2   &CR,AL\n";
        !           319: --     DDST,C  {$l $N}         "       fsubd2  &CR,AL\n":24;
        !           320: 
        !           321: --     BDST,C  {$1 $l}         "       movb    AL,A1\n subb2   &CR,AL\n":16;
        !           322: --     HDST,C  {$1 $l}         "       movh    AL,A1\n subh2   &CR,AL\n":16;
        !           323: --     WDST,C  {$1 $l}         "       movw    AL,A1\n subw2   &CR,AL\n":16;
        !           324: --     DAWD[d],C {$1 $P $l $l $l} "\tmovw\tAL,A1\n\tmovw\tZDL,ZD1\n\tfsubd2\t&CR,AL\n":24;
        !           325: --     IAWD[d],C {$1 $P $l $l $l} "    movdd   AL,A1\n fsubd2  &CR,AL\n":24;
        !           326: 
        !           327: --     BFLD,C  {1 $N}
        !           328: "\textzv\t&ZHL,&SL,AL,A1\n\tsubb2\t&CR,A1\n\tinsv\tA1,&ZHL,&SL,AL\n";
        !           329: --     HFLD,C  {1 $N}
        !           330: "\textzv\t&ZHL,&SL,AL,A1\n\tsubh2\t&CR,A1\n\tinsv\tA1,&ZHL,&SL,AL\n";
        !           331: --     WFLD,C  {1 $N}
        !           332: "\textzv\t&ZHL,&SL,AL,A1\n\tsubw2\t&CR,A1\n\tinsv\tA1,&ZHL,&SL,AL\n";
        !           333: 
        !           334: --     BFLD,C  {2 $1 $l}
        !           335: "\textzv\t&ZHL,&SL,AL,A1\n\tmovw\tA1,A2\n\tsubb2\t&CR,A2\n\tinsv\tA2,&ZHL,&SL,AL\n":16;
        !           336: --     HFLD,C  {2 $1 $l}
        !           337: "\textzv\t&ZHL,&SL,AL,A1\n\tmovw\tA1,A2\n\tsubh2\t&CR,A2\n\tinsv\tA2,&ZHL,&SL,AL\n":16;
        !           338: --     WFLD,C  {2 $1 $l}
        !           339: "\textzv\t&ZHL,&SL,AL,A1\n\tmovw\tA1,A2\n\tsubw2\t&CR,A2\n\tinsv\tA2,&ZHL,&SL,AL\n":16;
        !           340: 
        !           341: #      assignment
        !           342: 
        !           343: #      same size or smaller integers
        !           344: 
        !           345: =      WDST,WSRC               {$L}            "RL!R   movw    AR,AL\n";
        !           346: =      HDST,HSRCnconv          {$L}            "RL!R   movh    AR,AL\n";
        !           347: =      BDST,BSRC               {$L}            "RL!R   movb    AR,AL\n";
        !           348: =      WDST,WSRC               {$R $C}         "       movw    AR,AL\n";
        !           349: =      HDST,HSRCnconv          {$R $C}         "       movh    AR,AL\n";
        !           350: =      BDST,BSRC               {$R $C}         "       movb    AR,AL\n";
        !           351: 
        !           352: #      bigger integers
        !           353: 
        !           354: =      HDST,BSRC               {$L $C}         "       movzbh  AR,AL\n":14;
        !           355: =      WDST,BSRC               {$L $C}         "       movzbw  AR,AL\n":14;
        !           356: 
        !           357: =      WDST,HSRC               {$L $C}         "       movbhw  AR,AL\n":14;
        !           358: =      WDST,UHSRC              {$L $C}         "       movzhw  AR,AL\n":14;
        !           359: 
        !           360: #      floating point -- better have conversions where appropriate!
        !           361: 
        !           362: =      SDST,SSRC       {$L}            "       movw    AR,AL\n";
        !           363: =      SDST,SSRC       {$R}            "       movw    AR,AL\n";
        !           364: =      DAWD[d],DAWD[d] {$L $r $l}      "\tmovw\tAR,AL\n\tmovw\tZDR,ZDL\n":24;
        !           365: =      IAWD[d],DSRC    {$L $r $l}      "       movdd   AR,AL\n":24;
        !           366: =      DDST,IAWD[d]    {$L $r $l}      "       movdd   AR,AL\n":24;
        !           367: =      DAWD[d],DAWD[d] {$R $r $l}      "\tmovw\tAR,AL\n\tmovw\tZDR,ZDL\n":24;
        !           368: =      IAWD[d],DSRC    {$R $r $l}      "       movdd   AR,AL\n":24;
        !           369: =      DDST,IAWD[d]    {$R $r $l}      "       movdd   AR,AL\n":24;
        !           370: =      SDST,DSRCconv[f] {$L $r}        "       movds   AR,AL\n":24;
        !           371: =      DDST,SSRCconv[d] {$L $l}        "       movsd   AR,AL\n":24;
        !           372: 
        !           373: =      FLD,BSRC        {$L 1 $C}       
        !           374:                        "RR!1\tmovzbw   AR,A1\n\tinsv\tA1,&ZHL,&SL,AL\n":18;
        !           375: =      FLD,HSRC        {$L 1 $C}
        !           376:                        "RR!1\tmovzhw   AR,A1\n\tinsv\tA1,&ZHL,&SL,AL\n":18;
        !           377: =      FLD,UHSRC       {$L 1 $C}
        !           378:                        "RR!1\tmovzhw   AR,A1\n\tinsv\tA1,&ZHL,&SL,AL\n":18;
        !           379: =      FLD,WSRC        {$L 1 $C}        "\tinsv\tAR,&ZHL,&SL,AL\n":16;
        !           380: 
        !           381: #      structure assignment, arguments
        !           382: 
        !           383: # complicated. do it in zzzcode()
        !           384: 
        !           385: 'STASG'        STAWD,STAWD     {$L 3 $]}       "ZS":24;
        !           386: 
        !           387: 'STARG'        STAWD   {$N 3 $[}       "Zs":24;
        !           388: 
        !           389: #      goto (for fortran)
        !           390: 
        !           391: 'GOTO' C                       {$N}            "       jmp     CL\n";
        !           392: 'GOTO' STK                     {$N}            "       jmp     *AL\n";
        !           393: 
        !           394: #      comma (list separator)
        !           395: 
        !           396: 'CM'   F,F                     {$N}            "";
        !           397: 
        !           398: #      comma op (eval left, eval right, return right value)
        !           399: 
        !           400: 'COMOP'        F,F                     {$N}            "";
        !           401: 'COMOP'        F,R                     {$R}            "";
        !           402: 'COMOP'        F,CC                    {$C}            "";
        !           403: 
        !           404: #      CALL
        !           405: 
        !           406: 'CALL' C,F             {$A $1}         "\tcall\t&Zc,CL\n";
        !           407: 'CALL' R,F             {$A $1}         "\tcall\t&Zc,0(AL)\n";
        !           408: 'CALL' N,F             {$A $1}         "\tcall\t&Zc,*AL\n";
        !           409: 'CALL' STK,F           {$A $1}         "\tcall\t&Zc,*AL\n";
        !           410: 
        !           411: 'UCALL'        C               {$A $1}         "       call    &Zc,CL\n";
        !           412: 'UCALL'        R               {$A $1}         "       call    &Zc,0(AL)\n";
        !           413: 'UCALL'        N               {$A $1}         "       call    &Zc,*AL\n";
        !           414: 'UCALL'        STK             {$A $1}         "       call    &Zc,*AL\n";
        !           415: 
        !           416: #      generate a label
        !           417: 
        !           418: 'GENLAB'       F               {$N}            ".\\LL:\n";
        !           419: 'GENLAB'       R               {$L}            ".\\LL:\n";
        !           420: 'GENLAB'       CC              {$C}            ".\\LL:\n";
        !           421: 
        !           422: #      conditional branch
        !           423: 
        !           424: 'GENBR'                CC              {$N}            "       ZC";
        !           425: 
        !           426: #      generate a branch
        !           427: 
        !           428: 'GENUBR'       F               {$N}            "       jmp     .\\LL\n";
        !           429: 'GENUBR'       C               {$N}            "       jmp     .\\LL\n";
        !           430: 'GENUBR'       R               {$N}            "       jmp     0(AL)\n";

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.