aboutsummaryrefslogtreecommitdiff
path: root/gcc/config/aarch64
diff options
context:
space:
mode:
Diffstat (limited to 'gcc/config/aarch64')
-rw-r--r--gcc/config/aarch64/aarch64-sve.md30
-rw-r--r--gcc/config/aarch64/iterators.md6
2 files changed, 36 insertions, 0 deletions
diff --git a/gcc/config/aarch64/aarch64-sve.md b/gcc/config/aarch64/aarch64-sve.md
index 0bb37e7..eac3ac9 100644
--- a/gcc/config/aarch64/aarch64-sve.md
+++ b/gcc/config/aarch64/aarch64-sve.md
@@ -1008,6 +1008,36 @@
"<su>mulh\t%0.<Vetype>, %1/m, %0.<Vetype>, %3.<Vetype>"
)
+;; Unpredicated division.
+(define_expand "<optab><mode>3"
+ [(set (match_operand:SVE_SDI 0 "register_operand")
+ (unspec:SVE_SDI
+ [(match_dup 3)
+ (SVE_INT_BINARY_SD:SVE_SDI
+ (match_operand:SVE_SDI 1 "register_operand")
+ (match_operand:SVE_SDI 2 "register_operand"))]
+ UNSPEC_MERGE_PTRUE))]
+ "TARGET_SVE"
+ {
+ operands[3] = force_reg (<VPRED>mode, CONSTM1_RTX (<VPRED>mode));
+ }
+)
+
+;; Division predicated with a PTRUE.
+(define_insn "*<optab><mode>3"
+ [(set (match_operand:SVE_SDI 0 "register_operand" "=w, w")
+ (unspec:SVE_SDI
+ [(match_operand:<VPRED> 1 "register_operand" "Upl, Upl")
+ (SVE_INT_BINARY_SD:SVE_SDI
+ (match_operand:SVE_SDI 2 "register_operand" "0, w")
+ (match_operand:SVE_SDI 3 "aarch64_sve_mul_operand" "w, 0"))]
+ UNSPEC_MERGE_PTRUE))]
+ "TARGET_SVE"
+ "@
+ <sve_int_op>\t%0.<Vetype>, %1/m, %0.<Vetype>, %3.<Vetype>
+ <sve_int_op>r\t%0.<Vetype>, %1/m, %0.<Vetype>, %2.<Vetype>"
+)
+
;; Unpredicated NEG, NOT and POPCOUNT.
(define_expand "<optab><mode>2"
[(set (match_operand:SVE_I 0 "register_operand")
diff --git a/gcc/config/aarch64/iterators.md b/gcc/config/aarch64/iterators.md
index 4db3a4c..dad07e4 100644
--- a/gcc/config/aarch64/iterators.md
+++ b/gcc/config/aarch64/iterators.md
@@ -1207,6 +1207,8 @@
(define_code_iterator SVE_INT_BINARY_REV [minus])
+(define_code_iterator SVE_INT_BINARY_SD [div udiv])
+
;; SVE integer comparisons.
(define_code_iterator SVE_INT_CMP [lt le eq ne ge gt ltu leu geu gtu])
@@ -1237,6 +1239,8 @@
(neg "neg")
(plus "add")
(minus "sub")
+ (div "div")
+ (udiv "udiv")
(ss_plus "qadd")
(us_plus "qadd")
(ss_minus "qsub")
@@ -1378,6 +1382,8 @@
;; The integer SVE instruction that implements an rtx code.
(define_code_attr sve_int_op [(plus "add")
(minus "sub")
+ (div "sdiv")
+ (udiv "udiv")
(neg "neg")
(smin "smin")
(smax "smax")