aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorUros Bizjak <ubizjak@gmail.com>2021-08-12 21:18:46 +0200
committerUros Bizjak <ubizjak@gmail.com>2021-08-12 21:19:46 +0200
commit8c8df06e46493f6cb55333db72fa1802279b48b4 (patch)
tree873faeb5c94024cef50dcd6443d56b3d40ef8017 /gcc
parenta6da2cddcf0e959de6666d4d74411af23507f9f9 (diff)
downloadgcc-8c8df06e46493f6cb55333db72fa1802279b48b4.zip
gcc-8c8df06e46493f6cb55333db72fa1802279b48b4.tar.gz
gcc-8c8df06e46493f6cb55333db72fa1802279b48b4.tar.bz2
[i386] Introduce scalar version of avx512f_vmscalef.
2021-08-12 Uroš Bizjak <ubizjak@gmail.com> gcc/ PR target/98309 * config/i386/i386.md (avx512f_scalef<mode>2): New insn pattern. (ldexp<mode>3): Use avx512f_scalef<mode>2. (UNSPEC_SCALEF): Move from ... * config/i386/sse.md (UNSPEC_SCALEF): ... here.
Diffstat (limited to 'gcc')
-rw-r--r--gcc/config/i386/i386.md27
-rw-r--r--gcc/config/i386/sse.md1
2 files changed, 19 insertions, 9 deletions
diff --git a/gcc/config/i386/i386.md b/gcc/config/i386/i386.md
index 56b09c5..4a8e8fe 100644
--- a/gcc/config/i386/i386.md
+++ b/gcc/config/i386/i386.md
@@ -125,6 +125,9 @@
UNSPEC_RSQRT
UNSPEC_PSADBW
+ ;; For AVX512F support
+ UNSPEC_SCALEF
+
;; Generic math support
UNSPEC_COPYSIGN
UNSPEC_XORSIGN
@@ -17894,6 +17897,17 @@
DONE;
})
+(define_insn "avx512f_scalef<mode>2"
+ [(set (match_operand:MODEF 0 "register_operand" "=v")
+ (unspec:MODEF
+ [(match_operand:MODEF 1 "register_operand" "v")
+ (match_operand:MODEF 2 "nonimmediate_operand" "vm")]
+ UNSPEC_SCALEF))]
+ "TARGET_AVX512F"
+ "vscalef<ssemodesuffix>\t{%2, %1, %0|%0, %1, %2}"
+ [(set_attr "prefix" "evex")
+ (set_attr "mode" "<MODE>")])
+
(define_expand "ldexpxf3"
[(match_operand:XF 0 "register_operand")
(match_operand:XF 1 "register_operand")
@@ -17924,15 +17938,12 @@
if (TARGET_AVX512F && TARGET_SSE_MATH)
{
rtx op2 = gen_reg_rtx (<MODE>mode);
- emit_insn (gen_floatsi<mode>2 (op2, operands[2]));
- operands[0] = lowpart_subreg (<ssevecmodef>mode, operands[0], <MODE>mode);
- if (MEM_P (operands[1]))
+
+ if (!nonimmediate_operand (operands[1], <MODE>mode))
operands[1] = force_reg (<MODE>mode, operands[1]);
- operands[1] = lowpart_subreg (<ssevecmodef>mode, operands[1], <MODE>mode);
- op2 = lowpart_subreg (<ssevecmodef>mode, op2, <MODE>mode);
- emit_insn (gen_avx512f_vmscalef<ssevecmodelower> (operands[0],
- operands[1],
- op2));
+
+ emit_insn (gen_floatsi<mode>2 (op2, operands[2]));
+ emit_insn (gen_avx512f_scalef<mode>2 (operands[0], operands[1], op2));
}
else
{
diff --git a/gcc/config/i386/sse.md b/gcc/config/i386/sse.md
index 3a7bbae..60e69a4 100644
--- a/gcc/config/i386/sse.md
+++ b/gcc/config/i386/sse.md
@@ -92,7 +92,6 @@
UNSPEC_RCP14
UNSPEC_RSQRT14
UNSPEC_FIXUPIMM
- UNSPEC_SCALEF
UNSPEC_VTERNLOG
UNSPEC_GETEXP
UNSPEC_GETMANT