[PATCH] i386: Relax extract location operand mode requirements
Uros Bizjak
ubizjak@gmail.com
Wed Feb 15 20:37:06 GMT 2023
There is no requirement on the mode of the location operand, so any
supported integer mode is valid. We can relax extract location
operand mode requirement of other patterns involving zero_extract RTX.
2023-02-15 Uroš Bizjak <ubizjak@gmail.com>
gcc/ChangeLog:
* config/i386/i386.md (*cmpqi_ext<mode>_1): Use
int248_register_operand predicate in zero_extract sub-RTX.
(*cmpqi_ext<mode>_2): Ditto.
(*cmpqi_ext<mode>_3): Ditto.
(*cmpqi_ext<mode>_4): Ditto.
(*extzvqi_mem_rex64): Ditto.
(*extzvqi): Ditto.
(*insvqi_1_mem_rex64): Ditto.
(@insv<mode>_1): Ditto.
(*insvqi_1): Ditto.
(*insvqi_2): Ditto.
(*insvqi_3): Ditto.
(*extendqi<SWI24:mode>_ext_1): Ditto.
(*addqi_ext<mode>_1): Ditto.
(*addqi_ext<mode>_2): Ditto.
(*subqi_ext<mode>_2): Ditto.
(*testqi_ext<mode>_1): Ditto.
(*testqi_ext<mode>_2): Ditto.
(*andqi_ext<mode>_1): Ditto.
(*andqi_ext<mode>_1_cc): Ditto.
(*andqi_ext<mode>_2): Ditto.
(*<any_or:code>qi_ext<mode>_1): Ditto.
(*<any_or:code>qi_ext<mode>_2): Ditto.
(*xorqi_ext<mode>_1_cc): Ditto.
(*negqi_ext<mode>_2): Ditto.
(*ashlqi_ext<mode>_2): Ditto.
(*<any_shiftrt:insn>qi_ext<mode>_2): Ditto.
Bootstrapped and regression tested on x86_64-linux-gnu {,-m32}.
Pushed to master.
Uros.
-------------- next part --------------
diff --git a/gcc/config/i386/i386.md b/gcc/config/i386/i386.md
index e37bc8dca53..198f06e0769 100644
--- a/gcc/config/i386/i386.md
+++ b/gcc/config/i386/i386.md
@@ -1459,7 +1459,7 @@
(match_operand:QI 0 "nonimmediate_operand" "QBc,m")
(subreg:QI
(zero_extract:SWI248
- (match_operand:SWI248 1 "register_operand" "Q,Q")
+ (match_operand 1 "int248_register_operand" "Q,Q")
(const_int 8)
(const_int 8)) 0)))]
"ix86_match_ccmode (insn, CCmode)"
@@ -1473,7 +1473,7 @@
(compare
(subreg:QI
(zero_extract:SWI248
- (match_operand:SWI248 0 "register_operand" "Q")
+ (match_operand 0 "int248_register_operand" "Q")
(const_int 8)
(const_int 8)) 0)
(match_operand:QI 1 "const0_operand")))]
@@ -1498,7 +1498,7 @@
(compare
(subreg:QI
(zero_extract:SWI248
- (match_operand:SWI248 0 "register_operand" "Q,Q")
+ (match_operand 0 "int248_register_operand" "Q,Q")
(const_int 8)
(const_int 8)) 0)
(match_operand:QI 1 "general_operand" "QnBc,m")))]
@@ -1513,12 +1513,12 @@
(compare
(subreg:QI
(zero_extract:SWI248
- (match_operand:SWI248 0 "register_operand" "Q")
+ (match_operand 0 "int248_register_operand" "Q")
(const_int 8)
(const_int 8)) 0)
(subreg:QI
(zero_extract:SWI248
- (match_operand:SWI248 1 "register_operand" "Q")
+ (match_operand 1 "int248_register_operand" "Q")
(const_int 8)
(const_int 8)) 0)))]
"ix86_match_ccmode (insn, CCmode)"
@@ -3192,7 +3192,7 @@
[(set (match_operand:QI 0 "norex_memory_operand" "=Bn")
(subreg:QI
(zero_extract:SWI248
- (match_operand:SWI248 1 "register_operand" "Q")
+ (match_operand 1 "int248_register_operand" "Q")
(const_int 8)
(const_int 8)) 0))]
"TARGET_64BIT && reload_completed"
@@ -3214,7 +3214,7 @@
[(set (match_operand:QI 0 "nonimmediate_operand" "=QBc,?R,m")
(subreg:QI
(zero_extract:SWI248
- (match_operand:SWI248 1 "register_operand" "Q,Q,Q")
+ (match_operand 1 "int248_register_operand" "Q,Q,Q")
(const_int 8)
(const_int 8)) 0))]
""
@@ -3242,7 +3242,7 @@
(define_peephole2
[(set (match_operand:QI 0 "register_operand")
(subreg:QI
- (zero_extract:SWI248 (match_operand:SWI248 1 "register_operand")
+ (zero_extract:SWI248 (match_operand 1 "int248_register_operand")
(const_int 8)
(const_int 8)) 0))
(set (match_operand:QI 2 "norex_memory_operand") (match_dup 0))]
@@ -3289,7 +3289,7 @@
(define_insn "*insvqi_1_mem_rex64"
[(set (zero_extract:SWI248
- (match_operand:SWI248 0 "register_operand" "+Q")
+ (match_operand 0 "int248_register_operand" "+Q")
(const_int 8)
(const_int 8))
(subreg:SWI248
@@ -3301,7 +3301,7 @@
(define_insn "@insv<mode>_1"
[(set (zero_extract:SWI248
- (match_operand:SWI248 0 "register_operand" "+Q,Q")
+ (match_operand 0 "int248_register_operand" "+Q,Q")
(const_int 8)
(const_int 8))
(match_operand:SWI248 1 "general_operand" "QnBc,m"))]
@@ -3317,7 +3317,7 @@
(define_insn "*insvqi_1"
[(set (zero_extract:SWI248
- (match_operand:SWI248 0 "register_operand" "+Q,Q")
+ (match_operand 0 "int248_register_operand" "+Q,Q")
(const_int 8)
(const_int 8))
(subreg:SWI248
@@ -3331,7 +3331,7 @@
(define_peephole2
[(set (match_operand:QI 0 "register_operand")
(match_operand:QI 1 "norex_memory_operand"))
- (set (zero_extract:SWI248 (match_operand:SWI248 2 "register_operand")
+ (set (zero_extract:SWI248 (match_operand 2 "int248_register_operand")
(const_int 8)
(const_int 8))
(subreg:SWI248 (match_dup 0) 0))]
@@ -3347,7 +3347,7 @@
[(parallel [(set (match_operand:SWI48 0 "general_reg_operand")
(const_int 0))
(clobber (reg:CC FLAGS_REG))])
- (set (zero_extract:SWI248 (match_operand:SWI248 1 "general_reg_operand")
+ (set (zero_extract:SWI248 (match_operand 1 "int248_register_operand")
(const_int 8)
(const_int 8))
(const_int 0))]
@@ -3360,7 +3360,7 @@
(define_peephole2
[(set (match_operand:SWI48 0 "general_reg_operand")
(match_operand:SWI48 1 "const_int_operand"))
- (set (zero_extract:SWI248 (match_operand:SWI248 2 "general_reg_operand")
+ (set (zero_extract:SWI248 (match_operand 2 "int248_register_operand")
(const_int 8)
(const_int 8))
(match_operand:SWI248 3 "const_int_operand"))]
@@ -3378,11 +3378,11 @@
(define_insn "*insvqi_2"
[(set (zero_extract:SWI248
- (match_operand:SWI248 0 "register_operand" "+Q")
+ (match_operand 0 "int248_register_operand" "+Q")
(const_int 8)
(const_int 8))
(any_extract:SWI248
- (match_operand:SWI248 1 "register_operand" "Q")
+ (match_operand 1 "int248_register_operand" "Q")
(const_int 8)
(const_int 8)))]
""
@@ -3392,7 +3392,7 @@
(define_insn "*insvqi_3"
[(set (zero_extract:SWI248
- (match_operand:SWI248 0 "register_operand" "+Q")
+ (match_operand 0 "int248_register_operand" "+Q")
(const_int 8)
(const_int 8))
(any_shiftrt:SWI248
@@ -4783,7 +4783,7 @@
(sign_extend:SWI24
(subreg:QI
(zero_extract:SWI248
- (match_operand:SWI248 1 "register_operand" "Q")
+ (match_operand 1 "int248_register_operand" "Q")
(const_int 8)
(const_int 8)) 0)))]
""
@@ -6657,14 +6657,14 @@
(define_insn "*addqi_ext<mode>_1"
[(set (zero_extract:SWI248
- (match_operand:SWI248 0 "register_operand" "+Q,Q")
+ (match_operand 0 "int248_register_operand" "+Q,Q")
(const_int 8)
(const_int 8))
(subreg:SWI248
(plus:QI
(subreg:QI
(zero_extract:SWI248
- (match_operand:SWI248 1 "register_operand" "0,0")
+ (match_operand 1 "int248_register_operand" "0,0")
(const_int 8)
(const_int 8)) 0)
(match_operand:QI 2 "general_operand" "QnBc,m")) 0))
@@ -6696,19 +6696,19 @@
(define_insn "*addqi_ext<mode>_2"
[(set (zero_extract:SWI248
- (match_operand:SWI248 0 "register_operand" "+Q")
+ (match_operand 0 "int248_register_operand" "+Q")
(const_int 8)
(const_int 8))
(subreg:SWI248
(plus:QI
(subreg:QI
(zero_extract:SWI248
- (match_operand:SWI248 1 "register_operand" "%0")
+ (match_operand 1 "int248_register_operand" "%0")
(const_int 8)
(const_int 8)) 0)
(subreg:QI
(zero_extract:SWI248
- (match_operand:SWI248 2 "register_operand" "Q")
+ (match_operand 2 "int248_register_operand" "Q")
(const_int 8)
(const_int 8)) 0)) 0))
(clobber (reg:CC FLAGS_REG))]
@@ -7267,19 +7267,19 @@
(define_insn "*subqi_ext<mode>_2"
[(set (zero_extract:SWI248
- (match_operand:SWI248 0 "register_operand" "+Q")
+ (match_operand 0 "int248_register_operand" "+Q")
(const_int 8)
(const_int 8))
(subreg:SWI248
(minus:QI
(subreg:QI
(zero_extract:SWI248
- (match_operand:SWI248 1 "register_operand" "0")
+ (match_operand 1 "int248_register_operand" "0")
(const_int 8)
(const_int 8)) 0)
(subreg:QI
(zero_extract:SWI248
- (match_operand:SWI248 2 "register_operand" "Q")
+ (match_operand 2 "int248_register_operand" "Q")
(const_int 8)
(const_int 8)) 0)) 0))
(clobber (reg:CC FLAGS_REG))]
@@ -9866,7 +9866,7 @@
(and:QI
(subreg:QI
(zero_extract:SWI248
- (match_operand:SWI248 0 "register_operand" "Q,Q")
+ (match_operand 0 "int248_register_operand" "Q,Q")
(const_int 8)
(const_int 8)) 0)
(match_operand:QI 1 "general_operand" "QnBc,m"))
@@ -9883,12 +9883,12 @@
(and:QI
(subreg:QI
(zero_extract:SWI248
- (match_operand:SWI248 0 "register_operand" "Q")
+ (match_operand 0 "int248_register_operand" "Q")
(const_int 8)
(const_int 8)) 0)
(subreg:QI
(zero_extract:SWI248
- (match_operand:SWI248 1 "register_operand" "Q")
+ (match_operand 1 "int248_register_operand" "Q")
(const_int 8)
(const_int 8)) 0))
(const_int 0)))]
@@ -10086,13 +10086,13 @@
(match_op_dup 1
[(and:QI
(subreg:QI
- (zero_extract:SI (match_dup 2)
+ (zero_extract:HI (match_dup 2)
(const_int 8)
(const_int 8)) 0)
(match_dup 3))
(const_int 0)]))]
{
- operands[2] = gen_lowpart (SImode, operands[2]);
+ operands[2] = gen_lowpart (HImode, operands[2]);
operands[3] = gen_int_mode (INTVAL (operands[3]) >> 8, QImode);
})
@@ -10417,21 +10417,21 @@
"(!TARGET_PARTIAL_REG_STALL || optimize_function_for_size_p (cfun))
&& reload_completed"
[(parallel
- [(set (zero_extract:SI (match_dup 0)
+ [(set (zero_extract:HI (match_dup 0)
(const_int 8)
(const_int 8))
- (subreg:SI
+ (subreg:HI
(xor:QI
(subreg:QI
- (zero_extract:SI (match_dup 0)
+ (zero_extract:HI (match_dup 0)
(const_int 8)
(const_int 8)) 0)
(subreg:QI
- (zero_extract:SI (match_dup 0)
+ (zero_extract:HI (match_dup 0)
(const_int 8)
(const_int 8)) 0)) 0))
(clobber (reg:CC FLAGS_REG))])]
- "operands[0] = gen_lowpart (SImode, operands[0]);")
+ "operands[0] = gen_lowpart (HImode, operands[0]);")
(define_insn "*anddi_2"
[(set (reg FLAGS_REG)
@@ -10544,14 +10544,14 @@
(define_insn "*andqi_ext<mode>_1"
[(set (zero_extract:SWI248
- (match_operand:SWI248 0 "register_operand" "+Q,Q")
+ (match_operand 0 "int248_register_operand" "+Q,Q")
(const_int 8)
(const_int 8))
(subreg:SWI248
(and:QI
(subreg:QI
(zero_extract:SWI248
- (match_operand:SWI248 1 "register_operand" "0,0")
+ (match_operand 1 "int248_register_operand" "0,0")
(const_int 8)
(const_int 8)) 0)
(match_operand:QI 2 "general_operand" "QnBc,m")) 0))
@@ -10571,13 +10571,13 @@
(and:QI
(subreg:QI
(zero_extract:SWI248
- (match_operand:SWI248 1 "register_operand" "0,0")
+ (match_operand 1 "int248_register_operand" "0,0")
(const_int 8)
(const_int 8)) 0)
(match_operand:QI 2 "general_operand" "QnBc,m"))
(const_int 0)))
(set (zero_extract:SWI248
- (match_operand:SWI248 0 "register_operand" "+Q,Q")
+ (match_operand 0 "int248_register_operand" "+Q,Q")
(const_int 8)
(const_int 8))
(subreg:SWI248
@@ -10598,19 +10598,19 @@
(define_insn "*andqi_ext<mode>_2"
[(set (zero_extract:SWI248
- (match_operand:SWI248 0 "register_operand" "+Q")
+ (match_operand 0 "int248_register_operand" "+Q")
(const_int 8)
(const_int 8))
(subreg:SWI248
(and:QI
(subreg:QI
(zero_extract:SWI248
- (match_operand:SWI248 1 "register_operand" "%0")
+ (match_operand 1 "int248_register_operand" "%0")
(const_int 8)
(const_int 8)) 0)
(subreg:QI
(zero_extract:SWI248
- (match_operand:SWI248 2 "register_operand" "Q")
+ (match_operand 2 "int248_register_operand" "Q")
(const_int 8)
(const_int 8)) 0)) 0))
(clobber (reg:CC FLAGS_REG))]
@@ -10635,20 +10635,20 @@
&& (!TARGET_PARTIAL_REG_STALL || optimize_function_for_size_p (cfun))
&& !(~INTVAL (operands[2]) & ~(255 << 8))"
[(parallel
- [(set (zero_extract:SI (match_dup 0)
+ [(set (zero_extract:HI (match_dup 0)
(const_int 8)
(const_int 8))
- (subreg:SI
+ (subreg:HI
(and:QI
(subreg:QI
- (zero_extract:SI (match_dup 1)
+ (zero_extract:HI (match_dup 1)
(const_int 8)
(const_int 8)) 0)
(match_dup 2)) 0))
(clobber (reg:CC FLAGS_REG))])]
{
- operands[0] = gen_lowpart (SImode, operands[0]);
- operands[1] = gen_lowpart (SImode, operands[1]);
+ operands[0] = gen_lowpart (HImode, operands[0]);
+ operands[1] = gen_lowpart (HImode, operands[1]);
operands[2] = gen_int_mode (INTVAL (operands[2]) >> 8, QImode);
})
@@ -11271,14 +11271,14 @@
(define_insn "*<code>qi_ext<mode>_1"
[(set (zero_extract:SWI248
- (match_operand:SWI248 0 "register_operand" "+Q,Q")
+ (match_operand 0 "int248_register_operand" "+Q,Q")
(const_int 8)
(const_int 8))
(subreg:SWI248
(any_or:QI
(subreg:QI
(zero_extract:SWI248
- (match_operand:SWI248 1 "register_operand" "0,0")
+ (match_operand 1 "int248_register_operand" "0,0")
(const_int 8)
(const_int 8)) 0)
(match_operand:QI 2 "general_operand" "QnBc,m")) 0))
@@ -11293,19 +11293,19 @@
(define_insn "*<code>qi_ext<mode>_2"
[(set (zero_extract:SWI248
- (match_operand:SWI248 0 "register_operand" "+Q")
+ (match_operand 0 "int248_register_operand" "+Q")
(const_int 8)
(const_int 8))
(subreg:SWI248
(any_or:QI
(subreg:QI
(zero_extract:SWI248
- (match_operand:SWI248 1 "register_operand" "%0")
+ (match_operand 1 "int248_register_operand" "%0")
(const_int 8)
(const_int 8)) 0)
(subreg:QI
(zero_extract:SWI248
- (match_operand:SWI248 2 "register_operand" "Q")
+ (match_operand 2 "int248_register_operand" "Q")
(const_int 8)
(const_int 8)) 0)) 0))
(clobber (reg:CC FLAGS_REG))]
@@ -11331,13 +11331,13 @@
&& (!TARGET_PARTIAL_REG_STALL || optimize_function_for_size_p (cfun))
&& !(INTVAL (operands[2]) & ~(255 << 8))"
[(parallel
- [(set (zero_extract:SI (match_dup 0)
+ [(set (zero_extract:HI (match_dup 0)
(const_int 8)
(const_int 8))
- (subreg:SI
+ (subreg:HI
(any_or:QI
(subreg:QI
- (zero_extract:SI (match_dup 1)
+ (zero_extract:HI (match_dup 1)
(const_int 8)
(const_int 8)) 0)
(match_dup 2)) 0))
@@ -11352,8 +11352,8 @@
emit_note (NOTE_INSN_DELETED);
DONE;
}
- operands[0] = gen_lowpart (SImode, operands[0]);
- operands[1] = gen_lowpart (SImode, operands[1]);
+ operands[0] = gen_lowpart (HImode, operands[0]);
+ operands[1] = gen_lowpart (HImode, operands[1]);
operands[2] = gen_int_mode (INTVAL (operands[2]) >> 8, QImode);
})
@@ -11406,13 +11406,13 @@
(xor:QI
(subreg:QI
(zero_extract:SWI248
- (match_operand:SWI248 1 "register_operand" "0,0")
+ (match_operand 1 "int248_register_operand" "0,0")
(const_int 8)
(const_int 8)) 0)
(match_operand:QI 2 "general_operand" "QnBc,m"))
(const_int 0)))
(set (zero_extract:SWI248
- (match_operand:SWI248 0 "register_operand" "+Q,Q")
+ (match_operand 0 "int248_register_operand" "+Q,Q")
(const_int 8)
(const_int 8))
(subreg:SWI248
@@ -11809,14 +11809,14 @@
(define_insn "*negqi_ext<mode>_2"
[(set (zero_extract:SWI248
- (match_operand:SWI248 0 "register_operand" "+Q")
+ (match_operand 0 "int248_register_operand" "+Q")
(const_int 8)
(const_int 8))
(subreg:SWI248
(neg:QI
(subreg:QI
(zero_extract:SWI248
- (match_operand:SWI248 1 "register_operand" "0")
+ (match_operand 1 "int248_register_operand" "0")
(const_int 8)
(const_int 8)) 0)) 0))
(clobber (reg:CC FLAGS_REG))]
@@ -13370,14 +13370,14 @@
(define_insn "*ashlqi_ext<mode>_2"
[(set (zero_extract:SWI248
- (match_operand:SWI248 0 "register_operand" "+Q")
+ (match_operand 0 "int248_register_operand" "+Q")
(const_int 8)
(const_int 8))
(subreg:SWI248
(ashift:QI
(subreg:QI
(zero_extract:SWI248
- (match_operand:SWI248 1 "register_operand" "0")
+ (match_operand 1 "int248_register_operand" "0")
(const_int 8)
(const_int 8)) 0)
(match_operand:QI 2 "nonmemory_operand" "cI")) 0))
@@ -14273,14 +14273,14 @@
(define_insn "*<insn>qi_ext<mode>_2"
[(set (zero_extract:SWI248
- (match_operand:SWI248 0 "register_operand" "+Q")
+ (match_operand 0 "int248_register_operand" "+Q")
(const_int 8)
(const_int 8))
(subreg:SWI248
(any_shiftrt:QI
(subreg:QI
(zero_extract:SWI248
- (match_operand:SWI248 1 "register_operand" "0")
+ (match_operand 1 "int248_register_operand" "0")
(const_int 8)
(const_int 8)) 0)
(match_operand:QI 2 "nonmemory_operand" "cI")) 0))
@@ -23135,7 +23135,7 @@
(match_operator 1 "compare_operator"
[(and:QI
(subreg:QI
- (zero_extract:SWI248 (match_operand:SWI248 2 "QIreg_operand")
+ (zero_extract:SWI248 (match_operand 2 "int248_register_operand")
(const_int 8)
(const_int 8)) 0)
(match_operand 3 "const_int_operand"))
More information about the Gcc-patches
mailing list