summaryrefslogtreecommitdiffstats
path: root/meta/recipes-devtools/gcc/gcc-6.4/backport/0006-x86-Add-mindirect-branch-register.patch
diff options
context:
space:
mode:
Diffstat (limited to 'meta/recipes-devtools/gcc/gcc-6.4/backport/0006-x86-Add-mindirect-branch-register.patch')
-rw-r--r--meta/recipes-devtools/gcc/gcc-6.4/backport/0006-x86-Add-mindirect-branch-register.patch946
1 files changed, 946 insertions, 0 deletions
diff --git a/meta/recipes-devtools/gcc/gcc-6.4/backport/0006-x86-Add-mindirect-branch-register.patch b/meta/recipes-devtools/gcc/gcc-6.4/backport/0006-x86-Add-mindirect-branch-register.patch
new file mode 100644
index 0000000000..ad736913cd
--- /dev/null
+++ b/meta/recipes-devtools/gcc/gcc-6.4/backport/0006-x86-Add-mindirect-branch-register.patch
@@ -0,0 +1,946 @@
1From 3f1c39fb543884d36e759a6dc196a8e914eb4f73 Mon Sep 17 00:00:00 2001
2From: "H.J. Lu" <hjl.tools@gmail.com>
3Date: Sat, 6 Jan 2018 22:29:56 -0800
4Subject: [PATCH 06/12] x86: Add -mindirect-branch-register
5
6Add -mindirect-branch-register to force indirect branch via register.
7This is implemented by disabling patterns of indirect branch via memory,
8similar to TARGET_X32.
9
10-mindirect-branch= and -mfunction-return= tests are updated with
11-mno-indirect-branch-register to avoid false test failures when
12-mindirect-branch-register is added to RUNTESTFLAGS for "make check".
13
14gcc/
15
16 Backport from mainline
17 2018-01-14 H.J. Lu <hongjiu.lu@intel.com>
18
19 * config/i386/constraints.md (Bs): Disallow memory operand for
20 -mindirect-branch-register.
21 (Bw): Likewise.
22 * config/i386/predicates.md (indirect_branch_operand): Likewise.
23 (GOT_memory_operand): Likewise.
24 (call_insn_operand): Likewise.
25 (sibcall_insn_operand): Likewise.
26 (GOT32_symbol_operand): Likewise.
27 * config/i386/i386.md (indirect_jump): Call convert_memory_address
28 for -mindirect-branch-register.
29 (tablejump): Likewise.
30 (*sibcall_memory): Likewise.
31 (*sibcall_value_memory): Likewise.
32 Disallow peepholes of indirect call and jump via memory for
33 -mindirect-branch-register.
34 (*call_pop): Replace m with Bw.
35 (*call_value_pop): Likewise.
36 (*sibcall_pop_memory): Replace m with Bs.
37 * config/i386/i386.opt (mindirect-branch-register): New option.
38 * doc/invoke.texi: Document -mindirect-branch-register option.
39
40gcc/testsuite/
41
42 Backport from mainline
43 2018-01-14 H.J. Lu <hongjiu.lu@intel.com>
44
45 * gcc.target/i386/indirect-thunk-1.c (dg-options): Add
46 -mno-indirect-branch-register.
47 * gcc.target/i386/indirect-thunk-2.c: Likewise.
48 * gcc.target/i386/indirect-thunk-3.c: Likewise.
49 * gcc.target/i386/indirect-thunk-4.c: Likewise.
50 * gcc.target/i386/indirect-thunk-5.c: Likewise.
51 * gcc.target/i386/indirect-thunk-6.c: Likewise.
52 * gcc.target/i386/indirect-thunk-7.c: Likewise.
53 * gcc.target/i386/indirect-thunk-attr-1.c: Likewise.
54 * gcc.target/i386/indirect-thunk-attr-2.c: Likewise.
55 * gcc.target/i386/indirect-thunk-attr-3.c: Likewise.
56 * gcc.target/i386/indirect-thunk-attr-4.c: Likewise.
57 * gcc.target/i386/indirect-thunk-attr-5.c: Likewise.
58 * gcc.target/i386/indirect-thunk-attr-6.c: Likewise.
59 * gcc.target/i386/indirect-thunk-attr-7.c: Likewise.
60 * gcc.target/i386/indirect-thunk-bnd-1.c: Likewise.
61 * gcc.target/i386/indirect-thunk-bnd-2.c: Likewise.
62 * gcc.target/i386/indirect-thunk-bnd-3.c: Likewise.
63 * gcc.target/i386/indirect-thunk-bnd-4.c: Likewise.
64 * gcc.target/i386/indirect-thunk-extern-1.c: Likewise.
65 * gcc.target/i386/indirect-thunk-extern-2.c: Likewise.
66 * gcc.target/i386/indirect-thunk-extern-3.c: Likewise.
67 * gcc.target/i386/indirect-thunk-extern-4.c: Likewise.
68 * gcc.target/i386/indirect-thunk-extern-5.c: Likewise.
69 * gcc.target/i386/indirect-thunk-extern-6.c: Likewise.
70 * gcc.target/i386/indirect-thunk-extern-7.c: Likewise.
71 * gcc.target/i386/indirect-thunk-inline-1.c: Likewise.
72 * gcc.target/i386/indirect-thunk-inline-2.c: Likewise.
73 * gcc.target/i386/indirect-thunk-inline-3.c: Likewise.
74 * gcc.target/i386/indirect-thunk-inline-4.c: Likewise.
75 * gcc.target/i386/indirect-thunk-inline-5.c: Likewise.
76 * gcc.target/i386/indirect-thunk-inline-6.c: Likewise.
77 * gcc.target/i386/indirect-thunk-inline-7.c: Likewise.
78 * gcc.target/i386/ret-thunk-10.c: Likewise.
79 * gcc.target/i386/ret-thunk-11.c: Likewise.
80 * gcc.target/i386/ret-thunk-12.c: Likewise.
81 * gcc.target/i386/ret-thunk-13.c: Likewise.
82 * gcc.target/i386/ret-thunk-14.c: Likewise.
83 * gcc.target/i386/ret-thunk-15.c: Likewise.
84 * gcc.target/i386/ret-thunk-9.c: Likewise.
85 * gcc.target/i386/indirect-thunk-register-1.c: New test.
86 * gcc.target/i386/indirect-thunk-register-2.c: Likewise.
87 * gcc.target/i386/indirect-thunk-register-3.c: Likewise.
88
89i386: Rename to ix86_indirect_branch_register
90
91Rename the variable for -mindirect-branch-register to
92ix86_indirect_branch_register to match the command-line option name.
93
94 Backport from mainline
95 2018-01-15 H.J. Lu <hongjiu.lu@intel.com>
96
97 * config/i386/constraints.md (Bs): Replace
98 ix86_indirect_branch_thunk_register with
99 ix86_indirect_branch_register.
100 (Bw): Likewise.
101 * config/i386/i386.md (indirect_jump): Likewise.
102 (tablejump): Likewise.
103 (*sibcall_memory): Likewise.
104 (*sibcall_value_memory): Likewise.
105 Peepholes of indirect call and jump via memory: Likewise.
106 * config/i386/i386.opt: Likewise.
107 * config/i386/predicates.md (indirect_branch_operand): Likewise.
108 (GOT_memory_operand): Likewise.
109 (call_insn_operand): Likewise.
110 (sibcall_insn_operand): Likewise.
111 (GOT32_symbol_operand): Likewise.
112
113x86: Rewrite ix86_indirect_branch_register logic
114
115Rewrite ix86_indirect_branch_register logic with
116
117(and (not (match_test "ix86_indirect_branch_register"))
118 (original condition before r256662))
119
120 Backport from mainline
121 2018-01-15 H.J. Lu <hongjiu.lu@intel.com>
122
123 * config/i386/predicates.md (constant_call_address_operand):
124 Rewrite ix86_indirect_branch_register logic.
125 (sibcall_insn_operand): Likewise.
126
127Don't check ix86_indirect_branch_register for GOT operand
128
129Since GOT_memory_operand and GOT32_symbol_operand are simple pattern
130matches, don't check ix86_indirect_branch_register here. If needed,
131-mindirect-branch= will convert indirect branch via GOT slot to a call
132and return thunk.
133
134 Backport from mainline
135 2018-01-15 H.J. Lu <hongjiu.lu@intel.com>
136
137 * config/i386/constraints.md (Bs): Update
138 ix86_indirect_branch_register check. Don't check
139 ix86_indirect_branch_register with GOT_memory_operand.
140 (Bw): Likewise.
141 * config/i386/predicates.md (GOT_memory_operand): Don't check
142 ix86_indirect_branch_register here.
143 (GOT32_symbol_operand): Likewise.
144
145i386: Rewrite indirect_branch_operand logic
146
147 Backport from mainline
148 2018-01-15 H.J. Lu <hongjiu.lu@intel.com>
149
150 * config/i386/predicates.md (indirect_branch_operand): Rewrite
151 ix86_indirect_branch_register logic.
152
153Upstream-Status: Pending
154
155Signed-off-by: Juro Bystricky <juro.bystricky@intel.com>
156
157---
158 gcc/config/i386/constraints.md | 6 ++--
159 gcc/config/i386/i386.md | 34 ++++++++++++++--------
160 gcc/config/i386/i386.opt | 4 +++
161 gcc/config/i386/predicates.md | 21 +++++++------
162 gcc/doc/invoke.texi | 6 +++-
163 gcc/testsuite/gcc.target/i386/indirect-thunk-1.c | 2 +-
164 gcc/testsuite/gcc.target/i386/indirect-thunk-2.c | 2 +-
165 gcc/testsuite/gcc.target/i386/indirect-thunk-3.c | 2 +-
166 gcc/testsuite/gcc.target/i386/indirect-thunk-4.c | 2 +-
167 gcc/testsuite/gcc.target/i386/indirect-thunk-5.c | 2 +-
168 gcc/testsuite/gcc.target/i386/indirect-thunk-6.c | 2 +-
169 gcc/testsuite/gcc.target/i386/indirect-thunk-7.c | 2 +-
170 .../gcc.target/i386/indirect-thunk-attr-1.c | 2 +-
171 .../gcc.target/i386/indirect-thunk-attr-2.c | 2 +-
172 .../gcc.target/i386/indirect-thunk-attr-3.c | 2 +-
173 .../gcc.target/i386/indirect-thunk-attr-4.c | 2 +-
174 .../gcc.target/i386/indirect-thunk-attr-5.c | 2 +-
175 .../gcc.target/i386/indirect-thunk-attr-6.c | 2 +-
176 .../gcc.target/i386/indirect-thunk-attr-7.c | 2 +-
177 .../gcc.target/i386/indirect-thunk-bnd-1.c | 2 +-
178 .../gcc.target/i386/indirect-thunk-bnd-2.c | 2 +-
179 .../gcc.target/i386/indirect-thunk-bnd-3.c | 2 +-
180 .../gcc.target/i386/indirect-thunk-bnd-4.c | 2 +-
181 .../gcc.target/i386/indirect-thunk-extern-1.c | 2 +-
182 .../gcc.target/i386/indirect-thunk-extern-2.c | 2 +-
183 .../gcc.target/i386/indirect-thunk-extern-3.c | 2 +-
184 .../gcc.target/i386/indirect-thunk-extern-4.c | 2 +-
185 .../gcc.target/i386/indirect-thunk-extern-5.c | 2 +-
186 .../gcc.target/i386/indirect-thunk-extern-6.c | 2 +-
187 .../gcc.target/i386/indirect-thunk-extern-7.c | 2 +-
188 .../gcc.target/i386/indirect-thunk-inline-1.c | 2 +-
189 .../gcc.target/i386/indirect-thunk-inline-2.c | 2 +-
190 .../gcc.target/i386/indirect-thunk-inline-3.c | 2 +-
191 .../gcc.target/i386/indirect-thunk-inline-4.c | 2 +-
192 .../gcc.target/i386/indirect-thunk-inline-5.c | 2 +-
193 .../gcc.target/i386/indirect-thunk-inline-6.c | 2 +-
194 .../gcc.target/i386/indirect-thunk-inline-7.c | 2 +-
195 .../gcc.target/i386/indirect-thunk-register-1.c | 22 ++++++++++++++
196 .../gcc.target/i386/indirect-thunk-register-2.c | 20 +++++++++++++
197 .../gcc.target/i386/indirect-thunk-register-3.c | 19 ++++++++++++
198 gcc/testsuite/gcc.target/i386/ret-thunk-10.c | 2 +-
199 gcc/testsuite/gcc.target/i386/ret-thunk-11.c | 2 +-
200 gcc/testsuite/gcc.target/i386/ret-thunk-12.c | 2 +-
201 gcc/testsuite/gcc.target/i386/ret-thunk-13.c | 2 +-
202 gcc/testsuite/gcc.target/i386/ret-thunk-14.c | 2 +-
203 gcc/testsuite/gcc.target/i386/ret-thunk-15.c | 2 +-
204 gcc/testsuite/gcc.target/i386/ret-thunk-9.c | 2 +-
205 47 files changed, 147 insertions(+), 63 deletions(-)
206 create mode 100644 gcc/testsuite/gcc.target/i386/indirect-thunk-register-1.c
207 create mode 100644 gcc/testsuite/gcc.target/i386/indirect-thunk-register-2.c
208 create mode 100644 gcc/testsuite/gcc.target/i386/indirect-thunk-register-3.c
209
210diff --git a/gcc/config/i386/constraints.md b/gcc/config/i386/constraints.md
211index 1a4c701..9204c8e 100644
212--- a/gcc/config/i386/constraints.md
213+++ b/gcc/config/i386/constraints.md
214@@ -172,14 +172,16 @@
215
216 (define_constraint "Bs"
217 "@internal Sibcall memory operand."
218- (ior (and (not (match_test "TARGET_X32"))
219+ (ior (and (not (match_test "ix86_indirect_branch_register"))
220+ (not (match_test "TARGET_X32"))
221 (match_operand 0 "sibcall_memory_operand"))
222 (and (match_test "TARGET_X32 && Pmode == DImode")
223 (match_operand 0 "GOT_memory_operand"))))
224
225 (define_constraint "Bw"
226 "@internal Call memory operand."
227- (ior (and (not (match_test "TARGET_X32"))
228+ (ior (and (not (match_test "ix86_indirect_branch_register"))
229+ (not (match_test "TARGET_X32"))
230 (match_operand 0 "memory_operand"))
231 (and (match_test "TARGET_X32 && Pmode == DImode")
232 (match_operand 0 "GOT_memory_operand"))))
233diff --git a/gcc/config/i386/i386.md b/gcc/config/i386/i386.md
234index 2da671e..05a88ff 100644
235--- a/gcc/config/i386/i386.md
236+++ b/gcc/config/i386/i386.md
237@@ -11805,7 +11805,7 @@
238 [(set (pc) (match_operand 0 "indirect_branch_operand"))]
239 ""
240 {
241- if (TARGET_X32)
242+ if (TARGET_X32 || ix86_indirect_branch_register)
243 operands[0] = convert_memory_address (word_mode, operands[0]);
244 cfun->machine->has_local_indirect_jump = true;
245 })
246@@ -11859,7 +11859,7 @@
247 OPTAB_DIRECT);
248 }
249
250- if (TARGET_X32)
251+ if (TARGET_X32 || ix86_indirect_branch_register)
252 operands[0] = convert_memory_address (word_mode, operands[0]);
253 cfun->machine->has_local_indirect_jump = true;
254 })
255@@ -12048,7 +12048,7 @@
256 [(call (mem:QI (match_operand:W 0 "memory_operand" "m"))
257 (match_operand 1))
258 (unspec [(const_int 0)] UNSPEC_PEEPSIB)]
259- "!TARGET_X32"
260+ "!TARGET_X32 && !ix86_indirect_branch_register"
261 "* return ix86_output_call_insn (insn, operands[0]);"
262 [(set_attr "type" "call")])
263
264@@ -12057,7 +12057,9 @@
265 (match_operand:W 1 "memory_operand"))
266 (call (mem:QI (match_dup 0))
267 (match_operand 3))]
268- "!TARGET_X32 && SIBLING_CALL_P (peep2_next_insn (1))
269+ "!TARGET_X32
270+ && !ix86_indirect_branch_register
271+ && SIBLING_CALL_P (peep2_next_insn (1))
272 && !reg_mentioned_p (operands[0],
273 CALL_INSN_FUNCTION_USAGE (peep2_next_insn (1)))"
274 [(parallel [(call (mem:QI (match_dup 1))
275@@ -12070,7 +12072,9 @@
276 (unspec_volatile [(const_int 0)] UNSPECV_BLOCKAGE)
277 (call (mem:QI (match_dup 0))
278 (match_operand 3))]
279- "!TARGET_X32 && SIBLING_CALL_P (peep2_next_insn (2))
280+ "!TARGET_X32
281+ && !ix86_indirect_branch_register
282+ && SIBLING_CALL_P (peep2_next_insn (2))
283 && !reg_mentioned_p (operands[0],
284 CALL_INSN_FUNCTION_USAGE (peep2_next_insn (2)))"
285 [(unspec_volatile [(const_int 0)] UNSPECV_BLOCKAGE)
286@@ -12092,7 +12096,7 @@
287 })
288
289 (define_insn "*call_pop"
290- [(call (mem:QI (match_operand:SI 0 "call_insn_operand" "lmBz"))
291+ [(call (mem:QI (match_operand:SI 0 "call_insn_operand" "lBwBz"))
292 (match_operand 1))
293 (set (reg:SI SP_REG)
294 (plus:SI (reg:SI SP_REG)
295@@ -12112,7 +12116,7 @@
296 [(set_attr "type" "call")])
297
298 (define_insn "*sibcall_pop_memory"
299- [(call (mem:QI (match_operand:SI 0 "memory_operand" "m"))
300+ [(call (mem:QI (match_operand:SI 0 "memory_operand" "Bs"))
301 (match_operand 1))
302 (set (reg:SI SP_REG)
303 (plus:SI (reg:SI SP_REG)
304@@ -12166,7 +12170,9 @@
305 [(set (match_operand:W 0 "register_operand")
306 (match_operand:W 1 "memory_operand"))
307 (set (pc) (match_dup 0))]
308- "!TARGET_X32 && peep2_reg_dead_p (2, operands[0])"
309+ "!TARGET_X32
310+ && !ix86_indirect_branch_register
311+ && peep2_reg_dead_p (2, operands[0])"
312 [(set (pc) (match_dup 1))])
313
314 ;; Call subroutine, returning value in operand 0
315@@ -12244,7 +12250,7 @@
316 (call (mem:QI (match_operand:W 1 "memory_operand" "m"))
317 (match_operand 2)))
318 (unspec [(const_int 0)] UNSPEC_PEEPSIB)]
319- "!TARGET_X32"
320+ "!TARGET_X32 && !ix86_indirect_branch_register"
321 "* return ix86_output_call_insn (insn, operands[1]);"
322 [(set_attr "type" "callv")])
323
324@@ -12254,7 +12260,9 @@
325 (set (match_operand 2)
326 (call (mem:QI (match_dup 0))
327 (match_operand 3)))]
328- "!TARGET_X32 && SIBLING_CALL_P (peep2_next_insn (1))
329+ "!TARGET_X32
330+ && !ix86_indirect_branch_register
331+ && SIBLING_CALL_P (peep2_next_insn (1))
332 && !reg_mentioned_p (operands[0],
333 CALL_INSN_FUNCTION_USAGE (peep2_next_insn (1)))"
334 [(parallel [(set (match_dup 2)
335@@ -12269,7 +12277,9 @@
336 (set (match_operand 2)
337 (call (mem:QI (match_dup 0))
338 (match_operand 3)))]
339- "!TARGET_X32 && SIBLING_CALL_P (peep2_next_insn (2))
340+ "!TARGET_X32
341+ && !ix86_indirect_branch_register
342+ && SIBLING_CALL_P (peep2_next_insn (2))
343 && !reg_mentioned_p (operands[0],
344 CALL_INSN_FUNCTION_USAGE (peep2_next_insn (2)))"
345 [(unspec_volatile [(const_int 0)] UNSPECV_BLOCKAGE)
346@@ -12294,7 +12304,7 @@
347
348 (define_insn "*call_value_pop"
349 [(set (match_operand 0)
350- (call (mem:QI (match_operand:SI 1 "call_insn_operand" "lmBz"))
351+ (call (mem:QI (match_operand:SI 1 "call_insn_operand" "lBwBz"))
352 (match_operand 2)))
353 (set (reg:SI SP_REG)
354 (plus:SI (reg:SI SP_REG)
355diff --git a/gcc/config/i386/i386.opt b/gcc/config/i386/i386.opt
356index ad5916f..a97f84f 100644
357--- a/gcc/config/i386/i386.opt
358+++ b/gcc/config/i386/i386.opt
359@@ -921,3 +921,7 @@ Enum(indirect_branch) String(thunk-inline) Value(indirect_branch_thunk_inline)
360
361 EnumValue
362 Enum(indirect_branch) String(thunk-extern) Value(indirect_branch_thunk_extern)
363+
364+mindirect-branch-register
365+Target Report Var(ix86_indirect_branch_register) Init(0)
366+Force indirect call and jump via register.
367diff --git a/gcc/config/i386/predicates.md b/gcc/config/i386/predicates.md
368index 93dda7b..d1f0a7d 100644
369--- a/gcc/config/i386/predicates.md
370+++ b/gcc/config/i386/predicates.md
371@@ -593,7 +593,8 @@
372 ;; Test for a valid operand for indirect branch.
373 (define_predicate "indirect_branch_operand"
374 (ior (match_operand 0 "register_operand")
375- (and (not (match_test "TARGET_X32"))
376+ (and (not (match_test "ix86_indirect_branch_register"))
377+ (not (match_test "TARGET_X32"))
378 (match_operand 0 "memory_operand"))))
379
380 ;; Return true if OP is a memory operands that can be used in sibcalls.
381@@ -636,20 +637,22 @@
382 (ior (match_test "constant_call_address_operand
383 (op, mode == VOIDmode ? mode : Pmode)")
384 (match_operand 0 "call_register_no_elim_operand")
385- (ior (and (not (match_test "TARGET_X32"))
386- (match_operand 0 "memory_operand"))
387- (and (match_test "TARGET_X32 && Pmode == DImode")
388- (match_operand 0 "GOT_memory_operand")))))
389+ (and (not (match_test "ix86_indirect_branch_register"))
390+ (ior (and (not (match_test "TARGET_X32"))
391+ (match_operand 0 "memory_operand"))
392+ (and (match_test "TARGET_X32 && Pmode == DImode")
393+ (match_operand 0 "GOT_memory_operand"))))))
394
395 ;; Similarly, but for tail calls, in which we cannot allow memory references.
396 (define_special_predicate "sibcall_insn_operand"
397 (ior (match_test "constant_call_address_operand
398 (op, mode == VOIDmode ? mode : Pmode)")
399 (match_operand 0 "register_no_elim_operand")
400- (ior (and (not (match_test "TARGET_X32"))
401- (match_operand 0 "sibcall_memory_operand"))
402- (and (match_test "TARGET_X32 && Pmode == DImode")
403- (match_operand 0 "GOT_memory_operand")))))
404+ (and (not (match_test "ix86_indirect_branch_register"))
405+ (ior (and (not (match_test "TARGET_X32"))
406+ (match_operand 0 "sibcall_memory_operand"))
407+ (and (match_test "TARGET_X32 && Pmode == DImode")
408+ (match_operand 0 "GOT_memory_operand"))))))
409
410 ;; Return true if OP is a 32-bit GOT symbol operand.
411 (define_predicate "GOT32_symbol_operand"
412diff --git a/gcc/doc/invoke.texi b/gcc/doc/invoke.texi
413index fa63dc5..ad9f295 100644
414--- a/gcc/doc/invoke.texi
415+++ b/gcc/doc/invoke.texi
416@@ -1170,7 +1170,7 @@ See RS/6000 and PowerPC Options.
417 -mavx256-split-unaligned-load -mavx256-split-unaligned-store @gol
418 -malign-data=@var{type} -mstack-protector-guard=@var{guard} @gol
419 -mmitigate-rop -mindirect-branch=@var{choice} @gol
420--mfunction-return=@var{choice}}
421+-mfunction-return=@var{choice} -mindirect-branch-register}
422
423 @emph{x86 Windows Options}
424 @gccoptlist{-mconsole -mcygwin -mno-cygwin -mdll @gol
425@@ -24241,6 +24241,10 @@ object file. You can control this behavior for a specific function by
426 using the function attribute @code{function_return}.
427 @xref{Function Attributes}.
428
429+@item -mindirect-branch-register
430+@opindex -mindirect-branch-register
431+Force indirect call and jump via register.
432+
433 @end table
434
435 These @samp{-m} switches are supported in addition to the above
436diff --git a/gcc/testsuite/gcc.target/i386/indirect-thunk-1.c b/gcc/testsuite/gcc.target/i386/indirect-thunk-1.c
437index e365ef5..60d0988 100644
438--- a/gcc/testsuite/gcc.target/i386/indirect-thunk-1.c
439+++ b/gcc/testsuite/gcc.target/i386/indirect-thunk-1.c
440@@ -1,5 +1,5 @@
441 /* { dg-do compile } */
442-/* { dg-options "-O2 -mfunction-return=keep -mindirect-branch=thunk -fno-pic" } */
443+/* { dg-options "-O2 -mno-indirect-branch-register -mfunction-return=keep -mindirect-branch=thunk -fno-pic" } */
444
445 typedef void (*dispatch_t)(long offset);
446
447diff --git a/gcc/testsuite/gcc.target/i386/indirect-thunk-2.c b/gcc/testsuite/gcc.target/i386/indirect-thunk-2.c
448index 05a51ad..aac7516 100644
449--- a/gcc/testsuite/gcc.target/i386/indirect-thunk-2.c
450+++ b/gcc/testsuite/gcc.target/i386/indirect-thunk-2.c
451@@ -1,5 +1,5 @@
452 /* { dg-do compile } */
453-/* { dg-options "-O2 -mfunction-return=keep -mindirect-branch=thunk -fno-pic" } */
454+/* { dg-options "-O2 -mno-indirect-branch-register -mfunction-return=keep -mindirect-branch=thunk -fno-pic" } */
455
456 typedef void (*dispatch_t)(long offset);
457
458diff --git a/gcc/testsuite/gcc.target/i386/indirect-thunk-3.c b/gcc/testsuite/gcc.target/i386/indirect-thunk-3.c
459index 3c0d4c3..9e24a38 100644
460--- a/gcc/testsuite/gcc.target/i386/indirect-thunk-3.c
461+++ b/gcc/testsuite/gcc.target/i386/indirect-thunk-3.c
462@@ -1,5 +1,5 @@
463 /* { dg-do compile } */
464-/* { dg-options "-O2 -mfunction-return=keep -mindirect-branch=thunk -fno-pic" } */
465+/* { dg-options "-O2 -mno-indirect-branch-register -mno-indirect-branch-register -mno-indirect-branch-register -mfunction-return=keep -mindirect-branch=thunk -fno-pic" } */
466
467 typedef void (*dispatch_t)(long offset);
468
469diff --git a/gcc/testsuite/gcc.target/i386/indirect-thunk-4.c b/gcc/testsuite/gcc.target/i386/indirect-thunk-4.c
470index 14d4ef6..127b5d9 100644
471--- a/gcc/testsuite/gcc.target/i386/indirect-thunk-4.c
472+++ b/gcc/testsuite/gcc.target/i386/indirect-thunk-4.c
473@@ -1,5 +1,5 @@
474 /* { dg-do compile } */
475-/* { dg-options "-O2 -mfunction-return=keep -mindirect-branch=thunk -fno-pic" } */
476+/* { dg-options "-O2 -mno-indirect-branch-register -mno-indirect-branch-register -mno-indirect-branch-register -mfunction-return=keep -mindirect-branch=thunk -fno-pic" } */
477
478 typedef void (*dispatch_t)(long offset);
479
480diff --git a/gcc/testsuite/gcc.target/i386/indirect-thunk-5.c b/gcc/testsuite/gcc.target/i386/indirect-thunk-5.c
481index b4836c3..fcaa18d 100644
482--- a/gcc/testsuite/gcc.target/i386/indirect-thunk-5.c
483+++ b/gcc/testsuite/gcc.target/i386/indirect-thunk-5.c
484@@ -1,5 +1,5 @@
485 /* { dg-do compile { target *-*-linux* } } */
486-/* { dg-options "-O2 -mfunction-return=keep -fpic -fno-plt -mindirect-branch=thunk" } */
487+/* { dg-options "-O2 -mno-indirect-branch-register -mfunction-return=keep -fpic -fno-plt -mindirect-branch=thunk" } */
488
489 extern void bar (void);
490
491diff --git a/gcc/testsuite/gcc.target/i386/indirect-thunk-6.c b/gcc/testsuite/gcc.target/i386/indirect-thunk-6.c
492index 1f06bd1..e464928 100644
493--- a/gcc/testsuite/gcc.target/i386/indirect-thunk-6.c
494+++ b/gcc/testsuite/gcc.target/i386/indirect-thunk-6.c
495@@ -1,5 +1,5 @@
496 /* { dg-do compile { target *-*-linux* } } */
497-/* { dg-options "-O2 -mfunction-return=keep -fpic -fno-plt -mindirect-branch=thunk" } */
498+/* { dg-options "-O2 -mno-indirect-branch-register -mno-indirect-branch-register -mno-indirect-branch-register -mfunction-return=keep -fpic -fno-plt -mindirect-branch=thunk" } */
499
500 extern void bar (void);
501
502diff --git a/gcc/testsuite/gcc.target/i386/indirect-thunk-7.c b/gcc/testsuite/gcc.target/i386/indirect-thunk-7.c
503index bc6b47a..17c2d0f 100644
504--- a/gcc/testsuite/gcc.target/i386/indirect-thunk-7.c
505+++ b/gcc/testsuite/gcc.target/i386/indirect-thunk-7.c
506@@ -1,5 +1,5 @@
507 /* { dg-do compile } */
508-/* { dg-options "-O2 -mfunction-return=keep -mindirect-branch=thunk -fno-pic" } */
509+/* { dg-options "-O2 -mno-indirect-branch-register -mfunction-return=keep -mindirect-branch=thunk -fno-pic" } */
510
511 void func0 (void);
512 void func1 (void);
513diff --git a/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-1.c b/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-1.c
514index 2257be3..9194ccf 100644
515--- a/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-1.c
516+++ b/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-1.c
517@@ -1,5 +1,5 @@
518 /* { dg-do compile } */
519-/* { dg-options "-O2 -mfunction-return=keep -fno-pic" } */
520+/* { dg-options "-O2 -mno-indirect-branch-register -mfunction-return=keep -fno-pic" } */
521
522 typedef void (*dispatch_t)(long offset);
523
524diff --git a/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-2.c b/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-2.c
525index e9cfdc5..e51f261 100644
526--- a/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-2.c
527+++ b/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-2.c
528@@ -1,5 +1,5 @@
529 /* { dg-do compile } */
530-/* { dg-options "-O2 -mfunction-return=keep -fno-pic" } */
531+/* { dg-options "-O2 -mno-indirect-branch-register -mfunction-return=keep -fno-pic" } */
532
533 typedef void (*dispatch_t)(long offset);
534
535diff --git a/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-3.c b/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-3.c
536index f938db0..4aeec18 100644
537--- a/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-3.c
538+++ b/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-3.c
539@@ -1,5 +1,5 @@
540 /* { dg-do compile } */
541-/* { dg-options "-O2 -mfunction-return=keep -fno-pic" } */
542+/* { dg-options "-O2 -mno-indirect-branch-register -mfunction-return=keep -fno-pic" } */
543
544 typedef void (*dispatch_t)(long offset);
545
546diff --git a/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-4.c b/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-4.c
547index 4e58599..ac0e599 100644
548--- a/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-4.c
549+++ b/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-4.c
550@@ -1,5 +1,5 @@
551 /* { dg-do compile } */
552-/* { dg-options "-O2 -mfunction-return=keep -fno-pic" } */
553+/* { dg-options "-O2 -mno-indirect-branch-register -mfunction-return=keep -fno-pic" } */
554
555 typedef void (*dispatch_t)(long offset);
556
557diff --git a/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-5.c b/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-5.c
558index b8d5024..573cf1e 100644
559--- a/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-5.c
560+++ b/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-5.c
561@@ -1,5 +1,5 @@
562 /* { dg-do compile } */
563-/* { dg-options "-O2 -mfunction-return=keep -fno-pic" } */
564+/* { dg-options "-O2 -mno-indirect-branch-register -mfunction-return=keep -fno-pic" } */
565
566 typedef void (*dispatch_t)(long offset);
567
568diff --git a/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-6.c b/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-6.c
569index 455adab..b2b37fc 100644
570--- a/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-6.c
571+++ b/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-6.c
572@@ -1,5 +1,5 @@
573 /* { dg-do compile } */
574-/* { dg-options "-O2 -mfunction-return=keep -fno-pic" } */
575+/* { dg-options "-O2 -mno-indirect-branch-register -mfunction-return=keep -fno-pic" } */
576
577 typedef void (*dispatch_t)(long offset);
578
579diff --git a/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-7.c b/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-7.c
580index 4595b84..4a43e19 100644
581--- a/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-7.c
582+++ b/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-7.c
583@@ -1,5 +1,5 @@
584 /* { dg-do compile } */
585-/* { dg-options "-O2 -mfunction-return=keep -fno-pic" } */
586+/* { dg-options "-O2 -mno-indirect-branch-register -mfunction-return=keep -fno-pic" } */
587
588 void func0 (void);
589 void func1 (void);
590diff --git a/gcc/testsuite/gcc.target/i386/indirect-thunk-bnd-1.c b/gcc/testsuite/gcc.target/i386/indirect-thunk-bnd-1.c
591index 5e3e118..ac84ab6 100644
592--- a/gcc/testsuite/gcc.target/i386/indirect-thunk-bnd-1.c
593+++ b/gcc/testsuite/gcc.target/i386/indirect-thunk-bnd-1.c
594@@ -1,5 +1,5 @@
595 /* { dg-do compile { target { ! x32 } } } */
596-/* { dg-options "-O2 -mfunction-return=keep -mindirect-branch=thunk -fcheck-pointer-bounds -mmpx -fno-pic" } */
597+/* { dg-options "-O2 -mno-indirect-branch-register -mfunction-return=keep -mindirect-branch=thunk -fcheck-pointer-bounds -mmpx -fno-pic" } */
598
599 void (*dispatch) (char *);
600 char buf[10];
601diff --git a/gcc/testsuite/gcc.target/i386/indirect-thunk-bnd-2.c b/gcc/testsuite/gcc.target/i386/indirect-thunk-bnd-2.c
602index 2801aa4..ce655e8 100644
603--- a/gcc/testsuite/gcc.target/i386/indirect-thunk-bnd-2.c
604+++ b/gcc/testsuite/gcc.target/i386/indirect-thunk-bnd-2.c
605@@ -1,5 +1,5 @@
606 /* { dg-do compile { target { ! x32 } } } */
607-/* { dg-options "-O2 -mfunction-return=keep -mindirect-branch=thunk -fcheck-pointer-bounds -mmpx -fno-pic" } */
608+/* { dg-options "-O2 -mno-indirect-branch-register -mfunction-return=keep -mindirect-branch=thunk -fcheck-pointer-bounds -mmpx -fno-pic" } */
609
610 void (*dispatch) (char *);
611 char buf[10];
612diff --git a/gcc/testsuite/gcc.target/i386/indirect-thunk-bnd-3.c b/gcc/testsuite/gcc.target/i386/indirect-thunk-bnd-3.c
613index 70b4fb3..d34485a 100644
614--- a/gcc/testsuite/gcc.target/i386/indirect-thunk-bnd-3.c
615+++ b/gcc/testsuite/gcc.target/i386/indirect-thunk-bnd-3.c
616@@ -1,5 +1,5 @@
617 /* { dg-do compile { target { *-*-linux* && { ! x32 } } } } */
618-/* { dg-options "-O2 -mfunction-return=keep -mindirect-branch=thunk -fcheck-pointer-bounds -mmpx -fpic -fno-plt" } */
619+/* { dg-options "-O2 -mno-indirect-branch-register -mfunction-return=keep -mindirect-branch=thunk -fcheck-pointer-bounds -mmpx -fpic -fno-plt" } */
620
621 void bar (char *);
622 char buf[10];
623diff --git a/gcc/testsuite/gcc.target/i386/indirect-thunk-bnd-4.c b/gcc/testsuite/gcc.target/i386/indirect-thunk-bnd-4.c
624index 3baf03e..0e19830 100644
625--- a/gcc/testsuite/gcc.target/i386/indirect-thunk-bnd-4.c
626+++ b/gcc/testsuite/gcc.target/i386/indirect-thunk-bnd-4.c
627@@ -1,5 +1,5 @@
628 /* { dg-do compile { target { *-*-linux* && { ! x32 } } } } */
629-/* { dg-options "-O2 -mfunction-return=keep -mindirect-branch=thunk -fcheck-pointer-bounds -mmpx -fpic -fno-plt" } */
630+/* { dg-options "-O2 -mno-indirect-branch-register -mno-indirect-branch-register -mfunction-return=keep -mindirect-branch=thunk -fcheck-pointer-bounds -mmpx -fpic -fno-plt" } */
631
632 void bar (char *);
633 char buf[10];
634diff --git a/gcc/testsuite/gcc.target/i386/indirect-thunk-extern-1.c b/gcc/testsuite/gcc.target/i386/indirect-thunk-extern-1.c
635index edeb264..579441f 100644
636--- a/gcc/testsuite/gcc.target/i386/indirect-thunk-extern-1.c
637+++ b/gcc/testsuite/gcc.target/i386/indirect-thunk-extern-1.c
638@@ -1,5 +1,5 @@
639 /* { dg-do compile } */
640-/* { dg-options "-O2 -mfunction-return=keep -mindirect-branch=thunk-extern -fno-pic" } */
641+/* { dg-options "-O2 -mno-indirect-branch-register -mfunction-return=keep -mindirect-branch=thunk-extern -fno-pic" } */
642
643 typedef void (*dispatch_t)(long offset);
644
645diff --git a/gcc/testsuite/gcc.target/i386/indirect-thunk-extern-2.c b/gcc/testsuite/gcc.target/i386/indirect-thunk-extern-2.c
646index 1d00413..c92e6f2 100644
647--- a/gcc/testsuite/gcc.target/i386/indirect-thunk-extern-2.c
648+++ b/gcc/testsuite/gcc.target/i386/indirect-thunk-extern-2.c
649@@ -1,5 +1,5 @@
650 /* { dg-do compile } */
651-/* { dg-options "-O2 -mfunction-return=keep -mindirect-branch=thunk-extern -fno-pic" } */
652+/* { dg-options "-O2 -mno-indirect-branch-register -mfunction-return=keep -mindirect-branch=thunk-extern -fno-pic" } */
653
654 typedef void (*dispatch_t)(long offset);
655
656diff --git a/gcc/testsuite/gcc.target/i386/indirect-thunk-extern-3.c b/gcc/testsuite/gcc.target/i386/indirect-thunk-extern-3.c
657index 06ebf1c..d9964c2 100644
658--- a/gcc/testsuite/gcc.target/i386/indirect-thunk-extern-3.c
659+++ b/gcc/testsuite/gcc.target/i386/indirect-thunk-extern-3.c
660@@ -1,5 +1,5 @@
661 /* { dg-do compile } */
662-/* { dg-options "-O2 -mfunction-return=keep -mindirect-branch=thunk-extern -fno-pic" } */
663+/* { dg-options "-O2 -mno-indirect-branch-register -mfunction-return=keep -mindirect-branch=thunk-extern -fno-pic" } */
664
665 typedef void (*dispatch_t)(long offset);
666
667diff --git a/gcc/testsuite/gcc.target/i386/indirect-thunk-extern-4.c b/gcc/testsuite/gcc.target/i386/indirect-thunk-extern-4.c
668index 1c8f944..d4dca4d 100644
669--- a/gcc/testsuite/gcc.target/i386/indirect-thunk-extern-4.c
670+++ b/gcc/testsuite/gcc.target/i386/indirect-thunk-extern-4.c
671@@ -1,5 +1,5 @@
672 /* { dg-do compile } */
673-/* { dg-options "-O2 -mfunction-return=keep -mindirect-branch=thunk-extern -fno-pic" } */
674+/* { dg-options "-O2 -mno-indirect-branch-register -mfunction-return=keep -mindirect-branch=thunk-extern -fno-pic" } */
675
676 typedef void (*dispatch_t)(long offset);
677
678diff --git a/gcc/testsuite/gcc.target/i386/indirect-thunk-extern-5.c b/gcc/testsuite/gcc.target/i386/indirect-thunk-extern-5.c
679index 21740ac..5c07e02 100644
680--- a/gcc/testsuite/gcc.target/i386/indirect-thunk-extern-5.c
681+++ b/gcc/testsuite/gcc.target/i386/indirect-thunk-extern-5.c
682@@ -1,5 +1,5 @@
683 /* { dg-do compile { target *-*-linux* } } */
684-/* { dg-options "-O2 -mfunction-return=keep -fpic -fno-plt -mindirect-branch=thunk-extern" } */
685+/* { dg-options "-O2 -mno-indirect-branch-register -mfunction-return=keep -fpic -fno-plt -mindirect-branch=thunk-extern" } */
686
687 extern void bar (void);
688
689diff --git a/gcc/testsuite/gcc.target/i386/indirect-thunk-extern-6.c b/gcc/testsuite/gcc.target/i386/indirect-thunk-extern-6.c
690index a77c1f4..3eb4406 100644
691--- a/gcc/testsuite/gcc.target/i386/indirect-thunk-extern-6.c
692+++ b/gcc/testsuite/gcc.target/i386/indirect-thunk-extern-6.c
693@@ -1,5 +1,5 @@
694 /* { dg-do compile { target *-*-linux* } } */
695-/* { dg-options "-O2 -mfunction-return=keep -fpic -fno-plt -mindirect-branch=thunk-extern" } */
696+/* { dg-options "-O2 -mno-indirect-branch-register -mfunction-return=keep -fpic -fno-plt -mindirect-branch=thunk-extern" } */
697
698 extern void bar (void);
699
700diff --git a/gcc/testsuite/gcc.target/i386/indirect-thunk-extern-7.c b/gcc/testsuite/gcc.target/i386/indirect-thunk-extern-7.c
701index 86e9fd1..aece938 100644
702--- a/gcc/testsuite/gcc.target/i386/indirect-thunk-extern-7.c
703+++ b/gcc/testsuite/gcc.target/i386/indirect-thunk-extern-7.c
704@@ -1,5 +1,5 @@
705 /* { dg-do compile } */
706-/* { dg-options "-O2 -mfunction-return=keep -mindirect-branch=thunk-extern -fno-pic" } */
707+/* { dg-options "-O2 -mno-indirect-branch-register -mfunction-return=keep -mindirect-branch=thunk-extern -fno-pic" } */
708
709 void func0 (void);
710 void func1 (void);
711diff --git a/gcc/testsuite/gcc.target/i386/indirect-thunk-inline-1.c b/gcc/testsuite/gcc.target/i386/indirect-thunk-inline-1.c
712index 3ecde87..3aba5e8 100644
713--- a/gcc/testsuite/gcc.target/i386/indirect-thunk-inline-1.c
714+++ b/gcc/testsuite/gcc.target/i386/indirect-thunk-inline-1.c
715@@ -1,5 +1,5 @@
716 /* { dg-do compile } */
717-/* { dg-options "-O2 -mfunction-return=keep -mindirect-branch=thunk-inline -fno-pic" } */
718+/* { dg-options "-O2 -mno-indirect-branch-register -mfunction-return=keep -mindirect-branch=thunk-inline -fno-pic" } */
719
720 typedef void (*dispatch_t)(long offset);
721
722diff --git a/gcc/testsuite/gcc.target/i386/indirect-thunk-inline-2.c b/gcc/testsuite/gcc.target/i386/indirect-thunk-inline-2.c
723index df32a19..0f0181d 100644
724--- a/gcc/testsuite/gcc.target/i386/indirect-thunk-inline-2.c
725+++ b/gcc/testsuite/gcc.target/i386/indirect-thunk-inline-2.c
726@@ -1,5 +1,5 @@
727 /* { dg-do compile } */
728-/* { dg-options "-O2 -mfunction-return=keep -mindirect-branch=thunk-inline -fno-pic" } */
729+/* { dg-options "-O2 -mno-indirect-branch-register -mfunction-return=keep -mindirect-branch=thunk-inline -fno-pic" } */
730
731 typedef void (*dispatch_t)(long offset);
732
733diff --git a/gcc/testsuite/gcc.target/i386/indirect-thunk-inline-3.c b/gcc/testsuite/gcc.target/i386/indirect-thunk-inline-3.c
734index 9540996..2eef6f3 100644
735--- a/gcc/testsuite/gcc.target/i386/indirect-thunk-inline-3.c
736+++ b/gcc/testsuite/gcc.target/i386/indirect-thunk-inline-3.c
737@@ -1,5 +1,5 @@
738 /* { dg-do compile } */
739-/* { dg-options "-O2 -mfunction-return=keep -mindirect-branch=thunk-inline -fno-pic" } */
740+/* { dg-options "-O2 -mno-indirect-branch-register -mfunction-return=keep -mindirect-branch=thunk-inline -fno-pic" } */
741
742 typedef void (*dispatch_t)(long offset);
743
744diff --git a/gcc/testsuite/gcc.target/i386/indirect-thunk-inline-4.c b/gcc/testsuite/gcc.target/i386/indirect-thunk-inline-4.c
745index f3db6e2..e825a10 100644
746--- a/gcc/testsuite/gcc.target/i386/indirect-thunk-inline-4.c
747+++ b/gcc/testsuite/gcc.target/i386/indirect-thunk-inline-4.c
748@@ -1,5 +1,5 @@
749 /* { dg-do compile } */
750-/* { dg-options "-O2 -mfunction-return=keep -mindirect-branch=thunk-inline -fno-pic" } */
751+/* { dg-options "-O2 -mno-indirect-branch-register -mfunction-return=keep -mindirect-branch=thunk-inline -fno-pic" } */
752
753 typedef void (*dispatch_t)(long offset);
754
755diff --git a/gcc/testsuite/gcc.target/i386/indirect-thunk-inline-5.c b/gcc/testsuite/gcc.target/i386/indirect-thunk-inline-5.c
756index 0f687c3..c6d77e1 100644
757--- a/gcc/testsuite/gcc.target/i386/indirect-thunk-inline-5.c
758+++ b/gcc/testsuite/gcc.target/i386/indirect-thunk-inline-5.c
759@@ -1,5 +1,5 @@
760 /* { dg-do compile { target *-*-linux* } } */
761-/* { dg-options "-O2 -mfunction-return=keep -fpic -fno-plt -mindirect-branch=thunk-inline" } */
762+/* { dg-options "-O2 -mno-indirect-branch-register -mfunction-return=keep -fpic -fno-plt -mindirect-branch=thunk-inline" } */
763
764 extern void bar (void);
765
766diff --git a/gcc/testsuite/gcc.target/i386/indirect-thunk-inline-6.c b/gcc/testsuite/gcc.target/i386/indirect-thunk-inline-6.c
767index b27c6fc..6454827 100644
768--- a/gcc/testsuite/gcc.target/i386/indirect-thunk-inline-6.c
769+++ b/gcc/testsuite/gcc.target/i386/indirect-thunk-inline-6.c
770@@ -1,5 +1,5 @@
771 /* { dg-do compile { target *-*-linux* } } */
772-/* { dg-options "-O2 -mfunction-return=keep -fpic -fno-plt -mindirect-branch=thunk-inline" } */
773+/* { dg-options "-O2 -mno-indirect-branch-register -mfunction-return=keep -fpic -fno-plt -mindirect-branch=thunk-inline" } */
774
775 extern void bar (void);
776
777diff --git a/gcc/testsuite/gcc.target/i386/indirect-thunk-inline-7.c b/gcc/testsuite/gcc.target/i386/indirect-thunk-inline-7.c
778index 764a375..c67066c 100644
779--- a/gcc/testsuite/gcc.target/i386/indirect-thunk-inline-7.c
780+++ b/gcc/testsuite/gcc.target/i386/indirect-thunk-inline-7.c
781@@ -1,5 +1,5 @@
782 /* { dg-do compile } */
783-/* { dg-options "-O2 -mfunction-return=keep -mindirect-branch=thunk-inline -fno-pic" } */
784+/* { dg-options "-O2 -mno-indirect-branch-register -mfunction-return=keep -mindirect-branch=thunk-inline -fno-pic" } */
785
786 void func0 (void);
787 void func1 (void);
788diff --git a/gcc/testsuite/gcc.target/i386/indirect-thunk-register-1.c b/gcc/testsuite/gcc.target/i386/indirect-thunk-register-1.c
789new file mode 100644
790index 0000000..7d396a3
791--- /dev/null
792+++ b/gcc/testsuite/gcc.target/i386/indirect-thunk-register-1.c
793@@ -0,0 +1,22 @@
794+/* { dg-do compile } */
795+/* { dg-options "-O2 -mindirect-branch=thunk -mindirect-branch-register -fno-pic" } */
796+
797+typedef void (*dispatch_t)(long offset);
798+
799+dispatch_t dispatch;
800+
801+void
802+male_indirect_jump (long offset)
803+{
804+ dispatch(offset);
805+}
806+
807+/* { dg-final { scan-assembler "jmp\[ \t\]*__x86_indirect_thunk_(r|e)ax" } } */
808+/* { dg-final { scan-assembler "jmp\[ \t\]*\.LIND" } } */
809+/* { dg-final { scan-assembler "call\[ \t\]*\.LIND" } } */
810+/* { dg-final { scan-assembler "mov\[ \t\](%eax|%rax), \\((%esp|%rsp)\\)" } } */
811+/* { dg-final { scan-assembler {\tpause} } } */
812+/* { dg-final { scan-assembler-not "push(?:l|q)\[ \t\]*_?dispatch" } } */
813+/* { dg-final { scan-assembler-not "pushq\[ \t\]%rax" } } */
814+/* { dg-final { scan-assembler-not "__x86_indirect_thunk\n" } } */
815+/* { dg-final { scan-assembler-not "__x86_indirect_thunk_bnd\n" } } */
816diff --git a/gcc/testsuite/gcc.target/i386/indirect-thunk-register-2.c b/gcc/testsuite/gcc.target/i386/indirect-thunk-register-2.c
817new file mode 100644
818index 0000000..e7e616b
819--- /dev/null
820+++ b/gcc/testsuite/gcc.target/i386/indirect-thunk-register-2.c
821@@ -0,0 +1,20 @@
822+/* { dg-do compile } */
823+/* { dg-options "-O2 -mindirect-branch=thunk-inline -mindirect-branch-register -fno-pic" } */
824+
825+typedef void (*dispatch_t)(long offset);
826+
827+dispatch_t dispatch;
828+
829+void
830+male_indirect_jump (long offset)
831+{
832+ dispatch(offset);
833+}
834+
835+/* { dg-final { scan-assembler "jmp\[ \t\]*\.LIND" } } */
836+/* { dg-final { scan-assembler "call\[ \t\]*\.LIND" } } */
837+/* { dg-final { scan-assembler "mov\[ \t\](%eax|%rax), \\((%esp|%rsp)\\)" } } */
838+/* { dg-final { scan-assembler {\tpause} } } */
839+/* { dg-final { scan-assembler-not "push(?:l|q)\[ \t\]*_?dispatch" } } */
840+/* { dg-final { scan-assembler-not "pushq\[ \t\]%rax" } } */
841+/* { dg-final { scan-assembler-not "__x86_indirect_thunk" } } */
842diff --git a/gcc/testsuite/gcc.target/i386/indirect-thunk-register-3.c b/gcc/testsuite/gcc.target/i386/indirect-thunk-register-3.c
843new file mode 100644
844index 0000000..5320e92
845--- /dev/null
846+++ b/gcc/testsuite/gcc.target/i386/indirect-thunk-register-3.c
847@@ -0,0 +1,19 @@
848+/* { dg-do compile } */
849+/* { dg-options "-O2 -mindirect-branch=thunk-extern -mindirect-branch-register -fno-pic" } */
850+
851+typedef void (*dispatch_t)(long offset);
852+
853+dispatch_t dispatch;
854+
855+void
856+male_indirect_jump (long offset)
857+{
858+ dispatch(offset);
859+}
860+
861+/* { dg-final { scan-assembler "jmp\[ \t\]*__x86_indirect_thunk_(r|e)ax" } } */
862+/* { dg-final { scan-assembler-not "push(?:l|q)\[ \t\]*_?dispatch" } } */
863+/* { dg-final { scan-assembler-not "pushq\[ \t\]%rax" } } */
864+/* { dg-final { scan-assembler-not {\t(pause|pause|nop)} } } */
865+/* { dg-final { scan-assembler-not "jmp\[ \t\]*\.LIND" } } */
866+/* { dg-final { scan-assembler-not "call\[ \t\]*\.LIND" } } */
867diff --git a/gcc/testsuite/gcc.target/i386/ret-thunk-10.c b/gcc/testsuite/gcc.target/i386/ret-thunk-10.c
868index 3a6727b..e6fea84 100644
869--- a/gcc/testsuite/gcc.target/i386/ret-thunk-10.c
870+++ b/gcc/testsuite/gcc.target/i386/ret-thunk-10.c
871@@ -1,5 +1,5 @@
872 /* { dg-do compile } */
873-/* { dg-options "-O2 -mfunction-return=thunk-inline -mindirect-branch=thunk -fno-pic" } */
874+/* { dg-options "-O2 -mno-indirect-branch-register -mno-indirect-branch-register -mfunction-return=thunk-inline -mindirect-branch=thunk -fno-pic" } */
875
876 extern void (*bar) (void);
877
878diff --git a/gcc/testsuite/gcc.target/i386/ret-thunk-11.c b/gcc/testsuite/gcc.target/i386/ret-thunk-11.c
879index b8f6818..e239ec4 100644
880--- a/gcc/testsuite/gcc.target/i386/ret-thunk-11.c
881+++ b/gcc/testsuite/gcc.target/i386/ret-thunk-11.c
882@@ -1,5 +1,5 @@
883 /* { dg-do compile } */
884-/* { dg-options "-O2 -mfunction-return=thunk-extern -mindirect-branch=thunk -fno-pic" } */
885+/* { dg-options "-O2 -mno-indirect-branch-register -mno-indirect-branch-register -mno-indirect-branch-register -mno-indirect-branch-register -mfunction-return=thunk-extern -mindirect-branch=thunk -fno-pic" } */
886
887 extern void (*bar) (void);
888
889diff --git a/gcc/testsuite/gcc.target/i386/ret-thunk-12.c b/gcc/testsuite/gcc.target/i386/ret-thunk-12.c
890index 01b0a02..fa31813 100644
891--- a/gcc/testsuite/gcc.target/i386/ret-thunk-12.c
892+++ b/gcc/testsuite/gcc.target/i386/ret-thunk-12.c
893@@ -1,5 +1,5 @@
894 /* { dg-do compile } */
895-/* { dg-options "-O2 -mfunction-return=keep -mindirect-branch=thunk -fno-pic" } */
896+/* { dg-options "-O2 -mno-indirect-branch-register -mno-indirect-branch-register -mno-indirect-branch-register -mno-indirect-branch-register -mfunction-return=keep -mindirect-branch=thunk -fno-pic" } */
897
898 extern void (*bar) (void);
899
900diff --git a/gcc/testsuite/gcc.target/i386/ret-thunk-13.c b/gcc/testsuite/gcc.target/i386/ret-thunk-13.c
901index 4b497b5..fd5b41f 100644
902--- a/gcc/testsuite/gcc.target/i386/ret-thunk-13.c
903+++ b/gcc/testsuite/gcc.target/i386/ret-thunk-13.c
904@@ -1,5 +1,5 @@
905 /* { dg-do compile } */
906-/* { dg-options "-O2 -mfunction-return=keep -mindirect-branch=thunk-inline -fno-pic" } */
907+/* { dg-options "-O2 -mno-indirect-branch-register -mfunction-return=keep -mindirect-branch=thunk-inline -fno-pic" } */
908
909 extern void (*bar) (void);
910 extern int foo (void) __attribute__ ((function_return("thunk")));
911diff --git a/gcc/testsuite/gcc.target/i386/ret-thunk-14.c b/gcc/testsuite/gcc.target/i386/ret-thunk-14.c
912index 4ae4c44..d606373 100644
913--- a/gcc/testsuite/gcc.target/i386/ret-thunk-14.c
914+++ b/gcc/testsuite/gcc.target/i386/ret-thunk-14.c
915@@ -1,5 +1,5 @@
916 /* { dg-do compile } */
917-/* { dg-options "-O2 -mfunction-return=keep -mindirect-branch=thunk-extern -fno-pic" } */
918+/* { dg-options "-O2 -mno-indirect-branch-register -mfunction-return=keep -mindirect-branch=thunk-extern -fno-pic" } */
919
920 extern void (*bar) (void);
921
922diff --git a/gcc/testsuite/gcc.target/i386/ret-thunk-15.c b/gcc/testsuite/gcc.target/i386/ret-thunk-15.c
923index 5b5bc76..75e45e2 100644
924--- a/gcc/testsuite/gcc.target/i386/ret-thunk-15.c
925+++ b/gcc/testsuite/gcc.target/i386/ret-thunk-15.c
926@@ -1,5 +1,5 @@
927 /* { dg-do compile } */
928-/* { dg-options "-O2 -mfunction-return=keep -mindirect-branch=keep -fno-pic" } */
929+/* { dg-options "-O2 -mno-indirect-branch-register -mno-indirect-branch-register -mno-indirect-branch-register -mno-indirect-branch-register -mfunction-return=keep -mindirect-branch=keep -fno-pic" } */
930
931 extern void (*bar) (void);
932
933diff --git a/gcc/testsuite/gcc.target/i386/ret-thunk-9.c b/gcc/testsuite/gcc.target/i386/ret-thunk-9.c
934index fa24a1f..d1db41c 100644
935--- a/gcc/testsuite/gcc.target/i386/ret-thunk-9.c
936+++ b/gcc/testsuite/gcc.target/i386/ret-thunk-9.c
937@@ -1,5 +1,5 @@
938 /* { dg-do compile } */
939-/* { dg-options "-O2 -mfunction-return=thunk -mindirect-branch=thunk -fno-pic" } */
940+/* { dg-options "-O2 -mno-indirect-branch-register -mno-indirect-branch-register -mfunction-return=thunk -mindirect-branch=thunk -fno-pic" } */
941
942 extern void (*bar) (void);
943
944--
9452.7.4
946