home *** CD-ROM | disk | FTP | other *** search
/ Education Sampler 1992 [NeXTSTEP] / Education_1992_Sampler.iso / NeXT / GnuSource / cplusplus-8 / config / out-vax.c < prev    next >
Encoding:
C/C++ Source or Header  |  1990-06-27  |  3.3 KB  |  153 lines

  1. /* Subroutines for insn-output.c for Vax.
  2.    Copyright (C) 1987 Free Software Foundation, Inc.
  3.  
  4. This file is part of GNU CC.
  5.  
  6. GNU CC is free software; you can redistribute it and/or modify
  7. it under the terms of the GNU General Public License as published by
  8. the Free Software Foundation; either version 1, or (at your option)
  9. any later version.
  10.  
  11. GNU CC is distributed in the hope that it will be useful,
  12. but WITHOUT ANY WARRANTY; without even the implied warranty of
  13. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  14. GNU General Public License for more details.
  15.  
  16. You should have received a copy of the GNU General Public License
  17. along with GNU CC; see the file COPYING.  If not, write to
  18. the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.  */
  19.  
  20. #include <stdio.h>
  21.  
  22. /* This function allows any constant operand, even on VMS where some
  23.    constants are not normally legitimate.  */
  24.  
  25. int
  26. supergeneral_operand (x, mode)
  27.      rtx x;
  28.      enum machine_mode mode;
  29. {
  30.   return (CONSTANT_P (x) || general_operand (x, mode));
  31. }
  32.  
  33. print_operand_address (file, addr)
  34.      FILE *file;
  35.      register rtx addr;
  36. {
  37.   register rtx reg1, reg2, breg, ireg;
  38.   rtx offset;
  39.  
  40.  retry:
  41.   switch (GET_CODE (addr))
  42.     {
  43.     case MEM:
  44.       fprintf (file, "*");
  45.       addr = XEXP (addr, 0);
  46.       goto retry;
  47.  
  48.     case REG:
  49.       fprintf (file, "(%s)", reg_names[REGNO (addr)]);
  50.       break;
  51.  
  52.     case PRE_DEC:
  53.       fprintf (file, "-(%s)", reg_names[REGNO (XEXP (addr, 0))]);
  54.       break;
  55.  
  56.     case POST_INC:
  57.       fprintf (file, "(%s)+", reg_names[REGNO (XEXP (addr, 0))]);
  58.       break;
  59.  
  60.     case PLUS:
  61.       reg1 = 0;    reg2 = 0;
  62.       ireg = 0;    breg = 0;
  63.       offset = 0;
  64.       if (CONSTANT_ADDRESS_P (XEXP (addr, 0))
  65.       || GET_CODE (XEXP (addr, 0)) == MEM)
  66.     {
  67.       offset = XEXP (addr, 0);
  68.       addr = XEXP (addr, 1);
  69.     }
  70.       else if (CONSTANT_ADDRESS_P (XEXP (addr, 1))
  71.            || GET_CODE (XEXP (addr, 1)) == MEM)
  72.     {
  73.       offset = XEXP (addr, 1);
  74.       addr = XEXP (addr, 0);
  75.     }
  76.       if (GET_CODE (addr) != PLUS)
  77.     ;
  78.       else if (GET_CODE (XEXP (addr, 0)) == MULT)
  79.     {
  80.       reg1 = XEXP (addr, 0);
  81.       addr = XEXP (addr, 1);
  82.     }
  83.       else if (GET_CODE (XEXP (addr, 1)) == MULT)
  84.     {
  85.       reg1 = XEXP (addr, 1);
  86.       addr = XEXP (addr, 0);
  87.     }
  88.       else if (GET_CODE (XEXP (addr, 0)) == REG)
  89.     {
  90.       reg1 = XEXP (addr, 0);
  91.       addr = XEXP (addr, 1);
  92.     }
  93.       else if (GET_CODE (XEXP (addr, 1)) == REG)
  94.     {
  95.       reg1 = XEXP (addr, 1);
  96.       addr = XEXP (addr, 0);
  97.     }
  98.       if (GET_CODE (addr) == REG || GET_CODE (addr) == MULT)
  99.     {
  100.       if (reg1 == 0)
  101.         reg1 = addr;
  102.       else
  103.         reg2 = addr;
  104.       addr = 0;
  105.     }
  106.       if (offset != 0)
  107.     {
  108.       if (addr != 0) abort ();
  109.       addr = offset;
  110.     }
  111.       if (reg1 != 0 && GET_CODE (reg1) == MULT)
  112.     {
  113.       breg = reg2;
  114.       ireg = reg1;
  115.     }
  116.       else if (reg2 != 0 && GET_CODE (reg2) == MULT)
  117.     {
  118.       breg = reg1;
  119.       ireg = reg2;
  120.     }
  121.       else if (reg2 != 0 || GET_CODE (addr) == MEM)
  122.     {
  123.       breg = reg2;
  124.       ireg = reg1;
  125.     }
  126.       else
  127.     {
  128.       breg = reg1;
  129.       ireg = reg2;
  130.     }
  131.       if (addr != 0)
  132.     output_address (addr);
  133.       if (breg != 0)
  134.     {
  135.       if (GET_CODE (breg) != REG)
  136.         abort ();
  137.       fprintf (file, "(%s)", reg_names[REGNO (breg)]);
  138.     }
  139.       if (ireg != 0)
  140.     {
  141.       if (GET_CODE (ireg) == MULT)
  142.         ireg = XEXP (ireg, 0);
  143.       if (GET_CODE (ireg) != REG)
  144.         abort ();
  145.       fprintf (file, "[%s]", reg_names[REGNO (ireg)]);
  146.     }
  147.       break;
  148.  
  149.     default:
  150.       output_addr_const (file, addr);
  151.     }
  152. }
  153.