1! RUN: bbc -emit-fir %s -o - | FileCheck %s 2! RUN: %flang_fc1 -emit-fir %s -o - | FileCheck %s 3 4! CHECK-LABEL: maskl_test 5subroutine maskl_test(a, b) 6 integer :: a 7 integer :: b 8 ! CHECK-DAG: %[[BITS:.*]] = arith.constant 32 : i32 9 ! CHECK-DAG: %[[C__1:.*]] = arith.constant -1 : i32 10 ! CHECK-DAG: %[[C__0:.*]] = arith.constant 0 : i32 11 ! CHECK: %[[A:.*]] = fir.declare %{{.*}}Ea 12 ! CHECK: %[[B:.*]] = fir.declare %{{.*}}Eb 13 14 ! CHECK: %[[A_VAL:.*]] = fir.load %[[A]] : !fir.ref<i32> 15 b = maskl(a) 16 ! CHECK: %[[LEN:.*]] = arith.subi %[[BITS]], %[[A_VAL]] : i32 17 ! CHECK: %[[SHIFT:.*]] = arith.shli %[[C__1]], %[[LEN]] : i32 18 ! CHECK: %[[IS0:.*]] = arith.cmpi eq, %[[A_VAL]], %[[C__0]] : i32 19 ! CHECK: %[[RESULT:.*]] = arith.select %[[IS0]], %[[C__0]], %[[SHIFT]] : i32 20 ! CHECK: fir.store %[[RESULT]] to %[[B]] : !fir.ref<i32> 21end subroutine maskl_test 22 23! CHECK-LABEL: maskl1_test 24subroutine maskl1_test(a, b) 25 integer :: a 26 integer(kind=1) :: b 27 ! CHECK-DAG: %[[BITS:.*]] = arith.constant 8 : i8 28 ! CHECK-DAG: %[[C__1:.*]] = arith.constant -1 : i8 29 ! CHECK-DAG: %[[C__0:.*]] = arith.constant 0 : i8 30 ! CHECK: %[[A:.*]] = fir.declare %{{.*}}Ea 31 ! CHECK: %[[B:.*]] = fir.declare %{{.*}}Eb 32 33 ! CHECK: %[[A_VAL:.*]] = fir.load %[[A]] : !fir.ref<i32> 34 b = maskl(a, 1) 35 ! CHECK: %[[A_CONV:.*]] = fir.convert %[[A_VAL]] : (i32) -> i8 36 ! CHECK: %[[LEN:.*]] = arith.subi %[[BITS]], %[[A_CONV]] : i8 37 ! CHECK: %[[SHIFT:.*]] = arith.shli %[[C__1]], %[[LEN]] : i8 38 ! CHECK: %[[IS0:.*]] = arith.cmpi eq, %[[A_CONV]], %[[C__0]] : i8 39 ! CHECK: %[[RESULT:.*]] = arith.select %[[IS0]], %[[C__0]], %[[SHIFT]] : i8 40 ! CHECK: fir.store %[[RESULT]] to %[[B]] : !fir.ref<i8> 41end subroutine maskl1_test 42 43! CHECK-LABEL: maskl2_test 44subroutine maskl2_test(a, b) 45 integer :: a 46 integer(kind=2) :: b 47 ! CHECK-DAG: %[[BITS:.*]] = arith.constant 16 : i16 48 ! CHECK-DAG: %[[C__1:.*]] = arith.constant -1 : i16 49 ! CHECK-DAG: %[[C__0:.*]] = arith.constant 0 : i16 50 ! CHECK: %[[A:.*]] = fir.declare %{{.*}}Ea 51 ! CHECK: %[[B:.*]] = fir.declare %{{.*}}Eb 52 53 ! CHECK: %[[A_VAL:.*]] = fir.load %[[A]] : !fir.ref<i32> 54 b = maskl(a, 2) 55 ! CHECK: %[[A_CONV:.*]] = fir.convert %[[A_VAL]] : (i32) -> i16 56 ! CHECK: %[[LEN:.*]] = arith.subi %[[BITS]], %[[A_CONV]] : i16 57 ! CHECK: %[[SHIFT:.*]] = arith.shli %[[C__1]], %[[LEN]] : i16 58 ! CHECK: %[[IS0:.*]] = arith.cmpi eq, %[[A_CONV]], %[[C__0]] : i16 59 ! CHECK: %[[RESULT:.*]] = arith.select %[[IS0]], %[[C__0]], %[[SHIFT]] : i16 60 ! CHECK: fir.store %[[RESULT]] to %[[B]] : !fir.ref<i16> 61end subroutine maskl2_test 62 63! CHECK-LABEL: maskl4_test 64subroutine maskl4_test(a, b) 65 integer :: a 66 integer(kind=4) :: b 67 ! CHECK-DAG: %[[BITS:.*]] = arith.constant 32 : i32 68 ! CHECK-DAG: %[[C__1:.*]] = arith.constant -1 : i32 69 ! CHECK-DAG: %[[C__0:.*]] = arith.constant 0 : i32 70 ! CHECK: %[[A:.*]] = fir.declare %{{.*}}Ea 71 ! CHECK: %[[B:.*]] = fir.declare %{{.*}}Eb 72 73 ! CHECK: %[[A_VAL:.*]] = fir.load %[[A]] : !fir.ref<i32> 74 b = maskl(a, 4) 75 ! CHECK: %[[LEN:.*]] = arith.subi %[[BITS]], %[[A_VAL]] : i32 76 ! CHECK: %[[SHIFT:.*]] = arith.shli %[[C__1]], %[[LEN]] : i32 77 ! CHECK: %[[IS0:.*]] = arith.cmpi eq, %[[A_VAL]], %[[C__0]] : i32 78 ! CHECK: %[[RESULT:.*]] = arith.select %[[IS0]], %[[C__0]], %[[SHIFT]] : i32 79 ! CHECK: fir.store %[[RESULT]] to %[[B]] : !fir.ref<i32> 80end subroutine maskl4_test 81 82! CHECK-LABEL: maskl8_test 83subroutine maskl8_test(a, b) 84 integer :: a 85 integer(kind=8) :: b 86 ! CHECK-DAG: %[[BITS:.*]] = arith.constant 64 : i64 87 ! CHECK-DAG: %[[C__1:.*]] = arith.constant -1 : i64 88 ! CHECK-DAG: %[[C__0:.*]] = arith.constant 0 : i64 89 ! CHECK: %[[A:.*]] = fir.declare %{{.*}}Ea 90 ! CHECK: %[[B:.*]] = fir.declare %{{.*}}Eb 91 92 ! CHECK: %[[A_VAL:.*]] = fir.load %[[A]] : !fir.ref<i32> 93 b = maskl(a, 8) 94 ! CHECK: %[[A_CONV:.*]] = fir.convert %[[A_VAL]] : (i32) -> i64 95 ! CHECK: %[[LEN:.*]] = arith.subi %[[BITS]], %[[A_CONV]] : i64 96 ! CHECK: %[[SHIFT:.*]] = arith.shli %[[C__1]], %[[LEN]] : i64 97 ! CHECK: %[[IS0:.*]] = arith.cmpi eq, %[[A_CONV]], %[[C__0]] : i64 98 ! CHECK: %[[RESULT:.*]] = arith.select %[[IS0]], %[[C__0]], %[[SHIFT]] : i64 99 ! CHECK: fir.store %[[RESULT]] to %[[B]] : !fir.ref<i64> 100end subroutine maskl8_test 101 102subroutine maskl16_test(a, b) 103 integer :: a 104 integer(16) :: b 105 ! CHECK-DAG: %[[BITS:.*]] = arith.constant 128 : i128 106 ! CHECK-DAG: %[[C__1:.*]] = arith.constant -1 : i128 107 ! CHECK-DAG: %[[C__0:.*]] = arith.constant 0 : i128 108 ! CHECK: %[[A:.*]] = fir.declare %{{.*}}Ea 109 ! CHECK: %[[B:.*]] = fir.declare %{{.*}}Eb 110 111 ! CHECK: %[[A_VAL:.*]] = fir.load %[[A]] : !fir.ref<i32> 112 b = maskl(a, 16) 113 ! CHECK: %[[A_CONV:.*]] = fir.convert %[[A_VAL]] : (i32) -> i128 114 ! CHECK: %[[LEN:.*]] = arith.subi %[[BITS]], %[[A_CONV]] : i128 115 ! CHECK: %[[SHIFT:.*]] = arith.shli %[[C__1]], %[[LEN]] : i128 116 ! CHECK: %[[IS0:.*]] = arith.cmpi eq, %[[A_CONV]], %[[C__0]] : i128 117 ! CHECK: %[[RESULT:.*]] = arith.select %[[IS0]], %[[C__0]], %[[SHIFT]] : i128 118 ! CHECK: fir.store %[[RESULT]] to %[[B]] : !fir.ref<i128> 119end subroutine 120