annotate gcc/config/pdp11/pdp11.md @ 158:494b0b89df80 default tip

...
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Mon, 25 May 2020 18:13:55 +0900
parents 1830386684a0
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1 ;;- Machine description for the pdp11 for GNU C compiler
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2 ;; Copyright (C) 1994-2020 Free Software Foundation, Inc.
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
3 ;; Contributed by Michael K. Gschwind (mike@vlsivie.tuwien.ac.at).
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
4
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
5 ;; This file is part of GCC.
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
6
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
7 ;; GCC is free software; you can redistribute it and/or modify
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
8 ;; it under the terms of the GNU General Public License as published by
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
9 ;; the Free Software Foundation; either version 3, or (at your option)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
10 ;; any later version.
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
11
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
12 ;; GCC is distributed in the hope that it will be useful,
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
13 ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
14 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
15 ;; GNU General Public License for more details.
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
16
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
17 ;; You should have received a copy of the GNU General Public License
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
18 ;; along with GCC; see the file COPYING3. If not see
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
19 ;; <http://www.gnu.org/licenses/>.
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
20
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
21 (include "predicates.md")
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
22 (include "constraints.md")
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
23
111
kono
parents: 67
diff changeset
24 (define_c_enum "unspecv"
kono
parents: 67
diff changeset
25 [
kono
parents: 67
diff changeset
26 UNSPECV_BLOCKAGE
kono
parents: 67
diff changeset
27 UNSPECV_SETD
kono
parents: 67
diff changeset
28 UNSPECV_SETI
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
29 UNSPECV_CPYMEM
111
kono
parents: 67
diff changeset
30 ])
kono
parents: 67
diff changeset
31
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
32 (define_constants
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
33 [
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
34 ;; Register numbers
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
35 (R0_REGNUM 0)
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
36 (RETVAL_REGNUM 0)
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
37 (FRAME_POINTER_REGNUM 5)
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
38 (STACK_POINTER_REGNUM 6)
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
39 (PC_REGNUM 7)
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
40 (AC0_REGNUM 8)
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
41 (AC3_REGNUM 11)
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
42 (AC4_REGNUM 12)
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
43 (AC5_REGNUM 13)
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
44 ;; The next one is not a physical register but is used for
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
45 ;; addressing arguments.
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
46 (ARG_POINTER_REGNUM 14)
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
47 ;; Condition code registers
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
48 (CC_REGNUM 15)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
49 (FCC_REGNUM 16)
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
50 ;; End of hard registers
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
51 (FIRST_PSEUDO_REGISTER 17)
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
52
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
53 ;; Branch offset limits, as byte offsets from (pc). That is NOT
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
54 ;; the same thing as "instruction address" -- it is for backward
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
55 ;; branches, but for forward branches it refers to the address
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
56 ;; following the instruction. So the max forward distance
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
57 ;; matches what the processor handbook says, while the max
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
58 ;; backward branch is 2 less than the book.
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
59 (MIN_BRANCH -254)
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
60 (MAX_BRANCH 254)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
61 (MIN_SOB -124)
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
62 (MAX_SOB 0)])
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
63
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
64 ;; DF is 64 bit
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
65 ;; SF is 32 bit
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
66 ;; SI is 32 bit
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
67 ;; HI is 16 bit
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
68 ;; QI is 8 bit
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
69
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
70 ;; Integer modes supported on the PDP11, with a mapping from machine mode
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
71 ;; to mnemonic suffix. SImode and DImode are usually special cases.
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
72 (define_mode_iterator PDPint [QI HI])
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
73 (define_mode_attr isfx [(QI "b") (HI "")])
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
74 (define_mode_attr mname [(QI "QImode") (HI "HImode") (SI "SImode") (DI "DImode")])
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
75 (define_mode_attr e_mname [(QI "E_QImode") (HI "E_HImode") (SI "E_SImode") (DI "E_DImode")])
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
76 (define_mode_attr hmode [(QI "hi") (HI "hi") (SI "si") (DI "di")])
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
77
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
78 ;; These are analogous for use in splitters and expanders.
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
79 (define_mode_iterator HSint [HI SI])
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
80 (define_mode_iterator QHSint [QI HI SI])
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
81 (define_mode_iterator QHSDint [QI HI SI DI])
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
82
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
83 (define_code_iterator SHF [ashift ashiftrt lshiftrt])
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
84
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
85 ;; Substitution to turn a CC clobber into a CC setter. We have four of
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
86 ;; these: for CCmode vs. CCNZmode, and for CC_REGNUM vs. FCC_REGNUM.
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
87 (define_subst "cc_cc"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
88 [(set (match_operand 0 "") (match_operand 1 ""))
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
89 (clobber (reg CC_REGNUM))]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
90 ""
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
91 [(set (reg:CC CC_REGNUM)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
92 (compare:CC (match_dup 1) (const_int 0)))
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
93 (set (match_dup 0) (match_dup 1))])
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
94
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
95 (define_subst "cc_ccnz"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
96 [(set (match_operand 0 "") (match_operand 1 ""))
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
97 (clobber (reg CC_REGNUM))]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
98 ""
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
99 [(set (reg:CCNZ CC_REGNUM)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
100 (compare:CCNZ (match_dup 1) (const_int 0)))
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
101 (set (match_dup 0) (match_dup 1))])
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
102
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
103 (define_subst "fcc_cc"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
104 [(set (match_operand 0 "") (match_operand 1 ""))
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
105 (clobber (reg FCC_REGNUM))]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
106 ""
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
107 [(set (reg:CC FCC_REGNUM)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
108 (compare:CC (match_dup 1) (const_int 0)))
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
109 (set (match_dup 0) (match_dup 1))])
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
110
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
111 (define_subst "fcc_ccnz"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
112 [(set (match_operand 0 "") (match_operand 1 ""))
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
113 (clobber (reg FCC_REGNUM))]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
114 ""
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
115 [(set (reg:CCNZ FCC_REGNUM)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
116 (compare:CCNZ (match_dup 1) (const_int 0)))
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
117 (set (match_dup 0) (match_dup 1))])
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
118
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
119 (define_subst_attr "cc_cc" "cc_cc" "_nocc" "_cc")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
120 (define_subst_attr "fcc_cc" "fcc_cc" "_nocc" "_cc")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
121 (define_subst_attr "cc_ccnz" "cc_ccnz" "_nocc" "_cc")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
122 (define_subst_attr "fcc_ccnz" "fcc_ccnz" "_nocc" "_cc")
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
123
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
124 ;;- See file "rtl.def" for documentation on define_insn, match_*, et. al.
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
125
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
126 ;; Compare instructions.
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
127
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
128 ;; currently we only support df floats, which saves us quite some
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
129 ;; hassle switching the FP mode!
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
130 ;; we assume that CPU is always in long float mode, and
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
131 ;; 16 bit integer mode - currently, the prologue for main does this,
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
132 ;; but maybe we should just set up a NEW crt0 properly,
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
133 ;; -- and what about signal handling code?
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
134 ;; (we don't even let sf floats in the register file, so
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
135 ;; we only should have to worry about truncating and widening
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
136 ;; when going to memory)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
137
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
138 ;; abort() call by g++ - must define libfunc for cmp_optab
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
139 ;; and ucmp_optab for mode SImode, because we don't have that!!!
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
140 ;; - yet since no libfunc is there, we abort ()
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
141
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
142 ;; define attributes
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
143 ;; currently type is only fpu or arith or unknown, maybe branch later ?
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
144 ;; default is arith
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
145 (define_attr "type" "unknown,arith,fp" (const_string "arith"))
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
146
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
147 ;; length default is 2 bytes each
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
148 (define_attr "length" "" (const_int 2))
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
149
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
150 ;; instruction base cost (not counting operands)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
151 (define_attr "base_cost" "" (const_int 2))
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
152
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
153 ;; a user's asm statement
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
154 (define_asm_attributes
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
155 [(set_attr "type" "unknown")
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
156 ; length for asm is the max length per statement. That would be
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
157 ; 3 words, for a two-operand instruction with extra word addressing
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
158 ; modes for both operands.
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
159 (set_attr "length" "6")])
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
160
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
161 ;; define function units
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
162
111
kono
parents: 67
diff changeset
163 ;; Prologue and epilogue support.
kono
parents: 67
diff changeset
164
kono
parents: 67
diff changeset
165 (define_expand "prologue"
kono
parents: 67
diff changeset
166 [(const_int 0)]
kono
parents: 67
diff changeset
167 ""
kono
parents: 67
diff changeset
168 {
kono
parents: 67
diff changeset
169 pdp11_expand_prologue ();
kono
parents: 67
diff changeset
170 DONE;
kono
parents: 67
diff changeset
171 })
kono
parents: 67
diff changeset
172
kono
parents: 67
diff changeset
173 (define_expand "epilogue"
kono
parents: 67
diff changeset
174 [(const_int 0)]
kono
parents: 67
diff changeset
175 ""
kono
parents: 67
diff changeset
176 {
kono
parents: 67
diff changeset
177 pdp11_expand_epilogue ();
kono
parents: 67
diff changeset
178 DONE;
kono
parents: 67
diff changeset
179 })
kono
parents: 67
diff changeset
180
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
181 (define_insn "rtspc"
111
kono
parents: 67
diff changeset
182 [(return)]
kono
parents: 67
diff changeset
183 ""
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
184 "rts\tpc")
111
kono
parents: 67
diff changeset
185
kono
parents: 67
diff changeset
186 (define_insn "blockage"
kono
parents: 67
diff changeset
187 [(unspec_volatile [(const_int 0)] UNSPECV_BLOCKAGE)]
kono
parents: 67
diff changeset
188 ""
kono
parents: 67
diff changeset
189 ""
kono
parents: 67
diff changeset
190 [(set_attr "length" "0")])
kono
parents: 67
diff changeset
191
kono
parents: 67
diff changeset
192 (define_insn "setd"
kono
parents: 67
diff changeset
193 [(unspec_volatile [(const_int 0)] UNSPECV_SETD)]
kono
parents: 67
diff changeset
194 ""
kono
parents: 67
diff changeset
195 "setd")
kono
parents: 67
diff changeset
196
kono
parents: 67
diff changeset
197 (define_insn "seti"
kono
parents: 67
diff changeset
198 [(unspec_volatile [(const_int 0)] UNSPECV_SETI)]
kono
parents: 67
diff changeset
199 ""
kono
parents: 67
diff changeset
200 "seti")
kono
parents: 67
diff changeset
201
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
202 ;; arithmetic - values here immediately when next insn issued
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
203 ;; or does it mean the number of cycles after this insn was issued?
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
204 ;; how do I say that fpu insns use cpu also? (pre-interaction phase)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
205
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
206 ;(define_function_unit "cpu" 1 1 (eq_attr "type" "arith") 0 0)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
207 ;(define_function_unit "fpu" 1 1 (eq_attr "type" "fp") 0 0)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
208
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
209 ;; compare
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
210 (define_insn "*cmpdf"
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
211 [(set (reg:CC FCC_REGNUM)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
212 (compare:CC (match_operand:DF 0 "general_operand" "fR,fR,Q,QF")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
213 (match_operand:DF 1 "register_or_const0_operand" "G,a,G,a")))]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
214 "TARGET_FPU && reload_completed"
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
215 "*
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
216 {
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
217 if (which_alternative == 0 || which_alternative == 2)
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
218 return \"{tstd|tstf}\t%0\";
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
219 else
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
220 return \"{cmpd|cmpf}\t%0,%1\";
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
221 }"
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
222 [(set_attr "length" "2,2,4,4")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
223 (set_attr "base_cost" "4")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
224 (set_attr "type" "fp")])
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
225
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
226 ;; Copy floating point processor condition code register to main CPU
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
227 ;; condition code register.
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
228 (define_insn "*cfcc"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
229 [(set (reg CC_REGNUM) (reg FCC_REGNUM))]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
230 "TARGET_FPU && reload_completed"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
231 "cfcc")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
232
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
233 (define_insn "cmp<mode>"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
234 [(set (reg:CC CC_REGNUM)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
235 (compare:CC (match_operand:PDPint 0 "general_operand" "rR,rR,rR,Q,Qi,Qi")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
236 (match_operand:PDPint 1 "general_operand" "N,rR,Qi,N,rR,Qi")))]
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
237 ""
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
238 "@
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
239 tst<PDPint:isfx>\t%0
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
240 cmp<PDPint:isfx>\t%0,%1
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
241 cmp<PDPint:isfx>\t%0,%1
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
242 tst<PDPint:isfx>\t%0
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
243 cmp<PDPint:isfx>\t%0,%1
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
244 cmp<PDPint:isfx>\t%0,%1"
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
245 [(set_attr "length" "2,2,4,4,4,6")])
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
246
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
247 ;; Two word compare
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
248 (define_insn "cmpsi"
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
249 [(set (reg:CC CC_REGNUM)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
250 (compare:CC (match_operand:SI 0 "general_operand" "rDQi")
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
251 (match_operand:SI 1 "general_operand" "rDQi")))]
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
252 ""
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
253 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
254 rtx inops[2];
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
255 rtx exops[2][2];
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
256 rtx lb[1];
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
257
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
258 inops[0] = operands[0];
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
259 inops[1] = operands[1];
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
260 pdp11_expand_operands (inops, exops, 2, 2, NULL, big);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
261 lb[0] = gen_label_rtx ();
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
262
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
263 if (CONST_INT_P (exops[0][1]) && INTVAL (exops[0][1]) == 0)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
264 output_asm_insn ("tst\t%0", exops[0]);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
265 else
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
266 output_asm_insn ("cmp\t%0,%1", exops[0]);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
267 output_asm_insn ("bne\t%l0", lb);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
268 if (CONST_INT_P (exops[1][1]) && INTVAL (exops[1][1]) == 0)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
269 output_asm_insn ("tst\t%0", exops[1]);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
270 else
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
271 output_asm_insn ("cmp\t%0,%1", exops[1]);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
272 output_asm_label (lb[0]);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
273 fputs (":\n", asm_out_file);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
274
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
275 return "";
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
276 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
277 [(set (attr "length")
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
278 (symbol_ref "pdp11_cmp_length (operands, 2)"))
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
279 (set_attr "base_cost" "0")])
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
280
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
281 ;; Four word compare
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
282 (define_insn "cmpdi"
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
283 [(set (reg:CC CC_REGNUM)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
284 (compare:CC (match_operand:DI 0 "general_operand" "rDQi")
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
285 (match_operand:DI 1 "general_operand" "rDQi")))]
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
286 ""
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
287 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
288 rtx inops[4];
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
289 rtx exops[4][2];
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
290 rtx lb[1];
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
291 int i;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
292
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
293 inops[0] = operands[0];
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
294 inops[1] = operands[1];
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
295 pdp11_expand_operands (inops, exops, 2, 4, NULL, big);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
296 lb[0] = gen_label_rtx ();
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
297
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
298 for (i = 0; i < 3; i++)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
299 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
300 if (CONST_INT_P (exops[i][1]) && INTVAL (exops[i][1]) == 0)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
301 output_asm_insn ("tst\t%0", exops[i]);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
302 else
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
303 output_asm_insn ("cmp\t%0,%1", exops[i]);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
304 output_asm_insn ("bne\t%l0", lb);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
305 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
306 if (CONST_INT_P (exops[3][1]) && INTVAL (exops[3][1]) == 0)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
307 output_asm_insn ("tst\t%0", exops[3]);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
308 else
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
309 output_asm_insn ("cmp\t%0,%1", exops[3]);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
310 output_asm_label (lb[0]);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
311 fputs (":\n", asm_out_file);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
312
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
313 return "";
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
314 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
315 [(set (attr "length")
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
316 (symbol_ref "pdp11_cmp_length (operands, 2)"))
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
317 (set_attr "base_cost" "0")])
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
318
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
319 ;; sob instruction
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
320 ;;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
321 ;; This expander has to check for mode match because the doloop pass
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
322 ;; in gcc that invokes it does not do so, i.e., it may attempt to apply
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
323 ;; this pattern even if the count operand is QI or SI mode.
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
324 (define_expand "doloop_end"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
325 [(parallel [(set (pc)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
326 (if_then_else
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
327 (ne (match_operand:HI 0 "nonimmediate_operand" "+r,!m")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
328 (const_int 1))
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
329 (label_ref (match_operand 1 "" ""))
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
330 (pc)))
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
331 (set (match_dup 0)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
332 (plus:HI (match_dup 0)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
333 (const_int -1)))])]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
334 "TARGET_40_PLUS"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
335 "{
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
336 if (GET_MODE (operands[0]) != HImode)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
337 FAIL;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
338 }")
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
339
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
340 ;; Do a define_split because some alternatives clobber CC.
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
341 ;; Some don't, but it isn't all that interesting to cover that case.
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
342 (define_insn_and_split "doloop_end_insn"
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
343 [(set (pc)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
344 (if_then_else
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
345 (ne (match_operand:HI 0 "nonimmediate_operand" "+r,!m")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
346 (const_int 1))
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
347 (label_ref (match_operand 1 "" ""))
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
348 (pc)))
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
349 (set (match_dup 0)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
350 (plus:HI (match_dup 0)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
351 (const_int -1)))]
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
352 "TARGET_40_PLUS"
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
353 "#"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
354 "&& reload_completed"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
355 [(parallel [(set (pc)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
356 (if_then_else
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
357 (ne (match_dup 0) (const_int 1))
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
358 (label_ref (match_dup 1))
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
359 (pc)))
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
360 (set (match_dup 0)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
361 (plus:HI (match_dup 0)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
362 (const_int -1)))
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
363 (clobber (reg:CC CC_REGNUM))])]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
364 "")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
365
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
366 ;; Note that there is a memory alternative here. This is as documented
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
367 ;; in gccint, which says that doloop_end, since it has both a jump and
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
368 ;; an output interrupt "must handle its own reloads". That translates
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
369 ;; to: must accept memory operands as valid though they may be deprecated.
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
370 (define_insn "doloop_end_nocc"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
371 [(set (pc)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
372 (if_then_else
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
373 (ne (match_operand:HI 0 "nonimmediate_operand" "+r,!m")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
374 (const_int 1))
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
375 (label_ref (match_operand 1 "" ""))
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
376 (pc)))
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
377 (set (match_dup 0)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
378 (plus:HI (match_dup 0)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
379 (const_int -1)))
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
380 (clobber (reg:CC CC_REGNUM))]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
381 "TARGET_40_PLUS && reload_completed"
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
382 "*
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
383 {
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
384 rtx lb[1];
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
385
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
386 if (get_attr_length (insn) == 2)
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
387 return \"sob\t%0,%l1\";
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
388
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
389 /* emulate sob */
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
390 lb[0] = gen_label_rtx ();
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
391 output_asm_insn (\"dec\t%0\", operands);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
392 output_asm_insn (\"beq\t%l0\", lb);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
393 output_asm_insn (\"jmp\t%l1\", operands);
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
394
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
395 output_asm_label (lb[0]);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
396 fputs (\":\\n\", asm_out_file);
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
397
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
398 return \"\";
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
399 }"
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
400 [(set (attr "length")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
401 (if_then_else (eq (symbol_ref ("which_alternative")) (const_int 1))
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
402 (const_int 10)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
403 (if_then_else (ior (lt (minus (match_dup 1) (pc))
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
404 (const_int MIN_SOB))
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
405 (gt (minus (match_dup 1) (pc))
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
406 (const_int MAX_SOB)))
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
407 (const_int 8)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
408 (const_int 2))))])
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
409
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
410 ;; These control RTL generation for conditional jump insns
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
411 ;; and match them for register allocation.
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
412 ;; Post reload these get expanded into insns that actually
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
413 ;; manipulate the condition code registers. We can't do that before
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
414 ;; because instructions generated by reload clobber condition codes (new
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
415 ;; CC design, type #2).
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
416 (define_insn_and_split "cbranchdf4"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
417 [(set (pc)
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
418 (if_then_else (match_operator 0 "ordered_comparison_operator"
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
419 [(match_operand:DF 1 "general_operand" "fg")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
420 (match_operand:DF 2 "general_operand" "a")])
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
421 (label_ref (match_operand 3 "" ""))
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
422 (pc)))]
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
423 "TARGET_FPU"
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
424 "#"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
425 "&& reload_completed"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
426 [(set (reg:CC FCC_REGNUM)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
427 (compare:CC (match_dup 1) (match_dup 2)))
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
428 (set (pc)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
429 (if_then_else (match_op_dup 0
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
430 [(reg:CC FCC_REGNUM) (const_int 0)])
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
431 (label_ref (match_dup 3))
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
432 (pc)))]
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
433 "")
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
434
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
435 (define_insn_and_split "cbranch<mode>4"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
436 [(set (pc)
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
437 (if_then_else (match_operator 0 "ordered_comparison_operator"
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
438 [(match_operand:QHSDint 1 "general_operand" "g")
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
439 (match_operand:QHSDint 2 "general_operand" "g")])
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
440 (label_ref (match_operand 3 "" ""))
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
441 (pc)))]
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
442 ""
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
443 "#"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
444 "reload_completed"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
445 [(set (reg:CC CC_REGNUM)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
446 (compare:CC (match_dup 1) (match_dup 2)))
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
447 (set (pc)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
448 (if_then_else (match_op_dup 0
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
449 [(reg:CC CC_REGNUM) (const_int 0)])
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
450 (label_ref (match_dup 3))
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
451 (pc)))]
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
452 "")
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
453
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
454 ;; This splitter turns a branch on float condition into a branch on
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
455 ;; CPU condition, by adding a CFCC.
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
456 (define_split
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
457 [(set (pc)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
458 (if_then_else (match_operator 0 "ordered_comparison_operator"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
459 [(reg:CC FCC_REGNUM) (const_int 0)])
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
460 (label_ref (match_operand 1 "" ""))
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
461 (pc)))]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
462 "TARGET_FPU && reload_completed"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
463 [(set (reg:CC CC_REGNUM) (reg:CC FCC_REGNUM))
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
464 (set (pc)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
465 (if_then_else (match_op_dup 0
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
466 [(reg:CC CC_REGNUM) (const_int 0)])
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
467 (label_ref (match_dup 1))
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
468 (pc)))]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
469 "")
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
470
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
471 (define_insn "cond_branch"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
472 [(set (pc)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
473 (if_then_else (match_operator 0 "ordered_comparison_operator"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
474 [(reg:CC CC_REGNUM) (const_int 0)])
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
475 (label_ref (match_operand 1 "" ""))
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
476 (pc)))]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
477 "reload_completed"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
478 "* return output_jump (operands, 0, get_attr_length (insn));"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
479 [(set (attr "length") (if_then_else (ior (lt (minus (match_dup 1)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
480 (pc))
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
481 (const_int MIN_BRANCH))
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
482 (gt (minus (match_dup 1)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
483 (pc))
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
484 (const_int MAX_BRANCH)))
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
485 (const_int 6)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
486 (const_int 2)))])
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
487
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
488 (define_insn "*branch"
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
489 [(set (pc)
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
490 (if_then_else (match_operator 0 "ccnz_operator"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
491 [(reg:CCNZ CC_REGNUM) (const_int 0)])
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
492 (label_ref (match_operand 1 "" ""))
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
493 (pc)))]
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
494 "reload_completed"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
495 "* return output_jump (operands, 1, get_attr_length (insn));"
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
496 [(set (attr "length") (if_then_else (ior (lt (minus (match_dup 1)
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
497 (pc))
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
498 (const_int MIN_BRANCH))
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
499 (gt (minus (match_dup 1)
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
500 (pc))
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
501 (const_int MAX_BRANCH)))
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
502 (const_int 6)
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
503 (const_int 2)))])
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
504
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
505
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
506 ;; Move instructions
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
507
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
508 ;; "length" is defined even though this pattern won't appear at
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
509 ;; assembly language output time. But the length is used by
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
510 ;; pdp11_insn_cost, before the post-reload splitter adds the
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
511 ;; CC clobber to the insn.
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
512 (define_insn "movdi"
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
513 [(set (match_operand:DI 0 "nonimmediate_operand" "=&r,g")
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
514 (match_operand:DI 1 "general_operand" "rN,g"))]
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
515 ""
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
516 ""
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
517 [(set_attr "length" "16,32")])
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
518
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
519
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
520 (define_insn "*movdi_nocc"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
521 [(set (match_operand:DI 0 "nonimmediate_operand" "=&r,g")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
522 (match_operand:DI 1 "general_operand" "rN,g"))
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
523 (clobber (reg:CC CC_REGNUM))]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
524 ""
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
525 "* return output_move_multiple (operands);"
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
526 [(set_attr "length" "16,32")])
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
527
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
528 (define_insn "movsi"
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
529 [(set (match_operand:SI 0 "nonimmediate_operand" "=r,r,g,g")
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
530 (match_operand:SI 1 "general_operand" "rN,IJ,IJ,g"))]
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
531 ""
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
532 ""
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
533 [(set_attr "length" "4,6,8,16")])
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
534
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
535 (define_insn "*movsi_nocc"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
536 [(set (match_operand:SI 0 "nonimmediate_operand" "=r,r,g,g")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
537 (match_operand:SI 1 "general_operand" "rN,IJ,IJ,g"))
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
538 (clobber (reg:CC CC_REGNUM))]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
539 ""
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
540 "* return output_move_multiple (operands);"
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
541 [(set_attr "length" "4,6,8,16")])
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
542
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
543 ;; That long string of "Z" constraints enforces the restriction that
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
544 ;; a register source and auto increment or decrement destination must
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
545 ;; not use the same register, because that case is not consistently
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
546 ;; implemented across the PDP11 models.
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
547 ;; TODO: the same should be applied to insn like add, but this is not
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
548 ;; necessary yet because the incdec optimization pass does not apply
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
549 ;; that optimization to 3-operand insns at the moment.
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
550 (define_insn "mov<mode>"
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
551 [(set (match_operand:PDPint 0 "nonimmediate_operand" "=rR,Za,Zb,Zc,Zd,Ze,Zf,Zg,rD,rR,Q,Q")
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
552 (match_operand:PDPint 1 "general_operand" "RN,Z0,Z1,Z2,Z3,Z4,Z5,Z6,r,Qi,rRN,Qi"))]
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
553 ""
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
554 ""
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
555 [(set_attr "length" "2,2,2,2,2,2,2,2,2,4,4,6")])
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
556
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
557 ;; This splits all the integer moves: DI and SI modes as well as
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
558 ;; the simple machine operations.
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
559 (define_split
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
560 [(set (match_operand:QHSDint 0 "nonimmediate_operand" "")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
561 (match_operand:QHSDint 1 "general_operand" ""))]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
562 "reload_completed"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
563 [(parallel [(set (match_dup 0)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
564 (match_dup 1))
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
565 (clobber (reg:CC CC_REGNUM))])]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
566 "")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
567
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
568 ;; MOV clears V
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
569 (define_insn "*mov<mode>_<cc_cc>"
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
570 [(set (match_operand:PDPint 0 "nonimmediate_operand" "=rR,Za,Zb,Zc,Zd,Ze,Zf,Zg,rD,rR,Q,Q")
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
571 (match_operand:PDPint 1 "general_operand" "RN,Z0,Z1,Z2,Z3,Z4,Z5,Z6,r,Qi,rRN,Qi"))
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
572 (clobber (reg:CC CC_REGNUM))]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
573 "reload_completed"
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
574 "*
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
575 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
576 if (operands[1] == const0_rtx)
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
577 return \"clr<PDPint:isfx>\t%0\";
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
578
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
579 return \"mov<PDPint:isfx>\t%1,%0\";
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
580 }"
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
581 [(set_attr "length" "2,2,2,2,2,2,2,2,2,4,4,6")])
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
582
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
583 ;; movdf has unusually complicated condition code handling, because
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
584 ;; load (into float register) updates the FCC, while store (from
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
585 ;; float register) leaves it untouched.
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
586 ;;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
587 ;; 1. Loads are: ac4, ac5, or non-register into load-register
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
588 ;; 2. Stores are: load-register to non-register, ac4, or ac5
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
589 ;; 3. Moves from ac0-ac3 to another ac0-ac3 can be handled
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
590 ;; either as loads or as stores.
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
591
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
592 (define_expand "movdf"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
593 [(set (match_operand:DF 0 "float_nonimm_operand" "")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
594 (match_operand:DF 1 "float_operand" ""))]
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
595 "TARGET_FPU"
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
596 "")
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
597
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
598 ;; Splitter for all these cases. Store is the first two
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
599 ;; alternatives, which are not split. Note that case 3
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
600 ;; is treated as a store, i.e., not split.
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
601 (define_insn_and_split "movdf_split"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
602 [(set (match_operand:DF 0 "float_nonimm_operand" "=fR,FQ,a,a,a")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
603 (match_operand:DF 1 "float_operand" "a,a,hR,FQ,G"))]
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
604 "TARGET_FPU"
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
605 "*
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
606 gcc_assert (which_alternative < 2);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
607 return \"std\t%1,%0\";
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
608 "
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
609 "&& reload_completed"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
610 [(parallel [(set (match_dup 0)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
611 (match_dup 1))
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
612 (clobber (reg:CC FCC_REGNUM))])]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
613 "{
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
614 if (GET_CODE (operands[1]) == REG &&
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
615 REGNO_REG_CLASS (REGNO (operands[1])) == LOAD_FPU_REGS)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
616 FAIL;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
617 }"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
618 [(set_attr "length" "2,4,0,0,0")])
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
619
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
620 ;; Loads (case 1).
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
621 (define_insn "*ldd<fcc_cc>"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
622 [(set (match_operand:DF 0 "float_nonimm_operand" "=a,a,a")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
623 (match_operand:DF 1 "float_operand" "hR,FQ,G"))
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
624 (clobber (reg:CC FCC_REGNUM))]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
625 "TARGET_FPU && reload_completed"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
626 "@
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
627 ldd\t%1,%0
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
628 ldd\t%1,%0
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
629 clrd\t%0"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
630 [(set_attr "length" "2,4,2")])
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
631
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
632 ;; SFmode is easier because that uses convert load/store, which
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
633 ;; always change condition codes.
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
634 ;; Note that these insns are cheating a bit. We actually have
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
635 ;; DFmode operands in the FPU registers, which is why the
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
636 ;; ldcfd and stcdf instructions appear. But GCC likes to think
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
637 ;; of these as SFmode loads and does the conversion once in the
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
638 ;; register, at least in many cases. So we pretend to do this,
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
639 ;; but then extend and truncate register-to-register are NOP and
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
640 ;; generate no code.
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
641 (define_insn_and_split "movsf"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
642 [(set (match_operand:SF 0 "float_nonimm_operand" "=a,fR,a,Q,a")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
643 (match_operand:SF 1 "float_operand" "fRG,a,FQ,a,G"))]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
644 "TARGET_FPU"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
645 "#"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
646 "&& reload_completed"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
647 [(parallel [(set (match_dup 0)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
648 (match_dup 1))
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
649 (clobber (reg:CC FCC_REGNUM))])]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
650 ""
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
651 [(set_attr "length" "2,2,4,4,2")])
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
652
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
653 (define_insn "*movsf<fcc_ccnz>"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
654 [(set (match_operand:SF 0 "float_nonimm_operand" "=a,fR,a,Q,a")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
655 (match_operand:SF 1 "float_operand" "fR,a,FQ,a,G"))
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
656 (clobber (reg:CC FCC_REGNUM))]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
657 "TARGET_FPU && reload_completed"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
658 "@
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
659 {ldcfd|movof}\t%1,%0
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
660 {stcdf|movfo}\t%1,%0
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
661 {ldcfd|movof}\t%1,%0
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
662 {stcdf|movfo}\t%1,%0
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
663 clrf\t%0"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
664 [(set_attr "length" "2,2,4,4,2")])
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
665
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
666 ;; Expand a block move. We turn this into a move loop.
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
667 (define_expand "cpymemhi"
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
668 [(parallel [(unspec_volatile [(const_int 0)] UNSPECV_CPYMEM)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
669 (match_operand:BLK 0 "general_operand" "=g")
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
670 (match_operand:BLK 1 "general_operand" "g")
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
671 (match_operand:HI 2 "immediate_operand" "i")
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
672 (match_operand:HI 3 "immediate_operand" "i")
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
673 (clobber (mem:BLK (scratch)))
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
674 (clobber (match_dup 0))
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
675 (clobber (match_dup 1))
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
676 (clobber (match_dup 2))])]
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
677 ""
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
678 "
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
679 {
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
680 int count;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
681 count = INTVAL (operands[2]);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
682 if (count == 0)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
683 DONE;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
684 if (INTVAL (operands [3]) >= 2 && (count & 1) == 0)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
685 count >>= 1;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
686 else
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
687 operands[3] = const1_rtx;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
688 operands[2] = copy_to_mode_reg (HImode,
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
689 gen_rtx_CONST_INT (HImode, count));
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
690
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
691 /* Load BLKmode MEM addresses into scratch registers. */
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
692 operands[0] = copy_to_mode_reg (Pmode, XEXP (operands[0], 0));
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
693 operands[1] = copy_to_mode_reg (Pmode, XEXP (operands[1], 0));
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
694 }")
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
695
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
696 ;; Expand a block move. We turn this into a move loop.
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
697 (define_insn_and_split "cpymemhi1"
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
698 [(unspec_volatile [(const_int 0)] UNSPECV_CPYMEM)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
699 (match_operand:HI 0 "register_operand" "+r")
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
700 (match_operand:HI 1 "register_operand" "+r")
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
701 (match_operand:HI 2 "register_operand" "+r")
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
702 (match_operand:HI 3 "immediate_operand" "i")
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
703 (clobber (mem:BLK (scratch)))
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
704 (clobber (match_dup 0))
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
705 (clobber (match_dup 1))
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
706 (clobber (match_dup 2))]
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
707 ""
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
708 "#"
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
709 "reload_completed"
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
710 [(parallel [(unspec_volatile [(const_int 0)] UNSPECV_CPYMEM)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
711 (match_dup 0)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
712 (match_dup 1)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
713 (match_dup 2)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
714 (match_dup 3)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
715 (clobber (mem:BLK (scratch)))
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
716 (clobber (match_dup 0))
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
717 (clobber (match_dup 1))
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
718 (clobber (match_dup 2))
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
719 (clobber (reg:CC CC_REGNUM))])]
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
720 "")
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
721
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
722 (define_insn "cpymemhi_nocc"
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
723 [(unspec_volatile [(const_int 0)] UNSPECV_CPYMEM)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
724 (match_operand:HI 0 "register_operand" "+r")
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
725 (match_operand:HI 1 "register_operand" "+r")
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
726 (match_operand:HI 2 "register_operand" "+r")
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
727 (match_operand:HI 3 "immediate_operand" "i")
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
728 (clobber (mem:BLK (scratch)))
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
729 (clobber (match_dup 0))
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
730 (clobber (match_dup 1))
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
731 (clobber (match_dup 2))
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
732 (clobber (reg:CC CC_REGNUM))]
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
733 "reload_completed"
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
734 "*
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
735 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
736 rtx lb[2];
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
737
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
738 lb[0] = operands[2];
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
739 lb[1] = gen_label_rtx ();
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
740
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
741 output_asm_label (lb[1]);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
742 fputs (\":\n\", asm_out_file);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
743 if (INTVAL (operands[3]) > 1)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
744 output_asm_insn (\"mov\t(%1)+,(%0)+\", operands);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
745 else
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
746 output_asm_insn (\"movb\t(%1)+,(%0)+\", operands);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
747 if (TARGET_40_PLUS)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
748 output_asm_insn (\"sob\t%0,%l1\", lb);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
749 else
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
750 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
751 output_asm_insn (\"dec\t%0\", lb);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
752 output_asm_insn (\"bne\t%l1\", lb);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
753 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
754 return \"\";
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
755 }"
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
756 [(set (attr "length")
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
757 (if_then_else (match_test "TARGET_40_PLUS")
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
758 (const_int 4)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
759 (const_int 6)))])
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
760
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
761 ;;- truncation instructions
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
762
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
763 ;; We sometimes end up doing a register to register truncate,
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
764 ;; which isn't right because we actually load registers always
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
765 ;; with a DFmode value. But even with PROMOTE the compiler
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
766 ;; doesn't always get that (so we don't use it). That means
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
767 ;; a register to register truncate is a NOP.
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
768 (define_insn_and_split "truncdfsf2"
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
769 [(set (match_operand:SF 0 "float_nonimm_operand" "=f,R,Q")
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
770 (float_truncate:SF (match_operand:DF 1 "register_operand" "0,a,a")))]
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
771 "TARGET_FPU"
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
772 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
773 gcc_assert (which_alternative == 0);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
774 return "";
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
775 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
776 "&& reload_completed"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
777 [(parallel [(set (match_dup 0) (float_truncate:SF (match_dup 1)))
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
778 (clobber (reg:CC FCC_REGNUM))])]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
779 "{
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
780 if (GET_CODE (operands[0]) == REG &&
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
781 GET_CODE (operands[1]) == REG &&
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
782 REGNO (operands[0]) == REGNO (operands[1]))
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
783 FAIL;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
784 }"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
785 [(set_attr "length" "0,0,0")])
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
786
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
787 (define_insn "*truncdfsf2_<fcc_cc>"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
788 [(set (match_operand:SF 0 "float_nonimm_operand" "=R,Q")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
789 (float_truncate:SF (match_operand:DF 1 "register_operand" "a,a")))
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
790 (clobber (reg:CC FCC_REGNUM))]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
791 "TARGET_FPU && reload_completed"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
792 "{stcdf|movfo}\t%1,%0"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
793 [(set_attr "length" "2,4")])
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
794
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
795
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
796 ;;- zero extension instruction
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
797
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
798 (define_insn_and_split "zero_extendqihi2"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
799 [(set (match_operand:HI 0 "nonimmediate_operand" "=rD,Q,&r,&r")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
800 (zero_extend:HI (match_operand:QI 1 "general_operand" "0,0,rR,Q")))]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
801 ""
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
802 "#"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
803 "reload_completed"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
804 [(parallel [(set (match_dup 0) (zero_extend:HI (match_dup 1)))
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
805 (clobber (reg:CC CC_REGNUM))])]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
806 "{
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
807 rtx r;
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
808
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
809 if (!REG_P (operands[0]))
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
810 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
811 r = gen_rtx_MEM (QImode, operands[0]);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
812 adjust_address (r, QImode, 1);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
813 emit_move_insn (r, const0_rtx);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
814 DONE;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
815 }
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
816 else if (!REG_P (operands[1]) ||
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
817 REGNO (operands[0]) != REGNO (operands[1]))
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
818 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
819 /* Alternatives 2 and 3 */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
820 emit_move_insn (operands[0], const0_rtx);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
821 r = gen_rtx_REG (QImode, REGNO (operands[0]));
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
822 emit_insn (gen_iorqi3_nocc (r, r, operands[1]));
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
823 DONE;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
824 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
825 }"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
826 [(set_attr "length" "4,4,4,6")])
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
827
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
828 (define_insn "*zero_extendqihi2<cc_cc>"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
829 [(parallel [(set (match_operand:HI 0 "nonimmediate_operand" "=rR,Q")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
830 (zero_extend:HI (match_operand:QI 1 "general_operand" "0,0")))
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
831 (clobber (reg:CC CC_REGNUM))])]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
832 "reload_completed"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
833 "bic\t%#0177400,%0"
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
834 [(set_attr "length" "4,6")])
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
835
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
836 ;;- sign extension instructions
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
837
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
838 ;; We sometimes end up doing a register to register extend,
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
839 ;; which isn't right because we actually load registers always
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
840 ;; with a DFmode value. But even with PROMOTE the compiler
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
841 ;; doesn't always get that (so we don't use it). That means
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
842 ;; a register to register truncate is a NOP.
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
843 (define_insn_and_split "extendsfdf2"
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
844 [(set (match_operand:DF 0 "register_operand" "=f,a,a")
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
845 (float_extend:DF (match_operand:SF 1 "float_operand" "0,R,Q")))]
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
846 "TARGET_FPU"
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
847 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
848 gcc_assert (which_alternative == 0);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
849 return "";
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
850 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
851 "&& reload_completed"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
852 [(parallel [(set (match_dup 0) (float_extend:DF (match_dup 1)))
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
853 (clobber (reg:CC FCC_REGNUM))])]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
854 "{
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
855 if (GET_CODE (operands[0]) == REG &&
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
856 GET_CODE (operands[1]) == REG &&
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
857 REGNO (operands[0]) == REGNO (operands[1]))
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
858 FAIL;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
859 }"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
860 [(set_attr "length" "0,0,0")])
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
861
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
862 (define_insn "*extendsfdf2_<fcc_cc>"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
863 [(set (match_operand:DF 0 "register_operand" "=a,a")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
864 (float_extend:DF (match_operand:SF 1 "float_operand" "R,Q")))
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
865 (clobber (reg:CC FCC_REGNUM))]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
866 "TARGET_FPU && reload_completed"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
867 "{ldcfd|movof}\t%1,%0"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
868 [(set_attr "length" "2,4")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
869 (set_attr "base_cost" "6")])
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
870
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
871 ;; movb sign extends if destination is a register
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
872 (define_insn_and_split "extendqihi2"
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
873 [(set (match_operand:HI 0 "register_operand" "=r,r")
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
874 (sign_extend:HI (match_operand:QI 1 "general_operand" "rR,Q")))]
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
875 ""
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
876 "#"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
877 "reload_completed"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
878 [(parallel [(set (match_dup 0) (sign_extend:HI (match_dup 1)))
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
879 (clobber (reg:CC CC_REGNUM))])]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
880 ""
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
881 [(set_attr "length" "2,4")])
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
882
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
883 ;; MOVB clears V
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
884 (define_insn "*extendqihi2<cc_cc>"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
885 [(set (match_operand:HI 0 "register_operand" "=r,r")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
886 (sign_extend:HI (match_operand:QI 1 "general_operand" "rR,Q")))
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
887 (clobber (reg:CC CC_REGNUM))]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
888 "reload_completed"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
889 "movb\t%1,%0"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
890 [(set_attr "length" "2,4")])
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
891
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
892 (define_insn_and_split "extendhisi2"
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
893 [(set (match_operand:SI 0 "nonimmediate_operand" "=o,<,r")
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
894 (sign_extend:SI (match_operand:HI 1 "general_operand" "g,g,g")))]
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
895 "TARGET_40_PLUS"
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
896 "#"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
897 "&& reload_completed"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
898 [(parallel [(set (match_dup 0) (sign_extend:SI (match_dup 1)))
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
899 (clobber (reg:CC CC_REGNUM))])]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
900 ""
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
901 [(set_attr "length" "10,6,6")])
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
902
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
903 (define_insn "*extendhisi2_nocc"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
904 [(set (match_operand:SI 0 "nonimmediate_operand" "=o,<,r")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
905 (sign_extend:SI (match_operand:HI 1 "general_operand" "g,g,g")))
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
906 (clobber (reg:CC CC_REGNUM))]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
907 "TARGET_40_PLUS && reload_completed"
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
908 "*
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
909 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
910 rtx latehalf[2];
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
911
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
912 /* we don't want to mess with auto increment */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
913
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
914 switch (which_alternative)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
915 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
916 case 0:
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
917
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
918 latehalf[0] = operands[0];
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
919 operands[0] = adjust_address(operands[0], HImode, 2);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
920
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
921 output_asm_insn(\"mov\t%1,%0\", operands);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
922 output_asm_insn(\"sxt\t%0\", latehalf);
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
923
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
924 return \"\";
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
925
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
926 case 1:
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
927
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
928 /* - auto-decrement - right direction ;-) */
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
929 output_asm_insn(\"mov\t%1,%0\", operands);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
930 output_asm_insn(\"sxt\t%0\", operands);
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
931
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
932 return \"\";
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
933
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
934 case 2:
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
935
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
936 /* make register pair available */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
937 latehalf[0] = operands[0];
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
938 operands[0] = gen_rtx_REG (HImode, REGNO (operands[0]) + 1);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
939
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
940 output_asm_insn(\"mov\t%1,%0\", operands);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
941 output_asm_insn(\"sxt\t%0\", latehalf);
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
942
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
943 return \"\";
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
944
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
945 default:
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
946
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
947 gcc_unreachable ();
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
948 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
949 }"
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
950 [(set_attr "length" "10,6,6")])
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
951
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
952 ;; make float to int and vice versa
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
953 ;; assume that we are normally in double and integer mode -
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
954 ;; what do pdp library routines do to fpu mode ?
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
955
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
956 ;; Note: the hardware treats register source as
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
957 ;; a 16-bit (high order only) source, which isn't
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
958 ;; what we want. But we do need to support register
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
959 ;; dest because gcc asks for it.
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
960 (define_insn_and_split "floatsidf2"
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
961 [(set (match_operand:DF 0 "register_operand" "=a,a,a")
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
962 (float:DF (match_operand:SI 1 "general_operand" "r,R,Q")))]
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
963 "TARGET_FPU"
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
964 "#"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
965 "&& reload_completed"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
966 [(parallel [(set (match_dup 0) (float:DF (match_dup 1)))
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
967 (clobber (reg:CC FCC_REGNUM))])]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
968 ""
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
969 [(set_attr "length" "10,6,8")])
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
970
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
971 (define_insn "*floatsidf2<fcc_cc>"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
972 [(set (match_operand:DF 0 "register_operand" "=a,a,a")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
973 (float:DF (match_operand:SI 1 "general_operand" "r,R,Q")))
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
974 (clobber (reg:CC FCC_REGNUM))]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
975 "TARGET_FPU && reload_completed"
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
976 "* if (which_alternative ==0)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
977 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
978 rtx latehalf[2];
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
979
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
980 latehalf[0] = NULL;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
981 latehalf[1] = gen_rtx_REG (HImode, REGNO (operands[1]) + 1);
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
982 output_asm_insn(\"mov\t%1,-(sp)\", latehalf);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
983 output_asm_insn(\"mov\t%1,-(sp)\", operands);
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
984
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
985 output_asm_insn(\"setl\", operands);
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
986 output_asm_insn(\"{ldcld|movif}\t(sp)+,%0\", operands);
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
987 output_asm_insn(\"seti\", operands);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
988 return \"\";
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
989 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
990 else
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
991 return \"setl\;{ldcld|movif}\t%1,%0\;seti\";
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
992 "
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
993 [(set_attr "length" "10,6,8")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
994 (set_attr "base_cost" "12")])
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
995
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
996 (define_insn_and_split "floathidf2"
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
997 [(set (match_operand:DF 0 "register_operand" "=a,a")
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
998 (float:DF (match_operand:HI 1 "general_operand" "rR,Qi")))]
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
999 "TARGET_FPU"
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1000 "#"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1001 "&& reload_completed"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1002 [(parallel [(set (match_dup 0) (float:DF (match_dup 1)))
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1003 (clobber (reg:CC FCC_REGNUM))])]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1004 ""
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1005 [(set_attr "length" "2,4")])
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1006
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1007 (define_insn "*floathidf2<fcc_cc>"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1008 [(set (match_operand:DF 0 "register_operand" "=a,a")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1009 (float:DF (match_operand:HI 1 "general_operand" "rR,Qi")))
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1010 (clobber (reg:CC FCC_REGNUM))]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1011 "TARGET_FPU && reload_completed"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1012 "{ldcid|movif}\t%1,%0"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1013 [(set_attr "length" "2,4")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1014 (set_attr "base_cost" "12")])
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1015
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1016 ;; cut float to int
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1017
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1018 ;; Note: the hardware treats register destination as
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1019 ;; a 16-bit (high order only) destination, which isn't
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1020 ;; what we want. But we do need to support register
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1021 ;; dest because gcc asks for it.
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1022 (define_insn_and_split "fix_truncdfsi2"
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1023 [(set (match_operand:SI 0 "nonimmediate_operand" "=r,R,Q")
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1024 (fix:SI (fix:DF (match_operand:DF 1 "register_operand" "a,a,a"))))]
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1025 "TARGET_FPU"
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1026 "#"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1027 "&& reload_completed"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1028 [(parallel [(set (match_dup 0) (fix:SI (fix:DF (match_dup 1))))
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1029 (clobber (reg:CC CC_REGNUM))
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1030 (clobber (reg:CC FCC_REGNUM))])]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1031 ""
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1032 [(set_attr "length" "10,6,8")])
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1033
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1034 ;; Note: this clobbers both sets of condition codes!
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1035 (define_insn "*fix_truncdfsi2_nocc"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1036 [(set (match_operand:SI 0 "nonimmediate_operand" "=r,R,Q")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1037 (fix:SI (fix:DF (match_operand:DF 1 "register_operand" "a,a,a"))))
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1038 (clobber (reg:CC CC_REGNUM))
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1039 (clobber (reg:CC FCC_REGNUM))]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1040 "TARGET_FPU && reload_completed"
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1041 "* if (which_alternative ==0)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1042 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1043 output_asm_insn(\"setl\", operands);
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1044 output_asm_insn(\"{stcdl|movfi}\t%1,-(sp)\", operands);
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1045 output_asm_insn(\"seti\", operands);
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1046 output_asm_insn(\"mov\t(sp)+,%0\", operands);
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1047 operands[0] = gen_rtx_REG (HImode, REGNO (operands[0]) + 1);
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1048 output_asm_insn(\"mov\t(sp)+,%0\", operands);
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1049 return \"\";
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1050 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1051 else
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1052 return \"setl\;{stcdl|movfi}\t%1,%0\;seti\";
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1053 "
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1054 [(set_attr "length" "10,6,8")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1055 (set_attr "base_cost" "12")])
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1056
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1057 (define_insn_and_split "fix_truncdfhi2"
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1058 [(set (match_operand:HI 0 "nonimmediate_operand" "=rR,Q")
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1059 (fix:HI (fix:DF (match_operand:DF 1 "register_operand" "a,a"))))]
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1060 "TARGET_FPU"
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1061 "#"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1062 "&& reload_completed"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1063 [(parallel [(set (match_dup 0) (fix:HI (fix:DF (match_dup 1))))
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1064 (clobber (reg:CC CC_REGNUM))
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1065 (clobber (reg:CC FCC_REGNUM))])]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1066 ""
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1067 [(set_attr "length" "2,4")])
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1068
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1069 ;; Note: this clobbers both sets of condition codes!
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1070 (define_insn "*fix_truncdfhi2_nocc"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1071 [(set (match_operand:HI 0 "nonimmediate_operand" "=rR,Q")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1072 (fix:HI (fix:DF (match_operand:DF 1 "register_operand" "a,a"))))
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1073 (clobber (reg:CC CC_REGNUM))
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1074 (clobber (reg:CC FCC_REGNUM))]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1075 "TARGET_FPU && reload_completed"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1076 "{stcdi|movfi}\t%1,%0"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1077 [(set_attr "length" "2,4")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1078 (set_attr "base_cost" "12")])
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1079
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1080
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1081 ;;- arithmetic instructions
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1082 ;;- add instructions
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1083
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1084 (define_insn_and_split "adddf3"
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1085 [(set (match_operand:DF 0 "register_operand" "=a,a")
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1086 (plus:DF (match_operand:DF 1 "register_operand" "%0,0")
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1087 (match_operand:DF 2 "general_operand" "fR,QF")))]
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1088 "TARGET_FPU"
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1089 "#"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1090 "&& reload_completed"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1091 [(parallel [(set (match_dup 0)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1092 (plus:DF (match_dup 1) (match_dup 2)))
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1093 (clobber (reg:CC FCC_REGNUM))])]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1094 ""
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1095 [(set_attr "length" "2,4")])
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1096
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1097 ;; Float add sets V if overflow from add
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1098 (define_insn "*adddf3<fcc_ccnz>"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1099 [(set (match_operand:DF 0 "register_operand" "=a,a")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1100 (plus:DF (match_operand:DF 1 "register_operand" "%0,0")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1101 (match_operand:DF 2 "general_operand" "fR,QF")))
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1102 (clobber (reg:CC FCC_REGNUM))]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1103 "TARGET_FPU && reload_completed"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1104 "{addd|addf}\t%2,%0"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1105 [(set_attr "length" "2,4")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1106 (set_attr "base_cost" "6")])
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1107
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1108 (define_insn_and_split "adddi3"
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1109 [(set (match_operand:DI 0 "nonimmediate_operand" "=&r,r,o,o")
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1110 (plus:DI (match_operand:DI 1 "general_operand" "%0,0,0,0")
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1111 (match_operand:DI 2 "general_operand" "r,on,r,on")))]
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1112 ""
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1113 "#"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1114 "reload_completed"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1115 [(parallel [(set (match_dup 0) (plus:DI (match_dup 1) (match_dup 2)))
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1116 (clobber (reg:CC CC_REGNUM))])]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1117 ""
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1118 [(set_attr "length" "20,28,40,48")])
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1119
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1120 (define_insn "*adddi3_nocc"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1121 [(set (match_operand:DI 0 "nonimmediate_operand" "=&r,r,o,o")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1122 (plus:DI (match_operand:DI 1 "general_operand" "%0,0,0,0")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1123 (match_operand:DI 2 "general_operand" "r,on,r,on")))
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1124 (clobber (reg:CC CC_REGNUM))]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1125 "reload_completed"
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1126 "*
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1127 {
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1128 rtx inops[2];
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1129 rtx exops[4][2];
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1130
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1131 inops[0] = operands[0];
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1132 inops[1] = operands[2];
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1133 pdp11_expand_operands (inops, exops, 2, 4, NULL, big);
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1134
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1135 if (!CONST_INT_P (exops[0][1]) || INTVAL (exops[0][1]) != 0)
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1136 output_asm_insn (\"add\t%1,%0\", exops[0]);
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1137 if (!CONST_INT_P (exops[1][1]) || INTVAL (exops[1][1]) != 0)
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1138 {
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1139 output_asm_insn (\"add\t%1,%0\", exops[1]);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1140 output_asm_insn (\"adc\t%0\", exops[0]);
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1141 }
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1142 if (!CONST_INT_P (exops[2][1]) || INTVAL (exops[2][1]) != 0)
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1143 {
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1144 output_asm_insn (\"add\t%1,%0\", exops[2]);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1145 output_asm_insn (\"adc\t%0\", exops[1]);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1146 output_asm_insn (\"adc\t%0\", exops[0]);
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1147 }
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1148 if (!CONST_INT_P (exops[3][1]) || INTVAL (exops[3][1]) != 0)
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1149 {
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1150 output_asm_insn (\"add\t%1,%0\", exops[3]);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1151 output_asm_insn (\"adc\t%0\", exops[2]);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1152 output_asm_insn (\"adc\t%0\", exops[1]);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1153 output_asm_insn (\"adc\t%0\", exops[0]);
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1154 }
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1155
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1156 return \"\";
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1157 }"
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1158 [(set_attr "length" "20,28,40,48")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1159 (set_attr "base_cost" "0")])
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1160
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1161 ;; Note that the register operand is not marked earlyclobber.
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1162 ;; The reason is that SI values go in register pairs, so they
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1163 ;; can't partially overlap. They can be either disjoint, or
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1164 ;; source and destination can be equal. The latter case is
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1165 ;; handled properly because of the ordering of the individual
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1166 ;; instructions used. Specifically, carry from the low to the
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1167 ;; high word is added at the end, so the adding of the high parts
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1168 ;; will always used the original high part and not a high part
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1169 ;; modified by carry (which would amount to double carry).
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1170 (define_insn_and_split "addsi3"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1171 [(set (match_operand:SI 0 "nonimmediate_operand" "=&r,r,o,o")
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1172 (plus:SI (match_operand:SI 1 "general_operand" "%0,0,0,0")
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1173 (match_operand:SI 2 "general_operand" "r,on,r,on")))]
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1174 ""
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1175 "#"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1176 "reload_completed"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1177 [(parallel [(set (match_dup 0) (plus:SI (match_dup 1) (match_dup 2)))
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1178 (clobber (reg:CC CC_REGNUM))])]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1179 ""
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1180 [(set_attr "length" "6,10,12,16")])
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1181
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1182 (define_insn "*addsi3_nocc"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1183 [(set (match_operand:SI 0 "nonimmediate_operand" "=&r,r,o,o")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1184 (plus:SI (match_operand:SI 1 "general_operand" "%0,0,0,0")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1185 (match_operand:SI 2 "general_operand" "r,on,r,on")))
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1186 (clobber (reg:CC CC_REGNUM))]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1187 "reload_completed"
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1188 "*
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1189 {
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1190 rtx inops[2];
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1191 rtx exops[2][2];
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1192
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1193 inops[0] = operands[0];
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1194 inops[1] = operands[2];
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1195 pdp11_expand_operands (inops, exops, 2, 2, NULL, big);
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1196
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1197 if (!CONST_INT_P (exops[0][1]) || INTVAL (exops[0][1]) != 0)
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1198 output_asm_insn (\"add\t%1,%0\", exops[0]);
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1199 if (!CONST_INT_P (exops[1][1]) || INTVAL (exops[1][1]) != 0)
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1200 {
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1201 output_asm_insn (\"add\t%1,%0\", exops[1]);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1202 output_asm_insn (\"adc\t%0\", exops[0]);
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1203 }
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1204
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1205 return \"\";
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1206 }"
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1207 [(set_attr "length" "6,10,12,16")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1208 (set_attr "base_cost" "0")])
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1209
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1210 (define_insn_and_split "addhi3"
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1211 [(set (match_operand:HI 0 "nonimmediate_operand" "=rR,rR,Q,Q")
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1212 (plus:HI (match_operand:HI 1 "general_operand" "%0,0,0,0")
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1213 (match_operand:HI 2 "general_operand" "rRLM,Qi,rRLM,Qi")))]
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1214 ""
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1215 "#"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1216 "reload_completed"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1217 [(parallel [(set (match_dup 0)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1218 (plus:HI (match_dup 1) (match_dup 2)))
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1219 (clobber (reg:CC CC_REGNUM))])]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1220 ""
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1221 [(set_attr "length" "2,4,4,6")])
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1222
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1223 ;; Add sets V if overflow from the add
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1224 (define_insn "*addhi3<cc_ccnz>"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1225 [(set (match_operand:HI 0 "nonimmediate_operand" "=rR,rR,Q,Q")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1226 (plus:HI (match_operand:HI 1 "general_operand" "%0,0,0,0")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1227 (match_operand:HI 2 "general_operand" "rRLM,Qi,rRLM,Qi")))
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1228 (clobber (reg:CC CC_REGNUM))]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1229 "reload_completed"
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1230 "*
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1231 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1232 if (GET_CODE (operands[2]) == CONST_INT)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1233 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1234 if (INTVAL(operands[2]) == 1)
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1235 return \"inc\t%0\";
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1236 else if (INTVAL(operands[2]) == -1)
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1237 return \"dec\t%0\";
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1238 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1239
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1240 return \"add\t%2,%0\";
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1241 }"
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1242 [(set_attr "length" "2,4,4,6")])
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1243
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1244 (define_insn_and_split "addqi3"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1245 [(set (match_operand:QI 0 "nonimmediate_operand" "=rR,Q")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1246 (plus:QI (match_operand:QI 1 "general_operand" "%0,0")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1247 (match_operand:QI 2 "incdec_operand" "LM,LM")))]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1248 ""
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1249 "#"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1250 "reload_completed"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1251 [(parallel [(set (match_dup 0)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1252 (plus:QI (match_dup 1) (match_dup 2)))
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1253 (clobber (reg:CC CC_REGNUM))])]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1254 ""
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1255 [(set_attr "length" "2,4")])
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1256
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1257 ;; Inc/dec sets V if overflow from the operation
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1258 (define_insn "*addqi3<cc_ccnz>"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1259 [(set (match_operand:QI 0 "nonimmediate_operand" "=rR,Q")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1260 (plus:QI (match_operand:QI 1 "general_operand" "%0,0")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1261 (match_operand:QI 2 "incdec_operand" "LM,LM")))
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1262 (clobber (reg:CC CC_REGNUM))]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1263 "reload_completed"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1264 "*
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1265 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1266 if (INTVAL(operands[2]) == 1)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1267 return \"incb\t%0\";
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1268 else
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1269 return \"decb\t%0\";
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1270 }"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1271 [(set_attr "length" "2,4")])
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1272
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1273
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1274 ;;- subtract instructions
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1275 ;; we don't have to care for constant second
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1276 ;; args, since they are canonical plus:xx now!
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1277 ;; also for minus:DF ??
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1278
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1279 (define_insn_and_split "subdf3"
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1280 [(set (match_operand:DF 0 "register_operand" "=a,a")
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1281 (minus:DF (match_operand:DF 1 "register_operand" "0,0")
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1282 (match_operand:DF 2 "general_operand" "fR,Q")))]
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1283 "TARGET_FPU"
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1284 "#"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1285 "&& reload_completed"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1286 [(parallel [(set (match_dup 0)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1287 (minus:DF (match_dup 1) (match_dup 2)))
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1288 (clobber (reg:CC FCC_REGNUM))])]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1289 ""
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1290 [(set_attr "length" "2,4")])
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1291
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1292 (define_insn "*subdf3<fcc_ccnz>"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1293 [(set (match_operand:DF 0 "register_operand" "=a,a")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1294 (minus:DF (match_operand:DF 1 "register_operand" "0,0")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1295 (match_operand:DF 2 "general_operand" "fR,QF")))
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1296 (clobber (reg:CC FCC_REGNUM))]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1297 "TARGET_FPU && reload_completed"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1298 "{subd|subf}\t%2,%0"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1299 [(set_attr "length" "2,4")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1300 (set_attr "base_cost" "6")])
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1301
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1302 (define_insn_and_split "subdi3"
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1303 [(set (match_operand:DI 0 "nonimmediate_operand" "=&r,r,o,o")
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1304 (minus:DI (match_operand:DI 1 "general_operand" "0,0,0,0")
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1305 (match_operand:DI 2 "general_operand" "r,on,r,on")))]
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1306 ""
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1307 "#"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1308 "reload_completed"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1309 [(parallel [(set (match_dup 0) (minus:DI (match_dup 1) (match_dup 2)))
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1310 (clobber (reg:CC CC_REGNUM))])]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1311 ""
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1312 [(set_attr "length" "20,28,40,48")])
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1313
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1314 (define_insn "*subdi3_nocc"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1315 [(set (match_operand:DI 0 "nonimmediate_operand" "=&r,r,o,o")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1316 (minus:DI (match_operand:DI 1 "general_operand" "0,0,0,0")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1317 (match_operand:DI 2 "general_operand" "r,on,r,on")))
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1318 (clobber (reg:CC CC_REGNUM))]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1319 "reload_completed"
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1320 "*
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1321 {
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1322 rtx inops[2];
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1323 rtx exops[4][2];
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1324
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1325 inops[0] = operands[0];
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1326 inops[1] = operands[2];
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1327 pdp11_expand_operands (inops, exops, 2, 4, NULL, big);
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1328
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1329 if (!CONST_INT_P (exops[0][1]) || INTVAL (exops[0][1]) != 0)
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1330 output_asm_insn (\"sub\t%1,%0\", exops[0]);
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1331 if (!CONST_INT_P (exops[1][1]) || INTVAL (exops[1][1]) != 0)
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1332 {
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1333 output_asm_insn (\"sub\t%1,%0\", exops[1]);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1334 output_asm_insn (\"sbc\t%0\", exops[0]);
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1335 }
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1336 if (!CONST_INT_P (exops[2][1]) || INTVAL (exops[2][1]) != 0)
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1337 {
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1338 output_asm_insn (\"sub\t%1,%0\", exops[2]);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1339 output_asm_insn (\"sbc\t%0\", exops[1]);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1340 output_asm_insn (\"sbc\t%0\", exops[0]);
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1341 }
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1342 if (!CONST_INT_P (exops[3][1]) || INTVAL (exops[3][1]) != 0)
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1343 {
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1344 output_asm_insn (\"sub\t%1,%0\", exops[3]);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1345 output_asm_insn (\"sbc\t%0\", exops[2]);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1346 output_asm_insn (\"sbc\t%0\", exops[1]);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1347 output_asm_insn (\"sbc\t%0\", exops[0]);
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1348 }
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1349
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1350 return \"\";
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1351 }"
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1352 [(set_attr "length" "20,28,40,48")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1353 (set_attr "base_cost" "0")])
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1354
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1355 (define_insn_and_split "subsi3"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1356 [(set (match_operand:SI 0 "nonimmediate_operand" "=&r,r,o,o")
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1357 (minus:SI (match_operand:SI 1 "general_operand" "0,0,0,0")
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1358 (match_operand:SI 2 "general_operand" "r,on,r,on")))]
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1359 ""
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1360 "#"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1361 "reload_completed"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1362 [(parallel [(set (match_dup 0) (minus:SI (match_dup 1) (match_dup 2)))
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1363 (clobber (reg:CC CC_REGNUM))])]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1364 ""
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1365 [(set_attr "length" "6,10,12,16")])
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1366
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1367 (define_insn "*subsi3_nocc"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1368 [(set (match_operand:SI 0 "nonimmediate_operand" "=&r,r,o,o")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1369 (minus:SI (match_operand:SI 1 "general_operand" "0,0,0,0")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1370 (match_operand:SI 2 "general_operand" "r,on,r,on")))
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1371 (clobber (reg:CC CC_REGNUM))]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1372 "reload_completed"
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1373 "*
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1374 {
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1375 rtx inops[2];
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1376 rtx exops[2][2];
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1377
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1378 inops[0] = operands[0];
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1379 inops[1] = operands[2];
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1380 pdp11_expand_operands (inops, exops, 2, 2, NULL, big);
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1381
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1382 if (!CONST_INT_P (exops[0][1]) || INTVAL (exops[0][1]) != 0)
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1383 output_asm_insn (\"sub\t%1,%0\", exops[0]);
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1384 if (!CONST_INT_P (exops[1][1]) || INTVAL (exops[1][1]) != 0)
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1385 {
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1386 output_asm_insn (\"sub\t%1,%0\", exops[1]);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1387 output_asm_insn (\"sbc\t%0\", exops[0]);
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1388 }
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1389
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1390 return \"\";
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1391 }"
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1392 [(set_attr "length" "6,10,12,16")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1393 (set_attr "base_cost" "0")])
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1394
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1395 (define_insn_and_split "subhi3"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1396 [(set (match_operand:HI 0 "nonimmediate_operand" "=rR,rR,Q,Q")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1397 (minus:HI (match_operand:HI 1 "general_operand" "0,0,0,0")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1398 (match_operand:HI 2 "general_operand" "rRLM,Qi,rRLM,Qi")))]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1399 ""
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1400 "#"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1401 "reload_completed"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1402 [(parallel [(set (match_dup 0)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1403 (minus:HI (match_dup 1) (match_dup 2)))
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1404 (clobber (reg:CC CC_REGNUM))])]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1405 ""
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1406 [(set_attr "length" "2,4,4,6")])
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1407
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1408 ;; Note: the manual says that (minus m (const_int n)) is converted
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1409 ;; to (plus m (const_int -n)) but that does not appear to be
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1410 ;; the case when it's wrapped in a PARALLEL. So instead we handle
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1411 ;; that case here, which is easy enough.
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1412 (define_insn "*subhi3<cc_ccnz>"
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1413 [(set (match_operand:HI 0 "nonimmediate_operand" "=rR,rR,Q,Q")
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1414 (minus:HI (match_operand:HI 1 "general_operand" "0,0,0,0")
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1415 (match_operand:HI 2 "general_operand" "rRLM,Qi,rRLM,Qi")))
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1416 (clobber (reg:CC CC_REGNUM))]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1417 "reload_completed"
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1418 "*
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1419 {
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1420 if (GET_CODE (operands[2]) == CONST_INT)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1421 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1422 if (INTVAL(operands[2]) == 1)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1423 return \"dec\t%0\";
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1424 else if (INTVAL(operands[2]) == -1)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1425 return \"inc\t%0\";
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1426 }
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1427
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1428 return \"sub\t%2,%0\";
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1429 }"
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1430 [(set_attr "length" "2,4,4,6")])
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1431
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1432 (define_insn_and_split "subqi3"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1433 [(set (match_operand:QI 0 "nonimmediate_operand" "=rR,Q")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1434 (plus:QI (match_operand:QI 1 "general_operand" "%0,0")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1435 (match_operand:QI 2 "incdec_operand" "LM,LM")))]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1436 ""
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1437 "#"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1438 "reload_completed"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1439 [(parallel [(set (match_dup 0)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1440 (plus:QI (match_dup 1) (match_dup 2)))
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1441 (clobber (reg:CC CC_REGNUM))])]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1442 ""
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1443 [(set_attr "length" "2,4")])
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1444
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1445 ;; Inc/dec sets V if overflow from the operation
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1446 (define_insn "*subqi3<cc_ccnz>"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1447 [(set (match_operand:QI 0 "nonimmediate_operand" "=rR,Q")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1448 (plus:QI (match_operand:QI 1 "general_operand" "%0,0")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1449 (match_operand:QI 2 "incdec_operand" "LM,LM")))
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1450 (clobber (reg:CC CC_REGNUM))]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1451 "reload_completed"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1452 "*
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1453 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1454 if (INTVAL(operands[2]) == -1)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1455 return \"incb\t%0\";
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1456 else
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1457 return \"decb\t%0\";
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1458 }"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1459 [(set_attr "length" "2,4")])
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1460
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1461 ;;;;- and instructions
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1462 ;; Bit-and on the pdp (like on the VAX) is done with a clear-bits insn.
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1463
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1464 (define_expand "and<mode>3"
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1465 [(set (match_operand:PDPint 0 "nonimmediate_operand" "")
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1466 (and:PDPint (not:PDPint (match_operand:PDPint 1 "general_operand" ""))
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1467 (match_operand:PDPint 2 "general_operand" "")))]
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1468 ""
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1469 "
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1470 {
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1471 rtx op1 = operands[1];
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1472
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1473 /* If there is a constant argument, complement that one.
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1474 Similarly, if one of the inputs is the same as the output,
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1475 complement the other input. */
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1476 if ((CONST_INT_P (operands[2]) && ! CONST_INT_P (op1)) ||
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1477 rtx_equal_p (operands[0], operands[1]))
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1478 {
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1479 operands[1] = operands[2];
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1480 operands[2] = op1;
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1481 op1 = operands[1];
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1482 }
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1483
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1484 if (CONST_INT_P (op1))
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1485 operands[1] = GEN_INT (~INTVAL (op1));
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1486 else
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1487 operands[1] = expand_unop (<MODE>mode, one_cmpl_optab, op1, 0, 1);
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1488 }"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1489 [(set_attr "length" "2,4,4,6")])
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1490
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1491 (define_insn_and_split "*bic<mode>"
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1492 [(set (match_operand:PDPint 0 "nonimmediate_operand" "=rR,rR,Q,Q")
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1493 (and:PDPint
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1494 (not: PDPint (match_operand:PDPint 1 "general_operand" "rR,Qi,rR,Qi"))
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1495 (match_operand:PDPint 2 "general_operand" "0,0,0,0")))]
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1496 ""
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1497 "#"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1498 "reload_completed"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1499 [(parallel [(set (match_dup 0)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1500 (and:PDPint (not:PDPint (match_dup 1)) (match_dup 2)))
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1501 (clobber (reg:CC CC_REGNUM))])]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1502 "")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1503
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1504 (define_insn "*bic<mode><cc_cc>"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1505 [(set (match_operand:PDPint 0 "nonimmediate_operand" "=rR,rR,Q,Q")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1506 (and:PDPint
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1507 (not: PDPint (match_operand:PDPint 1 "general_operand" "rR,Qi,rR,Qi"))
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1508 (match_operand:PDPint 2 "general_operand" "0,0,0,0")))
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1509 (clobber (reg:CC CC_REGNUM))]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1510 "reload_completed"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1511 "bic<PDPint:isfx>\t%1,%0"
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1512 [(set_attr "length" "2,4,4,6")])
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1513
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1514 ;;- Bit set (inclusive or) instructions
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1515 (define_insn_and_split "ior<mode>3"
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1516 [(set (match_operand:PDPint 0 "nonimmediate_operand" "=rR,rR,Q,Q")
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1517 (ior:PDPint (match_operand:PDPint 1 "general_operand" "%0,0,0,0")
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1518 (match_operand:PDPint 2 "general_operand" "rR,Qi,rR,Qi")))]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1519 ""
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1520 "#"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1521 "reload_completed"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1522 [(parallel [(set (match_dup 0)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1523 (ior:PDPint (match_dup 1) (match_dup 2)))
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1524 (clobber (reg:CC CC_REGNUM))])]
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1525 ""
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1526 [(set_attr "length" "2,4,4,6")])
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1527
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1528 (define_insn "ior<mode>3<cc_cc>"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1529 [(set (match_operand:PDPint 0 "nonimmediate_operand" "=rR,rR,Q,Q")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1530 (ior:PDPint (match_operand:PDPint 1 "general_operand" "%0,0,0,0")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1531 (match_operand:PDPint 2 "general_operand" "rR,Qi,rR,Qi")))
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1532 (clobber (reg:CC CC_REGNUM))]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1533 "reload_completed"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1534 "bis<PDPint:isfx>\t%2,%0"
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1535 [(set_attr "length" "2,4,4,6")])
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1536
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1537 ;;- xor instructions
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1538 (define_insn_and_split "xorhi3"
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1539 [(set (match_operand:HI 0 "nonimmediate_operand" "=rR,Q")
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1540 (xor:HI (match_operand:HI 1 "general_operand" "%0,0")
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1541 (match_operand:HI 2 "register_operand" "r,r")))]
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1542 "TARGET_40_PLUS"
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1543 "#"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1544 "&& reload_completed"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1545 [(parallel [(set (match_dup 0)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1546 (xor:HI (match_dup 1) (match_dup 2)))
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1547 (clobber (reg:CC CC_REGNUM))])]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1548 ""
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1549 [(set_attr "length" "2,4")])
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1550
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1551 (define_insn "*xorhi3<cc_cc>"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1552 [(set (match_operand:HI 0 "nonimmediate_operand" "=rR,Q")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1553 (xor:HI (match_operand:HI 1 "general_operand" "%0,0")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1554 (match_operand:HI 2 "register_operand" "r,r")))
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1555 (clobber (reg:CC CC_REGNUM))]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1556 "TARGET_40_PLUS && reload_completed"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1557 "xor\t%2,%0"
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1558 [(set_attr "length" "2,4")])
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1559
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1560 ;;- one complement instructions
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1561
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1562 (define_insn_and_split "one_cmpl<mode>2"
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1563 [(set (match_operand:PDPint 0 "nonimmediate_operand" "=rR,Q")
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1564 (not:PDPint (match_operand:PDPint 1 "general_operand" "0,0")))]
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1565 ""
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1566 "#"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1567 "reload_completed"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1568 [(parallel [(set (match_dup 0)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1569 (not:PDPint (match_dup 1)))
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1570 (clobber (reg:CC CC_REGNUM))])]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1571 ""
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1572 [(set_attr "length" "2,4")])
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1573
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1574 (define_insn "*one_cmpl<mode>2<cc_cc>"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1575 [(set (match_operand:PDPint 0 "nonimmediate_operand" "=rR,Q")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1576 (not:PDPint (match_operand:PDPint 1 "general_operand" "0,0")))
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1577 (clobber (reg:CC CC_REGNUM))]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1578 "reload_completed"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1579 "com<PDPint:isfx>\t%0"
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1580 [(set_attr "length" "2,4")])
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1581
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1582 ;;- arithmetic shift instructions
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1583 ;;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1584 ;; There is a fair amount of complexity here because with -m10
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1585 ;; (pdp-11/10, /20) we only have shift by one bit. Iterators are
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1586 ;; used to reduce the amount of very similar code.
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1587 ;;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1588 ;; First the insns used for small constant shifts.
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1589 (define_insn_and_split "<code><mode>_sc"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1590 [(set (match_operand:QHSint 0 "nonimmediate_operand" "=rD,Q")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1591 (SHF:QHSint (match_operand:QHSint 1 "general_operand" "0,0")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1592 (match_operand:HI 2 "expand_shift_operand" "O,O")))]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1593 ""
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1594 "#"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1595 "reload_completed"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1596 [(parallel [(set (match_dup 0) (SHF:QHSint (match_dup 1) (match_dup 2)))
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1597 (clobber (reg:CC CC_REGNUM))])]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1598 ""
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1599 [(set (attr "length")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1600 (symbol_ref "pdp11_shift_length (operands, <QHSint:mname>,
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1601 <CODE>, which_alternative == 0)"))
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1602 (set_attr "base_cost" "0")])
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1603
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1604 (define_insn "<code><mode>_sc<cc_ccnz>"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1605 [(set (match_operand:PDPint 0 "nonimmediate_operand" "=rD,Q")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1606 (SHF:PDPint (match_operand:PDPint 1 "general_operand" "0,0")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1607 (match_operand:HI 2 "expand_shift_operand" "O,O")))
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1608 (clobber (reg:CC CC_REGNUM))]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1609 "reload_completed"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1610 "* return pdp11_assemble_shift (operands, <PDPint:mname>, <CODE>);"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1611 [(set (attr "length")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1612 (symbol_ref "pdp11_shift_length (operands, <PDPint:mname>,
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1613 <CODE>, which_alternative == 0)"))
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1614 (set_attr "base_cost" "0")])
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1615
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1616 ;; This one comes only in clobber flavor.
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1617 (define_insn "<code>si_sc_nocc"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1618 [(set (match_operand:SI 0 "nonimmediate_operand" "=rD,Q")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1619 (SHF:SI (match_operand:SI 1 "general_operand" "0,0")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1620 (match_operand:HI 2 "expand_shift_operand" "O,O")))
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1621 (clobber (reg:CC CC_REGNUM))]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1622 "reload_completed"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1623 "* return pdp11_assemble_shift (operands, SImode, <CODE>);"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1624 [(set (attr "length")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1625 (symbol_ref "pdp11_shift_length (operands, SImode,
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1626 <CODE>, which_alternative == 0)"))
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1627 (set_attr "base_cost" "0")])
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1628
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1629 ;; Next, shifts that are done as a loop on base (11/10 class) machines.
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1630 ;; This applies to shift counts too large to unroll, or variable shift
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1631 ;; counts. The check for count <= 0 is done before we get here.
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1632 (define_insn_and_split "<code><mode>_base"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1633 [(set (match_operand:QHSint 0 "nonimmediate_operand" "=rD,Q")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1634 (SHF:QHSint (match_operand:QHSint 1 "general_operand" "0,0")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1635 (match_operand:HI 2 "register_operand" "r,r")))
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1636 (clobber (match_dup 2))]
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1637 ""
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1638 "#"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1639 "reload_completed"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1640 [(parallel [(set (match_dup 0) (SHF:QHSint (match_dup 1) (match_dup 2)))
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1641 (clobber (match_dup 2))
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1642 (clobber (reg:CC CC_REGNUM))])]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1643 ""
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1644 [(set (attr "length")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1645 (symbol_ref "pdp11_shift_length (operands, <QHSint:mname>,
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1646 <CODE>, which_alternative == 0)"))
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1647 (set_attr "base_cost" "0")])
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1648
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1649 (define_insn "<code><mode>_base_nocc"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1650 [(set (match_operand:QHSint 0 "nonimmediate_operand" "=rD,Q")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1651 (SHF:QHSint (match_operand:QHSint 1 "general_operand" "0,0")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1652 (match_operand:HI 2 "register_operand" "r,r")))
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1653 (clobber (match_dup 2))
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1654 (clobber (reg:CC CC_REGNUM))]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1655 "reload_completed"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1656 "* return pdp11_assemble_shift (operands, <QHSint:mname>, <CODE>);"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1657 [(set (attr "length")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1658 (symbol_ref "pdp11_shift_length (operands, <QHSint:mname>,
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1659 <CODE>, which_alternative == 0)"))
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1660 (set_attr "base_cost" "0")])
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1661
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1662 ;; Next the insns that use the extended instructions ash and ashc.
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1663 ;; Note that these are just left shifts, and HI/SI only. (Right shifts
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1664 ;; are done by shifting by a negative amount.)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1665 (define_insn_and_split "aslhi_op"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1666 [(set (match_operand:HI 0 "nonimmediate_operand" "=r,r")
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1667 (ashift:HI (match_operand:HI 1 "general_operand" "0,0")
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1668 (match_operand:HI 2 "general_operand" "rR,Qi")))]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1669 "TARGET_40_PLUS"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1670 "#"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1671 "&& reload_completed"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1672 [(parallel [(set (match_dup 0)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1673 (ashift:HI (match_dup 1) (match_dup 2)))
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1674 (clobber (reg:CC CC_REGNUM))])]
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1675 ""
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1676 [(set_attr "length" "2,4")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1677 (set_attr "base_cost" "8")])
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1678
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1679 (define_insn "aslhi_op<cc_ccnz>"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1680 [(set (match_operand:HI 0 "nonimmediate_operand" "=r,r")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1681 (ashift:HI (match_operand:HI 1 "general_operand" "0,0")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1682 (match_operand:HI 2 "general_operand" "rR,Qi")))
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1683 (clobber (reg:CC CC_REGNUM))]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1684 "TARGET_40_PLUS && reload_completed"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1685 "ash\t%2,%0"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1686 [(set_attr "length" "2,4")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1687 (set_attr "base_cost" "8")])
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1688
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1689 (define_insn_and_split "aslsi_op"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1690 [(set (match_operand:SI 0 "nonimmediate_operand" "=r,r")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1691 (ashift:SI (match_operand:SI 1 "general_operand" "0,0")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1692 (match_operand:HI 2 "general_operand" "rR,Qi")))]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1693 "TARGET_40_PLUS"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1694 "#"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1695 "&& reload_completed"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1696 [(parallel [(set (match_dup 0)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1697 (ashift:SI (match_dup 1) (match_dup 2)))
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1698 (clobber (reg:CC CC_REGNUM))])]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1699 ""
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1700 [(set_attr "length" "2,4")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1701 (set_attr "base_cost" "8")])
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1702
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1703 (define_insn "aslsi_op_<cc_ccnz>"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1704 [(set (match_operand:SI 0 "nonimmediate_operand" "=r,r")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1705 (ashift:SI (match_operand:SI 1 "general_operand" "0,0")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1706 (match_operand:HI 2 "general_operand" "rR,Qi")))
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1707 (clobber (reg:CC CC_REGNUM))]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1708 "TARGET_40_PLUS && reload_completed"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1709 "ashc\t%2,%0"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1710 [(set_attr "length" "2,4")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1711 (set_attr "base_cost" "8")])
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1712
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1713 ;; Now the expanders that produce the insns defined above.
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1714 (define_expand "ashl<mode>3"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1715 [(match_operand:QHSint 0 "nonimmediate_operand" "")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1716 (match_operand:QHSint 1 "general_operand" "")
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1717 (match_operand:HI 2 "general_operand" "")]
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1718 ""
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1719 "
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1720 {
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1721 rtx r;
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1722
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1723 if (!pdp11_expand_shift (operands, gen_ashift<mode>_sc, gen_ashift<mode>_base))
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1724 {
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1725 if (<QHSint:e_mname> == E_QImode)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1726 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1727 r = copy_to_mode_reg (HImode, gen_rtx_ZERO_EXTEND (HImode, operands[1]));
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1728 emit_insn (gen_aslhi_op (r, r, operands[2]));
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1729 emit_insn (gen_movqi (operands[0], gen_rtx_SUBREG (QImode, r, 0)));
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1730 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1731 else
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1732 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1733 emit_insn (gen_asl<QHSint:hmode>_op (operands[0], operands[1], operands[2]));
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1734 }
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1735 }
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1736 DONE;
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1737 }")
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1738
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1739 (define_expand "ashr<mode>3"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1740 [(match_operand:QHSint 0 "nonimmediate_operand" "")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1741 (match_operand:QHSint 1 "general_operand" "")
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1742 (match_operand:HI 2 "general_operand" "")]
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1743 ""
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1744 "
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1745 {
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1746 rtx r;
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1747
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1748 if (!pdp11_expand_shift (operands, gen_ashiftrt<mode>_sc, gen_ashiftrt<mode>_base))
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1749 {
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1750 operands[2] = negate_rtx (HImode, operands[2]);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1751 if (<QHSint:e_mname> == E_QImode)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1752 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1753 r = copy_to_mode_reg (HImode, gen_rtx_ZERO_EXTEND (HImode, operands[1]));
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1754 emit_insn (gen_aslhi_op (r, r, operands[2]));
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1755 emit_insn (gen_movqi (operands[0], gen_rtx_SUBREG (QImode, r, 0)));
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1756 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1757 else
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1758 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1759 emit_insn (gen_asl<QHSint:hmode>_op (operands[0], operands[1], operands[2]));
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1760 }
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1761 }
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1762 DONE;
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1763 }")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1764
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1765 (define_expand "lshr<mode>3"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1766 [(match_operand:QHSint 0 "nonimmediate_operand" "")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1767 (match_operand:QHSint 1 "general_operand" "")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1768 (match_operand:HI 2 "general_operand" "")]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1769 ""
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1770 "
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1771 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1772 rtx r, n;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1773
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1774 if (!pdp11_expand_shift (operands, gen_lshiftrt<mode>_sc, gen_lshiftrt<mode>_base))
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1775 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1776 if (<QHSint:e_mname> == E_QImode)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1777 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1778 r = copy_to_mode_reg (HImode, gen_rtx_ZERO_EXTEND (HImode, operands[1]));
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1779 emit_insn (gen_aslhi_op (r, r, operands[2]));
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1780 emit_insn (gen_movqi (operands[0], gen_rtx_SUBREG (QImode, r, 0)));
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1781 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1782 else
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1783 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1784 r = gen_reg_rtx (<QHSint:mname>);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1785 emit_insn (gen_lshiftrt<mode>_sc (r, operands[1], const1_rtx));
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1786 if (GET_CODE (operands[2]) != CONST_INT)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1787 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1788 n = gen_reg_rtx (HImode);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1789 emit_insn (gen_addhi3 (n, operands [2], GEN_INT (-1)));
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1790 emit_insn (gen_ashr<mode>3 (operands[0], r, n));
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1791 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1792 else
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1793 emit_insn (gen_asl<QHSint:hmode>_op (operands[0], r,
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1794 GEN_INT (1 - INTVAL (operands[2]))));
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1795 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1796 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1797 DONE;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1798 }")
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1799
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1800 ;; absolute
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1801
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1802 (define_insn_and_split "absdf2"
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1803 [(set (match_operand:DF 0 "nonimmediate_operand" "=fR,Q")
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1804 (abs:DF (match_operand:DF 1 "general_operand" "0,0")))]
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1805 "TARGET_FPU"
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1806 "#"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1807 "&& reload_completed"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1808 [(parallel [(set (match_dup 0) (abs:DF (match_dup 1)))
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1809 (clobber (reg:CC FCC_REGNUM))])]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1810 ""
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1811 [(set_attr "length" "2,4")])
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1812
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1813 (define_insn "absdf2<fcc_cc>"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1814 [(set (match_operand:DF 0 "nonimmediate_operand" "=fR,Q")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1815 (abs:DF (match_operand:DF 1 "general_operand" "0,0")))
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1816 (clobber (reg:CC FCC_REGNUM))]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1817 "TARGET_FPU && reload_completed"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1818 "{absd|absf}\t%0"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1819 [(set_attr "length" "2,4")])
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1820
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1821 ;; negate insns
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1822
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1823 (define_insn_and_split "negdf2"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1824 [(set (match_operand:DF 0 "nonimmediate_operand" "=fR,Q")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1825 (neg:DF (match_operand:DF 1 "general_operand" "0,0")))]
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1826 "TARGET_FPU"
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1827 "#"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1828 "&& reload_completed"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1829 [(parallel [(set (match_dup 0) (neg:DF (match_dup 1)))
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1830 (clobber (reg:CC FCC_REGNUM))])]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1831 ""
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1832 [(set_attr "length" "2,4")])
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1833
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1834 (define_insn "negdf2<fcc_cc>"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1835 [(set (match_operand:DF 0 "nonimmediate_operand" "=fR,Q")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1836 (neg:DF (match_operand:DF 1 "general_operand" "0,0")))
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1837 (clobber (reg:CC FCC_REGNUM))]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1838 "TARGET_FPU && reload_completed"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1839 "{negd|negf}\t%0"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1840 [(set_attr "length" "2,4")])
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1841
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1842 (define_insn_and_split "negdi2"
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1843 [(set (match_operand:DI 0 "nonimmediate_operand" "=r,o")
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1844 (neg:DI (match_operand:DI 1 "general_operand" "0,0")))]
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1845 ""
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1846 "#"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1847 "reload_completed"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1848 [(parallel [(set (match_dup 0) (neg:DI (match_dup 1)))
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1849 (clobber (reg:CC CC_REGNUM))])]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1850 ""
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1851 [(set_attr "length" "18,34")])
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1852
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1853 ;; TODO: this can be neg/adc/neg/adc... I believe. Check. Saves one word.
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1854 (define_insn "negdi2_nocc"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1855 [(set (match_operand:DI 0 "nonimmediate_operand" "=r,o")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1856 (neg:DI (match_operand:DI 1 "general_operand" "0,0")))
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1857 (clobber (reg:CC CC_REGNUM))]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1858 "reload_completed"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1859 {
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1860 rtx inops[2];
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1861 rtx exops[4][2];
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1862
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1863 inops[0] = operands[0];
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1864 pdp11_expand_operands (inops, exops, 1, 4, NULL, big);
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1865
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1866 output_asm_insn (\"com\t%0\", exops[3]);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1867 output_asm_insn (\"com\t%0\", exops[2]);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1868 output_asm_insn (\"com\t%0\", exops[1]);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1869 output_asm_insn (\"com\t%0\", exops[0]);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1870 output_asm_insn (\"add\t%#1,%0\", exops[3]);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1871 output_asm_insn (\"adc\t%0\", exops[2]);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1872 output_asm_insn (\"adc\t%0\", exops[1]);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1873 output_asm_insn (\"adc\t%0\", exops[0]);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1874
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1875 return \"\";
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1876 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1877 [(set_attr "length" "18,34")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1878 (set_attr "base_cost" "0")])
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1879
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1880 (define_insn_and_split "negsi2"
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1881 [(set (match_operand:SI 0 "nonimmediate_operand" "=r,o")
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1882 (neg:SI (match_operand:SI 1 "general_operand" "0,0")))]
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1883 ""
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1884 "#"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1885 "reload_completed"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1886 [(parallel [(set (match_dup 0) (neg:SI (match_dup 1)))
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1887 (clobber (reg:CC CC_REGNUM))])]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1888 ""
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1889 [(set_attr "length" "10,18")])
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1890
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1891 ;; TODO: this can be neg/adc/neg/adc... I believe. Check. Saves one word.
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1892 (define_insn "negsi2_nocc"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1893 [(set (match_operand:SI 0 "nonimmediate_operand" "=r,o")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1894 (neg:SI (match_operand:SI 1 "general_operand" "0,0")))
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1895 (clobber (reg:CC CC_REGNUM))]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1896 "reload_completed"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1897 {
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1898 rtx inops[2];
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1899 rtx exops[4][2];
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1900
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1901 inops[0] = operands[0];
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1902 pdp11_expand_operands (inops, exops, 1, 2, NULL, big);
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1903
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1904 output_asm_insn (\"com\t%0\", exops[1]);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1905 output_asm_insn (\"com\t%0\", exops[0]);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1906 output_asm_insn (\"add\t%#1,%0\", exops[1]);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1907 output_asm_insn (\"adc\t%0\", exops[0]);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1908
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1909 return \"\";
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1910 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1911 [(set_attr "length" "10,18")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1912 (set_attr "base_cost" "0")])
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1913
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1914 (define_insn_and_split "neg<mode>2"
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1915 [(set (match_operand:PDPint 0 "nonimmediate_operand" "=rR,Q")
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1916 (neg:PDPint (match_operand:PDPint 1 "general_operand" "0,0")))]
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1917 ""
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1918 "#"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1919 "reload_completed"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1920 [(parallel [(set (match_dup 0) (neg:PDPint (match_dup 1)))
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1921 (clobber (reg:CC CC_REGNUM))])]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1922 ""
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1923 [(set_attr "length" "2,4")])
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1924
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1925 (define_insn "neg<mode>2<cc_ccnz>"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1926 [(set (match_operand:PDPint 0 "nonimmediate_operand" "=rR,Q")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1927 (neg:PDPint (match_operand:PDPint 1 "general_operand" "0,0")))
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1928 (clobber (reg:CC CC_REGNUM))]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1929 ""
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1930 "neg<PDPint:isfx>\t%0"
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1931 [(set_attr "length" "2,4")])
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1932
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1933
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1934 ;; Unconditional and other jump instructions
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1935 (define_insn "jump"
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1936 [(set (pc)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1937 (label_ref (match_operand 0 "" "")))]
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1938 ""
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1939 "*
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1940 {
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1941 if (get_attr_length (insn) == 2)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1942 return \"br\t%l0\";
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1943 return \"jmp\t%l0\";
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1944 }"
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1945 [(set (attr "length") (if_then_else (ior (lt (minus (match_dup 0)
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1946 (pc))
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1947 (const_int MIN_BRANCH))
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1948 (gt (minus (match_dup 0)
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1949 (pc))
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1950 (const_int MAX_BRANCH)))
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1951 (const_int 4)
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1952 (const_int 2)))])
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1953
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1954 (define_insn "tablejump"
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1955 [(set (pc) (match_operand:HI 0 "general_operand" "r,R,Q"))
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1956 (use (label_ref (match_operand 1 "" "")))]
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1957 ""
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1958 "@
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1959 jmp\t(%0)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1960 jmp\t%@%0
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1961 jmp\t%@%0"
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1962 [(set_attr "length" "2,2,4")])
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1963
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1964 ;; indirect jump. TODO: this needs a constraint that allows memory
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1965 ;; references but not indirection, since we add a level of indirection
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1966 ;; in the generated code.
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1967 (define_insn "indirect_jump"
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1968 [(set (pc) (match_operand:HI 0 "general_operand" "r"))]
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1969 ""
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1970 "jmp\t@%0"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1971 [(set_attr "length" "2")])
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1972
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1973 ;;- jump to subroutine
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1974
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1975 (define_insn "call"
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1976 [(call (match_operand:HI 0 "general_operand" "rR,Q")
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1977 (match_operand:HI 1 "general_operand" "g,g"))]
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1978 ;;- Don't use operand 1 for most machines.
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1979 ""
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1980 "jsr\tpc,%0"
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1981 [(set_attr "length" "2,4")])
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1982
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1983 ;;- jump to subroutine
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1984 (define_insn "call_value"
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1985 [(set (match_operand 0 "" "")
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1986 (call (match_operand:HI 1 "general_operand" "rR,Q")
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1987 (match_operand:HI 2 "general_operand" "g,g")))]
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1988 ;;- Don't use operand 2 for most machines.
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1989 ""
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1990 "jsr\tpc,%1"
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1991 [(set_attr "length" "2,4")])
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1992
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1993 (define_expand "untyped_call"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1994 [(parallel [(call (match_operand 0 "" "")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1995 (const_int 0))
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1996 (match_operand 1 "" "")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1997 (match_operand 2 "" "")])]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1998 ""
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1999 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2000 int i;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2001
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2002 emit_call_insn (gen_call (operands[0], const0_rtx));
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2003
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2004 for (i = 0; i < XVECLEN (operands[2], 0); i++)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2005 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2006 rtx set = XVECEXP (operands[2], 0, i);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2007 emit_move_insn (SET_DEST (set), SET_SRC (set));
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2008 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2009
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2010 /* The optimizer does not know that the call sets the function value
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2011 registers we stored in the result block. We avoid problems by
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2012 claiming that all hard registers are used and clobbered at this
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2013 point. */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2014 emit_insn (gen_blockage ());
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2015
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2016 DONE;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2017 })
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2018
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2019 ;;- nop instruction
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2020 (define_insn "nop"
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2021 [(const_int 0)]
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2022 ""
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2023 "nop")
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2024
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2025
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2026 ;;- multiply
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2027
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2028 (define_insn_and_split "muldf3"
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
2029 [(set (match_operand:DF 0 "register_operand" "=a,a")
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
2030 (mult:DF (match_operand:DF 1 "register_operand" "%0,0")
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
2031 (match_operand:DF 2 "float_operand" "fR,QF")))]
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2032 "TARGET_FPU"
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2033 "#"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2034 "&& reload_completed"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2035 [(parallel [(set (match_dup 0) (mult:DF (match_dup 1) (match_dup 2)))
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2036 (clobber (reg:CC FCC_REGNUM))])]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2037 ""
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
2038 [(set_attr "length" "2,4")])
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2039
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2040 (define_insn "muldf3<fcc_ccnz>"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2041 [(set (match_operand:DF 0 "register_operand" "=a,a")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2042 (mult:DF (match_operand:DF 1 "register_operand" "%0,0")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2043 (match_operand:DF 2 "float_operand" "fR,QF")))
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2044 (clobber (reg:CC FCC_REGNUM))]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2045 "TARGET_FPU && reload_completed"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2046 "{muld|mulf}\t%2,%0"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2047 [(set_attr "length" "2,4")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2048 (set_attr "base_cost" "20")])
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2049
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2050 ;; 16 bit result multiply. This uses odd numbered registers.
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2051
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2052 (define_insn_and_split "mulhi3"
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2053 [(set (match_operand:HI 0 "register_operand" "=d,d") ; multiply regs
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2054 (mult:HI (match_operand:HI 1 "register_operand" "%0,0")
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2055 (match_operand:HI 2 "general_operand" "rR,Qi")))]
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
2056 "TARGET_40_PLUS"
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2057 "#"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2058 "&& reload_completed"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2059 [(parallel [(set (match_dup 0) (mult:HI (match_dup 1) (match_dup 2)))
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2060 (clobber (reg:CC CC_REGNUM))])]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2061 ""
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
2062 [(set_attr "length" "2,4")])
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2063
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2064 (define_insn "mulhi3<cc_cc>"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2065 [(set (match_operand:HI 0 "register_operand" "=d,d")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2066 (mult:HI (match_operand:HI 1 "register_operand" "%0,0")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2067 (match_operand:HI 2 "general_operand" "rR,Qi")))
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2068 (clobber (reg:CC CC_REGNUM))]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2069 "TARGET_40_PLUS && reload_completed"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2070 "mul\t%2,%0"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2071 [(set_attr "length" "2,4")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2072 (set_attr "base_cost" "20")])
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2073
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2074 ;; 32 bit result from 16 bit operands
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2075 (define_insn_and_split "mulhisi3"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2076 [(set (match_operand:SI 0 "register_operand" "=r,r")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2077 (mult:SI (sign_extend:SI (match_operand:HI 1 "register_operand" "%0,0"))
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2078 (sign_extend:SI (match_operand:HI 2 "general_operand" "rR,Qi"))))]
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
2079 "TARGET_40_PLUS"
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2080 "#"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2081 "&& reload_completed"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2082 [(parallel [(set (match_dup 0)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2083 (mult:SI (sign_extend:SI (match_dup 1))
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2084 (sign_extend:SI (match_dup 2))))
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2085 (clobber (reg:CC CC_REGNUM))])]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2086 ""
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
2087 [(set_attr "length" "2,4")])
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2088
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2089 (define_insn "mulhisi3<cc_cc>"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2090 [(set (match_operand:SI 0 "register_operand" "=r,r")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2091 (mult:SI (sign_extend:SI (match_operand:HI 1 "register_operand" "%0,0"))
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2092 (sign_extend:SI (match_operand:HI 2 "general_operand" "rR,Qi"))))
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2093 (clobber (reg:CC CC_REGNUM))]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2094 "TARGET_40_PLUS && reload_completed"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2095 "mul\t%2,%0"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2096 [(set_attr "length" "2,4")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2097 (set_attr "base_cost" "20")])
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2098
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2099 ;;- divide
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2100 (define_insn_and_split "divdf3"
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
2101 [(set (match_operand:DF 0 "register_operand" "=a,a")
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
2102 (div:DF (match_operand:DF 1 "register_operand" "0,0")
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
2103 (match_operand:DF 2 "general_operand" "fR,QF")))]
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2104 "TARGET_FPU"
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2105 "#"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2106 "&& reload_completed"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2107 [(parallel [(set (match_dup 0) (div:DF (match_dup 1) (match_dup 2)))
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2108 (clobber (reg:CC FCC_REGNUM))])]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2109 ""
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
2110 [(set_attr "length" "2,4")])
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2111
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2112 (define_insn "divdf3<fcc_ccnz>"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2113 [(set (match_operand:DF 0 "register_operand" "=a,a")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2114 (div:DF (match_operand:DF 1 "register_operand" "0,0")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2115 (match_operand:DF 2 "general_operand" "fR,QF")))
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2116 (clobber (reg:CC FCC_REGNUM))]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2117 "TARGET_FPU && reload_completed"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2118 "{divd|divf}\t%2,%0"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2119 [(set_attr "length" "2,4")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2120 (set_attr "base_cost" "20")])
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2121
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2122 (define_expand "divmodhi4"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2123 [(parallel
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2124 [(set (subreg:HI (match_dup 1) 0)
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
2125 (div:HI (match_operand:SI 1 "register_operand" "0")
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2126 (match_operand:HI 2 "general_operand" "g")))
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2127 (set (subreg:HI (match_dup 1) 2)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2128 (mod:HI (match_dup 1) (match_dup 2)))])
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
2129 (set (match_operand:HI 0 "register_operand" "=r")
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2130 (subreg:HI (match_dup 1) 0))
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2131 (set (match_operand:HI 3 "register_operand" "=r")
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2132 (subreg:HI (match_dup 1) 2))]
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
2133 "TARGET_40_PLUS"
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2134 "")
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2135
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2136 (define_insn_and_split "*divmodhi4"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2137 [(set (subreg:HI (match_operand:SI 0 "register_operand" "=r,r") 0)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2138 (div:HI (match_operand:SI 1 "register_operand" "0,0")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2139 (match_operand:HI 2 "general_operand" "rR,Qi")))
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2140 (set (subreg:HI (match_dup 1) 2)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2141 (mod:HI (match_dup 1) (match_dup 2)))]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2142 "TARGET_40_PLUS"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2143 "#"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2144 "&& reload_completed"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2145 [(parallel [(set (subreg:HI (match_dup 0) 0)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2146 (div:HI (match_dup 1) (match_dup 2)))
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2147 (set (subreg:HI (match_dup 1) 2)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2148 (mod:HI (match_dup 1) (match_dup 2)))
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2149 (clobber (reg:CC CC_REGNUM))])]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2150 ""
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2151 [(set_attr "length" "2,4")])
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2152
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2153 ;; Note that there is no corresponding CC setter pattern.
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2154 ;; The reason is that it won't be generated, because
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2155 ;; compare-elim.c only does the transformation on input
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2156 ;; insns that have a two-element PARALLEL, as opposed to
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2157 ;; the three-element one we have here.
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2158 (define_insn "divmodhi4_nocc"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2159 [(set (subreg:HI (match_operand:SI 0 "register_operand" "=r,r") 0)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2160 (div:HI (match_operand:SI 1 "register_operand" "0,0")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2161 (match_operand:HI 2 "general_operand" "rR,Qi")))
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2162 (set (subreg:HI (match_dup 1) 2)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2163 (mod:HI (match_dup 1) (match_dup 2)))
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2164 (clobber (reg:CC CC_REGNUM))]
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
2165 "TARGET_40_PLUS"
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2166 "div\t%2,%0"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2167 [(set_attr "length" "2,4")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2168 (set_attr "base_cost" "40")])
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2169
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2170 ;; Byte swap
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2171 (define_insn_and_split "bswaphi2"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2172 [(set (match_operand:HI 0 "nonimmediate_operand" "=rR,Q")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2173 (bswap:HI (match_operand:HI 1 "general_operand" "0,0")))]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2174 ""
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2175 "#"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2176 "reload_completed"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2177 [(parallel [(set (match_dup 0) (bswap:HI (match_dup 1)))
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2178 (clobber (reg:CC CC_REGNUM))])]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2179 ""
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2180 [(set_attr "length" "2,4")])
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2181
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2182 (define_insn "bswaphi2<cc_ccnz>"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2183 [(set (match_operand:HI 0 "nonimmediate_operand" "=rR,Q")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2184 (bswap:HI (match_operand:HI 1 "general_operand" "0,0")))
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2185 (clobber (reg:CC CC_REGNUM))]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2186 ""
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2187 "swab\t%0"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2188 [(set_attr "length" "2,4")])
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2189
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2190 (define_insn_and_split "bswapsi2"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2191 [(set (match_operand:SI 0 "register_operand" "=&r")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2192 (bswap:SI (match_operand:SI 1 "general_operand" "g")))]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2193 ""
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2194 "#"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2195 "reload_completed"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2196 [(parallel [(set (match_dup 0)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2197 (bswap:SI (match_dup 1)))
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2198 (clobber (reg:CC CC_REGNUM))])]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2199 ""
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2200 [(set_attr "length" "10")])
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2201
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2202 (define_insn "bswapsi2_nocc"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2203 [(set (match_operand:SI 0 "register_operand" "=&r,&r,&r")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2204 (bswap:SI (match_operand:SI 1 "general_operand" "r,D,Q")))
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2205 (clobber (reg:CC CC_REGNUM))]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2206 ""
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2207 {
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2208 rtx inops[2];
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2209 rtx exops[2][2];
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2210 rtx t;
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2211
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2212 inops[0] = operands[0];
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2213 inops[1] = operands[1];
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2214 pdp11_expand_operands (inops, exops, 2, 2, NULL, either);
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2215
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2216 t = exops[0][0];
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2217 exops[0][0] = exops[1][0];
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2218 exops[1][0] = t;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2219
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2220 output_asm_insn ("mov\t%0,%1", exops[0]);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2221 output_asm_insn ("mov\t%0,%1", exops[1]);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2222 output_asm_insn ("swab\t%0", exops[0]);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2223 output_asm_insn ("swab\t%0", exops[1]);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2224 return "";
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2225 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2226 [(set_attr "length" "8,10,12")])
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2227
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2228 (define_expand "rotrhi3"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2229 [(match_operand:HI 0 "register_operand" "")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2230 (match_operand:HI 1 "register_operand" "")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2231 (match_operand:HI 2 "general_operand" "")]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2232 "TARGET_40_PLUS"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2233 "
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2234 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2235 operands[2] = negate_rtx (HImode, operands[2]);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2236 emit_insn (gen_rotlhi3 (operands[0], operands[1], operands[2]));
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2237 DONE;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2238 }")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2239
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2240 (define_insn_and_split "rotlhi3"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2241 [(set (match_operand:HI 0 "register_operand" "=d,d")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2242 (rotate:HI (match_operand:HI 1 "register_operand" "0,0")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2243 (match_operand:HI 2 "general_operand" "rR,Qi")))]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2244 "TARGET_40_PLUS"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2245 "#"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2246 "&& reload_completed"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2247 [(parallel [(set (match_dup 0)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2248 (rotate:HI (match_dup 1) (match_dup 2)))
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2249 (clobber (reg:CC CC_REGNUM))])]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2250 ""
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2251 [(set_attr "length" "2,4")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2252 (set_attr "base_cost" "8")])
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2253
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2254 (define_insn "rotlhi3<cc_ccnz>"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2255 [(set (match_operand:HI 0 "register_operand" "=d,d")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2256 (rotate:HI (match_operand:HI 1 "register_operand" "0,0")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2257 (match_operand:HI 2 "general_operand" "rR,Qi")))
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2258 (clobber (reg:CC CC_REGNUM))]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2259 "TARGET_40_PLUS && reload_completed"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2260 "ashc\t%2,%0"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2261 [(set_attr "length" "2,4")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2262 (set_attr "base_cost" "8")])
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2263
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2264
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2265
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2266 ;; Some peephole optimizations
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2267
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2268 ;; Move then conditional branch on the result of the move is handled
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2269 ;; by compare elimination, but an earlier pass sometimes changes the
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2270 ;; compare operand to the move input, and then the compare is not
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2271 ;; eliminated. Do so here.
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2272 (define_peephole2
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2273 [(parallel [(set (match_operand:PDPint 0 "nonimmediate_operand" "")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2274 (match_operand:PDPint 1 "general_operand" ""))
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2275 (clobber (reg:CC CC_REGNUM))])
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2276 (set (reg:CC CC_REGNUM) (compare:CC (match_dup 1) (const_int 0)))]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2277 ""
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2278 [(parallel [(set (reg:CC CC_REGNUM) (compare:CC (match_dup 1) (const_int 0)))
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2279 (set (match_dup 0) (match_dup 1))])]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2280 "")