Add new shrpsi instruction variands to gcc/config/pa/pa.md.
2020-09-12 Roger Sayle <roger@nextmovesoftware.com> John David Anglin <danglin@gcc.gnu.org> gcc/ChangeLog * config/pa/pa.md (shrpsi4_1, shrpsi4_2): New define_insns split out from previous shrpsi4 providing two commutitive variants using plus_xor_ior_operator as a predicate. (shrpdi4_1, shrpdi4_2, shrpdi_3, shrpdi_4): Likewise DImode versions where _1 and _2 take register shifts, and _3 and _4 for integers. (rotlsi3_internal): Name this anonymous instruction. (rotrdi3): New DImode insn copied from rotrsi3. (rotldi3): New DImode expander copied from rotlsi3. (rotldi4_internal): New DImode insn copied from rotsi3_internal.
This commit is contained in:
parent
f2d9f95e9c
commit
49482217e0
1 changed files with 119 additions and 21 deletions
|
@ -6627,32 +6627,82 @@
|
|||
(set_attr "length" "4")])
|
||||
|
||||
; Shift right pair word 0 to 31 bits.
|
||||
(define_insn "shrpsi4"
|
||||
[(set (match_operand:SI 0 "register_operand" "=r,r")
|
||||
(ior:SI (ashift:SI (match_operand:SI 1 "register_operand" "r,r")
|
||||
(minus:SI (const_int 32)
|
||||
(match_operand:SI 3 "shift5_operand" "q,n")))
|
||||
(lshiftrt:SI (match_operand:SI 2 "register_operand" "r,r")
|
||||
(match_dup 3))))]
|
||||
(define_insn "*shrpsi4_1"
|
||||
[(set (match_operand:SI 0 "register_operand" "=r")
|
||||
(match_operator:SI 4 "plus_xor_ior_operator"
|
||||
[(ashift:SI (match_operand:SI 1 "register_operand" "r")
|
||||
(minus:SI (const_int 32)
|
||||
(match_operand:SI 3 "register_operand" "q")))
|
||||
(lshiftrt:SI (match_operand:SI 2 "register_operand" "r")
|
||||
(match_dup 3))]))]
|
||||
""
|
||||
"@
|
||||
{vshd %1,%2,%0|shrpw %1,%2,%%sar,%0}
|
||||
{shd|shrpw} %1,%2,%3,%0"
|
||||
"{vshd %1,%2,%0|shrpw %1,%2,%%sar,%0}"
|
||||
[(set_attr "type" "shift")
|
||||
(set_attr "length" "4")])
|
||||
|
||||
(define_insn "*shrpsi4_2"
|
||||
[(set (match_operand:SI 0 "register_operand" "=r")
|
||||
(match_operator:SI 4 "plus_xor_ior_operator"
|
||||
[(lshiftrt:SI (match_operand:SI 2 "register_operand" "r")
|
||||
(match_operand:SI 3 "register_operand" "q"))
|
||||
(ashift:SI (match_operand:SI 1 "register_operand" "r")
|
||||
(minus:SI (const_int 32)
|
||||
(match_dup 3)))]))]
|
||||
""
|
||||
"{vshd %1,%2,%0|shrpw %1,%2,%%sar,%0}"
|
||||
[(set_attr "type" "shift")
|
||||
(set_attr "length" "4")])
|
||||
|
||||
; Shift right pair doubleword 0 to 63 bits.
|
||||
(define_insn "shrpdi4"
|
||||
[(set (match_operand:DI 0 "register_operand" "=r,r")
|
||||
(ior:DI (ashift:DI (match_operand:SI 1 "register_operand" "r,r")
|
||||
(minus:DI (const_int 64)
|
||||
(match_operand:DI 3 "shift6_operand" "q,n")))
|
||||
(lshiftrt:DI (match_operand:DI 2 "register_operand" "r,r")
|
||||
(match_dup 3))))]
|
||||
(define_insn "*shrpdi4_1"
|
||||
[(set (match_operand:DI 0 "register_operand" "=r")
|
||||
(match_operator:DI 4 "plus_xor_ior_operator"
|
||||
[(ashift:DI (match_operand:DI 1 "register_operand" "r")
|
||||
(minus:DI (const_int 64)
|
||||
(match_operand:DI 3 "register_operand" "q")))
|
||||
(lshiftrt:DI (match_operand:DI 2 "register_operand" "r")
|
||||
(match_dup 3))]))]
|
||||
"TARGET_64BIT"
|
||||
"@
|
||||
shrpd %1,%2,%%sar,%0
|
||||
shrpd %1,%2,%3,%0"
|
||||
"shrpd %1,%2,%%sar,%0"
|
||||
[(set_attr "type" "shift")
|
||||
(set_attr "length" "4")])
|
||||
|
||||
(define_insn "*shrpdi4_2"
|
||||
[(set (match_operand:DI 0 "register_operand" "=r")
|
||||
(match_operator:DI 4 "plus_xor_ior_operator"
|
||||
[(lshiftrt:DI (match_operand:DI 2 "register_operand" "r")
|
||||
(match_operand:DI 3 "shift6_operand" "q"))
|
||||
(ashift:DI (match_operand:SI 1 "register_operand" "r")
|
||||
(minus:DI (const_int 64)
|
||||
(match_dup 3)))]))]
|
||||
"TARGET_64BIT"
|
||||
"shrpd %1,%2,%%sar,%0"
|
||||
[(set_attr "type" "shift")
|
||||
(set_attr "length" "4")])
|
||||
|
||||
(define_insn "*shrpdi4_3"
|
||||
[(set (match_operand:DI 0 "register_operand" "=r")
|
||||
(match_operator:DI 5 "plus_xor_ior_operator"
|
||||
[(ashift:DI (match_operand:DI 1 "register_operand" "r")
|
||||
(match_operand:DI 3 "const_int_operand" "n"))
|
||||
(lshiftrt:DI (match_operand:DI 2 "register_operand" "r")
|
||||
(match_operand:DI 4 "const_int_operand" "n"))]))]
|
||||
"TARGET_64BIT
|
||||
&& INTVAL (operands[3]) + INTVAL (operands[4]) == 64"
|
||||
"shrpd %1,%2,%4,%0"
|
||||
[(set_attr "type" "shift")
|
||||
(set_attr "length" "4")])
|
||||
|
||||
(define_insn "*shrpdi4_4"
|
||||
[(set (match_operand:DI 0 "register_operand" "=r")
|
||||
(match_operator:DI 5 "plus_xor_ior_operator"
|
||||
[(lshiftrt:DI (match_operand:DI 2 "register_operand" "r")
|
||||
(match_operand:DI 4 "const_int_operand" "n"))
|
||||
(ashift:DI (match_operand:DI 1 "register_operand" "r")
|
||||
(match_operand:DI 3 "const_int_operand" "n"))]))]
|
||||
"TARGET_64BIT
|
||||
&& INTVAL (operands[3]) + INTVAL (operands[4]) == 64"
|
||||
"shrpd %1,%2,%4,%0"
|
||||
[(set_attr "type" "shift")
|
||||
(set_attr "length" "4")])
|
||||
|
||||
|
@ -6691,7 +6741,7 @@
|
|||
/* Else expand normally. */
|
||||
}")
|
||||
|
||||
(define_insn ""
|
||||
(define_insn "*rotlsi3_internal"
|
||||
[(set (match_operand:SI 0 "register_operand" "=r")
|
||||
(rotate:SI (match_operand:SI 1 "register_operand" "r")
|
||||
(match_operand:SI 2 "const_int_operand" "n")))]
|
||||
|
@ -6704,6 +6754,54 @@
|
|||
[(set_attr "type" "shift")
|
||||
(set_attr "length" "4")])
|
||||
|
||||
(define_insn "rotrdi3"
|
||||
[(set (match_operand:DI 0 "register_operand" "=r,r")
|
||||
(rotatert:DI (match_operand:DI 1 "register_operand" "r,r")
|
||||
(match_operand:DI 2 "shift6_operand" "q,n")))]
|
||||
"TARGET_64BIT"
|
||||
"*
|
||||
{
|
||||
if (GET_CODE (operands[2]) == CONST_INT)
|
||||
{
|
||||
operands[2] = GEN_INT (INTVAL (operands[2]) & 63);
|
||||
return \"shrpd %1,%1,%2,%0\";
|
||||
}
|
||||
else
|
||||
return \"shrpd %1,%1,%%sar,%0\";
|
||||
}"
|
||||
[(set_attr "type" "shift")
|
||||
(set_attr "length" "4")])
|
||||
|
||||
(define_expand "rotldi3"
|
||||
[(set (match_operand:DI 0 "register_operand" "")
|
||||
(rotate:DI (match_operand:DI 1 "register_operand" "")
|
||||
(match_operand:DI 2 "arith32_operand" "")))]
|
||||
"TARGET_64BIT"
|
||||
"
|
||||
{
|
||||
if (GET_CODE (operands[2]) != CONST_INT)
|
||||
{
|
||||
rtx temp = gen_reg_rtx (DImode);
|
||||
emit_insn (gen_subdi3 (temp, GEN_INT (64), operands[2]));
|
||||
emit_insn (gen_rotrdi3 (operands[0], operands[1], temp));
|
||||
DONE;
|
||||
}
|
||||
/* Else expand normally. */
|
||||
}")
|
||||
|
||||
(define_insn "*rotldi3_internal"
|
||||
[(set (match_operand:DI 0 "register_operand" "=r")
|
||||
(rotate:DI (match_operand:DI 1 "register_operand" "r")
|
||||
(match_operand:DI 2 "const_int_operand" "n")))]
|
||||
"TARGET_64BIT"
|
||||
"*
|
||||
{
|
||||
operands[2] = GEN_INT ((64 - INTVAL (operands[2])) & 63);
|
||||
return \"shrpd %1,%1,%2,%0\";
|
||||
}"
|
||||
[(set_attr "type" "shift")
|
||||
(set_attr "length" "4")])
|
||||
|
||||
(define_insn ""
|
||||
[(set (match_operand:SI 0 "register_operand" "=r")
|
||||
(match_operator:SI 5 "plus_xor_ior_operator"
|
||||
|
|
Loading…
Add table
Reference in a new issue