[flang] Add support for LSHIFT and RSHIFT intrinsics
The functionality of LSHIFT and RSHIFT intrinsics is the same as the standard SHIFTL and SHIFTA intrinsics respectively. The patch is to alias the two intrinsics to the standardized ones. Differential Revision: https://reviews.llvm.org/D138839
This commit is contained in:
parent
0d07922d92
commit
93196654f5
|
@ -749,7 +749,7 @@ This phase currently supports all the intrinsic procedures listed above but the
|
|||
| Coarray intrinsic functions | IMAGE_INDEX, COSHAPE |
|
||||
| Object characteristic inquiry functions | ALLOCATED, ASSOCIATED, EXTENDS_TYPE_OF, IS_CONTIGUOUS, PRESENT, RANK, SAME_TYPE, STORAGE_SIZE |
|
||||
| Type inquiry intrinsic functions | BIT_SIZE, DIGITS, EPSILON, HUGE, KIND, MAXEXPONENT, MINEXPONENT, NEW_LINE, PRECISION, RADIX, RANGE, TINY|
|
||||
| Non-standard intrinsic functions | AND, OR, XOR, LSHIFT, RSHIFT, SHIFT, ZEXT, IZEXT, COSD, SIND, TAND, ACOSD, ASIND, ATAND, ATAN2D, COMPL, DCMPLX, EQV, NEQV, INT8, JINT, JNINT, KNINT, QCMPLX, DREAL, DFLOAT, QEXT, QFLOAT, QREAL, DNUM, NUM, JNUM, KNUM, QNUM, RNUM, RAN, RANF, ILEN, SIZEOF, MCLOCK, SECNDS, COTAN, IBCHNG, ISHA, ISHC, ISHL, IXOR, IARG, IARGC, NARGS, NUMARG, BADDRESS, IADDR, CACHESIZE, EOF, FP_CLASS, INT_PTR_KIND, ISNAN, MALLOC |
|
||||
| Non-standard intrinsic functions | AND, OR, XOR, SHIFT, ZEXT, IZEXT, COSD, SIND, TAND, ACOSD, ASIND, ATAND, ATAN2D, COMPL, DCMPLX, EQV, NEQV, INT8, JINT, JNINT, KNINT, QCMPLX, DREAL, DFLOAT, QEXT, QFLOAT, QREAL, DNUM, NUM, JNUM, KNUM, QNUM, RNUM, RAN, RANF, ILEN, SIZEOF, MCLOCK, SECNDS, COTAN, IBCHNG, ISHA, ISHC, ISHL, IXOR, IARG, IARGC, NARGS, NUMARG, BADDRESS, IADDR, CACHESIZE, EOF, FP_CLASS, INT_PTR_KIND, ISNAN, MALLOC |
|
||||
| Intrinsic subroutines |MVBITS (elemental), CPU_TIME, DATE_AND_TIME, EVENT_QUERY, EXECUTE_COMMAND_LINE, GET_COMMAND, GET_COMMAND_ARGUMENT, GET_ENVIRONMENT_VARIABLE, MOVE_ALLOC, RANDOM_INIT, RANDOM_NUMBER, RANDOM_SEED, SYSTEM_CLOCK |
|
||||
| Atomic intrinsic subroutines | ATOMIC_ADD |
|
||||
| Collective intrinsic subroutines | CO_REDUCE |
|
||||
|
|
|
@ -917,7 +917,7 @@ static const IntrinsicInterface genericIntrinsicFunction[]{
|
|||
// TODO: Coarray intrinsic functions
|
||||
// IMAGE_INDEX, COSHAPE
|
||||
// TODO: Non-standard intrinsic functions
|
||||
// LSHIFT, RSHIFT, SHIFT,
|
||||
// SHIFT,
|
||||
// COMPL, EQV, NEQV, INT8, JINT, JNINT, KNINT,
|
||||
// QCMPLX, QEXT, QFLOAT, QREAL, DNUM,
|
||||
// INUM, JNUM, KNUM, QNUM, RNUM, RAN, RANF, ILEN,
|
||||
|
@ -934,7 +934,9 @@ static const IntrinsicInterface genericIntrinsicFunction[]{
|
|||
static const std::pair<const char *, const char *> genericAlias[]{
|
||||
{"and", "iand"},
|
||||
{"imag", "aimag"},
|
||||
{"lshift", "shiftl"},
|
||||
{"or", "ior"},
|
||||
{"rshift", "shifta"},
|
||||
{"xor", "ieor"},
|
||||
{"__builtin_ieee_selected_real_kind", "selected_real_kind"},
|
||||
};
|
||||
|
|
|
@ -0,0 +1,50 @@
|
|||
! RUN: %flang_fc1 -fdebug-unparse %s 2>&1 | FileCheck %s
|
||||
! Check that a call to LSHIFT is transformed to SHIFTL.
|
||||
|
||||
subroutine test_default_integer()
|
||||
integer :: i, j, k
|
||||
k = lshift(i, j)
|
||||
!CHECK: k=shiftl(i,j)
|
||||
k = lshift(16, 2)
|
||||
!CHECK: k=64_4
|
||||
end
|
||||
|
||||
subroutine test_integer1()
|
||||
integer(1) :: i, j, k
|
||||
k = lshift(i, j)
|
||||
!CHECK: k=shiftl(i,int(j,kind=4))
|
||||
print *, lshift(8_1, 2)
|
||||
!CHECK: PRINT *, 32_1
|
||||
end
|
||||
|
||||
subroutine test_integer2()
|
||||
integer(2) :: i, j, k
|
||||
k = lshift(i, j)
|
||||
!CHECK: k=shiftl(i,int(j,kind=4))
|
||||
print *, lshift(8_2, 2)
|
||||
!CHECK: PRINT *, 32_2
|
||||
end
|
||||
|
||||
subroutine test_integer4()
|
||||
integer(4) :: i, j, k
|
||||
k = lshift(i, j)
|
||||
!CHECK: k=shiftl(i,j)
|
||||
print *, lshift(8_4, 2)
|
||||
!CHECK: PRINT *, 32_4
|
||||
end
|
||||
|
||||
subroutine test_integer8()
|
||||
integer(8) :: i, j, k
|
||||
k = lshift(i, j)
|
||||
!CHECK: k=shiftl(i,int(j,kind=4))
|
||||
print *, lshift(-16_8, 2)
|
||||
!CHECK: PRINT *, -64_8
|
||||
end
|
||||
|
||||
subroutine test_integer16()
|
||||
integer(16) :: i, j, k
|
||||
k = lshift(i, j)
|
||||
!CHECK: k=shiftl(i,int(j,kind=4))
|
||||
print *, lshift(8_16, 2)
|
||||
!CHECK: PRINT *, 32_16
|
||||
end
|
|
@ -0,0 +1,50 @@
|
|||
! RUN: %flang_fc1 -fdebug-unparse %s 2>&1 | FileCheck %s
|
||||
! Check that a call to RSHIFT is transformed to SHIFTA.
|
||||
|
||||
subroutine test_default_integer()
|
||||
integer :: i, j, k
|
||||
k = rshift(i, j)
|
||||
!CHECK: k=shifta(i,j)
|
||||
k = rshift(16, 2)
|
||||
!CHECK: k=4_4
|
||||
end
|
||||
|
||||
subroutine test_integer1()
|
||||
integer(1) :: i, j, k
|
||||
k = rshift(i, j)
|
||||
!CHECK: k=shifta(i,int(j,kind=4))
|
||||
print *, rshift(8_1, 2)
|
||||
!CHECK: PRINT *, 2_1
|
||||
end
|
||||
|
||||
subroutine test_integer2()
|
||||
integer(2) :: i, j, k
|
||||
k = rshift(i, j)
|
||||
!CHECK: k=shifta(i,int(j,kind=4))
|
||||
print *, rshift(8_2, 2)
|
||||
!CHECK: PRINT *, 2_2
|
||||
end
|
||||
|
||||
subroutine test_integer4()
|
||||
integer(4) :: i, j, k
|
||||
k = rshift(i, j)
|
||||
!CHECK: k=shifta(i,j)
|
||||
print *, rshift(8_4, 2)
|
||||
!CHECK: PRINT *, 2_4
|
||||
end
|
||||
|
||||
subroutine test_integer8()
|
||||
integer(8) :: i, j, k
|
||||
k = rshift(i, j)
|
||||
!CHECK: k=shifta(i,int(j,kind=4))
|
||||
print *, rshift(-16_8, 2)
|
||||
!CHECK: PRINT *, -4_8
|
||||
end
|
||||
|
||||
subroutine test_integer16()
|
||||
integer(16) :: i, j, k
|
||||
k = rshift(i, j)
|
||||
!CHECK: k=shifta(i,int(j,kind=4))
|
||||
print *, rshift(8_16, 2)
|
||||
!CHECK: PRINT *, 2_16
|
||||
end
|
Loading…
Reference in New Issue