1! RUN: bbc -emit-fir %s -o - | FileCheck %s 2! RUN: %flang_fc1 -emit-fir %s -o - | FileCheck %s 3 4! CHECK-LABEL: shifta1_test 5! CHECK-SAME: %[[A:.*]]: !fir.ref<i8>{{.*}}, %[[B:.*]]: !fir.ref<i32>{{.*}}, %[[C:.*]]: !fir.ref<i8>{{.*}} 6subroutine shifta1_test(a, b, c) 7 integer(kind=1) :: a 8 integer :: b 9 integer(kind=1) :: c 10 11 ! CHECK: %[[A_VAL:.*]] = fir.load %[[A]] : !fir.ref<i8> 12 ! CHECK: %[[B_VAL:.*]] = fir.load %[[B]] : !fir.ref<i32> 13 c = shifta(a, b) 14 ! CHECK: %[[C_BITS:.*]] = arith.constant 8 : i8 15 ! CHECK: %[[C_0:.*]] = arith.constant 0 : i8 16 ! CHECK: %[[B_CONV:.*]] = fir.convert %[[B_VAL]] : (i32) -> i8 17 ! CHECK: %[[UNDER:.*]] = arith.cmpi slt, %[[B_CONV]], %[[C_0]] : i8 18 ! CHECK: %[[OVER:.*]] = arith.cmpi sge, %[[B_CONV]], %[[C_BITS]] : i8 19 ! CHECK: %[[INVALID:.*]] = arith.ori %[[UNDER]], %[[OVER]] : i1 20 ! CHECK: %[[SHIFT:.*]] = arith.shrsi %[[A_VAL]], %[[B_CONV]] : i8 21 ! CHECK: %[[RES:.*]] = arith.select %[[INVALID]], %[[C_0]], %[[SHIFT]] : i8 22end subroutine shifta1_test 23 24! CHECK-LABEL: shifta2_test 25! CHECK-SAME: %[[A:.*]]: !fir.ref<i16>{{.*}}, %[[B:.*]]: !fir.ref<i32>{{.*}}, %[[C:.*]]: !fir.ref<i16>{{.*}} 26subroutine shifta2_test(a, b, c) 27 integer(kind=2) :: a 28 integer :: b 29 integer(kind=2) :: c 30 31 ! CHECK: %[[A_VAL:.*]] = fir.load %[[A]] : !fir.ref<i16> 32 ! CHECK: %[[B_VAL:.*]] = fir.load %[[B]] : !fir.ref<i32> 33 c = shifta(a, b) 34 ! CHECK: %[[C_BITS:.*]] = arith.constant 16 : i16 35 ! CHECK: %[[C_0:.*]] = arith.constant 0 : i16 36 ! CHECK: %[[B_CONV:.*]] = fir.convert %[[B_VAL]] : (i32) -> i16 37 ! CHECK: %[[UNDER:.*]] = arith.cmpi slt, %[[B_CONV]], %[[C_0]] : i16 38 ! CHECK: %[[OVER:.*]] = arith.cmpi sge, %[[B_CONV]], %[[C_BITS]] : i16 39 ! CHECK: %[[INVALID:.*]] = arith.ori %[[UNDER]], %[[OVER]] : i1 40 ! CHECK: %[[SHIFT:.*]] = arith.shrsi %[[A_VAL]], %[[B_CONV]] : i16 41 ! CHECK: %[[RES:.*]] = arith.select %[[INVALID]], %[[C_0]], %[[SHIFT]] : i16 42end subroutine shifta2_test 43 44! CHECK-LABEL: shifta4_test 45! CHECK-SAME: %[[A:.*]]: !fir.ref<i32>{{.*}}, %[[B:.*]]: !fir.ref<i32>{{.*}}, %[[C:.*]]: !fir.ref<i32>{{.*}} 46subroutine shifta4_test(a, b, c) 47 integer(kind=4) :: a 48 integer :: b 49 integer(kind=4) :: c 50 51 ! CHECK: %[[A_VAL:.*]] = fir.load %[[A]] : !fir.ref<i32> 52 ! CHECK: %[[B_VAL:.*]] = fir.load %[[B]] : !fir.ref<i32> 53 c = shifta(a, b) 54 ! CHECK: %[[C_BITS:.*]] = arith.constant 32 : i32 55 ! CHECK: %[[C_0:.*]] = arith.constant 0 : i32 56 ! CHECK: %[[UNDER:.*]] = arith.cmpi slt, %[[B_VAL]], %[[C_0]] : i32 57 ! CHECK: %[[OVER:.*]] = arith.cmpi sge, %[[B_VAL]], %[[C_BITS]] : i32 58 ! CHECK: %[[INVALID:.*]] = arith.ori %[[UNDER]], %[[OVER]] : i1 59 ! CHECK: %[[SHIFT:.*]] = arith.shrsi %[[A_VAL]], %[[B_VAL]] : i32 60 ! CHECK: %[[RES:.*]] = arith.select %[[INVALID]], %[[C_0]], %[[SHIFT]] : i32 61end subroutine shifta4_test 62 63! CHECK-LABEL: shifta8_test 64! CHECK-SAME: %[[A:.*]]: !fir.ref<i64>{{.*}}, %[[B:.*]]: !fir.ref<i32>{{.*}}, %[[C:.*]]: !fir.ref<i64>{{.*}} 65subroutine shifta8_test(a, b, c) 66 integer(kind=8) :: a 67 integer :: b 68 integer(kind=8) :: c 69 70 ! CHECK: %[[A_VAL:.*]] = fir.load %[[A]] : !fir.ref<i64> 71 ! CHECK: %[[B_VAL:.*]] = fir.load %[[B]] : !fir.ref<i32> 72 c = shifta(a, b) 73 ! CHECK: %[[C_BITS:.*]] = arith.constant 64 : i64 74 ! CHECK: %[[C_0:.*]] = arith.constant 0 : i64 75 ! CHECK: %[[B_CONV:.*]] = fir.convert %[[B_VAL]] : (i32) -> i64 76 ! CHECK: %[[UNDER:.*]] = arith.cmpi slt, %[[B_CONV]], %[[C_0]] : i64 77 ! CHECK: %[[OVER:.*]] = arith.cmpi sge, %[[B_CONV]], %[[C_BITS]] : i64 78 ! CHECK: %[[INVALID:.*]] = arith.ori %[[UNDER]], %[[OVER]] : i1 79 ! CHECK: %[[SHIFT:.*]] = arith.shrsi %[[A_VAL]], %[[B_CONV]] : i64 80 ! CHECK: %[[RES:.*]] = arith.select %[[INVALID]], %[[C_0]], %[[SHIFT]] : i64 81end subroutine shifta8_test 82 83! CHECK-LABEL: shifta16_test 84! CHECK-SAME: %[[A:.*]]: !fir.ref<i128>{{.*}}, %[[B:.*]]: !fir.ref<i32>{{.*}}, %[[C:.*]]: !fir.ref<i128>{{.*}} 85subroutine shifta16_test(a, b, c) 86 integer(kind=16) :: a 87 integer :: b 88 integer(kind=16) :: c 89 90 ! CHECK: %[[A_VAL:.*]] = fir.load %[[A]] : !fir.ref<i128> 91 ! CHECK: %[[B_VAL:.*]] = fir.load %[[B]] : !fir.ref<i32> 92 c = shifta(a, b) 93 ! CHECK: %[[C_BITS:.*]] = arith.constant 128 : i128 94 ! CHECK: %[[C_0:.*]] = arith.constant 0 : i128 95 ! CHECK: %[[B_CONV:.*]] = fir.convert %[[B_VAL]] : (i32) -> i128 96 ! CHECK: %[[UNDER:.*]] = arith.cmpi slt, %[[B_CONV]], %[[C_0]] : i128 97 ! CHECK: %[[OVER:.*]] = arith.cmpi sge, %[[B_CONV]], %[[C_BITS]] : i128 98 ! CHECK: %[[INVALID:.*]] = arith.ori %[[UNDER]], %[[OVER]] : i1 99 ! CHECK: %[[SHIFT:.*]] = arith.shrsi %[[A_VAL]], %[[B_CONV]] : i128 100 ! CHECK: %[[RES:.*]] = arith.select %[[INVALID]], %[[C_0]], %[[SHIFT]] : i128 101end subroutine shifta16_test 102