From 1b0399e74fe2b18b73c22704c33da76a792be836 Mon Sep 17 00:00:00 2001 From: Jakub Jelinek Date: Wed, 7 May 2014 17:57:48 +0200 Subject: [PATCH] backport: re PR target/57623 (BEXTR intrinsic has memory operands switched around (fails to compile code)) Backported from mainline 2013-06-27 Jakub Jelinek PR target/57623 * config/i386/i386.md (bmi_bextr_): Swap predicates and constraints of operand 1 and 2. * gcc.target/i386/bmi-bextr-3.c: New test. From-SVN: r210168 --- gcc/ChangeLog | 4 +++ gcc/config/i386/i386.md | 4 +-- gcc/testsuite/ChangeLog | 3 ++ gcc/testsuite/gcc.target/i386/bmi-bextr-3.c | 31 +++++++++++++++++++++ 4 files changed, 40 insertions(+), 2 deletions(-) create mode 100644 gcc/testsuite/gcc.target/i386/bmi-bextr-3.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 90a411b8969c..ea476d5eb550 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -3,6 +3,10 @@ Backported from mainline 2013-06-27 Jakub Jelinek + PR target/57623 + * config/i386/i386.md (bmi_bextr_): Swap predicates and + constraints of operand 1 and 2. + PR target/57623 * config/i386/i386.md (bmi2_bzhi_3): Swap AND arguments to match RTL canonicalization. Swap predicates and diff --git a/gcc/config/i386/i386.md b/gcc/config/i386/i386.md index 781e671036d4..9b8a96e428d6 100644 --- a/gcc/config/i386/i386.md +++ b/gcc/config/i386/i386.md @@ -12077,8 +12077,8 @@ (define_insn "bmi_bextr_" [(set (match_operand:SWI48 0 "register_operand" "=r") - (unspec:SWI48 [(match_operand:SWI48 1 "register_operand" "r") - (match_operand:SWI48 2 "nonimmediate_operand" "rm")] + (unspec:SWI48 [(match_operand:SWI48 1 "nonimmediate_operand" "rm") + (match_operand:SWI48 2 "register_operand" "r")] UNSPEC_BEXTR)) (clobber (reg:CC FLAGS_REG))] "TARGET_BMI" diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 897dfbcc0866..3723fc0e579f 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -3,6 +3,9 @@ Backported from mainline 2013-06-27 Jakub Jelinek + PR target/57623 + * gcc.target/i386/bmi-bextr-3.c: New test. + PR target/57623 * gcc.target/i386/bmi2-bzhi-1.c: New test. diff --git a/gcc/testsuite/gcc.target/i386/bmi-bextr-3.c b/gcc/testsuite/gcc.target/i386/bmi-bextr-3.c new file mode 100644 index 000000000000..fe342b9e0ad7 --- /dev/null +++ b/gcc/testsuite/gcc.target/i386/bmi-bextr-3.c @@ -0,0 +1,31 @@ +/* PR target/57623 */ +/* { dg-do assemble { target bmi } } */ +/* { dg-options "-O2 -mbmi" } */ + +#include + +unsigned int +f1 (unsigned int x, unsigned int *y) +{ + return __bextr_u32 (x, *y); +} + +unsigned int +f2 (unsigned int *x, unsigned int y) +{ + return __bextr_u32 (*x, y); +} + +#ifdef __x86_64__ +unsigned long long +f3 (unsigned long long x, unsigned long long *y) +{ + return __bextr_u64 (x, *y); +} + +unsigned long long +f4 (unsigned long long *x, unsigned long long y) +{ + return __bextr_u64 (*x, y); +} +#endif -- 2.47.2