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

Subversion Repositories openrisc

[/] [openrisc/] [trunk/] [gnu-dev/] [or1k-gcc/] [gcc/] [config/] [h8300/] [genmova.sh] - Blame information for rev 806

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

Line No. Rev Author Line
1 709 jeremybenn
#!/bin/sh
2
# Generate mova.md, a file containing patterns that can be implemented
3
# using the h8sx mova instruction.
4
 
5
# Copyright (C) 2004, 2009 Free Software Foundation, Inc.
6
#
7
# This file is part of GCC.
8
#
9
# GCC is free software; you can redistribute it and/or modify
10
# it under the terms of the GNU General Public License as published by
11
# the Free Software Foundation; either version 3, or (at your option)
12
# any later version.
13
#
14
# GCC is distributed in the hope that it will be useful,
15
# but WITHOUT ANY WARRANTY; without even the implied warranty of
16
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17
# GNU General Public License for more details.
18
#
19
# You should have received a copy of the GNU General Public License
20
# along with GCC; see the file COPYING3.  If not see
21
# <http://www.gnu.org/licenses/>.
22
 
23
echo ";; -*- buffer-read-only: t -*-"
24
echo ";; Generated automatically from genmova.sh"
25
echo ";; Copyright (C) 2004, 2009 Free Software Foundation, Inc."
26
echo ";;"
27
echo ";; This file is part of GCC."
28
echo ";;"
29
echo ";; GCC is free software; you can redistribute it and/or modify"
30
echo ";; it under the terms of the GNU General Public License as published by"
31
echo ";; the Free Software Foundation; either version 3, or (at your option)"
32
echo ";; any later version."
33
echo ";;"
34
echo ";; GCC is distributed in the hope that it will be useful,"
35
echo ";; but WITHOUT ANY WARRANTY; without even the implied warranty of"
36
echo ";; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the"
37
echo ";; GNU General Public License for more details."
38
echo ";;"
39
echo ";; You should have received a copy of the GNU General Public License"
40
echo ";; along with GCC; see the file COPYING3.  If not see"
41
echo ";; <http://www.gnu.org/licenses/>."
42
 
43
# Loop over modes for the source operand (the index).  Only 8-bit and
44
# 16-bit indices are allowed.
45
for s in QI HI; do
46
 
47
  # Set $src to the operand syntax for this size of index.
48
  case $s in
49
    QI) src=%X1.b;;
50
    HI) src=%T1.w;;
51
  esac
52
 
53
  # A match_operand for the source.
54
  operand="(match_operand:$s 1 \"h8300_dst_operand\" \"0,rQ\")"
55
 
56
  # Loop over the destination register's mode.  The QI and HI versions use
57
  # the same instructions as the SI ones, they just ignore the upper bits
58
  # of the result.
59
  for d in QI HI SI; do
60
 
61
    # If the destination is larger than the source, include a
62
    # zero_extend/plus pattern.  We could also match zero extensions
63
    # of memory without the plus, but it's not any smaller or faster
64
    # than separate insns.
65
    case $d:$s in
66
      SI:QI | SI:HI | HI:QI)
67
        cat <<EOF
68
(define_insn ""
69
  [(set (match_operand:$d 0 "register_operand" "=r,r")
70
        (plus:$d (zero_extend:$d $operand)
71
                 (match_operand:$d 2 "immediate_operand" "i,i")))]
72
  "TARGET_H8300SX"
73
  "mova/b.l @(%o2,$src),%S0"
74
  [(set_attr "length_table" "mova")
75
   (set_attr "cc" "none")])
76
 
77
EOF
78
        ;;
79
    esac
80
 
81
    # Loop over the shift amount.
82
    for shift in 1 2; do
83
      case $shift in
84
        1) opsize=w mult=2;;
85
        2) opsize=l mult=4;;
86
      esac
87
 
88
      # Calculate the mask of bits that will be nonzero after the source
89
      # has been extended and shifted.
90
      case $s:$shift in
91
        QI:1) mask=510;;
92
        QI:2) mask=1020;;
93
        HI:1) mask=131070;;
94
        HI:2) mask=262140;;
95
      esac
96
 
97
      # There doesn't seem to be a well-established canonical form for
98
      # some of the patterns we need.  Emit both shift and multiplication
99
      # patterns.
100
      for form in mult ashift; do
101
        case $form in
102
          mult) amount=$mult;;
103
          ashift) amount=$shift;;
104
        esac
105
 
106
        case $d:$s in
107
          # If the source and destination are the same size, we can treat
108
          # mova as a sort of multiply-add instruction.
109
          QI:QI | HI:HI)
110
            cat <<EOF
111
(define_insn ""
112
  [(set (match_operand:$d 0 "register_operand" "=r,r")
113
        (plus:$d ($form:$d $operand
114
                           (const_int $amount))
115
                 (match_operand:$d 2 "immediate_operand" "i,i")))]
116
  "TARGET_H8300SX"
117
  "mova/$opsize.l @(%o2,$src),%S0"
118
  [(set_attr "length_table" "mova")
119
   (set_attr "cc" "none")])
120
 
121
EOF
122
            ;;
123
 
124
          # Handle the cases where the source is smaller than the
125
          # destination.  Sometimes combine will keep the extension,
126
          # sometimes it will use an AND.
127
          SI:QI | SI:HI | HI:QI)
128
 
129
            # Emit the forms that use zero_extend.
130
            cat <<EOF
131
(define_insn ""
132
  [(set (match_operand:$d 0 "register_operand" "=r,r")
133
        ($form:$d (zero_extend:$d $operand)
134
                  (const_int $amount)))]
135
  "TARGET_H8300SX"
136
  "mova/$opsize.l @(0,$src),%S0"
137
  [(set_attr "length_table" "mova_zero")
138
   (set_attr "cc" "none")])
139
 
140
(define_insn ""
141
  [(set (match_operand:$d 0 "register_operand" "=r,r")
142
        (plus:$d ($form:$d (zero_extend:$d $operand)
143
                           (const_int $amount))
144
                 (match_operand:$d 2 "immediate_operand" "i,i")))]
145
  "TARGET_H8300SX"
146
  "mova/$opsize.l @(%o2,$src),%S0"
147
  [(set_attr "length_table" "mova")
148
   (set_attr "cc" "none")])
149
 
150
EOF
151
 
152
            # Now emit the forms that use AND.  When the index is a register,
153
            # these forms are effectively $d-mode operations: the index will
154
            # be a $d-mode REG or SUBREG.  When the index is a memory
155
            # location, we will have a paradoxical subreg such as:
156
            #
157
            #   (and:SI (mult:SI (subreg:SI (mem:QI ...) 0)
158
            #                    (const_int 4))
159
            #           (const_int 1020))
160
            #
161
            # Match the two case separately: a $d-mode register_operand
162
            # or a $d-mode subreg of an $s-mode memory_operand.  Match the
163
            # memory form first since register_operand accepts mem subregs
164
            # before reload.
165
            memory="(match_operand:$s 1 \"memory_operand\" \"m\")"
166
            memory="(subreg:$d $memory 0)"
167
            register="(match_operand:$d 1 \"register_operand\" \"0\")"
168
            for paradoxical in "$memory" "$register"; do
169
              cat <<EOF
170
(define_insn ""
171
  [(set (match_operand:$d 0 "register_operand" "=r")
172
        (and:$d ($form:$d $paradoxical
173
                          (const_int $amount))
174
                (const_int $mask)))]
175
  "TARGET_H8300SX"
176
  "mova/$opsize.l @(0,$src),%S0"
177
  [(set_attr "length_table" "mova_zero")
178
   (set_attr "cc" "none")])
179
 
180
(define_insn ""
181
  [(set (match_operand:$d 0 "register_operand" "=r")
182
        (plus:$d (and:$d ($form:$d $paradoxical
183
                                   (const_int $amount))
184
                         (const_int $mask))
185
                 (match_operand:$d 2 "immediate_operand" "i")))]
186
  "TARGET_H8300SX"
187
  "mova/$opsize.l @(%o2,$src),%S0"
188
  [(set_attr "length_table" "mova")
189
   (set_attr "cc" "none")])
190
 
191
EOF
192
              done
193
            ;;
194
        esac
195
      done
196
    done
197
  done
198
done

powered by: WebSVN 2.1.0

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