Patchwork tcg: remove obsolete jmp op

login
register
mail settings
Submitter Aurelien Jarno
Date Oct. 1, 2012, 7 p.m.
Message ID <1349118049-20978-1-git-send-email-aurelien@aurel32.net>
Download mbox | patch
Permalink /patch/188334/
State New
Headers show

Comments

Aurelien Jarno - Oct. 1, 2012, 7 p.m.
The TCG jmp operation doesn't really make sense in the QEMU context, it
is unused, it is not implemented by some targets, and it is wrongly
implemented by some others.

This patch simply removes it.

Cc: Andrzej Zaborowski <balrogg@gmail.com>
Cc: Richard Henderson <rth@twiddle.net>
Cc: Vassili Karpov (malc) <av1474@comtv.ru>
Cc: Alexander Graf <agraf@suse.de>
Cc: Blue Swirl <blauwirbel@gmail.com>
Cc: Stefan Weil <sw@weilnetz.de>
Signed-off-by: Aurelien Jarno <aurelien@aurel32.net>
---
 tcg/README             |    7 +------
 tcg/arm/tcg-target.c   |    7 -------
 tcg/hppa/tcg-target.c  |    6 ------
 tcg/i386/tcg-target.c  |    9 ---------
 tcg/ia64/tcg-target.c  |    4 ----
 tcg/mips/tcg-target.c  |    5 -----
 tcg/ppc/tcg-target.c   |   10 ----------
 tcg/ppc64/tcg-target.c |   10 ----------
 tcg/s390/tcg-target.c  |    6 ------
 tcg/sparc/tcg-target.c |    2 --
 tcg/tcg-opc.h          |    1 -
 tcg/tci/tcg-target.c   |    4 ----
 tci.c                  |    1 -
 13 files changed, 1 insertion(+), 71 deletions(-)
Richard Henderson - Oct. 1, 2012, 9:15 p.m.
On 2012-10-01 12:00, Aurelien Jarno wrote:
> The TCG jmp operation doesn't really make sense in the QEMU context, it
> is unused, it is not implemented by some targets, and it is wrongly
> implemented by some others.
> 
> This patch simply removes it.
> 
> Cc: Andrzej Zaborowski <balrogg@gmail.com>
> Cc: Richard Henderson <rth@twiddle.net>
> Cc: Vassili Karpov (malc) <av1474@comtv.ru>
> Cc: Alexander Graf <agraf@suse.de>
> Cc: Blue Swirl <blauwirbel@gmail.com>
> Cc: Stefan Weil <sw@weilnetz.de>
> Signed-off-by: Aurelien Jarno <aurelien@aurel32.net>

Yaye.  I posted a patch to do this 2 years ago and it got missed.

Reviewed-by: Richard Henderson <rth@twiddle.net>


r~
Blue Swirl - Oct. 3, 2012, 8:03 p.m.
On Mon, Oct 1, 2012 at 7:00 PM, Aurelien Jarno <aurelien@aurel32.net> wrote:
> The TCG jmp operation doesn't really make sense in the QEMU context, it
> is unused, it is not implemented by some targets, and it is wrongly
> implemented by some others.
>
> This patch simply removes it.
>
> Cc: Andrzej Zaborowski <balrogg@gmail.com>
> Cc: Richard Henderson <rth@twiddle.net>
> Cc: Vassili Karpov (malc) <av1474@comtv.ru>
> Cc: Alexander Graf <agraf@suse.de>
> Cc: Blue Swirl <blauwirbel@gmail.com>

Acked-by: Blue Swirl <blauwirbel@gmail.com>

> Cc: Stefan Weil <sw@weilnetz.de>
> Signed-off-by: Aurelien Jarno <aurelien@aurel32.net>
> ---
>  tcg/README             |    7 +------
>  tcg/arm/tcg-target.c   |    7 -------
>  tcg/hppa/tcg-target.c  |    6 ------
>  tcg/i386/tcg-target.c  |    9 ---------
>  tcg/ia64/tcg-target.c  |    4 ----
>  tcg/mips/tcg-target.c  |    5 -----
>  tcg/ppc/tcg-target.c   |   10 ----------
>  tcg/ppc64/tcg-target.c |   10 ----------
>  tcg/s390/tcg-target.c  |    6 ------
>  tcg/sparc/tcg-target.c |    2 --
>  tcg/tcg-opc.h          |    1 -
>  tcg/tci/tcg-target.c   |    4 ----
>  tci.c                  |    1 -
>  13 files changed, 1 insertion(+), 71 deletions(-)
>
> diff --git a/tcg/README b/tcg/README
> index 27846f1..aa86992 100644
> --- a/tcg/README
> +++ b/tcg/README
> @@ -88,8 +88,7 @@ supported.
>
>  * Branches:
>
> -Use the instruction 'br' to jump to a label. Use 'jmp' to jump to an
> -explicit address. Conditional branches can only jump to labels.
> +Use the instruction 'br' to jump to a label.
>
>  3.3) Code Optimizations
>
> @@ -129,10 +128,6 @@ call function 'ptr' (pointer type)
>
>  ********* Jumps/Labels
>
> -* jmp t0
> -
> -Absolute jump to address t0 (pointer type).
> -
>  * set_label $label
>
>  Define label 'label' at the current program point.
> diff --git a/tcg/arm/tcg-target.c b/tcg/arm/tcg-target.c
> index 2bad0a2..1e61864 100644
> --- a/tcg/arm/tcg-target.c
> +++ b/tcg/arm/tcg-target.c
> @@ -1530,12 +1530,6 @@ static inline void tcg_out_op(TCGContext *s, TCGOpcode opc,
>          else
>              tcg_out_callr(s, COND_AL, args[0]);
>          break;
> -    case INDEX_op_jmp:
> -        if (const_args[0])
> -            tcg_out_goto(s, COND_AL, args[0]);
> -        else
> -            tcg_out_bx(s, COND_AL, args[0]);
> -        break;
>      case INDEX_op_br:
>          tcg_out_goto_label(s, COND_AL, args[0]);
>          break;
> @@ -1769,7 +1763,6 @@ static const TCGTargetOpDef arm_op_defs[] = {
>      { INDEX_op_exit_tb, { } },
>      { INDEX_op_goto_tb, { } },
>      { INDEX_op_call, { "ri" } },
> -    { INDEX_op_jmp, { "ri" } },
>      { INDEX_op_br, { } },
>
>      { INDEX_op_mov_i32, { "r", "r" } },
> diff --git a/tcg/hppa/tcg-target.c b/tcg/hppa/tcg-target.c
> index 2c79c10..44974c4 100644
> --- a/tcg/hppa/tcg-target.c
> +++ b/tcg/hppa/tcg-target.c
> @@ -1353,11 +1353,6 @@ static inline void tcg_out_op(TCGContext *s, TCGOpcode opc, const TCGArg *args,
>          }
>          break;
>
> -    case INDEX_op_jmp:
> -        fprintf(stderr, "unimplemented jmp\n");
> -        tcg_abort();
> -        break;
> -
>      case INDEX_op_br:
>          tcg_out_branch(s, args[0], 1);
>          break;
> @@ -1592,7 +1587,6 @@ static const TCGTargetOpDef hppa_op_defs[] = {
>      { INDEX_op_goto_tb, { } },
>
>      { INDEX_op_call, { "ri" } },
> -    { INDEX_op_jmp, { "r" } },
>      { INDEX_op_br, { } },
>
>      { INDEX_op_mov_i32, { "r", "r" } },
> diff --git a/tcg/i386/tcg-target.c b/tcg/i386/tcg-target.c
> index 0e218c8..bb2306d 100644
> --- a/tcg/i386/tcg-target.c
> +++ b/tcg/i386/tcg-target.c
> @@ -1513,14 +1513,6 @@ static inline void tcg_out_op(TCGContext *s, TCGOpcode opc,
>              tcg_out_modrm(s, OPC_GRP5, EXT5_CALLN_Ev, args[0]);
>          }
>          break;
> -    case INDEX_op_jmp:
> -        if (const_args[0]) {
> -            tcg_out_jmp(s, args[0]);
> -        } else {
> -            /* jmp *reg */
> -            tcg_out_modrm(s, OPC_GRP5, EXT5_JMPN_Ev, args[0]);
> -        }
> -        break;
>      case INDEX_op_br:
>          tcg_out_jxx(s, JCC_JMP, args[0], 0);
>          break;
> @@ -1848,7 +1840,6 @@ static const TCGTargetOpDef x86_op_defs[] = {
>      { INDEX_op_exit_tb, { } },
>      { INDEX_op_goto_tb, { } },
>      { INDEX_op_call, { "ri" } },
> -    { INDEX_op_jmp, { "ri" } },
>      { INDEX_op_br, { } },
>      { INDEX_op_mov_i32, { "r", "r" } },
>      { INDEX_op_movi_i32, { "r" } },
> diff --git a/tcg/ia64/tcg-target.c b/tcg/ia64/tcg-target.c
> index dc9c12c..705712f 100644
> --- a/tcg/ia64/tcg-target.c
> +++ b/tcg/ia64/tcg-target.c
> @@ -1916,9 +1916,6 @@ static inline void tcg_out_op(TCGContext *s, TCGOpcode opc,
>      case INDEX_op_goto_tb:
>          tcg_out_goto_tb(s, args[0]);
>          break;
> -    case INDEX_op_jmp:
> -        tcg_out_jmp(s, args[0]);
> -        break;
>
>      case INDEX_op_movi_i32:
>          tcg_out_movi(s, TCG_TYPE_I32, args[0], args[1]);
> @@ -2156,7 +2153,6 @@ static const TCGTargetOpDef ia64_op_defs[] = {
>      { INDEX_op_call, { "r" } },
>      { INDEX_op_exit_tb, { } },
>      { INDEX_op_goto_tb, { } },
> -    { INDEX_op_jmp, { "r" } },
>
>      { INDEX_op_mov_i32, { "r", "r" } },
>      { INDEX_op_movi_i32, { "r" } },
> diff --git a/tcg/mips/tcg-target.c b/tcg/mips/tcg-target.c
> index 34e3e7f..7e4013e 100644
> --- a/tcg/mips/tcg-target.c
> +++ b/tcg/mips/tcg-target.c
> @@ -1322,10 +1322,6 @@ static inline void tcg_out_op(TCGContext *s, TCGOpcode opc,
>          tcg_out_opc_reg(s, OPC_JALR, TCG_REG_RA, args[0], 0);
>          tcg_out_nop(s);
>          break;
> -    case INDEX_op_jmp:
> -        tcg_out_opc_reg(s, OPC_JR, 0, args[0], 0);
> -        tcg_out_nop(s);
> -        break;
>      case INDEX_op_br:
>          tcg_out_brcond(s, TCG_COND_EQ, TCG_REG_ZERO, TCG_REG_ZERO, args[0]);
>          break;
> @@ -1577,7 +1573,6 @@ static const TCGTargetOpDef mips_op_defs[] = {
>      { INDEX_op_exit_tb, { } },
>      { INDEX_op_goto_tb, { } },
>      { INDEX_op_call, { "C" } },
> -    { INDEX_op_jmp, { "r" } },
>      { INDEX_op_br, { } },
>
>      { INDEX_op_mov_i32, { "r", "r" } },
> diff --git a/tcg/ppc/tcg-target.c b/tcg/ppc/tcg-target.c
> index 90c275d..56baedd 100644
> --- a/tcg/ppc/tcg-target.c
> +++ b/tcg/ppc/tcg-target.c
> @@ -1417,15 +1417,6 @@ static void tcg_out_op(TCGContext *s, TCGOpcode opc, const TCGArg *args,
>      case INDEX_op_call:
>          tcg_out_call (s, args[0], const_args[0]);
>          break;
> -    case INDEX_op_jmp:
> -        if (const_args[0]) {
> -            tcg_out_b (s, 0, args[0]);
> -        }
> -        else {
> -            tcg_out32 (s, MTSPR | RS (args[0]) | CTR);
> -            tcg_out32 (s, BCCTR | BO_ALWAYS);
> -        }
> -        break;
>      case INDEX_op_movi_i32:
>          tcg_out_movi(s, TCG_TYPE_I32, args[0], args[1]);
>          break;
> @@ -1904,7 +1895,6 @@ static const TCGTargetOpDef ppc_op_defs[] = {
>      { INDEX_op_exit_tb, { } },
>      { INDEX_op_goto_tb, { } },
>      { INDEX_op_call, { "ri" } },
> -    { INDEX_op_jmp, { "ri" } },
>      { INDEX_op_br, { } },
>
>      { INDEX_op_mov_i32, { "r", "r" } },
> diff --git a/tcg/ppc64/tcg-target.c b/tcg/ppc64/tcg-target.c
> index 19944bc..6e9b363 100644
> --- a/tcg/ppc64/tcg-target.c
> +++ b/tcg/ppc64/tcg-target.c
> @@ -1245,15 +1245,6 @@ static void tcg_out_op (TCGContext *s, TCGOpcode opc, const TCGArg *args,
>      case INDEX_op_call:
>          tcg_out_call (s, args[0], const_args[0]);
>          break;
> -    case INDEX_op_jmp:
> -        if (const_args[0]) {
> -            tcg_out_b (s, 0, args[0]);
> -        }
> -        else {
> -            tcg_out32 (s, MTSPR | RS (args[0]) | CTR);
> -            tcg_out32 (s, BCCTR | BO_ALWAYS);
> -        }
> -        break;
>      case INDEX_op_movi_i32:
>          tcg_out_movi (s, TCG_TYPE_I32, args[0], args[1]);
>          break;
> @@ -1588,7 +1579,6 @@ static const TCGTargetOpDef ppc_op_defs[] = {
>      { INDEX_op_exit_tb, { } },
>      { INDEX_op_goto_tb, { } },
>      { INDEX_op_call, { "ri" } },
> -    { INDEX_op_jmp, { "ri" } },
>      { INDEX_op_br, { } },
>
>      { INDEX_op_mov_i32, { "r", "r" } },
> diff --git a/tcg/s390/tcg-target.c b/tcg/s390/tcg-target.c
> index 3b90605..4b43059 100644
> --- a/tcg/s390/tcg-target.c
> +++ b/tcg/s390/tcg-target.c
> @@ -2037,11 +2037,6 @@ static inline void tcg_out_op(TCGContext *s, TCGOpcode opc,
>          break;
>  #endif /* TCG_TARGET_REG_BITS == 64 */
>
> -    case INDEX_op_jmp:
> -        /* This one is obsolete and never emitted.  */
> -        tcg_abort();
> -        break;
> -
>      default:
>          fprintf(stderr,"unimplemented opc 0x%x\n",opc);
>          tcg_abort();
> @@ -2052,7 +2047,6 @@ static const TCGTargetOpDef s390_op_defs[] = {
>      { INDEX_op_exit_tb, { } },
>      { INDEX_op_goto_tb, { } },
>      { INDEX_op_call, { "ri" } },
> -    { INDEX_op_jmp, { "ri" } },
>      { INDEX_op_br, { } },
>
>      { INDEX_op_mov_i32, { "r", "r" } },
> diff --git a/tcg/sparc/tcg-target.c b/tcg/sparc/tcg-target.c
> index 8fd7f86..e82fab2 100644
> --- a/tcg/sparc/tcg-target.c
> +++ b/tcg/sparc/tcg-target.c
> @@ -1097,7 +1097,6 @@ static inline void tcg_out_op(TCGContext *s, TCGOpcode opc, const TCGArg *args,
>          /* delay slot */
>          tcg_out_nop(s);
>          break;
> -    case INDEX_op_jmp:
>      case INDEX_op_br:
>          tcg_out_branch_i32(s, COND_A, args[0]);
>          tcg_out_nop(s);
> @@ -1367,7 +1366,6 @@ static const TCGTargetOpDef sparc_op_defs[] = {
>      { INDEX_op_exit_tb, { } },
>      { INDEX_op_goto_tb, { } },
>      { INDEX_op_call, { "ri" } },
> -    { INDEX_op_jmp, { "ri" } },
>      { INDEX_op_br, { } },
>
>      { INDEX_op_mov_i32, { "r", "r" } },
> diff --git a/tcg/tcg-opc.h b/tcg/tcg-opc.h
> index dbb0e39..04cb7ca 100644
> --- a/tcg/tcg-opc.h
> +++ b/tcg/tcg-opc.h
> @@ -38,7 +38,6 @@ DEF(discard, 1, 0, 0, 0)
>
>  DEF(set_label, 0, 0, 1, TCG_OPF_BB_END)
>  DEF(call, 0, 1, 2, TCG_OPF_SIDE_EFFECTS) /* variable number of parameters */
> -DEF(jmp, 0, 1, 0, TCG_OPF_BB_END | TCG_OPF_SIDE_EFFECTS)
>  DEF(br, 0, 0, 1, TCG_OPF_BB_END | TCG_OPF_SIDE_EFFECTS)
>
>  #define IMPL(X) (X ? 0 : TCG_OPF_NOT_PRESENT)
> diff --git a/tcg/tci/tcg-target.c b/tcg/tci/tcg-target.c
> index d272a90..e930740 100644
> --- a/tcg/tci/tcg-target.c
> +++ b/tcg/tci/tcg-target.c
> @@ -69,7 +69,6 @@ static const TCGTargetOpDef tcg_target_op_defs[] = {
>      { INDEX_op_exit_tb, { NULL } },
>      { INDEX_op_goto_tb, { NULL } },
>      { INDEX_op_call, { RI } },
> -    { INDEX_op_jmp, { RI } },
>      { INDEX_op_br, { NULL } },
>
>      { INDEX_op_mov_i32, { R, R } },
> @@ -583,9 +582,6 @@ static void tcg_out_op(TCGContext *s, TCGOpcode opc, const TCGArg *args,
>      case INDEX_op_call:
>          tcg_out_ri(s, const_args[0], args[0]);
>          break;
> -    case INDEX_op_jmp:
> -        TODO();
> -        break;
>      case INDEX_op_setcond_i32:
>          tcg_out_r(s, args[0]);
>          tcg_out_r(s, args[1]);
> diff --git a/tci.c b/tci.c
> index a4f7b78..98f5f71 100644
> --- a/tci.c
> +++ b/tci.c
> @@ -505,7 +505,6 @@ tcg_target_ulong tcg_qemu_tb_exec(CPUArchState *cpustate, uint8_t *tb_ptr)
>              tci_write_reg(TCG_REG_R0, tmp64);
>  #endif
>              break;
> -        case INDEX_op_jmp:
>          case INDEX_op_br:
>              label = tci_read_label(&tb_ptr);
>              assert(tb_ptr == old_code_ptr + op_size);
> --
> 1.7.10.4
>
Stefan Weil - Oct. 3, 2012, 8:21 p.m.
Am 01.10.2012 21:00, schrieb Aurelien Jarno:
> The TCG jmp operation doesn't really make sense in the QEMU context, it
> is unused, it is not implemented by some targets, and it is wrongly
> implemented by some others.
>
> This patch simply removes it.
>
> Cc: Andrzej Zaborowski<balrogg@gmail.com>
> Cc: Richard Henderson<rth@twiddle.net>
> Cc: Vassili Karpov (malc)<av1474@comtv.ru>
> Cc: Alexander Graf<agraf@suse.de>
> Cc: Blue Swirl<blauwirbel@gmail.com>
> Cc: Stefan Weil<sw@weilnetz.de>
> Signed-off-by: Aurelien Jarno<aurelien@aurel32.net>
> ---
>   tcg/README             |    7 +------
>   tcg/arm/tcg-target.c   |    7 -------
>   tcg/hppa/tcg-target.c  |    6 ------
>   tcg/i386/tcg-target.c  |    9 ---------
>   tcg/ia64/tcg-target.c  |    4 ----
>   tcg/mips/tcg-target.c  |    5 -----
>   tcg/ppc/tcg-target.c   |   10 ----------
>   tcg/ppc64/tcg-target.c |   10 ----------
>   tcg/s390/tcg-target.c  |    6 ------
>   tcg/sparc/tcg-target.c |    2 --
>   tcg/tcg-opc.h          |    1 -
>   tcg/tci/tcg-target.c   |    4 ----
>   tci.c                  |    1 -
>   13 files changed, 1 insertion(+), 71 deletions(-)
>
>    

Acked-by: Stefan Weil<sw@weilnetz.de>

Patch

diff --git a/tcg/README b/tcg/README
index 27846f1..aa86992 100644
--- a/tcg/README
+++ b/tcg/README
@@ -88,8 +88,7 @@  supported.
 
 * Branches:
 
-Use the instruction 'br' to jump to a label. Use 'jmp' to jump to an
-explicit address. Conditional branches can only jump to labels.
+Use the instruction 'br' to jump to a label.
 
 3.3) Code Optimizations
 
@@ -129,10 +128,6 @@  call function 'ptr' (pointer type)
 
 ********* Jumps/Labels
 
-* jmp t0
-
-Absolute jump to address t0 (pointer type).
-
 * set_label $label
 
 Define label 'label' at the current program point.
diff --git a/tcg/arm/tcg-target.c b/tcg/arm/tcg-target.c
index 2bad0a2..1e61864 100644
--- a/tcg/arm/tcg-target.c
+++ b/tcg/arm/tcg-target.c
@@ -1530,12 +1530,6 @@  static inline void tcg_out_op(TCGContext *s, TCGOpcode opc,
         else
             tcg_out_callr(s, COND_AL, args[0]);
         break;
-    case INDEX_op_jmp:
-        if (const_args[0])
-            tcg_out_goto(s, COND_AL, args[0]);
-        else
-            tcg_out_bx(s, COND_AL, args[0]);
-        break;
     case INDEX_op_br:
         tcg_out_goto_label(s, COND_AL, args[0]);
         break;
@@ -1769,7 +1763,6 @@  static const TCGTargetOpDef arm_op_defs[] = {
     { INDEX_op_exit_tb, { } },
     { INDEX_op_goto_tb, { } },
     { INDEX_op_call, { "ri" } },
-    { INDEX_op_jmp, { "ri" } },
     { INDEX_op_br, { } },
 
     { INDEX_op_mov_i32, { "r", "r" } },
diff --git a/tcg/hppa/tcg-target.c b/tcg/hppa/tcg-target.c
index 2c79c10..44974c4 100644
--- a/tcg/hppa/tcg-target.c
+++ b/tcg/hppa/tcg-target.c
@@ -1353,11 +1353,6 @@  static inline void tcg_out_op(TCGContext *s, TCGOpcode opc, const TCGArg *args,
         }
         break;
 
-    case INDEX_op_jmp:
-        fprintf(stderr, "unimplemented jmp\n");
-        tcg_abort();
-        break;
-
     case INDEX_op_br:
         tcg_out_branch(s, args[0], 1);
         break;
@@ -1592,7 +1587,6 @@  static const TCGTargetOpDef hppa_op_defs[] = {
     { INDEX_op_goto_tb, { } },
 
     { INDEX_op_call, { "ri" } },
-    { INDEX_op_jmp, { "r" } },
     { INDEX_op_br, { } },
 
     { INDEX_op_mov_i32, { "r", "r" } },
diff --git a/tcg/i386/tcg-target.c b/tcg/i386/tcg-target.c
index 0e218c8..bb2306d 100644
--- a/tcg/i386/tcg-target.c
+++ b/tcg/i386/tcg-target.c
@@ -1513,14 +1513,6 @@  static inline void tcg_out_op(TCGContext *s, TCGOpcode opc,
             tcg_out_modrm(s, OPC_GRP5, EXT5_CALLN_Ev, args[0]);
         }
         break;
-    case INDEX_op_jmp:
-        if (const_args[0]) {
-            tcg_out_jmp(s, args[0]);
-        } else {
-            /* jmp *reg */
-            tcg_out_modrm(s, OPC_GRP5, EXT5_JMPN_Ev, args[0]);
-        }
-        break;
     case INDEX_op_br:
         tcg_out_jxx(s, JCC_JMP, args[0], 0);
         break;
@@ -1848,7 +1840,6 @@  static const TCGTargetOpDef x86_op_defs[] = {
     { INDEX_op_exit_tb, { } },
     { INDEX_op_goto_tb, { } },
     { INDEX_op_call, { "ri" } },
-    { INDEX_op_jmp, { "ri" } },
     { INDEX_op_br, { } },
     { INDEX_op_mov_i32, { "r", "r" } },
     { INDEX_op_movi_i32, { "r" } },
diff --git a/tcg/ia64/tcg-target.c b/tcg/ia64/tcg-target.c
index dc9c12c..705712f 100644
--- a/tcg/ia64/tcg-target.c
+++ b/tcg/ia64/tcg-target.c
@@ -1916,9 +1916,6 @@  static inline void tcg_out_op(TCGContext *s, TCGOpcode opc,
     case INDEX_op_goto_tb:
         tcg_out_goto_tb(s, args[0]);
         break;
-    case INDEX_op_jmp:
-        tcg_out_jmp(s, args[0]);
-        break;
 
     case INDEX_op_movi_i32:
         tcg_out_movi(s, TCG_TYPE_I32, args[0], args[1]);
@@ -2156,7 +2153,6 @@  static const TCGTargetOpDef ia64_op_defs[] = {
     { INDEX_op_call, { "r" } },
     { INDEX_op_exit_tb, { } },
     { INDEX_op_goto_tb, { } },
-    { INDEX_op_jmp, { "r" } },
 
     { INDEX_op_mov_i32, { "r", "r" } },
     { INDEX_op_movi_i32, { "r" } },
diff --git a/tcg/mips/tcg-target.c b/tcg/mips/tcg-target.c
index 34e3e7f..7e4013e 100644
--- a/tcg/mips/tcg-target.c
+++ b/tcg/mips/tcg-target.c
@@ -1322,10 +1322,6 @@  static inline void tcg_out_op(TCGContext *s, TCGOpcode opc,
         tcg_out_opc_reg(s, OPC_JALR, TCG_REG_RA, args[0], 0);
         tcg_out_nop(s);
         break;
-    case INDEX_op_jmp:
-        tcg_out_opc_reg(s, OPC_JR, 0, args[0], 0);
-        tcg_out_nop(s);
-        break;
     case INDEX_op_br:
         tcg_out_brcond(s, TCG_COND_EQ, TCG_REG_ZERO, TCG_REG_ZERO, args[0]);
         break;
@@ -1577,7 +1573,6 @@  static const TCGTargetOpDef mips_op_defs[] = {
     { INDEX_op_exit_tb, { } },
     { INDEX_op_goto_tb, { } },
     { INDEX_op_call, { "C" } },
-    { INDEX_op_jmp, { "r" } },
     { INDEX_op_br, { } },
 
     { INDEX_op_mov_i32, { "r", "r" } },
diff --git a/tcg/ppc/tcg-target.c b/tcg/ppc/tcg-target.c
index 90c275d..56baedd 100644
--- a/tcg/ppc/tcg-target.c
+++ b/tcg/ppc/tcg-target.c
@@ -1417,15 +1417,6 @@  static void tcg_out_op(TCGContext *s, TCGOpcode opc, const TCGArg *args,
     case INDEX_op_call:
         tcg_out_call (s, args[0], const_args[0]);
         break;
-    case INDEX_op_jmp:
-        if (const_args[0]) {
-            tcg_out_b (s, 0, args[0]);
-        }
-        else {
-            tcg_out32 (s, MTSPR | RS (args[0]) | CTR);
-            tcg_out32 (s, BCCTR | BO_ALWAYS);
-        }
-        break;
     case INDEX_op_movi_i32:
         tcg_out_movi(s, TCG_TYPE_I32, args[0], args[1]);
         break;
@@ -1904,7 +1895,6 @@  static const TCGTargetOpDef ppc_op_defs[] = {
     { INDEX_op_exit_tb, { } },
     { INDEX_op_goto_tb, { } },
     { INDEX_op_call, { "ri" } },
-    { INDEX_op_jmp, { "ri" } },
     { INDEX_op_br, { } },
 
     { INDEX_op_mov_i32, { "r", "r" } },
diff --git a/tcg/ppc64/tcg-target.c b/tcg/ppc64/tcg-target.c
index 19944bc..6e9b363 100644
--- a/tcg/ppc64/tcg-target.c
+++ b/tcg/ppc64/tcg-target.c
@@ -1245,15 +1245,6 @@  static void tcg_out_op (TCGContext *s, TCGOpcode opc, const TCGArg *args,
     case INDEX_op_call:
         tcg_out_call (s, args[0], const_args[0]);
         break;
-    case INDEX_op_jmp:
-        if (const_args[0]) {
-            tcg_out_b (s, 0, args[0]);
-        }
-        else {
-            tcg_out32 (s, MTSPR | RS (args[0]) | CTR);
-            tcg_out32 (s, BCCTR | BO_ALWAYS);
-        }
-        break;
     case INDEX_op_movi_i32:
         tcg_out_movi (s, TCG_TYPE_I32, args[0], args[1]);
         break;
@@ -1588,7 +1579,6 @@  static const TCGTargetOpDef ppc_op_defs[] = {
     { INDEX_op_exit_tb, { } },
     { INDEX_op_goto_tb, { } },
     { INDEX_op_call, { "ri" } },
-    { INDEX_op_jmp, { "ri" } },
     { INDEX_op_br, { } },
 
     { INDEX_op_mov_i32, { "r", "r" } },
diff --git a/tcg/s390/tcg-target.c b/tcg/s390/tcg-target.c
index 3b90605..4b43059 100644
--- a/tcg/s390/tcg-target.c
+++ b/tcg/s390/tcg-target.c
@@ -2037,11 +2037,6 @@  static inline void tcg_out_op(TCGContext *s, TCGOpcode opc,
         break;
 #endif /* TCG_TARGET_REG_BITS == 64 */
 
-    case INDEX_op_jmp:
-        /* This one is obsolete and never emitted.  */
-        tcg_abort();
-        break;
-
     default:
         fprintf(stderr,"unimplemented opc 0x%x\n",opc);
         tcg_abort();
@@ -2052,7 +2047,6 @@  static const TCGTargetOpDef s390_op_defs[] = {
     { INDEX_op_exit_tb, { } },
     { INDEX_op_goto_tb, { } },
     { INDEX_op_call, { "ri" } },
-    { INDEX_op_jmp, { "ri" } },
     { INDEX_op_br, { } },
 
     { INDEX_op_mov_i32, { "r", "r" } },
diff --git a/tcg/sparc/tcg-target.c b/tcg/sparc/tcg-target.c
index 8fd7f86..e82fab2 100644
--- a/tcg/sparc/tcg-target.c
+++ b/tcg/sparc/tcg-target.c
@@ -1097,7 +1097,6 @@  static inline void tcg_out_op(TCGContext *s, TCGOpcode opc, const TCGArg *args,
         /* delay slot */
         tcg_out_nop(s);
         break;
-    case INDEX_op_jmp:
     case INDEX_op_br:
         tcg_out_branch_i32(s, COND_A, args[0]);
         tcg_out_nop(s);
@@ -1367,7 +1366,6 @@  static const TCGTargetOpDef sparc_op_defs[] = {
     { INDEX_op_exit_tb, { } },
     { INDEX_op_goto_tb, { } },
     { INDEX_op_call, { "ri" } },
-    { INDEX_op_jmp, { "ri" } },
     { INDEX_op_br, { } },
 
     { INDEX_op_mov_i32, { "r", "r" } },
diff --git a/tcg/tcg-opc.h b/tcg/tcg-opc.h
index dbb0e39..04cb7ca 100644
--- a/tcg/tcg-opc.h
+++ b/tcg/tcg-opc.h
@@ -38,7 +38,6 @@  DEF(discard, 1, 0, 0, 0)
 
 DEF(set_label, 0, 0, 1, TCG_OPF_BB_END)
 DEF(call, 0, 1, 2, TCG_OPF_SIDE_EFFECTS) /* variable number of parameters */
-DEF(jmp, 0, 1, 0, TCG_OPF_BB_END | TCG_OPF_SIDE_EFFECTS)
 DEF(br, 0, 0, 1, TCG_OPF_BB_END | TCG_OPF_SIDE_EFFECTS)
 
 #define IMPL(X) (X ? 0 : TCG_OPF_NOT_PRESENT)
diff --git a/tcg/tci/tcg-target.c b/tcg/tci/tcg-target.c
index d272a90..e930740 100644
--- a/tcg/tci/tcg-target.c
+++ b/tcg/tci/tcg-target.c
@@ -69,7 +69,6 @@  static const TCGTargetOpDef tcg_target_op_defs[] = {
     { INDEX_op_exit_tb, { NULL } },
     { INDEX_op_goto_tb, { NULL } },
     { INDEX_op_call, { RI } },
-    { INDEX_op_jmp, { RI } },
     { INDEX_op_br, { NULL } },
 
     { INDEX_op_mov_i32, { R, R } },
@@ -583,9 +582,6 @@  static void tcg_out_op(TCGContext *s, TCGOpcode opc, const TCGArg *args,
     case INDEX_op_call:
         tcg_out_ri(s, const_args[0], args[0]);
         break;
-    case INDEX_op_jmp:
-        TODO();
-        break;
     case INDEX_op_setcond_i32:
         tcg_out_r(s, args[0]);
         tcg_out_r(s, args[1]);
diff --git a/tci.c b/tci.c
index a4f7b78..98f5f71 100644
--- a/tci.c
+++ b/tci.c
@@ -505,7 +505,6 @@  tcg_target_ulong tcg_qemu_tb_exec(CPUArchState *cpustate, uint8_t *tb_ptr)
             tci_write_reg(TCG_REG_R0, tmp64);
 #endif
             break;
-        case INDEX_op_jmp:
         case INDEX_op_br:
             label = tci_read_label(&tb_ptr);
             assert(tb_ptr == old_code_ptr + op_size);