diff --git a/gcc/config/m68k/m68k_68000_10_costs.c b/gcc/config/m68k/m68k_68000_10_costs.c index 51277f2d07a..e37b48bd4d0 100644 --- a/gcc/config/m68k/m68k_68000_10_costs.c +++ b/gcc/config/m68k/m68k_68000_10_costs.c @@ -88,7 +88,13 @@ m68k_68000_10_costs (rtx x, machine_mode mode, int outer_code, case LE: case LT: case CC0: + return false; case ZERO_EXTRACT: + if (outer_code == COMPARE && GET_CODE (XEXP (x, 1)) == CONST_INT && INTVAL (XEXP (x, 1)) == 1) + { + *total = 2; + return true; + } return false; case POST_INC: case TRUNCATE: diff --git a/gcc/config/m68k/m68k_68020_costs.c b/gcc/config/m68k/m68k_68020_costs.c index 9504b6fcbc4..1f30a099d73 100644 --- a/gcc/config/m68k/m68k_68020_costs.c +++ b/gcc/config/m68k/m68k_68020_costs.c @@ -106,7 +106,10 @@ m68k_68020_costs (rtx x, machine_mode mode, int outer_code, int opno, return true; case SIGN_EXTRACT: case ZERO_EXTRACT: - *total = 8; + if (outer_code == COMPARE && GET_CODE (XEXP (x, 1)) == CONST_INT && INTVAL (XEXP (x, 1)) == 1) + *total = 2; + else; + *total = 8; return true; case TRUNCATE: case ZERO_EXTEND: diff --git a/gcc/config/m68k/m68k_68030_costs.c b/gcc/config/m68k/m68k_68030_costs.c index 63b15f99468..10925e9e5d4 100644 --- a/gcc/config/m68k/m68k_68030_costs.c +++ b/gcc/config/m68k/m68k_68030_costs.c @@ -106,8 +106,11 @@ m68k_68030_costs (rtx x, machine_mode mode, int outer_code, int opno, return true; case SIGN_EXTRACT: case ZERO_EXTRACT: - *total = 10; - return true; + if (outer_code == COMPARE && GET_CODE (XEXP (x, 1)) == CONST_INT && INTVAL (XEXP (x, 1)) == 1) + *total = 2; + else; + *total = 10; + return true; case TRUNCATE: case ZERO_EXTEND: *total = GET_MODE_SIZE(mode) > 2 ? 4 : 2; diff --git a/gcc/config/m68k/m68k_68040_costs.c b/gcc/config/m68k/m68k_68040_costs.c index e2dcd7992e4..1c30b24a01f 100644 --- a/gcc/config/m68k/m68k_68040_costs.c +++ b/gcc/config/m68k/m68k_68040_costs.c @@ -103,7 +103,10 @@ __m68k_68040_costs (rtx x, machine_mode mode, int outer_code, int opno, return true; case SIGN_EXTRACT: case ZERO_EXTRACT: - *total = 4; + if (outer_code == COMPARE && GET_CODE (XEXP (x, 1)) == CONST_INT && INTVAL (XEXP (x, 1)) == 1) + *total = 2; + else; + *total = 4; return true; case TRUNCATE: case ZERO_EXTEND: