> On Mon, Feb 26, 2018 at 7:47 AM, Jan Hubicka <hubi...@ucw.cz> wrote:
> > Hi,
> > my main concern about the patch is that we now have 
> > -mindirect-branch=thunk-extern
> > which is intended to work well and is used by kernel, but we also have 
> > other modes
> > that are documented and as such they should work but they may lead to 
> > invalid
> > unwind info (or did I miss anything imporant here?).
> > Why we can't fix the others as well?
> >
> 
> I took a closer look at my commit message.  It does leave an impression that
> only  -mindirect-branch=thunk-extern is fixed.  But in fact, all
> -mindirect-branch=
> choices are fixed.

I see, sorry for confussion!
> 
> 1.  -mindirect-branch=thunk generates:
> 
>        .cfi_startproc
>         pushq   %rbx
>         .cfi_def_cfa_offset 16
>         .cfi_offset 3, -16
>         movq    (%rdi), %rax
>         movq    %rdi, %rbx
>         movq    16(%rax), %rax
>         call    __x86_indirect_thunk_rax
>         movq    (%rbx), %rax
>         movq    %rbx, %rdi
>         popq    %rbx
>         .cfi_def_cfa_offset 8
>         movq    16(%rax), %rax
>         jmp     __x86_indirect_thunk_rax
>         .cfi_endproc
> 
> 2.  -mindirect-branch=thunk-inline generates:
> 
>        .cfi_startproc
>         pushq   %rbx
>         .cfi_def_cfa_offset 16
>         .cfi_offset 3, -16
>         movq    (%rdi), %rax
>         movq    %rdi, %rbx
>         movq    16(%rax), %rax
>         jmp     .LIND1
> .LIND0:
>         call    .LIND3
> .LIND2:
>         pause
>         lfence
>         jmp     .LIND2
> .LIND3:
>         mov     %rax, (%rsp)
>         ret
> .LIND1:
>         call    .LIND0
>         movq    (%rbx), %rax
>         movq    %rbx, %rdi
>         popq    %rbx
>         .cfi_def_cfa_offset 8
>         movq    16(%rax), %rax
>         call    .LIND5
> .LIND4:
>         pause
>         lfence
>         jmp     .LIND4
> .LIND5:
>         mov     %rax, (%rsp)
>         ret
>         .cfi_endproc
> 
> I updated the commit message with
> 
> This patch adds TARGET_INDIRECT_BRANCH_REGISTER to force indirect
> branch via register whenever -mindirect-branch= is used.
> 
> OK for trunk?
> 
> Thanks.
> 
> -- 
> H.J.

> From bd0672bd070da6fa4ff630540c1d87df3e8fdd53 Mon Sep 17 00:00:00 2001
> From: "H.J. Lu" <hjl.to...@gmail.com>
> Date: Fri, 26 Jan 2018 15:54:25 -0800
> Subject: [PATCH] i386: Add TARGET_INDIRECT_BRANCH_REGISTER
> 
> For
> 
> ---
> struct C {
>   virtual ~C();
>   virtual void f();
> };
> 
> void
> f (C *p)
> {
>   p->f();
>   p->f();
> }
> ---
> 
> -mindirect-branch=thunk-extern -O2 on x86-64 GNU/Linux generates:
> 
> _Z1fP1C:
> .LFB0:
>         .cfi_startproc
>         pushq   %rbx
>         .cfi_def_cfa_offset 16
>         .cfi_offset 3, -16
>         movq    (%rdi), %rax
>         movq    %rdi, %rbx
>         jmp     .LIND1
> .LIND0:
>         pushq   16(%rax)
>         jmp     __x86_indirect_thunk
> .LIND1:
>         call    .LIND0
>         movq    (%rbx), %rax
>         movq    %rbx, %rdi
>         popq    %rbx
>         .cfi_def_cfa_offset 8
>         movq    16(%rax), %rax
>         jmp     __x86_indirect_thunk_rax
>         .cfi_endproc
> 
> x86-64 is supposed to have asynchronous unwind tables by default, but
> there is nothing that reflects the change in the (relative) frame
> address after .LIND0.  That region really has to be moved outside of
> the .cfi_startproc/.cfi_endproc bracket.
> 
> This patch adds TARGET_INDIRECT_BRANCH_REGISTER to force indirect
> branch via register whenever -mindirect-branch= is used.  Now,
> -mindirect-branch=thunk-extern -O2 on x86-64 GNU/Linux generates:
> 
> _Z1fP1C:
> .LFB0:
>       .cfi_startproc
>       pushq   %rbx
>       .cfi_def_cfa_offset 16
>       .cfi_offset 3, -16
>       movq    (%rdi), %rax
>       movq    %rdi, %rbx
>       movq    16(%rax), %rax
>       call    __x86_indirect_thunk_rax
>       movq    (%rbx), %rax
>       movq    %rbx, %rdi
>       popq    %rbx
>       .cfi_def_cfa_offset 8
>       movq    16(%rax), %rax
>       jmp     __x86_indirect_thunk_rax
>       .cfi_endproc
> 
> so that "-mindirect-branch=thunk-extern" is equivalent to
> "-mindirect-branch=thunk-extern -mindirect-branch-register", which is
> used by Linux kernel.
> 
> gcc/
> 
>       PR target/84039
>       * config/i386/constraints.md (Bs): Replace
>       ix86_indirect_branch_register with
>       TARGET_INDIRECT_BRANCH_REGISTER.
>       (Bw): Likewise.
>       * config/i386/i386.md (indirect_jump): Likewise.
>       (tablejump): Likewise.
>       (*sibcall_memory): Likewise.
>       (*sibcall_value_memory): Likewise.
>       Peepholes of indirect call and jump via memory: Likewise.
>       (*sibcall_GOT_32): Disallowed for TARGET_INDIRECT_BRANCH_REGISTER.
>       (*sibcall_value_GOT_32): Likewise.
>       * config/i386/i386.opt: Likewise.
>       * config/i386/predicates.md (indirect_branch_operand): Likewise.
>       (GOT_memory_operand): Likewise.
>       (call_insn_operand): Likewise.
>       (sibcall_insn_operand): Likewise.
>       (GOT32_symbol_operand): Likewise.
>       * config/i386/i386.h (TARGET_INDIRECT_BRANCH_REGISTER): New.

OK,
thanks!
Honza
> 
> gcc/testsuite/
> 
>       PR target/84039
>       * gcc.target/i386/indirect-thunk-1.c: Updated.
>       * gcc.target/i386/indirect-thunk-2.c: Likewise.
>       * gcc.target/i386/indirect-thunk-3.c: Likewise.
>       * gcc.target/i386/indirect-thunk-4.c: Likewise.
>       * gcc.target/i386/indirect-thunk-5.c: Likewise.
>       * gcc.target/i386/indirect-thunk-6.c: Likewise.
>       * gcc.target/i386/indirect-thunk-7.c: Likewise.
>       * gcc.target/i386/indirect-thunk-attr-1.c: Likewise.
>       * gcc.target/i386/indirect-thunk-attr-2.c: Likewise.
>       * gcc.target/i386/indirect-thunk-attr-3.c: Likewise.
>       * gcc.target/i386/indirect-thunk-attr-4.c: Likewise.
>       * gcc.target/i386/indirect-thunk-attr-5.c: Likewise.
>       * gcc.target/i386/indirect-thunk-attr-6.c: Likewise.
>       * gcc.target/i386/indirect-thunk-attr-7.c: Likewise.
>       * gcc.target/i386/indirect-thunk-bnd-1.c: Likewise.
>       * gcc.target/i386/indirect-thunk-bnd-2.c: Likewise.
>       * gcc.target/i386/indirect-thunk-bnd-3.c: Likewise.
>       * gcc.target/i386/indirect-thunk-bnd-4.c: Likewise.
>       * gcc.target/i386/indirect-thunk-extern-1.c: Likewise.
>       * gcc.target/i386/indirect-thunk-extern-2.c: Likewise.
>       * gcc.target/i386/indirect-thunk-extern-3.c: Likewise.
>       * gcc.target/i386/indirect-thunk-extern-4.c: Likewise.
>       * gcc.target/i386/indirect-thunk-extern-5.c: Likewise.
>       * gcc.target/i386/indirect-thunk-extern-6.c: Likewise.
>       * gcc.target/i386/indirect-thunk-extern-7.c: Likewise.
>       * gcc.target/i386/indirect-thunk-inline-1.c: Likewise.
>       * gcc.target/i386/indirect-thunk-inline-2.c: Likewise.
>       * gcc.target/i386/indirect-thunk-inline-3.c: Likewise.
>       * gcc.target/i386/indirect-thunk-inline-4.c: Likewise.
>       * gcc.target/i386/indirect-thunk-inline-5.c: Likewise.
>       * gcc.target/i386/indirect-thunk-inline-6.c: Likewise.
>       * gcc.target/i386/indirect-thunk-inline-7.c: Likewise.
>       * gcc.target/i386/ret-thunk-9.c: Likewise.
>       * gcc.target/i386/ret-thunk-10.c: Likewise.
>       * gcc.target/i386/ret-thunk-11.c: Likewise.
>       * gcc.target/i386/ret-thunk-12.c: Likewise.
>       * gcc.target/i386/ret-thunk-13.c: Likewise.
>       * gcc.target/i386/ret-thunk-14.c: Likewise.
>       * gcc.target/i386/ret-thunk-15.c: Likewise.
> ---
>  gcc/config/i386/constraints.md                     |  4 ++--
>  gcc/config/i386/i386.h                             |  4 ++++
>  gcc/config/i386/i386.md                            | 28 
> +++++++++++++---------
>  gcc/config/i386/predicates.md                      |  6 ++---
>  gcc/testsuite/gcc.target/i386/indirect-thunk-1.c   |  5 ++--
>  gcc/testsuite/gcc.target/i386/indirect-thunk-2.c   |  5 ++--
>  gcc/testsuite/gcc.target/i386/indirect-thunk-3.c   |  5 ++--
>  gcc/testsuite/gcc.target/i386/indirect-thunk-4.c   |  5 ++--
>  gcc/testsuite/gcc.target/i386/indirect-thunk-5.c   |  6 +++--
>  gcc/testsuite/gcc.target/i386/indirect-thunk-6.c   | 12 ++++++----
>  gcc/testsuite/gcc.target/i386/indirect-thunk-7.c   |  5 ++--
>  .../gcc.target/i386/indirect-thunk-attr-1.c        |  5 ++--
>  .../gcc.target/i386/indirect-thunk-attr-2.c        |  5 ++--
>  .../gcc.target/i386/indirect-thunk-attr-3.c        |  3 +--
>  .../gcc.target/i386/indirect-thunk-attr-4.c        |  3 +--
>  .../gcc.target/i386/indirect-thunk-attr-5.c        |  9 ++++---
>  .../gcc.target/i386/indirect-thunk-attr-6.c        |  9 ++++---
>  .../gcc.target/i386/indirect-thunk-attr-7.c        |  5 ++--
>  .../gcc.target/i386/indirect-thunk-bnd-1.c         |  6 ++---
>  .../gcc.target/i386/indirect-thunk-bnd-2.c         |  6 ++---
>  .../gcc.target/i386/indirect-thunk-bnd-3.c         |  5 ++--
>  .../gcc.target/i386/indirect-thunk-bnd-4.c         |  7 +++---
>  .../gcc.target/i386/indirect-thunk-extern-1.c      |  5 ++--
>  .../gcc.target/i386/indirect-thunk-extern-2.c      |  5 ++--
>  .../gcc.target/i386/indirect-thunk-extern-3.c      |  9 ++++---
>  .../gcc.target/i386/indirect-thunk-extern-4.c      |  6 ++---
>  .../gcc.target/i386/indirect-thunk-extern-5.c      |  6 +++--
>  .../gcc.target/i386/indirect-thunk-extern-6.c      |  8 +++----
>  .../gcc.target/i386/indirect-thunk-extern-7.c      |  5 ++--
>  .../gcc.target/i386/indirect-thunk-inline-1.c      |  2 +-
>  .../gcc.target/i386/indirect-thunk-inline-2.c      |  2 +-
>  .../gcc.target/i386/indirect-thunk-inline-3.c      |  2 +-
>  .../gcc.target/i386/indirect-thunk-inline-4.c      |  2 +-
>  .../gcc.target/i386/indirect-thunk-inline-5.c      |  3 ++-
>  .../gcc.target/i386/indirect-thunk-inline-6.c      |  3 ++-
>  .../gcc.target/i386/indirect-thunk-inline-7.c      |  4 ++--
>  gcc/testsuite/gcc.target/i386/ret-thunk-10.c       |  9 +++----
>  gcc/testsuite/gcc.target/i386/ret-thunk-11.c       |  9 +++----
>  gcc/testsuite/gcc.target/i386/ret-thunk-12.c       |  8 +++----
>  gcc/testsuite/gcc.target/i386/ret-thunk-13.c       |  5 ++--
>  gcc/testsuite/gcc.target/i386/ret-thunk-14.c       |  7 +++---
>  gcc/testsuite/gcc.target/i386/ret-thunk-15.c       |  7 +++---
>  gcc/testsuite/gcc.target/i386/ret-thunk-9.c        | 13 ++++------
>  43 files changed, 127 insertions(+), 141 deletions(-)
> 
> diff --git a/gcc/config/i386/constraints.md b/gcc/config/i386/constraints.md
> index 664e906b311..d026968c4c9 100644
> --- a/gcc/config/i386/constraints.md
> +++ b/gcc/config/i386/constraints.md
> @@ -225,7 +225,7 @@
>  
>  (define_constraint "Bs"
>    "@internal Sibcall memory operand."
> -  (ior (and (not (match_test "ix86_indirect_branch_register"))
> +  (ior (and (not (match_test "TARGET_INDIRECT_BRANCH_REGISTER"))
>           (not (match_test "TARGET_X32"))
>           (match_operand 0 "sibcall_memory_operand"))
>         (and (match_test "TARGET_X32 && Pmode == DImode")
> @@ -233,7 +233,7 @@
>  
>  (define_constraint "Bw"
>    "@internal Call memory operand."
> -  (ior (and (not (match_test "ix86_indirect_branch_register"))
> +  (ior (and (not (match_test "TARGET_INDIRECT_BRANCH_REGISTER"))
>           (not (match_test "TARGET_X32"))
>           (match_operand 0 "memory_operand"))
>         (and (match_test "TARGET_X32 && Pmode == DImode")
> diff --git a/gcc/config/i386/i386.h b/gcc/config/i386/i386.h
> index 9d864501d4f..6f3ae683d74 100644
> --- a/gcc/config/i386/i386.h
> +++ b/gcc/config/i386/i386.h
> @@ -2709,6 +2709,10 @@ extern void debug_dispatch_window (int);
>  #define TARGET_PREFER_AVX256 (TARGET_PREFER_AVX128 \
>                                || prefer_vector_width_type == PVW_AVX256)
>  
> +#define TARGET_INDIRECT_BRANCH_REGISTER \
> +  (ix86_indirect_branch_register \
> +   || cfun->machine->indirect_branch_type != indirect_branch_keep)
> +
>  #define IX86_HLE_ACQUIRE (1 << 16)
>  #define IX86_HLE_RELEASE (1 << 17)
>  
> diff --git a/gcc/config/i386/i386.md b/gcc/config/i386/i386.md
> index f271278ed58..85e4b07cd0f 100644
> --- a/gcc/config/i386/i386.md
> +++ b/gcc/config/i386/i386.md
> @@ -12311,7 +12311,7 @@
>    [(set (pc) (match_operand 0 "indirect_branch_operand"))]
>    ""
>  {
> -  if (TARGET_X32 || ix86_indirect_branch_register)
> +  if (TARGET_X32 || TARGET_INDIRECT_BRANCH_REGISTER)
>      operands[0] = convert_memory_address (word_mode, operands[0]);
>    cfun->machine->has_local_indirect_jump = true;
>  })
> @@ -12365,7 +12365,7 @@
>                                        OPTAB_DIRECT);
>      }
>  
> -  if (TARGET_X32 || ix86_indirect_branch_register)
> +  if (TARGET_X32 || TARGET_INDIRECT_BRANCH_REGISTER)
>      operands[0] = convert_memory_address (word_mode, operands[0]);
>    cfun->machine->has_local_indirect_jump = true;
>  })
> @@ -12595,7 +12595,10 @@
>                    (match_operand:SI 0 "register_no_elim_operand" "U")
>                    (match_operand:SI 1 "GOT32_symbol_operand"))))
>        (match_operand 2))]
> -  "!TARGET_MACHO && !TARGET_64BIT && SIBLING_CALL_P (insn)"
> +  "!TARGET_MACHO
> +  && !TARGET_64BIT
> +  && !TARGET_INDIRECT_BRANCH_REGISTER
> +  && SIBLING_CALL_P (insn)"
>  {
>    rtx fnaddr = gen_rtx_PLUS (SImode, operands[0], operands[1]);
>    fnaddr = gen_const_mem (SImode, fnaddr);
> @@ -12614,7 +12617,7 @@
>    [(call (mem:QI (match_operand:W 0 "memory_operand" "m"))
>        (match_operand 1))
>     (unspec [(const_int 0)] UNSPEC_PEEPSIB)]
> -  "!TARGET_X32 && !ix86_indirect_branch_register"
> +  "!TARGET_X32 && !TARGET_INDIRECT_BRANCH_REGISTER"
>    "* return ix86_output_call_insn (insn, operands[0]);"
>    [(set_attr "type" "call")])
>  
> @@ -12624,7 +12627,7 @@
>     (call (mem:QI (match_dup 0))
>        (match_operand 3))]
>    "!TARGET_X32
> -   && !ix86_indirect_branch_register
> +   && !TARGET_INDIRECT_BRANCH_REGISTER
>     && SIBLING_CALL_P (peep2_next_insn (1))
>     && !reg_mentioned_p (operands[0],
>                       CALL_INSN_FUNCTION_USAGE (peep2_next_insn (1)))"
> @@ -12639,7 +12642,7 @@
>     (call (mem:QI (match_dup 0))
>        (match_operand 3))]
>    "!TARGET_X32
> -   && !ix86_indirect_branch_register
> +   && !TARGET_INDIRECT_BRANCH_REGISTER
>     && SIBLING_CALL_P (peep2_next_insn (2))
>     && !reg_mentioned_p (operands[0],
>                       CALL_INSN_FUNCTION_USAGE (peep2_next_insn (2)))"
> @@ -12737,7 +12740,7 @@
>          (match_operand:W 1 "memory_operand"))
>     (set (pc) (match_dup 0))]
>    "!TARGET_X32
> -   && !ix86_indirect_branch_register
> +   && !TARGET_INDIRECT_BRANCH_REGISTER
>     && peep2_reg_dead_p (2, operands[0])"
>    [(set (pc) (match_dup 1))])
>  
> @@ -12798,7 +12801,10 @@
>                         (match_operand:SI 1 "register_no_elim_operand" "U")
>                         (match_operand:SI 2 "GOT32_symbol_operand"))))
>        (match_operand 3)))]
> -  "!TARGET_MACHO && !TARGET_64BIT && SIBLING_CALL_P (insn)"
> +  "!TARGET_MACHO
> +   && !TARGET_64BIT
> +   && !TARGET_INDIRECT_BRANCH_REGISTER
> +   && SIBLING_CALL_P (insn)"
>  {
>    rtx fnaddr = gen_rtx_PLUS (SImode, operands[1], operands[2]);
>    fnaddr = gen_const_mem (SImode, fnaddr);
> @@ -12819,7 +12825,7 @@
>       (call (mem:QI (match_operand:W 1 "memory_operand" "m"))
>             (match_operand 2)))
>     (unspec [(const_int 0)] UNSPEC_PEEPSIB)]
> -  "!TARGET_X32 && !ix86_indirect_branch_register"
> +  "!TARGET_X32 && !TARGET_INDIRECT_BRANCH_REGISTER"
>    "* return ix86_output_call_insn (insn, operands[1]);"
>    [(set_attr "type" "callv")])
>  
> @@ -12830,7 +12836,7 @@
>     (call (mem:QI (match_dup 0))
>                (match_operand 3)))]
>    "!TARGET_X32
> -   && !ix86_indirect_branch_register
> +   && !TARGET_INDIRECT_BRANCH_REGISTER
>     && SIBLING_CALL_P (peep2_next_insn (1))
>     && !reg_mentioned_p (operands[0],
>                       CALL_INSN_FUNCTION_USAGE (peep2_next_insn (1)))"
> @@ -12847,7 +12853,7 @@
>       (call (mem:QI (match_dup 0))
>             (match_operand 3)))]
>    "!TARGET_X32
> -   && !ix86_indirect_branch_register
> +   && !TARGET_INDIRECT_BRANCH_REGISTER
>     && SIBLING_CALL_P (peep2_next_insn (2))
>     && !reg_mentioned_p (operands[0],
>                       CALL_INSN_FUNCTION_USAGE (peep2_next_insn (2)))"
> diff --git a/gcc/config/i386/predicates.md b/gcc/config/i386/predicates.md
> index 2f2393b9e3e..f6cdc86fc5f 100644
> --- a/gcc/config/i386/predicates.md
> +++ b/gcc/config/i386/predicates.md
> @@ -665,7 +665,7 @@
>  ;; Test for a valid operand for indirect branch.
>  (define_predicate "indirect_branch_operand"
>    (ior (match_operand 0 "register_operand")
> -       (and (not (match_test "ix86_indirect_branch_register"))
> +       (and (not (match_test "TARGET_INDIRECT_BRANCH_REGISTER"))
>           (not (match_test "TARGET_X32"))
>           (match_operand 0 "memory_operand"))))
>  
> @@ -709,7 +709,7 @@
>    (ior (match_test "constant_call_address_operand
>                    (op, mode == VOIDmode ? mode : Pmode)")
>         (match_operand 0 "call_register_no_elim_operand")
> -       (and (not (match_test "ix86_indirect_branch_register"))
> +       (and (not (match_test "TARGET_INDIRECT_BRANCH_REGISTER"))
>           (ior (and (not (match_test "TARGET_X32"))
>                     (match_operand 0 "memory_operand"))
>                (and (match_test "TARGET_X32 && Pmode == DImode")
> @@ -720,7 +720,7 @@
>    (ior (match_test "constant_call_address_operand
>                    (op, mode == VOIDmode ? mode : Pmode)")
>         (match_operand 0 "register_no_elim_operand")
> -       (and (not (match_test "ix86_indirect_branch_register"))
> +       (and (not (match_test "TARGET_INDIRECT_BRANCH_REGISTER"))
>           (ior (and (not (match_test "TARGET_X32"))
>                     (match_operand 0 "sibcall_memory_operand"))
>                (and (match_test "TARGET_X32 && Pmode == DImode")
> diff --git a/gcc/testsuite/gcc.target/i386/indirect-thunk-1.c 
> b/gcc/testsuite/gcc.target/i386/indirect-thunk-1.c
> index 60d09881a99..6e94d2c4865 100644
> --- a/gcc/testsuite/gcc.target/i386/indirect-thunk-1.c
> +++ b/gcc/testsuite/gcc.target/i386/indirect-thunk-1.c
> @@ -11,9 +11,8 @@ male_indirect_jump (long offset)
>    dispatch(offset);
>  }
>  
> -/* { dg-final { scan-assembler "push(?:l|q)\[ \t\]*_?dispatch" { target { { 
> ! x32 } && *-*-linux* } } } } */
> -/* { dg-final { scan-assembler "jmp\[ \t\]*__x86_indirect_thunk" { target { 
> ! x32 } } } } */
> -/* { dg-final { scan-assembler "jmp\[ \t\]*__x86_indirect_thunk_(r|e)ax" { 
> target x32 } } } */
> +/* { dg-final { scan-assembler "mov(?:l|q)\[ \t\]*_?dispatch" { target 
> *-*-linux* } } } */
> +/* { dg-final { scan-assembler "jmp\[ \t\]*__x86_indirect_thunk_(r|e)ax" } } 
> */
>  /* { dg-final { scan-assembler "jmp\[ \t\]*\.LIND" } } */
>  /* { dg-final { scan-assembler "call\[ \t\]*\.LIND" } } */
>  /* { dg-final { scan-assembler {\tpause} } } */
> diff --git a/gcc/testsuite/gcc.target/i386/indirect-thunk-2.c 
> b/gcc/testsuite/gcc.target/i386/indirect-thunk-2.c
> index aac75163794..3c467078964 100644
> --- a/gcc/testsuite/gcc.target/i386/indirect-thunk-2.c
> +++ b/gcc/testsuite/gcc.target/i386/indirect-thunk-2.c
> @@ -11,9 +11,8 @@ male_indirect_jump (long offset)
>    dispatch[offset](offset);
>  }
>  
> -/* { dg-final { scan-assembler "push(?:l|q)\[ \t\]*_?dispatch" { target { { 
> ! x32 } && *-*-linux* } } } } */
> -/* { dg-final { scan-assembler "jmp\[ \t\]*__x86_indirect_thunk" { target { 
> ! x32 } } } } */
> -/* { dg-final { scan-assembler "jmp\[ \t\]*__x86_indirect_thunk_(r|e)ax" { 
> target x32 } } } */
> +/* { dg-final { scan-assembler "mov(?:l|q)\[ \t\]*_?dispatch" { target 
> *-*-linux* } } } */
> +/* { dg-final { scan-assembler "jmp\[ \t\]*__x86_indirect_thunk_(r|e)ax" } } 
> */
>  /* { dg-final { scan-assembler "jmp\[ \t\]*\.LIND" } } */
>  /* { dg-final { scan-assembler "call\[ \t\]*\.LIND" } } */
>  /* { dg-final { scan-assembler {\tpause} } } */
> diff --git a/gcc/testsuite/gcc.target/i386/indirect-thunk-3.c 
> b/gcc/testsuite/gcc.target/i386/indirect-thunk-3.c
> index dab7ac2ef25..e4c9b885d50 100644
> --- a/gcc/testsuite/gcc.target/i386/indirect-thunk-3.c
> +++ b/gcc/testsuite/gcc.target/i386/indirect-thunk-3.c
> @@ -12,9 +12,8 @@ male_indirect_jump (long offset)
>    return 0;
>  }
>  
> -/* { dg-final { scan-assembler "push(?:l|q)\[ \t\]*_?dispatch" { target { { 
> ! x32 } && *-*-linux* } } } } */
> -/* { dg-final { scan-assembler "jmp\[ \t\]*__x86_indirect_thunk" { target { 
> ! x32 } } } } */
> -/* { dg-final { scan-assembler "call\[ \t\]*__x86_indirect_thunk_(r|e)ax" { 
> target x32 } } } */
> +/* { dg-final { scan-assembler "mov(?:l|q)\[ \t\]*_?dispatch" { target 
> *-*-linux* } } } */
> +/* { dg-final { scan-assembler "call\[ \t\]*__x86_indirect_thunk_(r|e)ax" } 
> } */
>  /* { dg-final { scan-assembler "jmp\[ \t\]*\.LIND" } } */
>  /* { dg-final { scan-assembler "call\[ \t\]*\.LIND" } } */
>  /* { dg-final { scan-assembler {\tpause} } } */
> diff --git a/gcc/testsuite/gcc.target/i386/indirect-thunk-4.c 
> b/gcc/testsuite/gcc.target/i386/indirect-thunk-4.c
> index 44cc5f52f45..b22554ae282 100644
> --- a/gcc/testsuite/gcc.target/i386/indirect-thunk-4.c
> +++ b/gcc/testsuite/gcc.target/i386/indirect-thunk-4.c
> @@ -12,9 +12,8 @@ male_indirect_jump (long offset)
>    return 0;
>  }
>  
> -/* { dg-final { scan-assembler "push(?:l|q)\[ \t\]*_?dispatch" { target { { 
> ! x32 } && *-*-linux* } } } } */
> -/* { dg-final { scan-assembler "jmp\[ \t\]*__x86_indirect_thunk" { target { 
> ! x32 } } } } */
> -/* { dg-final { scan-assembler "call\[ \t\]*__x86_indirect_thunk_(r|e)ax" { 
> target x32 } } } */
> +/* { dg-final { scan-assembler "mov(?:l|q)\[ \t\]*_?dispatch" { target 
> *-*-linux* } } } */
> +/* { dg-final { scan-assembler "call\[ \t\]*__x86_indirect_thunk_(r|e)ax" } 
> } */
>  /* { dg-final { scan-assembler "jmp\[ \t\]*\.LIND" } } */
>  /* { dg-final { scan-assembler "call\[ \t\]*\.LIND" } } */
>  /* { dg-final { scan-assembler {\tpause} } } */
> diff --git a/gcc/testsuite/gcc.target/i386/indirect-thunk-5.c 
> b/gcc/testsuite/gcc.target/i386/indirect-thunk-5.c
> index fcaa18d10b7..fb26c005e80 100644
> --- a/gcc/testsuite/gcc.target/i386/indirect-thunk-5.c
> +++ b/gcc/testsuite/gcc.target/i386/indirect-thunk-5.c
> @@ -9,8 +9,10 @@ foo (void)
>    bar ();
>  }
>  
> -/* { dg-final { scan-assembler "push(?:l|q)\[ \t\]*bar@GOT" } } */
> -/* { dg-final { scan-assembler "jmp\[ \t\]*__x86_indirect_thunk" } } */
> +/* { dg-final { scan-assembler "push(?:l|q)\[ \t\]*bar@GOT" { target x32 } } 
> } */
> +/* { dg-final { scan-assembler "jmp\[ \t\]*__x86_indirect_thunk" { target 
> x32 } } } */
> +/* { dg-final { scan-assembler "mov(?:l|q)\[ \t\]*bar@GOT" { target { ! x32 
> } } } } */
> +/* { dg-final { scan-assembler "jmp\[ \t\]*__x86_indirect_thunk_(r|e)ax" { 
> target { ! x32 } } } } */
>  /* { dg-final { scan-assembler "jmp\[ \t\]*\.LIND" } } */
>  /* { dg-final { scan-assembler "call\[ \t\]*\.LIND" } } */
>  /* { dg-final { scan-assembler {\tpause} } } */
> diff --git a/gcc/testsuite/gcc.target/i386/indirect-thunk-6.c 
> b/gcc/testsuite/gcc.target/i386/indirect-thunk-6.c
> index 1490f5336ca..8bc45ff68ce 100644
> --- a/gcc/testsuite/gcc.target/i386/indirect-thunk-6.c
> +++ b/gcc/testsuite/gcc.target/i386/indirect-thunk-6.c
> @@ -10,9 +10,13 @@ foo (void)
>    return 0;
>  }
>  
> -/* { dg-final { scan-assembler "push(?:l|q)\[ \t\]*bar@GOT" } } */
> -/* { dg-final { scan-assembler "jmp\[ \t\]*__x86_indirect_thunk" } } */
> -/* { dg-final { scan-assembler-times "jmp\[ \t\]*\.LIND" 2 } } */
> -/* { dg-final { scan-assembler-times "call\[ \t\]*\.LIND" 2 } } */
> +/* { dg-final { scan-assembler "push(?:l|q)\[ \t\]*bar@GOT" { target x32 } } 
> } */
> +/* { dg-final { scan-assembler "jmp\[ \t\]*__x86_indirect_thunk" { target 
> x32 } } } */
> +/* { dg-final { scan-assembler-times "jmp\[ \t\]*\.LIND" 2 { target x32 } } 
> } */
> +/* { dg-final { scan-assembler-times "call\[ \t\]*\.LIND" 2 { target x32 } } 
> } */
> +/* { dg-final { scan-assembler "mov(?:l|q)\[ \t\]*bar@GOT" { target { ! x32 
> } } } } */
> +/* { dg-final { scan-assembler "call\[ \t\]*__x86_indirect_thunk_(r|e)ax" { 
> target { ! x32 } } } } */
> +/* { dg-final { scan-assembler-times "jmp\[ \t\]*\.LIND" 1 { target { ! x32 
> } } } } */
> +/* { dg-final { scan-assembler-times "call\[ \t\]*\.LIND" 1 { target { ! x32 
> } } } } */
>  /* { dg-final { scan-assembler {\tpause} } } */
>  /* { dg-final { scan-assembler {\tlfence} } } */
> diff --git a/gcc/testsuite/gcc.target/i386/indirect-thunk-7.c 
> b/gcc/testsuite/gcc.target/i386/indirect-thunk-7.c
> index 17c2d0faf88..3c72036dbaf 100644
> --- a/gcc/testsuite/gcc.target/i386/indirect-thunk-7.c
> +++ b/gcc/testsuite/gcc.target/i386/indirect-thunk-7.c
> @@ -35,9 +35,8 @@ bar (int i)
>      }
>  }
>  
> -/* { dg-final { scan-assembler "push(?:l|q)\[ \t\]*\.L\[0-9\]+\\(,%" { 
> target { { ! x32 } && *-*-linux* } } } } */
> -/* { dg-final { scan-assembler "jmp\[ \t\]*__x86_indirect_thunk" { target { 
> ! x32 } } } } */
> -/* { dg-final { scan-assembler "jmp\[ \t\]*__x86_indirect_thunk_(r|e)ax" { 
> target x32 } } } */
> +/* { dg-final { scan-assembler "mov(?:l|q)\[ \t\]*\.L\[0-9\]+\\(,%" { target 
> *-*-linux* } } } */
> +/* { dg-final { scan-assembler "jmp\[ \t\]*__x86_indirect_thunk_(r|e)ax" } } 
> */
>  /* { dg-final { scan-assembler "jmp\[ \t\]*\.LIND" } } */
>  /* { dg-final { scan-assembler "call\[ \t\]*\.LIND" } } */
>  /* { dg-final { scan-assembler {\tpause} } } */
> diff --git a/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-1.c 
> b/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-1.c
> index 9194ccf3cbc..7106407b83d 100644
> --- a/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-1.c
> +++ b/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-1.c
> @@ -14,9 +14,8 @@ male_indirect_jump (long offset)
>    dispatch(offset);
>  }
>  
> -/* { dg-final { scan-assembler "push(?:l|q)\[ \t\]*_?dispatch" { target { { 
> ! x32 } && *-*-linux* } } } } */
> -/* { dg-final { scan-assembler "jmp\[ \t\]*__x86_indirect_thunk" { target { 
> ! x32 } } } } */
> -/* { dg-final { scan-assembler "jmp\[ \t\]*__x86_indirect_thunk_(r|e)ax" { 
> target x32 } } } */
> +/* { dg-final { scan-assembler "mov(?:l|q)\[ \t\]*_?dispatch" { target 
> *-*-linux* } } } */
> +/* { dg-final { scan-assembler "jmp\[ \t\]*__x86_indirect_thunk_(r|e)ax" } } 
> */
>  /* { dg-final { scan-assembler "jmp\[ \t\]*\.LIND" } } */
>  /* { dg-final { scan-assembler "call\[ \t\]*\.LIND" } } */
>  /* { dg-final { scan-assembler {\tpause} } } */
> diff --git a/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-2.c 
> b/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-2.c
> index e51f261a612..27c7e5b029b 100644
> --- a/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-2.c
> +++ b/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-2.c
> @@ -12,9 +12,8 @@ male_indirect_jump (long offset)
>    dispatch[offset](offset);
>  }
>  
> -/* { dg-final { scan-assembler "push(?:l|q)\[ \t\]*_?dispatch" { target { { 
> ! x32 } && *-*-linux* } } } } */
> -/* { dg-final { scan-assembler "jmp\[ \t\]*__x86_indirect_thunk" { target { 
> ! x32 } } } } */
> -/* { dg-final { scan-assembler "jmp\[ \t\]*__x86_indirect_thunk_(r|e)ax" { 
> target x32 } } } */
> +/* { dg-final { scan-assembler "mov(?:l|q)\[ \t\]*_?dispatch" { target 
> *-*-linux* } } } */
> +/* { dg-final { scan-assembler "jmp\[ \t\]*__x86_indirect_thunk_(r|e)ax" } } 
> */
>  /* { dg-final { scan-assembler "jmp\[ \t\]*\.LIND" } } */
>  /* { dg-final { scan-assembler "call\[ \t\]*\.LIND" } } */
>  /* { dg-final { scan-assembler {\tpause} } } */
> diff --git a/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-3.c 
> b/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-3.c
> index 4aeec1833cd..89a2bac8403 100644
> --- a/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-3.c
> +++ b/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-3.c
> @@ -14,10 +14,9 @@ male_indirect_jump (long offset)
>    return 0;
>  }
>  
> -/* { dg-final { scan-assembler "push(?:l|q)\[ \t\]*_?dispatch" { target { { 
> ! x32 } && *-*-linux* } } } } */
> +/* { dg-final { scan-assembler "mov(?:l|q)\[ \t\]*_?dispatch" { target 
> *-*-linux* } } } */
>  /* { dg-final { scan-assembler-times "jmp\[ \t\]*\.LIND" 2 } } */
>  /* { dg-final { scan-assembler-times "call\[ \t\]*\.LIND" 2 } } */
>  /* { dg-final { scan-assembler {\tpause} } } */
>  /* { dg-final { scan-assembler {\tlfence} } } */
>  /* { dg-final { scan-assembler-not "__x86_indirect_thunk" } } */
> -/* { dg-final { scan-assembler-not "pushq\[ \t\]%rax" { target x32 } } } */
> diff --git a/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-4.c 
> b/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-4.c
> index ac0e5999f63..3eb83c3779a 100644
> --- a/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-4.c
> +++ b/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-4.c
> @@ -13,10 +13,9 @@ male_indirect_jump (long offset)
>    return 0;
>  }
>  
> -/* { dg-final { scan-assembler "push(?:l|q)\[ \t\]*_?dispatch" { target { { 
> ! x32 } && *-*-linux* } } } } */
> +/* { dg-final { scan-assembler "mov(?:l|q)\[ \t\]*_?dispatch" { target 
> *-*-linux* } } } */
>  /* { dg-final { scan-assembler-times "jmp\[ \t\]*\.LIND" 2 } } */
>  /* { dg-final { scan-assembler-times "call\[ \t\]*\.LIND" 2 } } */
>  /* { dg-final { scan-assembler {\tpause} } } */
>  /* { dg-final { scan-assembler {\tlfence} } } */
>  /* { dg-final { scan-assembler-not "__x86_indirect_thunk" } } */
> -/* { dg-final { scan-assembler-not "pushq\[ \t\]%rax" { target x32 } } } */
> diff --git a/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-5.c 
> b/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-5.c
> index 573cf1ef09e..0098dd1133d 100644
> --- a/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-5.c
> +++ b/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-5.c
> @@ -14,9 +14,8 @@ male_indirect_jump (long offset)
>    return 0;
>  }
>  
> -/* { dg-final { scan-assembler "push(?:l|q)\[ \t\]*_?dispatch" { target { { 
> ! x32 } && *-*-linux* } } } } */
> -/* { dg-final { scan-assembler-times "jmp\[ \t\]*\.LIND" 1 { target { ! x32 
> } } } } */
> -/* { dg-final { scan-assembler-times "call\[ \t\]*\.LIND" 1 { target { ! x32 
> } } } } */
> -/* { dg-final { scan-assembler "jmp\[ \t\]*__x86_indirect_thunk" { target { 
> ! x32 } } } } */
> -/* { dg-final { scan-assembler "call\[ \t\]*__x86_indirect_thunk_(r|e)ax" { 
> target x32 } } } */
> +/* { dg-final { scan-assembler "mov(?:l|q)\[ \t\]*_?dispatch" { target 
> *-*-linux* } } } */
> +/* { dg-final { scan-assembler "call\[ \t\]*__x86_indirect_thunk_(r|e)ax" } 
> } */
>  /* { dg-final { scan-assembler-not {\t(lfence|pause)} } } */
> +/* { dg-final { scan-assembler-not "jmp\[ \t\]*\.LIND" } } */
> +/* { dg-final { scan-assembler-not "call\[ \t\]*\.LIND" } } */
> diff --git a/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-6.c 
> b/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-6.c
> index b2b37fc6e2e..ece8de15a4b 100644
> --- a/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-6.c
> +++ b/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-6.c
> @@ -13,9 +13,8 @@ male_indirect_jump (long offset)
>    return 0;
>  }
>  
> -/* { dg-final { scan-assembler "push(?:l|q)\[ \t\]*_?dispatch" { target { { 
> ! x32 } && *-*-linux* } } } } */
> -/* { dg-final { scan-assembler-times "jmp\[ \t\]*\.LIND" 1 { target { ! x32 
> } } } } */
> -/* { dg-final { scan-assembler-times "call\[ \t\]*\.LIND" 1 { target { ! x32 
> } } } } */
> -/* { dg-final { scan-assembler "jmp\[ \t\]*__x86_indirect_thunk" { target { 
> ! x32 } } } } */
> -/* { dg-final { scan-assembler "call\[ \t\]*__x86_indirect_thunk_(r|e)ax" { 
> target x32 } } } */
> +/* { dg-final { scan-assembler "mov(?:l|q)\[ \t\]*_?dispatch" { target 
> *-*-linux* } } } */
> +/* { dg-final { scan-assembler "call\[ \t\]*__x86_indirect_thunk_(r|e)ax" } 
> } */
>  /* { dg-final { scan-assembler-not {\t(lfence|pause)} } } */
> +/* { dg-final { scan-assembler-not "jmp\[ \t\]*\.LIND" } } */
> +/* { dg-final { scan-assembler-not "call\[ \t\]*\.LIND" } } */
> diff --git a/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-7.c 
> b/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-7.c
> index 4a43e199931..d53fc887dcc 100644
> --- a/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-7.c
> +++ b/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-7.c
> @@ -36,9 +36,8 @@ bar (int i)
>      }
>  }
>  
> -/* { dg-final { scan-assembler "push(?:l|q)\[ \t\]*\.L\[0-9\]+\\(,%" { 
> target { { ! x32 } && *-*-linux* } } } } */
> -/* { dg-final { scan-assembler "jmp\[ \t\]*__x86_indirect_thunk_(r|e)ax" { 
> target x32 } } } */
> -/* { dg-final { scan-assembler "jmp\[ \t\]*__x86_indirect_thunk" } } */
> +/* { dg-final { scan-assembler "mov(?:l|q)\[ \t\]*\.L\[0-9\]+\\(,%" { target 
> *-*-linux* } } } */
> +/* { dg-final { scan-assembler "jmp\[ \t\]*__x86_indirect_thunk_(r|e)ax" } } 
> */
>  /* { dg-final { scan-assembler-not {\t(lfence|pause)} } } */
>  /* { dg-final { scan-assembler-not "jmp\[ \t\]*\.LIND" } } */
>  /* { dg-final { scan-assembler-not "call\[ \t\]*\.LIND" } } */
> diff --git a/gcc/testsuite/gcc.target/i386/indirect-thunk-bnd-1.c 
> b/gcc/testsuite/gcc.target/i386/indirect-thunk-bnd-1.c
> index ac84ab623fa..73d16baddc7 100644
> --- a/gcc/testsuite/gcc.target/i386/indirect-thunk-bnd-1.c
> +++ b/gcc/testsuite/gcc.target/i386/indirect-thunk-bnd-1.c
> @@ -10,9 +10,9 @@ foo (void)
>    dispatch (buf);
>  }
>  
> -/* { dg-final { scan-assembler "push(?:l|q)\[ \t\]*_?dispatch" { target { { 
> ! x32 } && *-*-linux* } } } } */
> -/* { dg-final { scan-assembler "pushq\[ \t\]%rax" { target x32 } } } */
> -/* { dg-final { scan-assembler "bnd jmp\[ \t\]*__x86_indirect_thunk_bnd" } } 
> */
> +/* { dg-final { scan-assembler "mov(?:l|q)\[ \t\]*_?dispatch" { target 
> *-*-linux* } } } */
> +/* { dg-final { scan-assembler "bnd jmp\[ \t\]*__x86_indirect_thunk_bnd_rax" 
> { target lp64 } } } */
> +/* { dg-final { scan-assembler "bnd call\[ 
> \t\]*__x86_indirect_thunk_bnd_eax" { target ia32 } } } */
>  /* { dg-final { scan-assembler "jmp\[ \t\]*\.LIND" } } */
>  /* { dg-final { scan-assembler "bnd call\[ \t\]*\.LIND" } } */
>  /* { dg-final { scan-assembler "bnd ret" } } */
> diff --git a/gcc/testsuite/gcc.target/i386/indirect-thunk-bnd-2.c 
> b/gcc/testsuite/gcc.target/i386/indirect-thunk-bnd-2.c
> index ce655e8be1c..856751ac224 100644
> --- a/gcc/testsuite/gcc.target/i386/indirect-thunk-bnd-2.c
> +++ b/gcc/testsuite/gcc.target/i386/indirect-thunk-bnd-2.c
> @@ -11,10 +11,8 @@ foo (void)
>    return 0;
>  }
>  
> -/* { dg-final { scan-assembler "push(?:l|q)\[ \t\]*_?dispatch" { target { { 
> ! x32 } && *-*-linux* } } } } */
> -/* { dg-final { scan-assembler "pushq\[ \t\]%rax" { target x32 } } } */
> -/* { dg-final { scan-assembler "bnd jmp\[ \t\]*__x86_indirect_thunk_bnd" } } 
> */
> -/* { dg-final { scan-assembler "bnd jmp\[ \t\]*\.LIND" } } */
> +/* { dg-final { scan-assembler "mov(?:l|q)\[ \t\]*_?dispatch" { target 
> *-*-linux* } } } */
> +/* { dg-final { scan-assembler "bnd call\[ 
> \t\]*__x86_indirect_thunk_bnd_(r|e)ax" } } */
>  /* { dg-final { scan-assembler "bnd call\[ \t\]*\.LIND" } } */
>  /* { dg-final { scan-assembler "bnd ret" } } */
>  /* { dg-final { scan-assembler {\tpause} } } */
> diff --git a/gcc/testsuite/gcc.target/i386/indirect-thunk-bnd-3.c 
> b/gcc/testsuite/gcc.target/i386/indirect-thunk-bnd-3.c
> index d34485a0010..42312f65588 100644
> --- a/gcc/testsuite/gcc.target/i386/indirect-thunk-bnd-3.c
> +++ b/gcc/testsuite/gcc.target/i386/indirect-thunk-bnd-3.c
> @@ -10,8 +10,9 @@ foo (void)
>    bar (buf);
>  }
>  
> -/* { dg-final { scan-assembler "push(?:l|q)\[ \t\]*bar@GOT" } } */
> -/* { dg-final { scan-assembler "bnd jmp\[ \t\]*__x86_indirect_thunk_bnd" } } 
> */
> +/* { dg-final { scan-assembler "mov(?:l|q)\[ \t\]*bar@GOT" } } */
> +/* { dg-final { scan-assembler "bnd jmp\[ \t\]*__x86_indirect_thunk_bnd_rax" 
> { target lp64 } } } */
> +/* { dg-final { scan-assembler "bnd call\[ 
> \t\]*__x86_indirect_thunk_bnd_eax" { target ia32 } } } */
>  /* { dg-final { scan-assembler "jmp\[ \t\]*\.LIND" } } */
>  /* { dg-final { scan-assembler "bnd call\[ \t\]*\.LIND" } } */
>  /* { dg-final { scan-assembler "bnd ret" } } */
> diff --git a/gcc/testsuite/gcc.target/i386/indirect-thunk-bnd-4.c 
> b/gcc/testsuite/gcc.target/i386/indirect-thunk-bnd-4.c
> index a5fc4a23351..8850f2ffca4 100644
> --- a/gcc/testsuite/gcc.target/i386/indirect-thunk-bnd-4.c
> +++ b/gcc/testsuite/gcc.target/i386/indirect-thunk-bnd-4.c
> @@ -11,10 +11,9 @@ foo (void)
>    return 0;
>  }
>  
> -/* { dg-final { scan-assembler "push(?:l|q)\[ \t\]*bar@GOT" } } */
> -/* { dg-final { scan-assembler "bnd jmp\[ \t\]*__x86_indirect_thunk" } } */
> -/* { dg-final { scan-assembler "bnd jmp\[ \t\]*\.LIND" } } */
> -/* { dg-final { scan-assembler-times "bnd call\[ \t\]*\.LIND" 2 } } */
> +/* { dg-final { scan-assembler "mov(?:l|q)\[ \t\]*bar@GOT" } } */
> +/* { dg-final { scan-assembler "bnd call\[ 
> \t\]*__x86_indirect_thunk_bnd_(r|e)ax" } } */
> +/* { dg-final { scan-assembler-times "bnd call\[ \t\]*\.LIND" 1 } } */
>  /* { dg-final { scan-assembler "bnd ret" } } */
>  /* { dg-final { scan-assembler {\tpause} } } */
>  /* { dg-final { scan-assembler {\tlfence} } } */
> diff --git a/gcc/testsuite/gcc.target/i386/indirect-thunk-extern-1.c 
> b/gcc/testsuite/gcc.target/i386/indirect-thunk-extern-1.c
> index 579441f250e..c09dd0afd2d 100644
> --- a/gcc/testsuite/gcc.target/i386/indirect-thunk-extern-1.c
> +++ b/gcc/testsuite/gcc.target/i386/indirect-thunk-extern-1.c
> @@ -11,9 +11,8 @@ male_indirect_jump (long offset)
>    dispatch(offset);
>  }
>  
> -/* { dg-final { scan-assembler "push(?:l|q)\[ \t\]*_?dispatch" { target { { 
> ! x32 } && *-*-linux* } } } } */
> -/* { dg-final { scan-assembler "jmp\[ \t\]*__x86_indirect_thunk" { target { 
> ! x32 } } } } */
> -/* { dg-final { scan-assembler "jmp\[ \t\]*__x86_indirect_thunk_(r|e)ax" { 
> target x32 } } } */
> +/* { dg-final { scan-assembler "mov(?:l|q)\[ \t\]*_?dispatch" { target 
> *-*-linux* } } } */
> +/* { dg-final { scan-assembler "jmp\[ \t\]*__x86_indirect_thunk_(r|e)ax" } } 
> */
>  /* { dg-final { scan-assembler-not {\t(lfence|pause)} } } */
>  /* { dg-final { scan-assembler-not "jmp\[ \t\]*\.LIND" } } */
>  /* { dg-final { scan-assembler-not "call\[ \t\]*\.LIND" } } */
> diff --git a/gcc/testsuite/gcc.target/i386/indirect-thunk-extern-2.c 
> b/gcc/testsuite/gcc.target/i386/indirect-thunk-extern-2.c
> index c92e6f2b02d..826425a5115 100644
> --- a/gcc/testsuite/gcc.target/i386/indirect-thunk-extern-2.c
> +++ b/gcc/testsuite/gcc.target/i386/indirect-thunk-extern-2.c
> @@ -11,9 +11,8 @@ male_indirect_jump (long offset)
>    dispatch[offset](offset);
>  }
>  
> -/* { dg-final { scan-assembler "push(?:l|q)\[ \t\]*_?dispatch" { target { { 
> ! x32 } && *-*-linux* } } } } */
> -/* { dg-final { scan-assembler "jmp\[ \t\]*__x86_indirect_thunk" { target { 
> ! x32 } } } } */
> -/* { dg-final { scan-assembler "jmp\[ \t\]*__x86_indirect_thunk_(r|e)ax" { 
> target x32 } } } */
> +/* { dg-final { scan-assembler "mov(?:l|q)\[ \t\]*_?dispatch" { target 
> *-*-linux* } } } */
> +/* { dg-final { scan-assembler "jmp\[ \t\]*__x86_indirect_thunk_(r|e)ax" } } 
> */
>  /* { dg-final { scan-assembler-not {\t(lfence|pause)} } } */
>  /* { dg-final { scan-assembler-not "jmp\[ \t\]*\.LIND" } } */
>  /* { dg-final { scan-assembler-not "call\[ \t\]*\.LIND" } } */
> diff --git a/gcc/testsuite/gcc.target/i386/indirect-thunk-extern-3.c 
> b/gcc/testsuite/gcc.target/i386/indirect-thunk-extern-3.c
> index d9964c25bbd..385626850a2 100644
> --- a/gcc/testsuite/gcc.target/i386/indirect-thunk-extern-3.c
> +++ b/gcc/testsuite/gcc.target/i386/indirect-thunk-extern-3.c
> @@ -12,9 +12,8 @@ male_indirect_jump (long offset)
>    return 0;
>  }
>  
> -/* { dg-final { scan-assembler "push(?:l|q)\[ \t\]*_?dispatch" { target { { 
> ! x32 } && *-*-linux* } } } } */
> -/* { dg-final { scan-assembler "jmp\[ \t\]*__x86_indirect_thunk" { target { 
> ! x32 } } } } */
> -/* { dg-final { scan-assembler-times "jmp\[ \t\]*\.LIND" 1 { target { ! x32 
> } } } } */
> -/* { dg-final { scan-assembler-times "call\[ \t\]*\.LIND" 1 { target { ! x32 
> } } } } */
> -/* { dg-final { scan-assembler "call\[ \t\]*__x86_indirect_thunk_(r|e)ax" { 
> target x32 } } } */
> +/* { dg-final { scan-assembler "mov(?:l|q)\[ \t\]*_?dispatch" { target 
> *-*-linux* } } } */
> +/* { dg-final { scan-assembler "call\[ \t\]*__x86_indirect_thunk_(r|e)ax" } 
> } */
>  /* { dg-final { scan-assembler-not {\t(lfence|pause)} } } */
> +/* { dg-final { scan-assembler-not "jmp\[ \t\]*\.LIND" } } */
> +/* { dg-final { scan-assembler-not "call\[ \t\]*\.LIND" } } */
> diff --git a/gcc/testsuite/gcc.target/i386/indirect-thunk-extern-4.c 
> b/gcc/testsuite/gcc.target/i386/indirect-thunk-extern-4.c
> index d4dca4dc5fe..1ae49b137ca 100644
> --- a/gcc/testsuite/gcc.target/i386/indirect-thunk-extern-4.c
> +++ b/gcc/testsuite/gcc.target/i386/indirect-thunk-extern-4.c
> @@ -12,9 +12,7 @@ male_indirect_jump (long offset)
>    return 0;
>  }
>  
> -/* { dg-final { scan-assembler "push(?:l|q)\[ \t\]*_?dispatch" { target { { 
> ! x32 } && *-*-linux* } } } } */
> -/* { dg-final { scan-assembler "jmp\[ \t\]*__x86_indirect_thunk" { target { 
> ! x32 } } } } */
> -/* { dg-final { scan-assembler-times "jmp\[ \t\]*\.LIND" 1 { target { ! x32 
> } } } } */
> -/* { dg-final { scan-assembler-times "call\[ \t\]*\.LIND" 1 { target { ! x32 
> } } } } */
>  /* { dg-final { scan-assembler "call\[ \t\]*__x86_indirect_thunk_(r|e)ax" { 
> target x32 } } } */
> +/* { dg-final { scan-assembler "mov(?:l|q)\[ \t\]*_?dispatch" { target 
> *-*-linux* } } } */
> +/* { dg-final { scan-assembler "call\[ \t\]*__x86_indirect_thunk_(r|e)ax" } 
> } */
>  /* { dg-final { scan-assembler-not {\t(lfence|pause)} } } */
> diff --git a/gcc/testsuite/gcc.target/i386/indirect-thunk-extern-5.c 
> b/gcc/testsuite/gcc.target/i386/indirect-thunk-extern-5.c
> index 5c07e02df6a..53282390977 100644
> --- a/gcc/testsuite/gcc.target/i386/indirect-thunk-extern-5.c
> +++ b/gcc/testsuite/gcc.target/i386/indirect-thunk-extern-5.c
> @@ -9,8 +9,10 @@ foo (void)
>    bar ();
>  }
>  
> -/* { dg-final { scan-assembler "push(?:l|q)\[ \t\]*bar@GOT" } } */
> -/* { dg-final { scan-assembler "jmp\[ \t\]*__x86_indirect_thunk" } } */
> +/* { dg-final { scan-assembler "push(?:l|q)\[ \t\]*bar@GOT" { target x32 } } 
> } */
> +/* { dg-final { scan-assembler "jmp\[ \t\]*__x86_indirect_thunk" { target 
> x32 } } } */
> +/* { dg-final { scan-assembler "mov(?:l|q)\[ \t\]*bar@GOT" { target { ! x32 
> } } } } */
> +/* { dg-final { scan-assembler "jmp\[ \t\]*__x86_indirect_thunk_(r|e)ax" { 
> target { ! x32 } } } } */
>  /* { dg-final { scan-assembler-not {\t(lfence|pause)} } } */
>  /* { dg-final { scan-assembler-not "jmp\[ \t\]*\.LIND" } } */
>  /* { dg-final { scan-assembler-not "call\[ \t\]*\.LIND" } } */
> diff --git a/gcc/testsuite/gcc.target/i386/indirect-thunk-extern-6.c 
> b/gcc/testsuite/gcc.target/i386/indirect-thunk-extern-6.c
> index 3eb440693a0..8ae43482d0c 100644
> --- a/gcc/testsuite/gcc.target/i386/indirect-thunk-extern-6.c
> +++ b/gcc/testsuite/gcc.target/i386/indirect-thunk-extern-6.c
> @@ -10,8 +10,8 @@ foo (void)
>    return 0;
>  }
>  
> -/* { dg-final { scan-assembler "push(?:l|q)\[ \t\]*bar@GOT" } } */
> -/* { dg-final { scan-assembler-times "jmp\[ \t\]*\.LIND" 1 } } */
> -/* { dg-final { scan-assembler-times "call\[ \t\]*\.LIND" 1 } } */
> -/* { dg-final { scan-assembler "jmp\[ \t\]*__x86_indirect_thunk" } } */
> +/* { dg-final { scan-assembler "push(?:l|q)\[ \t\]*bar@GOT" { target x32 } } 
> } */
> +/* { dg-final { scan-assembler "jmp\[ \t\]*__x86_indirect_thunk" { target 
> x32 } } } */
> +/* { dg-final { scan-assembler "mov(?:l|q)\[ \t\]*bar@GOT" { target { ! x32 
> } } } } */
> +/* { dg-final { scan-assembler "call\[ \t\]*__x86_indirect_thunk_(r|e)ax" { 
> target { ! x32 } } } } */
>  /* { dg-final { scan-assembler-not {\t(lfence|pause)} } } */
> diff --git a/gcc/testsuite/gcc.target/i386/indirect-thunk-extern-7.c 
> b/gcc/testsuite/gcc.target/i386/indirect-thunk-extern-7.c
> index aece9383697..2b9a33e93dc 100644
> --- a/gcc/testsuite/gcc.target/i386/indirect-thunk-extern-7.c
> +++ b/gcc/testsuite/gcc.target/i386/indirect-thunk-extern-7.c
> @@ -35,9 +35,8 @@ bar (int i)
>      }
>  }
>  
> -/* { dg-final { scan-assembler "push(?:l|q)\[ \t\]*\.L\[0-9\]+\\(,%" { 
> target { { ! x32 } && *-*-linux* } } } } */
> -/* { dg-final { scan-assembler "jmp\[ \t\]*__x86_indirect_thunk" { target { 
> ! x32 } } } } */
> -/* { dg-final { scan-assembler "jmp\[ \t\]*__x86_indirect_thunk_(r|e)ax" { 
> target x32 } } } */
> +/* { dg-final { scan-assembler "mov(?:l|q)\[ \t\]*\.L\[0-9\]+\\(,%" { target 
> *-*-linux* } } } */
> +/* { dg-final { scan-assembler "jmp\[ \t\]*__x86_indirect_thunk_(r|e)ax" } } 
> */
>  /* { dg-final { scan-assembler-not {\t(lfence|pause)} } } */
>  /* { dg-final { scan-assembler-not "jmp\[ \t\]*\.LIND" } } */
>  /* { dg-final { scan-assembler-not "call\[ \t\]*\.LIND" } } */
> diff --git a/gcc/testsuite/gcc.target/i386/indirect-thunk-inline-1.c 
> b/gcc/testsuite/gcc.target/i386/indirect-thunk-inline-1.c
> index 3aba5e8c81f..869d9040838 100644
> --- a/gcc/testsuite/gcc.target/i386/indirect-thunk-inline-1.c
> +++ b/gcc/testsuite/gcc.target/i386/indirect-thunk-inline-1.c
> @@ -11,7 +11,7 @@ male_indirect_jump (long offset)
>    dispatch(offset);
>  }
>  
> -/* { dg-final { scan-assembler "push(?:l|q)\[ \t\]*_?dispatch" { target { { 
> ! x32 } && *-*-linux* } } } } */
> +/* { dg-final { scan-assembler "mov(?:l|q)\[ \t\]*_?dispatch" { target 
> *-*-linux* } } } */
>  /* { dg-final { scan-assembler "jmp\[ \t\]*\.LIND" } } */
>  /* { dg-final { scan-assembler "call\[ \t\]*\.LIND" } } */
>  /* { dg-final { scan-assembler {\tpause} } } */
> diff --git a/gcc/testsuite/gcc.target/i386/indirect-thunk-inline-2.c 
> b/gcc/testsuite/gcc.target/i386/indirect-thunk-inline-2.c
> index 0f0181d6672..c5c16ed8bd8 100644
> --- a/gcc/testsuite/gcc.target/i386/indirect-thunk-inline-2.c
> +++ b/gcc/testsuite/gcc.target/i386/indirect-thunk-inline-2.c
> @@ -11,7 +11,7 @@ male_indirect_jump (long offset)
>    dispatch[offset](offset);
>  }
>  
> -/* { dg-final { scan-assembler "push(?:l|q)\[ \t\]*_?dispatch" { target { { 
> ! x32 } && *-*-linux* } } } } */
> +/* { dg-final { scan-assembler "mov(?:l|q)\[ \t\]*_?dispatch" { target 
> *-*-linux* } } } */
>  /* { dg-final { scan-assembler "jmp\[ \t\]*\.LIND" } } */
>  /* { dg-final { scan-assembler "call\[ \t\]*\.LIND" } } */
>  /* { dg-final { scan-assembler {\tpause} } } */
> diff --git a/gcc/testsuite/gcc.target/i386/indirect-thunk-inline-3.c 
> b/gcc/testsuite/gcc.target/i386/indirect-thunk-inline-3.c
> index 2eef6f35a75..4a63ebed8ab 100644
> --- a/gcc/testsuite/gcc.target/i386/indirect-thunk-inline-3.c
> +++ b/gcc/testsuite/gcc.target/i386/indirect-thunk-inline-3.c
> @@ -12,7 +12,7 @@ male_indirect_jump (long offset)
>    return 0;
>  }
>  
> -/* { dg-final { scan-assembler "push(?:l|q)\[ \t\]*_?dispatch" { target { { 
> ! x32 } && *-*-linux* } } } } */
> +/* { dg-final { scan-assembler "mov(?:l|q)\[ \t\]*_?dispatch" { target 
> *-*-linux* } } } */
>  /* { dg-final { scan-assembler-times "jmp\[ \t\]*\.LIND" 2 } } */
>  /* { dg-final { scan-assembler-times "call\[ \t\]*\.LIND" 2 } } */
>  /* { dg-final { scan-assembler-times {\tpause} 1 } } */
> diff --git a/gcc/testsuite/gcc.target/i386/indirect-thunk-inline-4.c 
> b/gcc/testsuite/gcc.target/i386/indirect-thunk-inline-4.c
> index e825a10f14c..a395ffca018 100644
> --- a/gcc/testsuite/gcc.target/i386/indirect-thunk-inline-4.c
> +++ b/gcc/testsuite/gcc.target/i386/indirect-thunk-inline-4.c
> @@ -12,7 +12,7 @@ male_indirect_jump (long offset)
>    return 0;
>  }
>  
> -/* { dg-final { scan-assembler "push(?:l|q)\[ \t\]*_?dispatch" { target { { 
> ! x32 } && *-*-linux* } } } } */
> +/* { dg-final { scan-assembler "mov(?:l|q)\[ \t\]*_?dispatch" { target 
> *-*-linux* } } } */
>  /* { dg-final { scan-assembler-times "jmp\[ \t\]*\.LIND" 2 } } */
>  /* { dg-final { scan-assembler-times "call\[ \t\]*\.LIND" 2 } } */
>  /* { dg-final { scan-assembler-times {\tpause} 1 } } */
> diff --git a/gcc/testsuite/gcc.target/i386/indirect-thunk-inline-5.c 
> b/gcc/testsuite/gcc.target/i386/indirect-thunk-inline-5.c
> index c6d77e10352..21cbfd39582 100644
> --- a/gcc/testsuite/gcc.target/i386/indirect-thunk-inline-5.c
> +++ b/gcc/testsuite/gcc.target/i386/indirect-thunk-inline-5.c
> @@ -9,7 +9,8 @@ foo (void)
>    bar ();
>  }
>  
> -/* { dg-final { scan-assembler "push(?:l|q)\[ \t\]*bar@GOT" } } */
> +/* { dg-final { scan-assembler "push(?:l|q)\[ \t\]*bar@GOT" { target x32 } } 
> } */
> +/* { dg-final { scan-assembler "mov(?:l|q)\[ \t\]*bar@GOT" { target { ! x32 
> } } } } */
>  /* { dg-final { scan-assembler "jmp\[ \t\]*\.LIND" } } */
>  /* { dg-final { scan-assembler "call\[ \t\]*\.LIND" } } */
>  /* { dg-final { scan-assembler {\tpause} } } */
> diff --git a/gcc/testsuite/gcc.target/i386/indirect-thunk-inline-6.c 
> b/gcc/testsuite/gcc.target/i386/indirect-thunk-inline-6.c
> index 6454827b780..d1300f18dc7 100644
> --- a/gcc/testsuite/gcc.target/i386/indirect-thunk-inline-6.c
> +++ b/gcc/testsuite/gcc.target/i386/indirect-thunk-inline-6.c
> @@ -10,7 +10,8 @@ foo (void)
>    return 0;
>  }
>  
> -/* { dg-final { scan-assembler "push(?:l|q)\[ \t\]*bar@GOT" } } */
> +/* { dg-final { scan-assembler "push(?:l|q)\[ \t\]*bar@GOT" { target x32 } } 
> } */
> +/* { dg-final { scan-assembler "mov(?:l|q)\[ \t\]*bar@GOT" { target { ! x32 
> } } } } */
>  /* { dg-final { scan-assembler-times "jmp\[ \t\]*\.LIND" 2 } } */
>  /* { dg-final { scan-assembler-times "call\[ \t\]*\.LIND" 2 } } */
>  /* { dg-final { scan-assembler-times {\tpause} 1 } } */
> diff --git a/gcc/testsuite/gcc.target/i386/indirect-thunk-inline-7.c 
> b/gcc/testsuite/gcc.target/i386/indirect-thunk-inline-7.c
> index c67066cf197..ea009245a58 100644
> --- a/gcc/testsuite/gcc.target/i386/indirect-thunk-inline-7.c
> +++ b/gcc/testsuite/gcc.target/i386/indirect-thunk-inline-7.c
> @@ -35,8 +35,8 @@ bar (int i)
>      }
>  }
>  
> -/* { dg-final { scan-assembler "push(?:l|q)\[ \t\]*\.L\[0-9\]+\\(,%" { 
> target { { ! x32 } && *-*-linux* } } } } */
> -/* { dg-final { scan-assembler-not "pushq\[ \t\]%rax" { target x32 } } } */
> +/* { dg-final { scan-assembler "mov(?:l|q)\[ \t\]*\.L\[0-9\]+\\(,%" { target 
> *-*-linux* } } } */
> +/* { dg-final { scan-assembler-not "pushq\[ \t\]%(r|e)ax" } } */
>  /* { dg-final { scan-assembler "jmp\[ \t\]*\.LIND" } } */
>  /* { dg-final { scan-assembler "call\[ \t\]*\.LIND" } } */
>  /* { dg-final { scan-assembler {\tpause} } } */
> diff --git a/gcc/testsuite/gcc.target/i386/ret-thunk-10.c 
> b/gcc/testsuite/gcc.target/i386/ret-thunk-10.c
> index 6de9b8c9f4f..b245d21b002 100644
> --- a/gcc/testsuite/gcc.target/i386/ret-thunk-10.c
> +++ b/gcc/testsuite/gcc.target/i386/ret-thunk-10.c
> @@ -15,9 +15,6 @@ foo (void)
>  /* { dg-final { scan-assembler-not "jmp\[ \t\]*__x86_return_thunk" } } */
>  /* { dg-final { scan-assembler-times {\tpause} 2 } } */
>  /* { dg-final { scan-assembler-times {\tlfence} 2 } } */
> -/* { dg-final { scan-assembler "push(?:l|q)\[ \t\]*_?bar" { target { { ! x32 
> } && *-*-linux* } } } } */
> -/* { dg-final { scan-assembler "jmp\[ \t\]*__x86_indirect_thunk" { target { 
> ! x32 } }  } } */
> -/* { dg-final { scan-assembler "__x86_indirect_thunk:" { target { ! x32 } }  
> } } */
> -/* { dg-final { scan-assembler "call\[ \t\]*__x86_indirect_thunk_(r|e)ax" { 
> target { x32 } }  } } */
> -/* { dg-final { scan-assembler "__x86_indirect_thunk_(r|e)ax:" { target { 
> x32 } }  } } */
> -/* { dg-final { scan-assembler-not "pushq\[ \t\]%rax" { target x32 } } } */
> +/* { dg-final { scan-assembler "call\[ \t\]*__x86_indirect_thunk_(r|e)ax" } 
> } */
> +/* { dg-final { scan-assembler "__x86_indirect_thunk_(r|e)ax:" } } */
> +/* { dg-final { scan-assembler-not "pushq\[ \t\]%rax" } } */
> diff --git a/gcc/testsuite/gcc.target/i386/ret-thunk-11.c 
> b/gcc/testsuite/gcc.target/i386/ret-thunk-11.c
> index 36598037541..ce0543e1181 100644
> --- a/gcc/testsuite/gcc.target/i386/ret-thunk-11.c
> +++ b/gcc/testsuite/gcc.target/i386/ret-thunk-11.c
> @@ -15,9 +15,6 @@ foo (void)
>  /* { dg-final { scan-assembler-times {\tlfence} 1 } } */
>  /* { dg-final { scan-assembler "jmp\[ \t\]*\.LIND" } } */
>  /* { dg-final { scan-assembler "call\[ \t\]*\.LIND" } } */
> -/* { dg-final { scan-assembler "push(?:l|q)\[ \t\]*_?bar" { target { { ! x32 
> } && *-*-linux* } } } } */
> -/* { dg-final { scan-assembler "jmp\[ \t\]*__x86_indirect_thunk" { target { 
> ! x32 } } } } */
> -/* { dg-final { scan-assembler "__x86_indirect_thunk:" { target { ! x32 } }  
> } } */
> -/* { dg-final { scan-assembler "call\[ \t\]*__x86_indirect_thunk_(r|e)ax" { 
> target { x32 } }  } } */
> -/* { dg-final { scan-assembler "__x86_indirect_thunk_(r|e)ax:" { target { 
> x32 } }  } } */
> -/* { dg-final { scan-assembler-not "pushq\[ \t\]%rax" { target x32 } } } */
> +/* { dg-final { scan-assembler "call\[ \t\]*__x86_indirect_thunk_(r|e)ax" } 
> } */
> +/* { dg-final { scan-assembler "__x86_indirect_thunk_(r|e)ax:" } } */
> +/* { dg-final { scan-assembler-not "pushq\[ \t\]%rax" } } */
> diff --git a/gcc/testsuite/gcc.target/i386/ret-thunk-12.c 
> b/gcc/testsuite/gcc.target/i386/ret-thunk-12.c
> index 5fb1a4de776..3b0023a0a6d 100644
> --- a/gcc/testsuite/gcc.target/i386/ret-thunk-12.c
> +++ b/gcc/testsuite/gcc.target/i386/ret-thunk-12.c
> @@ -15,8 +15,6 @@ foo (void)
>  /* { dg-final { scan-assembler-times {\tlfence} 1 } } */
>  /* { dg-final { scan-assembler "jmp\[ \t\]*\.LIND" } } */
>  /* { dg-final { scan-assembler "call\[ \t\]*\.LIND" } } */
> -/* { dg-final { scan-assembler "jmp\[ \t\]*__x86_indirect_thunk" { target { 
> ! x32 } } } } */
> -/* { dg-final { scan-assembler "__x86_indirect_thunk:" { target { ! x32 } }  
> } } */
> -/* { dg-final { scan-assembler "call\[ \t\]*__x86_indirect_thunk_(r|e)ax" { 
> target { x32 } }  } } */
> -/* { dg-final { scan-assembler "__x86_indirect_thunk_(r|e)ax:" { target { 
> x32 } }  } } */
> -/* { dg-final { scan-assembler-not "pushq\[ \t\]%rax" { target x32 } } } */
> +/* { dg-final { scan-assembler "call\[ \t\]*__x86_indirect_thunk_(r|e)ax" } 
> } */
> +/* { dg-final { scan-assembler "__x86_indirect_thunk_(r|e)ax:" } } */
> +/* { dg-final { scan-assembler-not "pushq\[ \t\]%rax" } } */
> diff --git a/gcc/testsuite/gcc.target/i386/ret-thunk-13.c 
> b/gcc/testsuite/gcc.target/i386/ret-thunk-13.c
> index fd5b41fdd3f..55f156c4376 100644
> --- a/gcc/testsuite/gcc.target/i386/ret-thunk-13.c
> +++ b/gcc/testsuite/gcc.target/i386/ret-thunk-13.c
> @@ -14,9 +14,8 @@ foo (void)
>  /* { dg-final { scan-assembler "jmp\[ \t\]*__x86_return_thunk" } } */
>  /* { dg-final { scan-assembler-times {\tpause} 2 } } */
>  /* { dg-final { scan-assembler-times {\tlfence} 2 } } */
> -/* { dg-final { scan-assembler "push(?:l|q)\[ \t\]*_?bar" { target { { ! x32 
> } && *-*-linux* } } } } */
>  /* { dg-final { scan-assembler-times "jmp\[ \t\]*\.LIND" 3 } } */
>  /* { dg-final { scan-assembler-times "call\[ \t\]*\.LIND" 3 } } */
>  /* { dg-final { scan-assembler-not "jmp\[ \t\]*__x86_indirect_thunk" } } */
> -/* { dg-final { scan-assembler-not "call\[ 
> \t\]*__x86_indirect_thunk_(r|e)ax" { target { x32 } }  } } */
> -/* { dg-final { scan-assembler-not "pushq\[ \t\]%rax" { target x32 } } } */
> +/* { dg-final { scan-assembler-not "call\[ 
> \t\]*__x86_indirect_thunk_(r|e)ax" } } */
> +/* { dg-final { scan-assembler-not "pushq\[ \t\]%rax" } } */
> diff --git a/gcc/testsuite/gcc.target/i386/ret-thunk-14.c 
> b/gcc/testsuite/gcc.target/i386/ret-thunk-14.c
> index d606373ead1..1c790436a53 100644
> --- a/gcc/testsuite/gcc.target/i386/ret-thunk-14.c
> +++ b/gcc/testsuite/gcc.target/i386/ret-thunk-14.c
> @@ -16,7 +16,6 @@ foo (void)
>  /* { dg-final { scan-assembler-not "jmp\[ \t\]*__x86_return_thunk" } } */
>  /* { dg-final { scan-assembler "jmp\[ \t\]*\.LIND" } } */
>  /* { dg-final { scan-assembler "call\[ \t\]*\.LIND" } } */
> -/* { dg-final { scan-assembler "push(?:l|q)\[ \t\]*_?bar" { target { { ! x32 
> } && *-*-linux* } } } } */
> -/* { dg-final { scan-assembler "jmp\[ \t\]*__x86_indirect_thunk" { target { 
> ! x32 } } } } */
> -/* { dg-final { scan-assembler "call\[ \t\]*__x86_indirect_thunk_(r|e)ax" { 
> target { x32 } }  } } */
> -/* { dg-final { scan-assembler-not "pushq\[ \t\]%rax" { target x32 } } } */
> +/* { dg-final { scan-assembler "mov(?:l|q)\[ \t\]*_?bar" { target *-*-linux* 
> } } } */
> +/* { dg-final { scan-assembler "call\[ \t\]*__x86_indirect_thunk_(r|e)ax" } 
> } */
> +/* { dg-final { scan-assembler-not "pushq\[ \t\]%rax" } } */
> diff --git a/gcc/testsuite/gcc.target/i386/ret-thunk-15.c 
> b/gcc/testsuite/gcc.target/i386/ret-thunk-15.c
> index 2038644aa59..bc2bedf5a9c 100644
> --- a/gcc/testsuite/gcc.target/i386/ret-thunk-15.c
> +++ b/gcc/testsuite/gcc.target/i386/ret-thunk-15.c
> @@ -16,7 +16,6 @@ foo (void)
>  /* { dg-final { scan-assembler "call\[ \t\]*\.LIND" } } */
>  /* { dg-final { scan-assembler-times {\tpause} 1 } } */
>  /* { dg-final { scan-assembler-times {\tlfence} 1 } } */
> -/* { dg-final { scan-assembler "push(?:l|q)\[ \t\]*_?bar" { target { { ! x32 
> } && *-*-linux* } } } } */
> -/* { dg-final { scan-assembler "jmp\[ \t\]*__x86_indirect_thunk" { target { 
> ! x32 } } } } */
> -/* { dg-final { scan-assembler "call\[ \t\]*__x86_indirect_thunk_(r|e)ax" { 
> target x32 } } } */
> -/* { dg-final { scan-assembler-not "pushq\[ \t\]%rax" { target x32 } } } */
> +/* { dg-final { scan-assembler "mov(?:l|q)\[ \t\]*_?bar" { target *-*-linux* 
> } } } */
> +/* { dg-final { scan-assembler "call\[ \t\]*__x86_indirect_thunk_(r|e)ax" } 
> } */
> +/* { dg-final { scan-assembler-not "pushq\[ \t\]%rax" } } */
> diff --git a/gcc/testsuite/gcc.target/i386/ret-thunk-9.c 
> b/gcc/testsuite/gcc.target/i386/ret-thunk-9.c
> index d34dd4e6dc7..b75fc9219b0 100644
> --- a/gcc/testsuite/gcc.target/i386/ret-thunk-9.c
> +++ b/gcc/testsuite/gcc.target/i386/ret-thunk-9.c
> @@ -14,11 +14,8 @@ foo (void)
>  /* { dg-final { scan-assembler "jmp\[ \t\]*\.LIND" } } */
>  /* { dg-final { scan-assembler "call\[ \t\]*\.LIND" } } */
>  /* { dg-final { scan-assembler "__x86_indirect_thunk:" } } */
> -/* { dg-final { scan-assembler-times {\tpause} 1 { target { ! x32 } } } } */
> -/* { dg-final { scan-assembler-times {\tlfence} 1 { target { ! x32 } } } } */
> -/* { dg-final { scan-assembler "push(?:l|q)\[ \t\]*_?bar" { target { { ! x32 
> } && *-*-linux* } } } } */
> -/* { dg-final { scan-assembler "jmp\[ \t\]*__x86_indirect_thunk" { target { 
> ! x32 } } } } */
> -/* { dg-final { scan-assembler-times {\tpause} 2 { target { x32 } } } } */
> -/* { dg-final { scan-assembler-times {\tlfence} 2 { target { x32 } } } } */
> -/* { dg-final { scan-assembler "call\[ \t\]*__x86_indirect_thunk_(r|e)ax" { 
> target { x32 } } } } */
> -/* { dg-final { scan-assembler-not "pushq\[ \t\]%rax" { target x32 } } } */
> +/* { dg-final { scan-assembler "mov(?:l|q)\[ \t\]*_?bar" { target *-*-linux* 
> } } } */
> +/* { dg-final { scan-assembler-times {\tpause} 2 } } */
> +/* { dg-final { scan-assembler-times {\tlfence} 2 } } */
> +/* { dg-final { scan-assembler "call\[ \t\]*__x86_indirect_thunk_(r|e)ax" } 
> } */
> +/* { dg-final { scan-assembler-not "pushq\[ \t\]%rax" } } */
> -- 
> 2.14.3
> 

Reply via email to