From 9d901b0e8fbb741dc6ac72faa4be1a3dc6b9b599 Mon Sep 17 00:00:00 2001 From: Jakub Jelinek Date: Thu, 13 Oct 2011 00:05:00 +0200 Subject: sse.md (avx2_gathersi, [...]): Add clobber of match_scratch... * config/i386/sse.md (avx2_gathersi, avx2_gatherdi, avx2_gatherdi256): Add clobber of match_scratch, change memory_operand to register_operand, add (mem:BLK (scratch)) use. (*avx2_gathersi, *avx2_gatherdi, *avx2_gatherdi256): Add clobber of match_scratch, add earlyclobber to the output operand and match_scratch, add (mem:BLK (scratch)) use, change the other mem to match_operand. Use %p6 instead of %c6 in the pattern. * config/i386/i386.c (ix86_expand_builtin): Adjust for operand 2 being a Pmode register_operand instead of memory_operand. From-SVN: r179869 --- gcc/ChangeLog | 14 +++++++ gcc/config/i386/i386.c | 6 +-- gcc/config/i386/sse.md | 109 ++++++++++++++++++++++++++----------------------- 3 files changed, 75 insertions(+), 54 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index f45327e..e9a8e07 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,17 @@ +2011-10-12 Jakub Jelinek + + * config/i386/sse.md (avx2_gathersi, + avx2_gatherdi, avx2_gatherdi256): Add clobber of + match_scratch, change memory_operand to register_operand, + add (mem:BLK (scratch)) use. + (*avx2_gathersi, *avx2_gatherdi, + *avx2_gatherdi256): Add clobber of match_scratch, + add earlyclobber to the output operand and match_scratch, + add (mem:BLK (scratch)) use, change the other mem to match_operand. + Use %p6 instead of %c6 in the pattern. + * config/i386/i386.c (ix86_expand_builtin): Adjust for + operand 2 being a Pmode register_operand instead of memory_operand. + 2011-10-12 Kai Tietz * config/i386/i386.md (simple_return): Disable diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c index 625c55e..f73a969 100644 --- a/gcc/config/i386/i386.c +++ b/gcc/config/i386/i386.c @@ -28748,7 +28748,6 @@ rdrand_step: op4 = expand_normal (arg4); /* Note the arg order is different from the operand order. */ mode0 = insn_data[icode].operand[1].mode; - mode1 = insn_data[icode].operand[2].mode; mode2 = insn_data[icode].operand[3].mode; mode3 = insn_data[icode].operand[4].mode; mode4 = insn_data[icode].operand[5].mode; @@ -28762,12 +28761,11 @@ rdrand_step: if (GET_MODE (op1) != Pmode) op1 = convert_to_mode (Pmode, op1, 1); op1 = force_reg (Pmode, op1); - op1 = gen_rtx_MEM (mode1, op1); if (!insn_data[icode].operand[1].predicate (op0, mode0)) op0 = copy_to_mode_reg (mode0, op0); - if (!insn_data[icode].operand[2].predicate (op1, mode1)) - op1 = copy_to_mode_reg (mode1, op1); + if (!insn_data[icode].operand[2].predicate (op1, Pmode)) + op1 = copy_to_mode_reg (Pmode, op1); if (!insn_data[icode].operand[3].predicate (op2, mode2)) op2 = copy_to_mode_reg (mode2, op2); if (!insn_data[icode].operand[4].predicate (op3, mode3)) diff --git a/gcc/config/i386/sse.md b/gcc/config/i386/sse.md index 9153352..b916eda 100644 --- a/gcc/config/i386/sse.md +++ b/gcc/config/i386/sse.md @@ -12524,55 +12524,61 @@ (V8SI "V8SI") (V8SF "V8SI")]) (define_expand "avx2_gathersi" - [(set (match_operand:VEC_GATHER_MODE 0 "register_operand" "") - (unspec:VEC_GATHER_MODE - [(match_operand:VEC_GATHER_MODE 1 "register_operand" "") - (match_operand: 2 "memory_operand" "") - (match_operand: 3 "register_operand" "") - (match_operand:VEC_GATHER_MODE 4 "register_operand" "") - (match_operand:SI 5 "const1248_operand " "")] - UNSPEC_GATHER))] + [(parallel [(set (match_operand:VEC_GATHER_MODE 0 "register_operand" "") + (unspec:VEC_GATHER_MODE + [(match_operand:VEC_GATHER_MODE 1 "register_operand" "") + (match_operand 2 "register_operand" "") + (mem:BLK (scratch)) + (match_operand: 3 "register_operand" "") + (match_operand:VEC_GATHER_MODE 4 "register_operand" "") + (match_operand:SI 5 "const1248_operand " "")] + UNSPEC_GATHER)) + (clobber (match_scratch:VEC_GATHER_MODE 6 ""))])] "TARGET_AVX2") (define_insn "*avx2_gathersi" - [(set (match_operand:VEC_GATHER_MODE 0 "register_operand" "=x") + [(set (match_operand:VEC_GATHER_MODE 0 "register_operand" "=&x") (unspec:VEC_GATHER_MODE - [(match_operand:VEC_GATHER_MODE 1 "register_operand" "0") - (mem: - (match_operand:P 2 "register_operand" "r")) - (match_operand: 3 "register_operand" "x") - (match_operand:VEC_GATHER_MODE 4 "register_operand" "x") - (match_operand:SI 5 "const1248_operand" "n")] - UNSPEC_GATHER))] + [(match_operand:VEC_GATHER_MODE 2 "register_operand" "0") + (match_operand:P 3 "register_operand" "r") + (mem:BLK (scratch)) + (match_operand: 4 "register_operand" "x") + (match_operand:VEC_GATHER_MODE 5 "register_operand" "1") + (match_operand:SI 6 "const1248_operand" "n")] + UNSPEC_GATHER)) + (clobber (match_scratch:VEC_GATHER_MODE 1 "=&x"))] "TARGET_AVX2" - "vgatherd\t{%4, (%2, %3, %c5), %0|%0, (%2, %3, %c5), %4}" + "vgatherd\t{%1, (%3, %4, %p6), %0|%0, (%3, %4, %p6), %1}" [(set_attr "type" "ssemov") (set_attr "prefix" "vex") (set_attr "mode" "")]) (define_expand "avx2_gatherdi" - [(set (match_operand:VEC_GATHER_MODE 0 "register_operand" "") - (unspec:VEC_GATHER_MODE - [(match_operand:VEC_GATHER_MODE 1 "register_operand" "") - (match_operand: 2 "memory_operand" "") - (match_operand: 3 "register_operand" "") - (match_operand:VEC_GATHER_MODE 4 "register_operand" "") - (match_operand:SI 5 "const1248_operand " "")] - UNSPEC_GATHER))] + [(parallel [(set (match_operand:VEC_GATHER_MODE 0 "register_operand" "") + (unspec:VEC_GATHER_MODE + [(match_operand:VEC_GATHER_MODE 1 "register_operand" "") + (match_operand 2 "register_operand" "") + (mem:BLK (scratch)) + (match_operand: 3 "register_operand" "") + (match_operand:VEC_GATHER_MODE 4 "register_operand" "") + (match_operand:SI 5 "const1248_operand " "")] + UNSPEC_GATHER)) + (clobber (match_scratch:VEC_GATHER_MODE 6 ""))])] "TARGET_AVX2") (define_insn "*avx2_gatherdi" - [(set (match_operand:AVXMODE48P_DI 0 "register_operand" "=x") + [(set (match_operand:AVXMODE48P_DI 0 "register_operand" "=&x") (unspec:AVXMODE48P_DI - [(match_operand:AVXMODE48P_DI 1 "register_operand" "0") - (mem: - (match_operand:P 2 "register_operand" "r")) - (match_operand: 3 "register_operand" "x") - (match_operand:AVXMODE48P_DI 4 "register_operand" "x") - (match_operand:SI 5 "const1248_operand" "n")] - UNSPEC_GATHER))] + [(match_operand:AVXMODE48P_DI 2 "register_operand" "0") + (match_operand:P 3 "register_operand" "r") + (mem:BLK (scratch)) + (match_operand: 4 "register_operand" "x") + (match_operand:AVXMODE48P_DI 5 "register_operand" "1") + (match_operand:SI 6 "const1248_operand" "n")] + UNSPEC_GATHER)) + (clobber (match_scratch:AVXMODE48P_DI 1 "=&x"))] "TARGET_AVX2" - "vgatherq\t{%4, (%2, %3, %c5), %0|%0, (%2, %3, %c5), %4}" + "vgatherq\t{%1, (%3, %4, %p6), %0|%0, (%3, %4, %p6), %1}" [(set_attr "type" "ssemov") (set_attr "prefix" "vex") (set_attr "mode" "")]) @@ -12580,28 +12586,31 @@ ;; Special handling for VEX.256 with float arguments ;; since there're still xmms as operands (define_expand "avx2_gatherdi256" - [(set (match_operand:VI4F_128 0 "register_operand" "") - (unspec:VI4F_128 - [(match_operand:VI4F_128 1 "register_operand" "") - (match_operand: 2 "memory_operand" "") - (match_operand:V4DI 3 "register_operand" "") - (match_operand:VI4F_128 4 "register_operand" "") - (match_operand:SI 5 "const1248_operand " "")] - UNSPEC_GATHER))] + [(parallel [(set (match_operand:VI4F_128 0 "register_operand" "") + (unspec:VI4F_128 + [(match_operand:VI4F_128 1 "register_operand" "") + (match_operand 2 "register_operand" "") + (mem:BLK (scratch)) + (match_operand:V4DI 3 "register_operand" "") + (match_operand:VI4F_128 4 "register_operand" "") + (match_operand:SI 5 "const1248_operand " "")] + UNSPEC_GATHER)) + (clobber (match_scratch:VI4F_128 6 ""))])] "TARGET_AVX2") (define_insn "*avx2_gatherdi256" [(set (match_operand:VI4F_128 0 "register_operand" "=x") (unspec:VI4F_128 - [(match_operand:VI4F_128 1 "register_operand" "0") - (mem: - (match_operand:P 2 "register_operand" "r")) - (match_operand:V4DI 3 "register_operand" "x") - (match_operand:VI4F_128 4 "register_operand" "x") - (match_operand:SI 5 "const1248_operand" "n")] - UNSPEC_GATHER))] + [(match_operand:VI4F_128 2 "register_operand" "0") + (match_operand:P 3 "register_operand" "r") + (mem:BLK (scratch)) + (match_operand:V4DI 4 "register_operand" "x") + (match_operand:VI4F_128 5 "register_operand" "1") + (match_operand:SI 6 "const1248_operand" "n")] + UNSPEC_GATHER)) + (clobber (match_scratch:VI4F_128 1 "=&x"))] "TARGET_AVX2" - "vgatherq\t{%4, (%2, %3, %c5), %0|%0, (%2, %3, %c5), %4}" + "vgatherq\t{%1, (%3, %4, %p6), %0|%0, (%3, %4, %p6), %1}" [(set_attr "type" "ssemov") (set_attr "prefix" "vex") (set_attr "mode" "")]) -- cgit v1.1