+2020-01-23 Jakub Jelinek <jakub@redhat.com>
+
+ PR target/93376
+ * config/i386/i386-modes.def (POImode): New mode.
+ (MAX_BITSIZE_MODE_ANY_INT): Change from 128 to 160.
+ * config/i386/i386.md (DPWI): New mode attribute.
+ (addv<mode>4, subv<mode>4): Use <DPWI> instead of <DWI>.
+ (QWI): Rename to...
+ (QPWI): ... this. Use POI instead of OI for TImode.
+ (*addv<dwi>4_doubleword, *addv<dwi>4_doubleword_1,
+ *subv<dwi>4_doubleword, *subv<dwi>4_doubleword_1): Use <QPWI>
+ instead of <QWI>.
+
2020-01-23 Richard Sandiford <richard.sandiford@arm.com>
PR target/93341
PARTIAL_INT_MODE (HI, 16, P2QI);
PARTIAL_INT_MODE (SI, 32, P2HI);
+/* Mode used for signed overflow checking of TImode. As
+ MAX_BITSIZE_MODE_ANY_INT is only 160, wide-int.h reserves only that
+ rounded up to multiple of HOST_BITS_PER_WIDE_INT bits in wide_int etc.,
+ so OImode is too large. For the overflow checking we actually need
+ just 1 or 2 bits beyond TImode precision. Use 160 bits to have
+ a multiple of 32. */
+PARTIAL_INT_MODE (OI, 160, POI);
+
/* Keep the OI and XI modes from confusing the compiler into thinking
that these modes could actually be used for computation. They are
- only holders for vectors during data movement. */
-#define MAX_BITSIZE_MODE_ANY_INT (128)
+ only holders for vectors during data movement. Include POImode precision
+ though. */
+#define MAX_BITSIZE_MODE_ANY_INT (160)
/* The symbol Pmode stands for one of the above machine modes (usually SImode).
The tm.h file specifies which one. It is not a distinct mode. */
[(set_attr "type" "alu")
(set_attr "mode" "QI")])
+;; Like DWI, but use POImode instead of OImode.
+(define_mode_attr DPWI [(QI "HI") (HI "SI") (SI "DI") (DI "TI") (TI "POI")])
+
;; Add with jump on overflow.
(define_expand "addv<mode>4"
[(parallel [(set (reg:CCO FLAGS_REG)
(eq:CCO
- (plus:<DWI>
- (sign_extend:<DWI>
+ (plus:<DPWI>
+ (sign_extend:<DPWI>
(match_operand:SWIDWI 1 "nonimmediate_operand"))
(match_dup 4))
- (sign_extend:<DWI>
+ (sign_extend:<DPWI>
(plus:SWIDWI (match_dup 1)
(match_operand:SWIDWI 2
"<general_hilo_operand>")))))
if (CONST_SCALAR_INT_P (operands[2]))
operands[4] = operands[2];
else
- operands[4] = gen_rtx_SIGN_EXTEND (<DWI>mode, operands[2]);
+ operands[4] = gen_rtx_SIGN_EXTEND (<DPWI>mode, operands[2]);
})
(define_insn "*addv<mode>4"
(const_string "<MODE_SIZE>")))])
;; Quad word integer modes as mode attribute.
-(define_mode_attr QWI [(SI "TI") (DI "OI")])
+(define_mode_attr QPWI [(SI "TI") (DI "POI")])
(define_insn_and_split "*addv<dwi>4_doubleword"
[(set (reg:CCO FLAGS_REG)
(eq:CCO
- (plus:<QWI>
- (sign_extend:<QWI>
+ (plus:<QPWI>
+ (sign_extend:<QPWI>
(match_operand:<DWI> 1 "nonimmediate_operand" "%0,0"))
- (sign_extend:<QWI>
+ (sign_extend:<QPWI>
(match_operand:<DWI> 2 "x86_64_hilo_general_operand" "r<di>,o")))
- (sign_extend:<QWI>
+ (sign_extend:<QPWI>
(plus:<DWI> (match_dup 1) (match_dup 2)))))
(set (match_operand:<DWI> 0 "nonimmediate_operand" "=ro,r")
(plus:<DWI> (match_dup 1) (match_dup 2)))]
(define_insn_and_split "*addv<dwi>4_doubleword_1"
[(set (reg:CCO FLAGS_REG)
(eq:CCO
- (plus:<QWI>
- (sign_extend:<QWI>
+ (plus:<QPWI>
+ (sign_extend:<QPWI>
(match_operand:<DWI> 1 "nonimmediate_operand" "%0"))
- (match_operand:<QWI> 3 "const_scalar_int_operand" ""))
- (sign_extend:<QWI>
+ (match_operand:<QPWI> 3 "const_scalar_int_operand" ""))
+ (sign_extend:<QPWI>
(plus:<DWI>
(match_dup 1)
(match_operand:<DWI> 2 "x86_64_hilo_general_operand" "<di>")))))
(define_expand "subv<mode>4"
[(parallel [(set (reg:CCO FLAGS_REG)
(eq:CCO
- (minus:<DWI>
- (sign_extend:<DWI>
+ (minus:<DPWI>
+ (sign_extend:<DPWI>
(match_operand:SWIDWI 1 "nonimmediate_operand"))
(match_dup 4))
- (sign_extend:<DWI>
+ (sign_extend:<DPWI>
(minus:SWIDWI (match_dup 1)
(match_operand:SWIDWI 2
"<general_hilo_operand>")))))
if (CONST_SCALAR_INT_P (operands[2]))
operands[4] = operands[2];
else
- operands[4] = gen_rtx_SIGN_EXTEND (<DWI>mode, operands[2]);
+ operands[4] = gen_rtx_SIGN_EXTEND (<DPWI>mode, operands[2]);
})
(define_insn "*subv<mode>4"
(define_insn_and_split "*subv<dwi>4_doubleword"
[(set (reg:CCO FLAGS_REG)
(eq:CCO
- (minus:<QWI>
- (sign_extend:<QWI>
+ (minus:<QPWI>
+ (sign_extend:<QPWI>
(match_operand:<DWI> 1 "nonimmediate_operand" "0,0"))
- (sign_extend:<QWI>
+ (sign_extend:<QPWI>
(match_operand:<DWI> 2 "x86_64_hilo_general_operand" "r<di>,o")))
- (sign_extend:<QWI>
+ (sign_extend:<QPWI>
(minus:<DWI> (match_dup 1) (match_dup 2)))))
(set (match_operand:<DWI> 0 "nonimmediate_operand" "=ro,r")
(minus:<DWI> (match_dup 1) (match_dup 2)))]
(define_insn_and_split "*subv<dwi>4_doubleword_1"
[(set (reg:CCO FLAGS_REG)
(eq:CCO
- (minus:<QWI>
- (sign_extend:<QWI>
+ (minus:<QPWI>
+ (sign_extend:<QPWI>
(match_operand:<DWI> 1 "nonimmediate_operand" "0"))
- (match_operand:<QWI> 3 "const_scalar_int_operand" ""))
- (sign_extend:<QWI>
+ (match_operand:<QPWI> 3 "const_scalar_int_operand" ""))
+ (sign_extend:<QPWI>
(minus:<DWI>
(match_dup 1)
(match_operand:<DWI> 2 "x86_64_hilo_general_operand" "<di>")))))