S/390: PR80464: Split MEM->GPR vector moves
We do this already for TImode values but it was missing for vector modes. gcc/ChangeLog: 2017-04-25 Andreas Krebbel <krebbel@linux.vnet.ibm.com> PR target/80464 * config/s390/vector.md: Split MEM->GPR vector moves for non-s_operand addresses. gcc/testsuite/ChangeLog: 2017-04-25 Andreas Krebbel <krebbel@linux.vnet.ibm.com> PR target/80464 * gfortran.fortran-torture/compile/pr80464.f90: New test. From-SVN: r247134
This commit is contained in:
parent
3cb9ee2f9c
commit
854dbb3cb1
@ -248,6 +248,25 @@
|
||||
operands[5] = operand_subword (operands[1], 0, 0, <MODE>mode);
|
||||
})
|
||||
|
||||
; This is the vector equivalent to the TImode splitter in s390.md. It
|
||||
; is required if both target GPRs occur in the source address operand.
|
||||
|
||||
; For non-s_operands at least one of the target GPRs does not conflict
|
||||
; with the address operand and one of the splitters above will take
|
||||
; over.
|
||||
(define_split
|
||||
[(set (match_operand:V_128 0 "register_operand" "")
|
||||
(match_operand:V_128 1 "memory_operand" ""))]
|
||||
"TARGET_ZARCH && reload_completed
|
||||
&& !VECTOR_REG_P (operands[0])
|
||||
&& !s_operand (operands[1], VOIDmode)"
|
||||
[(set (match_dup 0) (match_dup 1))]
|
||||
{
|
||||
rtx addr = operand_subword (operands[0], 1, 0, <MODE>mode);
|
||||
addr = gen_lowpart (Pmode, addr);
|
||||
s390_load_address (addr, XEXP (operands[1], 0));
|
||||
operands[1] = replace_equiv_address (operands[1], addr);
|
||||
})
|
||||
|
||||
; Moves for smaller vector modes.
|
||||
|
||||
|
39
gcc/testsuite/gfortran.fortran-torture/compile/pr80464.f90
Normal file
39
gcc/testsuite/gfortran.fortran-torture/compile/pr80464.f90
Normal file
@ -0,0 +1,39 @@
|
||||
subroutine bla(a,bar,lb,ne,nt,v,b)
|
||||
character*8 lb
|
||||
integer bar(20),foo(8,5)
|
||||
real*8 a(3,*),x(3,8),v(0:3,*)
|
||||
if(lb(4:4).eq.'3') then
|
||||
n=8
|
||||
elseif(lb(4:5).eq.'10') then
|
||||
n=10
|
||||
ns=6
|
||||
m=4
|
||||
endif
|
||||
call blub(id)
|
||||
do
|
||||
if(id.eq.0) exit
|
||||
if(lb(4:4).eq.'6') then
|
||||
m=1
|
||||
endif
|
||||
if((n.eq.20).or.(n.eq.8)) then
|
||||
if(b.eq.0) then
|
||||
do i=1,ns
|
||||
do j=1,3
|
||||
x(j,i)=a(j,bar(foo(i,ig)))
|
||||
enddo
|
||||
enddo
|
||||
else
|
||||
do i=1,ns
|
||||
do j=1,3
|
||||
x(j,i)=a(j,bar(foo(i,ig)))+v(j,bar(foo(i,ig)))
|
||||
enddo
|
||||
enddo
|
||||
endif
|
||||
endif
|
||||
do i=1,m
|
||||
if(lb(4:5).eq.'1E') then
|
||||
call blab(x)
|
||||
endif
|
||||
enddo
|
||||
enddo
|
||||
end subroutine bla
|
Loading…
Reference in New Issue
Block a user