[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:
Kelvin Li 2022-11-28 14:02:16 -05:00
parent 0d07922d92
commit 93196654f5
4 changed files with 104 additions and 2 deletions

View File

@ -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 |

View File

@ -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"},
};

View File

@ -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

View File

@ -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