OpenCores
URL https://opencores.org/ocsvn/scarts/scarts/trunk

Subversion Repositories scarts

[/] [scarts/] [trunk/] [toolchain/] [scarts-gcc/] [gcc-4.1.1/] [gcc/] [rtlhooks.c] - Blame information for rev 20

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 12 jlechner
/* Generic hooks for the RTL middle-end.
2
   Copyright (C) 2004, 2005 Free Software Foundation, Inc.
3
 
4
This file is part of GCC.
5
 
6
GCC is free software; you can redistribute it and/or modify it under
7
the terms of the GNU General Public License as published by the Free
8
Software Foundation; either version 2, or (at your option) any later
9
version.
10
 
11
GCC is distributed in the hope that it will be useful, but WITHOUT ANY
12
WARRANTY; without even the implied warranty of MERCHANTABILITY or
13
FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
14
for more details.
15
 
16
You should have received a copy of the GNU General Public License
17
along with GCC; see the file COPYING.  If not, write to the Free
18
Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA
19
02110-1301, USA.  */
20
 
21
#include "config.h"
22
#include "system.h"
23
#include "coretypes.h"
24
#include "tm.h"
25
#include "rtl.h"
26
#include "rtlhooks-def.h"
27
#include "expr.h"
28
#include "recog.h"
29
 
30
 
31
/* For speed, we will copy the RTX hooks struct member-by-member
32
   instead of doing indirect calls.  For these reason, we initialize
33
   *two* struct rtl_hooks globals: rtl_hooks is the one that is used
34
   to actually call the hooks, while general_rtl_hooks is used
35
   to restore the hooks by passes that modify them.  */
36
 
37
const struct rtl_hooks general_rtl_hooks = RTL_HOOKS_INITIALIZER;
38
struct rtl_hooks rtl_hooks = RTL_HOOKS_INITIALIZER;
39
 
40
rtx
41
gen_lowpart_general (enum machine_mode mode, rtx x)
42
{
43
  rtx result = gen_lowpart_common (mode, x);
44
 
45
  if (result)
46
    return result;
47
  else if (REG_P (x))
48
    {
49
      /* Must be a hard reg that's not valid in MODE.  */
50
      result = gen_lowpart_common (mode, copy_to_reg (x));
51
      gcc_assert (result != 0);
52
      return result;
53
    }
54
  else
55
    {
56
      int offset = 0;
57
 
58
      /* The only additional case we can do is MEM.  */
59
      gcc_assert (MEM_P (x));
60
 
61
      /* The following exposes the use of "x" to CSE.  */
62
      if (GET_MODE_SIZE (GET_MODE (x)) <= UNITS_PER_WORD
63
          && SCALAR_INT_MODE_P (GET_MODE (x))
64
          && TRULY_NOOP_TRUNCATION (GET_MODE_BITSIZE (mode),
65
                                    GET_MODE_BITSIZE (GET_MODE (x)))
66
          && ! no_new_pseudos)
67
        return gen_lowpart_general (mode, force_reg (GET_MODE (x), x));
68
 
69
      if (WORDS_BIG_ENDIAN)
70
        offset = (MAX (GET_MODE_SIZE (GET_MODE (x)), UNITS_PER_WORD)
71
                  - MAX (GET_MODE_SIZE (mode), UNITS_PER_WORD));
72
 
73
      if (BYTES_BIG_ENDIAN)
74
        /* Adjust the address so that the address-after-the-data
75
           is unchanged.  */
76
        offset -= (MIN (UNITS_PER_WORD, GET_MODE_SIZE (mode))
77
                   - MIN (UNITS_PER_WORD, GET_MODE_SIZE (GET_MODE (x))));
78
 
79
      return adjust_address (x, mode, offset);
80
    }
81
}
82
 
83
/* Similar to gen_lowpart, but cannot emit any instruction via
84
   copy_to_reg or force_reg.  Mainly used in simplify-rtx.c.  */
85
rtx
86
gen_lowpart_no_emit_general (enum machine_mode mode, rtx x)
87
{
88
  rtx result = gen_lowpart_if_possible (mode, x);
89
  if (result)
90
    return result;
91
  else
92
    return x;
93
}
94
 
95
rtx
96
reg_num_sign_bit_copies_general (rtx x ATTRIBUTE_UNUSED,
97
                                 enum machine_mode mode ATTRIBUTE_UNUSED,
98
                                 rtx known_x ATTRIBUTE_UNUSED,
99
                                 enum machine_mode known_mode ATTRIBUTE_UNUSED,
100
                                 unsigned int known_ret ATTRIBUTE_UNUSED,
101
                                 unsigned int *result ATTRIBUTE_UNUSED)
102
{
103
  return NULL;
104
}
105
 
106
rtx
107
reg_nonzero_bits_general (rtx x ATTRIBUTE_UNUSED,
108
                          enum machine_mode mode ATTRIBUTE_UNUSED,
109
                          rtx known_x ATTRIBUTE_UNUSED,
110
                          enum machine_mode known_mode ATTRIBUTE_UNUSED,
111
                          unsigned HOST_WIDE_INT known_ret ATTRIBUTE_UNUSED,
112
                          unsigned HOST_WIDE_INT *nonzero ATTRIBUTE_UNUSED)
113
{
114
  return NULL;
115
}
116
 
117
/* Assuming that X is an rtx (e.g., MEM, REG or SUBREG) for a fixed-point
118
   number, return an rtx (MEM, SUBREG, or CONST_INT) that refers to the
119
   least-significant part of X.
120
   MODE specifies how big a part of X to return.
121
 
122
   If the requested operation cannot be done, 0 is returned.
123
 
124
   This is similar to gen_lowpart_general.  */
125
 
126
rtx
127
gen_lowpart_if_possible (enum machine_mode mode, rtx x)
128
{
129
  rtx result = gen_lowpart_common (mode, x);
130
 
131
  if (result)
132
    return result;
133
  else if (MEM_P (x))
134
    {
135
      /* This is the only other case we handle.  */
136
      int offset = 0;
137
      rtx new;
138
 
139
      if (WORDS_BIG_ENDIAN)
140
        offset = (MAX (GET_MODE_SIZE (GET_MODE (x)), UNITS_PER_WORD)
141
                  - MAX (GET_MODE_SIZE (mode), UNITS_PER_WORD));
142
      if (BYTES_BIG_ENDIAN)
143
        /* Adjust the address so that the address-after-the-data is
144
           unchanged.  */
145
        offset -= (MIN (UNITS_PER_WORD, GET_MODE_SIZE (mode))
146
                   - MIN (UNITS_PER_WORD, GET_MODE_SIZE (GET_MODE (x))));
147
 
148
      new = adjust_address_nv (x, mode, offset);
149
      if (! memory_address_p (mode, XEXP (new, 0)))
150
        return 0;
151
 
152
      return new;
153
    }
154
  else if (mode != GET_MODE (x) && GET_MODE (x) != VOIDmode)
155
    return gen_lowpart_SUBREG (mode, x);
156
  else
157
    return 0;
158
}
159
 

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.