1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
|
! { dg-do run }
! { dg-options "-funsigned" }
! Test dot_product both for runtime and compile
program memain
call test1
call test2
contains
subroutine test1
integer, parameter :: n = 10
real(8), dimension(n) :: a, b
unsigned, dimension(n) :: u, v
integer(8), dimension(n) :: i, j
unsigned :: res_u
integer(8) :: res_i
integer :: k
do k=1,10
call random_number(a)
call random_number(b)
u = uint(a*2**32)
v = uint(b*2**32)
i = int(u,8)
j = int(v,8)
res_u = dot_product(u,v)
res_i = dot_product(i,j)
if (res_u /= uint(res_i)) error stop 1
end do
end subroutine test1
subroutine test2
integer, parameter :: n = 5
unsigned, parameter, dimension(n) :: &
u = [1149221887u, 214388752u, 724301838u, 1618160523u, 1783282425u], &
v = [1428464973u, 1887264271u, 1830319906u, 983537781u, 13514400u]
integer(8), parameter, dimension(n) :: i = int(u,8), j=int(v,8)
unsigned, parameter :: res_1 = dot_product(u,v)
integer(8), parameter :: res_2 = dot_product(i,j)
if (res_1 /= uint(res_2)) error stop 2
end subroutine test2
end program
|