1 ! RUN: bbc -emit-fir %s -o - | FileCheck %s
2 ! RUN: %flang_fc1 -emit-fir %s -o - | FileCheck %s
4 ! CHECK-LABEL: dshiftl1_test
5 ! CHECK-SAME: %[[A:.*]]: !fir.ref<i8>{{.*}}, %[[B:.*]]: !fir.ref<i8>{{.*}}, %[[S:.*]]: !fir.ref<i32>{{.*}}, %[[C:.*]]: !fir.ref<i8>{{.*}}
6 subroutine dshiftl1_test(a
, b
, s
, c
)
7 integer(kind
=1) :: a
, b
11 ! CHECK: %[[A_VAL:.*]] = fir.load %[[A]] : !fir.ref<i8>
12 ! CHECK: %[[B_VAL:.*]] = fir.load %[[B]] : !fir.ref<i8>
13 ! CHECK: %[[S_VAL:.*]] = fir.load %[[S]] : !fir.ref<i32>
15 ! CHECK: %[[S_CONV:.*]] = fir.convert %[[S_VAL]] : (i32) -> i8
16 ! CHECK: %[[C_BITS:.*]] = arith.constant 8 : i8
17 ! CHECK: %[[DIFF:.*]] = arith.subi %[[C_BITS]], %[[S_CONV]] : i8
18 ! CHECK: %[[C_BITS_L:.*]] = arith.constant 8 : i8
19 ! CHECK: %[[C_0_L:.*]] = arith.constant 0 : i8
20 ! CHECK: %[[UNDER_L:.*]] = arith.cmpi slt, %[[S_CONV]], %[[C_0_L]] : i8
21 ! CHECK: %[[OVER_L:.*]] = arith.cmpi sge, %[[S_CONV]], %[[C_BITS_L]] : i8
22 ! CHECK: %[[INV_L:.*]] = arith.ori %[[UNDER_L]], %[[OVER_L]] : i1
23 ! CHECK: %[[SHL:.*]] = arith.shli %[[A_VAL]], %[[S_CONV]] : i8
24 ! CHECK: %[[LFT:.*]] = arith.select %[[INV_L]], %[[C_0_L]], %[[SHL]] : i8
25 ! CHECK: %[[C_BITS_R:.*]] = arith.constant 8 : i8
26 ! CHECK: %[[C_0_R:.*]] = arith.constant 0 : i8
27 ! CHECK: %[[UNDER_R:.*]] = arith.cmpi slt, %[[DIFF]], %[[C_0_R]] : i8
28 ! CHECK: %[[OVER_R:.*]] = arith.cmpi sge, %[[DIFF]], %[[C_BITS_R]] : i8
29 ! CHECK: %[[INV_R:.*]] = arith.ori %[[UNDER_R]], %[[OVER_R]] : i1
30 ! CHECK: %[[SHR:.*]] = arith.shrui %[[B_VAL]], %[[DIFF]] : i8
31 ! CHECK: %[[RGT:.*]] = arith.select %[[INV_R]], %[[C_0_R]], %[[SHR]] : i8
32 ! CHECK: %[[SHIFT:.*]] = arith.ori %[[LFT]], %[[RGT]] : i8
33 end subroutine dshiftl1_test
35 ! CHECK-LABEL: dshiftl2_test
36 ! CHECK-SAME: %[[A:.*]]: !fir.ref<i16>{{.*}}, %[[B:.*]]: !fir.ref<i16>{{.*}}, %[[S:.*]]: !fir.ref<i32>{{.*}}, %[[C:.*]]: !fir.ref<i16>{{.*}}
37 subroutine dshiftl2_test(a
, b
, s
, c
)
38 integer(kind
=2) :: a
, b
42 ! CHECK: %[[A_VAL:.*]] = fir.load %[[A]] : !fir.ref<i16>
43 ! CHECK: %[[B_VAL:.*]] = fir.load %[[B]] : !fir.ref<i16>
44 ! CHECK: %[[S_VAL:.*]] = fir.load %[[S]] : !fir.ref<i32>
46 ! CHECK: %[[S_CONV:.*]] = fir.convert %[[S_VAL]] : (i32) -> i16
47 ! CHECK: %[[C_BITS:.*]] = arith.constant 16 : i16
48 ! CHECK: %[[DIFF:.*]] = arith.subi %[[C_BITS]], %[[S_CONV]] : i16
49 ! CHECK: %[[C_BITS_L:.*]] = arith.constant 16 : i16
50 ! CHECK: %[[C_0_L:.*]] = arith.constant 0 : i16
51 ! CHECK: %[[UNDER_L:.*]] = arith.cmpi slt, %[[S_CONV]], %[[C_0_L]] : i16
52 ! CHECK: %[[OVER_L:.*]] = arith.cmpi sge, %[[S_CONV]], %[[C_BITS_L]] : i16
53 ! CHECK: %[[INV_L:.*]] = arith.ori %[[UNDER_L]], %[[OVER_L]] : i1
54 ! CHECK: %[[SHL:.*]] = arith.shli %[[A_VAL]], %[[S_CONV]] : i16
55 ! CHECK: %[[LFT:.*]] = arith.select %[[INV_L]], %[[C_0_L]], %[[SHL]] : i16
56 ! CHECK: %[[C_BITS_R:.*]] = arith.constant 16 : i16
57 ! CHECK: %[[C_0_R:.*]] = arith.constant 0 : i16
58 ! CHECK: %[[UNDER_R:.*]] = arith.cmpi slt, %[[DIFF]], %[[C_0_R]] : i16
59 ! CHECK: %[[OVER_R:.*]] = arith.cmpi sge, %[[DIFF]], %[[C_BITS_R]] : i16
60 ! CHECK: %[[INV_R:.*]] = arith.ori %[[UNDER_R]], %[[OVER_R]] : i1
61 ! CHECK: %[[SHR:.*]] = arith.shrui %[[B_VAL]], %[[DIFF]] : i16
62 ! CHECK: %[[RGT:.*]] = arith.select %[[INV_R]], %[[C_0_R]], %[[SHR]] : i16
63 ! CHECK: %[[SHIFT:.*]] = arith.ori %[[LFT]], %[[RGT]] : i16
64 end subroutine dshiftl2_test
66 ! CHECK-LABEL: dshiftl4_test
67 ! CHECK-SAME: %[[A:.*]]: !fir.ref<i32>{{.*}}, %[[B:.*]]: !fir.ref<i32>{{.*}}, %[[S:.*]]: !fir.ref<i32>{{.*}}, %[[C:.*]]: !fir.ref<i32>{{.*}}
68 subroutine dshiftl4_test(a
, b
, s
, c
)
69 integer(kind
=4) :: a
, b
73 ! CHECK: %[[A_VAL:.*]] = fir.load %[[A]] : !fir.ref<i32>
74 ! CHECK: %[[B_VAL:.*]] = fir.load %[[B]] : !fir.ref<i32>
75 ! CHECK: %[[S_VAL:.*]] = fir.load %[[S]] : !fir.ref<i32>
77 ! CHECK: %[[C_BITS:.*]] = arith.constant 32 : i32
78 ! CHECK: %[[DIFF:.*]] = arith.subi %[[C_BITS]], %[[S_VAL]] : i32
79 ! CHECK: %[[C_BITS_L:.*]] = arith.constant 32 : i32
80 ! CHECK: %[[C_0_L:.*]] = arith.constant 0 : i32
81 ! CHECK: %[[UNDER_L:.*]] = arith.cmpi slt, %[[S_VAL]], %[[C_0_L]] : i32
82 ! CHECK: %[[OVER_L:.*]] = arith.cmpi sge, %[[S_VAL]], %[[C_BITS_L]] : i32
83 ! CHECK: %[[INV_L:.*]] = arith.ori %[[UNDER_L]], %[[OVER_L]] : i1
84 ! CHECK: %[[SHL:.*]] = arith.shli %[[A_VAL]], %[[S_VAL]] : i32
85 ! CHECK: %[[LFT:.*]] = arith.select %[[INV_L]], %[[C_0_L]], %[[SHL]] : i32
86 ! CHECK: %[[C_BITS_R:.*]] = arith.constant 32 : i32
87 ! CHECK: %[[C_0_R:.*]] = arith.constant 0 : i32
88 ! CHECK: %[[UNDER_R:.*]] = arith.cmpi slt, %[[DIFF]], %[[C_0_R]] : i32
89 ! CHECK: %[[OVER_R:.*]] = arith.cmpi sge, %[[DIFF]], %[[C_BITS_R]] : i32
90 ! CHECK: %[[INV_R:.*]] = arith.ori %[[UNDER_R]], %[[OVER_R]] : i1
91 ! CHECK: %[[SHR:.*]] = arith.shrui %[[B_VAL]], %[[DIFF]] : i32
92 ! CHECK: %[[RGT:.*]] = arith.select %[[INV_R]], %[[C_0_R]], %[[SHR]] : i32
93 ! CHECK: %[[SHIFT:.*]] = arith.ori %[[LFT]], %[[RGT]] : i32
94 end subroutine dshiftl4_test
96 ! CHECK-LABEL: dshiftl8_test
97 ! CHECK-SAME: %[[A:.*]]: !fir.ref<i64>{{.*}}, %[[B:.*]]: !fir.ref<i64>{{.*}}, %[[S:.*]]: !fir.ref<i32>{{.*}}, %[[C:.*]]: !fir.ref<i64>{{.*}}
98 subroutine dshiftl8_test(a
, b
, s
, c
)
99 integer(kind
=8) :: a
, b
103 ! CHECK: %[[A_VAL:.*]] = fir.load %[[A]] : !fir.ref<i64>
104 ! CHECK: %[[B_VAL:.*]] = fir.load %[[B]] : !fir.ref<i64>
105 ! CHECK: %[[S_VAL:.*]] = fir.load %[[S]] : !fir.ref<i32>
107 ! CHECK: %[[S_CONV:.*]] = fir.convert %[[S_VAL]] : (i32) -> i64
108 ! CHECK: %[[C_BITS:.*]] = arith.constant 64 : i64
109 ! CHECK: %[[DIFF:.*]] = arith.subi %[[C_BITS]], %[[S_CONV]] : i64
110 ! CHECK: %[[C_BITS_L:.*]] = arith.constant 64 : i64
111 ! CHECK: %[[C_0_L:.*]] = arith.constant 0 : i64
112 ! CHECK: %[[UNDER_L:.*]] = arith.cmpi slt, %[[S_CONV]], %[[C_0_L]] : i64
113 ! CHECK: %[[OVER_L:.*]] = arith.cmpi sge, %[[S_CONV]], %[[C_BITS_L]] : i64
114 ! CHECK: %[[INV_L:.*]] = arith.ori %[[UNDER_L]], %[[OVER_L]] : i1
115 ! CHECK: %[[SHL:.*]] = arith.shli %[[A_VAL]], %[[S_CONV]] : i64
116 ! CHECK: %[[LFT:.*]] = arith.select %[[INV_L]], %[[C_0_L]], %[[SHL]] : i64
117 ! CHECK: %[[C_BITS_R:.*]] = arith.constant 64 : i64
118 ! CHECK: %[[C_0_R:.*]] = arith.constant 0 : i64
119 ! CHECK: %[[UNDER_R:.*]] = arith.cmpi slt, %[[DIFF]], %[[C_0_R]] : i64
120 ! CHECK: %[[OVER_R:.*]] = arith.cmpi sge, %[[DIFF]], %[[C_BITS_R]] : i64
121 ! CHECK: %[[INV_R:.*]] = arith.ori %[[UNDER_R]], %[[OVER_R]] : i1
122 ! CHECK: %[[SHR:.*]] = arith.shrui %[[B_VAL]], %[[DIFF]] : i64
123 ! CHECK: %[[RGT:.*]] = arith.select %[[INV_R]], %[[C_0_R]], %[[SHR]] : i64
124 ! CHECK: %[[SHIFT:.*]] = arith.ori %[[LFT]], %[[RGT]] : i64
125 end subroutine dshiftl8_test
127 ! CHECK-LABEL: dshiftl16_test
128 ! CHECK-SAME: %[[A:.*]]: !fir.ref<i128>{{.*}}, %[[B:.*]]: !fir.ref<i128>{{.*}}, %[[S:.*]]: !fir.ref<i32>{{.*}}, %[[C:.*]]: !fir.ref<i128>{{.*}}
129 subroutine dshiftl16_test(a
, b
, s
, c
)
130 integer(kind
=16) :: a
, b
132 integer(kind
=16) :: c
134 ! CHECK: %[[A_VAL:.*]] = fir.load %[[A]] : !fir.ref<i128>
135 ! CHECK: %[[B_VAL:.*]] = fir.load %[[B]] : !fir.ref<i128>
136 ! CHECK: %[[S_VAL:.*]] = fir.load %[[S]] : !fir.ref<i32>
138 ! CHECK: %[[S_CONV:.*]] = fir.convert %[[S_VAL]] : (i32) -> i128
139 ! CHECK: %[[C_BITS:.*]] = arith.constant 128 : i128
140 ! CHECK: %[[DIFF:.*]] = arith.subi %[[C_BITS]], %[[S_CONV]] : i128
141 ! CHECK: %[[C_BITS_L:.*]] = arith.constant 128 : i128
142 ! CHECK: %[[C_0_L:.*]] = arith.constant 0 : i128
143 ! CHECK: %[[UNDER_L:.*]] = arith.cmpi slt, %[[S_CONV]], %[[C_0_L]] : i128
144 ! CHECK: %[[OVER_L:.*]] = arith.cmpi sge, %[[S_CONV]], %[[C_BITS_L]] : i128
145 ! CHECK: %[[INV_L:.*]] = arith.ori %[[UNDER_L]], %[[OVER_L]] : i1
146 ! CHECK: %[[SHL:.*]] = arith.shli %[[A_VAL]], %[[S_CONV]] : i128
147 ! CHECK: %[[LFT:.*]] = arith.select %[[INV_L]], %[[C_0_L]], %[[SHL]] : i128
148 ! CHECK: %[[C_BITS_R:.*]] = arith.constant 128 : i128
149 ! CHECK: %[[C_0_R:.*]] = arith.constant 0 : i128
150 ! CHECK: %[[UNDER_R:.*]] = arith.cmpi slt, %[[DIFF]], %[[C_0_R]] : i128
151 ! CHECK: %[[OVER_R:.*]] = arith.cmpi sge, %[[DIFF]], %[[C_BITS_R]] : i128
152 ! CHECK: %[[INV_R:.*]] = arith.ori %[[UNDER_R]], %[[OVER_R]] : i1
153 ! CHECK: %[[SHR:.*]] = arith.shrui %[[B_VAL]], %[[DIFF]] : i128
154 ! CHECK: %[[RGT:.*]] = arith.select %[[INV_R]], %[[C_0_R]], %[[SHR]] : i128
155 ! CHECK: %[[SHIFT:.*]] = arith.ori %[[LFT]], %[[RGT]] : i128
156 end subroutine dshiftl16_test