1! RUN: %flang_fc1 -flang-experimental-hlfir -triple powerpc64le-unknown-unknown -emit-llvm %s -o - | FileCheck --check-prefixes="LLVMIR","LLVMIR-LE" %s 2! RUN: %flang_fc1 -flang-experimental-hlfir -triple powerpc64-unknown-unknown -emit-llvm %s -o - | FileCheck --check-prefixes="LLVMIR","LLVMIR-BE" %s 3! REQUIRES: target=powerpc{{.*}} 4 5!------------- 6! vec_extract 7!------------- 8! CHECK-LABEL: vec_extract_testf32 9subroutine vec_extract_testf32(x, i1, i2, i4, i8) 10 vector(real(4)) :: x 11 real(4) :: r 12 integer(1) :: i1 13 integer(2) :: i2 14 integer(4) :: i4 15 integer(8) :: i8 16 r = vec_extract(x, i1) 17 18! LLVMIR: %[[x:.*]] = load <4 x float>, ptr %{{[0-9]}}, align 16 19! LLVMIR: %[[i1:.*]] = load i8, ptr %{{[0-9]}}, align 1 20! LLVMIR: %[[u:.*]] = urem i8 %[[i1]], 4 21! LLVMIR-BE: %[[s:.*]] = sub i8 3, %[[u]] 22! LLVMIR-LE: %[[r:.*]] = extractelement <4 x float> %[[x]], i8 %[[u]] 23! LLVMIR-BE: %[[r:.*]] = extractelement <4 x float> %[[x]], i8 %[[s]] 24! LLVMIR: store float %[[r]], ptr %{{[0-9]}}, align 4 25 26 r = vec_extract(x, i2) 27 28! LLVMIR: %[[x:.*]] = load <4 x float>, ptr %{{[0-9]}}, align 16 29! LLVMIR: %[[i2:.*]] = load i16, ptr %{{[0-9]}}, align 2 30! LLVMIR: %[[u:.*]] = urem i16 %[[i2]], 4 31! LLVMIR-BE: %[[s:.*]] = sub i16 3, %[[u]] 32! LLVMIR-LE: %[[r:.*]] = extractelement <4 x float> %[[x]], i16 %[[u]] 33! LLVMIR-BE: %[[r:.*]] = extractelement <4 x float> %[[x]], i16 %[[s]] 34! LLVMIR: store float %[[r]], ptr %{{[0-9]}}, align 4 35 36 r = vec_extract(x, i4) 37 38! LLVMIR: %[[x:.*]] = load <4 x float>, ptr %{{[0-9]}}, align 16 39! LLVMIR: %[[i4:.*]] = load i32, ptr %{{[0-9]}}, align 4 40! LLVMIR: %[[u:.*]] = urem i32 %[[i4]], 4 41! LLVMIR-BE: %[[s:.*]] = sub i32 3, %[[u]] 42! LLVMIR-LE: %[[r:.*]] = extractelement <4 x float> %[[x]], i32 %[[u]] 43! LLVMIR-BE: %[[r:.*]] = extractelement <4 x float> %[[x]], i32 %[[s]] 44! LLVMIR: store float %[[r]], ptr %{{[0-9]}}, align 4 45 46 r = vec_extract(x, i8) 47 48! LLVMIR: %[[x:.*]] = load <4 x float>, ptr %{{[0-9]}}, align 16 49! LLVMIR: %[[i8:.*]] = load i64, ptr %{{[0-9]}}, align 8 50! LLVMIR: %[[u:.*]] = urem i64 %[[i8]], 4 51! LLVMIR-BE: %[[s:.*]] = sub i64 3, %[[u]] 52! LLVMIR-LE: %[[r:.*]] = extractelement <4 x float> %[[x]], i64 %[[u]] 53! LLVMIR-BE: %[[r:.*]] = extractelement <4 x float> %[[x]], i64 %[[s]] 54! LLVMIR: store float %[[r]], ptr %{{[0-9]}}, align 4 55end subroutine vec_extract_testf32 56 57! CHECK-LABEL: vec_extract_testf64 58subroutine vec_extract_testf64(x, i1, i2, i4, i8) 59 vector(real(8)) :: x 60 real(8) :: r 61 integer(1) :: i1 62 integer(2) :: i2 63 integer(4) :: i4 64 integer(8) :: i8 65 r = vec_extract(x, i1) 66 67! LLVMIR: %[[x:.*]] = load <2 x double>, ptr %{{[0-9]}}, align 16 68! LLVMIR: %[[i1:.*]] = load i8, ptr %{{[0-9]}}, align 1 69! LLVMIR: %[[u:.*]] = urem i8 %[[i1]], 2 70! LLVMIR-BE: %[[s:.*]] = sub i8 1, %[[u]] 71! LLVMIR-LE: %[[r:.*]] = extractelement <2 x double> %[[x]], i8 %[[u]] 72! LLVMIR-BE: %[[r:.*]] = extractelement <2 x double> %[[x]], i8 %[[s]] 73! LLVMIR: store double %[[r]], ptr %{{[0-9]}}, align 8 74 75 r = vec_extract(x, i2) 76 77! LLVMIR: %[[x:.*]] = load <2 x double>, ptr %{{[0-9]}}, align 16 78! LLVMIR: %[[i2:.*]] = load i16, ptr %{{[0-9]}}, align 2 79! LLVMIR: %[[u:.*]] = urem i16 %[[i2]], 2 80! LLVMIR-BE: %[[s:.*]] = sub i16 1, %[[u]] 81! LLVMIR-LE: %[[r:.*]] = extractelement <2 x double> %[[x]], i16 %[[u]] 82! LLVMIR-BE: %[[r:.*]] = extractelement <2 x double> %[[x]], i16 %[[s]] 83! LLVMIR: store double %[[r]], ptr %{{[0-9]}}, align 8 84 85 86 r = vec_extract(x, i4) 87 88! LLVMIR: %[[x:.*]] = load <2 x double>, ptr %{{[0-9]}}, align 16 89! LLVMIR: %[[i4:.*]] = load i32, ptr %{{[0-9]}}, align 4 90! LLVMIR: %[[u:.*]] = urem i32 %[[i4]], 2 91! LLVMIR-BE: %[[s:.*]] = sub i32 1, %[[u]] 92! LLVMIR-LE: %[[r:.*]] = extractelement <2 x double> %[[x]], i32 %[[u]] 93! LLVMIR-BE: %[[r:.*]] = extractelement <2 x double> %[[x]], i32 %[[s]] 94! LLVMIR: store double %[[r]], ptr %{{[0-9]}}, align 8 95 96 r = vec_extract(x, i8) 97 98! LLVMIR: %[[x:.*]] = load <2 x double>, ptr %{{[0-9]}}, align 16 99! LLVMIR: %[[i8:.*]] = load i64, ptr %{{[0-9]}}, align 8 100! LLVMIR: %[[u:.*]] = urem i64 %[[i8]], 2 101! LLVMIR-BE: %[[s:.*]] = sub i64 1, %[[u]] 102! LLVMIR-LE: %[[r:.*]] = extractelement <2 x double> %[[x]], i64 %[[u]] 103! LLVMIR-BE: %[[r:.*]] = extractelement <2 x double> %[[x]], i64 %[[s]] 104! LLVMIR: store double %[[r]], ptr %{{[0-9]}}, align 8 105end subroutine vec_extract_testf64 106 107! CHECK-LABEL: vec_extract_testi8 108subroutine vec_extract_testi8(x, i1, i2, i4, i8) 109 vector(integer(1)) :: x 110 integer(1) :: r 111 integer(1) :: i1 112 integer(2) :: i2 113 integer(4) :: i4 114 integer(8) :: i8 115 r = vec_extract(x, i1) 116 117! LLVMIR: %[[x:.*]] = load <16 x i8>, ptr %{{[0-9]}}, align 16 118! LLVMIR: %[[i1:.*]] = load i8, ptr %{{[0-9]}}, align 1 119! LLVMIR: %[[u:.*]] = urem i8 %[[i1]], 16 120! LLVMIR-BE: %[[s:.*]] = sub i8 15, %[[u]] 121! LLVMIR-LE: %[[r:.*]] = extractelement <16 x i8> %[[x]], i8 %[[u]] 122! LLVMIR-BE: %[[r:.*]] = extractelement <16 x i8> %[[x]], i8 %[[s]] 123! LLVMIR: store i8 %[[r]], ptr %{{[0-9]}}, align 1 124 125 r = vec_extract(x, i2) 126 127! LLVMIR: %[[x:.*]] = load <16 x i8>, ptr %{{[0-9]}}, align 16 128! LLVMIR: %[[i2:.*]] = load i16, ptr %{{[0-9]}}, align 2 129! LLVMIR: %[[u:.*]] = urem i16 %[[i2]], 16 130! LLVMIR-BE: %[[s:.*]] = sub i16 15, %[[u]] 131! LLVMIR-LE: %[[r:.*]] = extractelement <16 x i8> %[[x]], i16 %[[u]] 132! LLVMIR-BE: %[[r:.*]] = extractelement <16 x i8> %[[x]], i16 %[[s]] 133! LLVMIR: store i8 %[[r]], ptr %{{[0-9]}}, align 1 134 135 r = vec_extract(x, i4) 136 137! LLVMIR: %[[x:.*]] = load <16 x i8>, ptr %{{[0-9]}}, align 16 138! LLVMIR: %[[i4:.*]] = load i32, ptr %{{[0-9]}}, align 4 139! LLVMIR: %[[u:.*]] = urem i32 %[[i4]], 16 140! LLVMIR-BE: %[[s:.*]] = sub i32 15, %[[u]] 141! LLVMIR-LE: %[[r:.*]] = extractelement <16 x i8> %[[x]], i32 %[[u]] 142! LLVMIR-BE: %[[r:.*]] = extractelement <16 x i8> %[[x]], i32 %[[s]] 143! LLVMIR: store i8 %[[r]], ptr %{{[0-9]}}, align 1 144 145 r = vec_extract(x, i8) 146 147! LLVMIR: %[[x:.*]] = load <16 x i8>, ptr %{{[0-9]}}, align 16 148! LLVMIR: %[[i8:.*]] = load i64, ptr %{{[0-9]}}, align 8 149! LLVMIR: %[[u:.*]] = urem i64 %[[i8]], 16 150! LLVMIR-BE: %[[s:.*]] = sub i64 15, %[[u]] 151! LLVMIR-LE: %[[r:.*]] = extractelement <16 x i8> %[[x]], i64 %[[u]] 152! LLVMIR-BE: %[[r:.*]] = extractelement <16 x i8> %[[x]], i64 %[[s]] 153! LLVMIR: store i8 %[[r]], ptr %{{[0-9]}}, align 1 154end subroutine vec_extract_testi8 155 156! CHECK-LABEL: vec_extract_testi16 157subroutine vec_extract_testi16(x, i1, i2, i4, i8) 158 vector(integer(2)) :: x 159 integer(2) :: r 160 integer(1) :: i1 161 integer(2) :: i2 162 integer(4) :: i4 163 integer(8) :: i8 164 r = vec_extract(x, i1) 165 166! LLVMIR: %[[x:.*]] = load <8 x i16>, ptr %{{[0-9]}}, align 16 167! LLVMIR: %[[i1:.*]] = load i8, ptr %{{[0-9]}}, align 1 168! LLVMIR: %[[u:.*]] = urem i8 %[[i1]], 8 169! LLVMIR-BE: %[[s:.*]] = sub i8 7, %[[u]] 170! LLVMIR-LE: %[[r:.*]] = extractelement <8 x i16> %[[x]], i8 %[[u]] 171! LLVMIR-BE: %[[r:.*]] = extractelement <8 x i16> %[[x]], i8 %[[s]] 172! LLVMIR: store i16 %[[r]], ptr %{{[0-9]}}, align 2 173 174 r = vec_extract(x, i2) 175 176! LLVMIR: %[[x:.*]] = load <8 x i16>, ptr %{{[0-9]}}, align 16 177! LLVMIR: %[[i2:.*]] = load i16, ptr %{{[0-9]}}, align 2 178! LLVMIR: %[[u:.*]] = urem i16 %[[i2]], 8 179! LLVMIR-BE: %[[s:.*]] = sub i16 7, %[[u]] 180! LLVMIR-LE: %[[r:.*]] = extractelement <8 x i16> %[[x]], i16 %[[u]] 181! LLVMIR-BE: %[[r:.*]] = extractelement <8 x i16> %[[x]], i16 %[[s]] 182! LLVMIR: store i16 %[[r]], ptr %{{[0-9]}}, align 2 183 184 r = vec_extract(x, i4) 185 186! LLVMIR: %[[x:.*]] = load <8 x i16>, ptr %{{[0-9]}}, align 16 187! LLVMIR: %[[i4:.*]] = load i32, ptr %{{[0-9]}}, align 4 188! LLVMIR: %[[u:.*]] = urem i32 %[[i4]], 8 189! LLVMIR-BE: %[[s:.*]] = sub i32 7, %[[u]] 190! LLVMIR-LE: %[[r:.*]] = extractelement <8 x i16> %[[x]], i32 %[[u]] 191! LLVMIR-BE: %[[r:.*]] = extractelement <8 x i16> %[[x]], i32 %[[s]] 192! LLVMIR: store i16 %[[r]], ptr %{{[0-9]}}, align 2 193 194 r = vec_extract(x, i8) 195 196! LLVMIR: %[[x:.*]] = load <8 x i16>, ptr %{{[0-9]}}, align 16 197! LLVMIR: %[[i8:.*]] = load i64, ptr %{{[0-9]}}, align 8 198! LLVMIR: %[[u:.*]] = urem i64 %[[i8]], 8 199! LLVMIR-BE: %[[s:.*]] = sub i64 7, %[[u]] 200! LLVMIR-LE: %[[r:.*]] = extractelement <8 x i16> %[[x]], i64 %[[u]] 201! LLVMIR-BE: %[[r:.*]] = extractelement <8 x i16> %[[x]], i64 %[[s]] 202! LLVMIR: store i16 %[[r]], ptr %{{[0-9]}}, align 2 203end subroutine vec_extract_testi16 204 205! CHECK-LABEL: vec_extract_testi32 206subroutine vec_extract_testi32(x, i1, i2, i4, i8) 207 vector(integer(4)) :: x 208 integer(4) :: r 209 integer(1) :: i1 210 integer(2) :: i2 211 integer(4) :: i4 212 integer(8) :: i8 213 r = vec_extract(x, i1) 214 215! LLVMIR: %[[x:.*]] = load <4 x i32>, ptr %{{[0-9]}}, align 16 216! LLVMIR: %[[i1:.*]] = load i8, ptr %{{[0-9]}}, align 1 217! LLVMIR: %[[u:.*]] = urem i8 %[[i1]], 4 218! LLVMIR-BE: %[[s:.*]] = sub i8 3, %[[u]] 219! LLVMIR-LE: %[[r:.*]] = extractelement <4 x i32> %[[x]], i8 %[[u]] 220! LLVMIR-BE: %[[r:.*]] = extractelement <4 x i32> %[[x]], i8 %[[s]] 221! LLVMIR: store i32 %[[r]], ptr %{{[0-9]}}, align 4 222 223 r = vec_extract(x, i2) 224 225! LLVMIR: %[[x:.*]] = load <4 x i32>, ptr %{{[0-9]}}, align 16 226! LLVMIR: %[[i2:.*]] = load i16, ptr %{{[0-9]}}, align 2 227! LLVMIR: %[[u:.*]] = urem i16 %[[i2]], 4 228! LLVMIR-BE: %[[s:.*]] = sub i16 3, %[[u]] 229! LLVMIR-LE: %[[r:.*]] = extractelement <4 x i32> %[[x]], i16 %[[u]] 230! LLVMIR-BE: %[[r:.*]] = extractelement <4 x i32> %[[x]], i16 %[[s]] 231! LLVMIR: store i32 %[[r]], ptr %{{[0-9]}}, align 4 232 233 r = vec_extract(x, i4) 234 235! LLVMIR: %[[x:.*]] = load <4 x i32>, ptr %{{[0-9]}}, align 16 236! LLVMIR: %[[i4:.*]] = load i32, ptr %{{[0-9]}}, align 4 237! LLVMIR: %[[u:.*]] = urem i32 %[[i4]], 4 238! LLVMIR-BE: %[[s:.*]] = sub i32 3, %[[u]] 239! LLVMIR-LE: %[[r:.*]] = extractelement <4 x i32> %[[x]], i32 %[[u]] 240! LLVMIR-BE: %[[r:.*]] = extractelement <4 x i32> %[[x]], i32 %[[s]] 241! LLVMIR: store i32 %[[r]], ptr %{{[0-9]}}, align 4 242 243 r = vec_extract(x, i8) 244 245! LLVMIR: %[[x:.*]] = load <4 x i32>, ptr %{{[0-9]}}, align 16 246! LLVMIR: %[[i8:.*]] = load i64, ptr %{{[0-9]}}, align 8 247! LLVMIR: %[[u:.*]] = urem i64 %[[i8]], 4 248! LLVMIR-BE: %[[s:.*]] = sub i64 3, %[[u]] 249! LLVMIR-LE: %[[r:.*]] = extractelement <4 x i32> %[[x]], i64 %[[u]] 250! LLVMIR-BE: %[[r:.*]] = extractelement <4 x i32> %[[x]], i64 %[[s]] 251! LLVMIR: store i32 %[[r]], ptr %{{[0-9]}}, align 4 252end subroutine vec_extract_testi32 253 254! CHECK-LABEL: vec_extract_testi64 255subroutine vec_extract_testi64(x, i1, i2, i4, i8) 256 vector(integer(8)) :: x 257 integer(8) :: r 258 integer(1) :: i1 259 integer(2) :: i2 260 integer(4) :: i4 261 integer(8) :: i8 262 r = vec_extract(x, i1) 263 264! LLVMIR: %[[x:.*]] = load <2 x i64>, ptr %{{[0-9]}}, align 16 265! LLVMIR: %[[i1:.*]] = load i8, ptr %{{[0-9]}}, align 1 266! LLVMIR: %[[u:.*]] = urem i8 %[[i1]], 2 267! LLVMIR-BE: %[[s:.*]] = sub i8 1, %[[u]] 268! LLVMIR-LE: %[[r:.*]] = extractelement <2 x i64> %[[x]], i8 %[[u]] 269! LLVMIR-BE: %[[r:.*]] = extractelement <2 x i64> %[[x]], i8 %[[s]] 270! LLVMIR: store i64 %[[r]], ptr %{{[0-9]}}, align 8 271 272 r = vec_extract(x, i2) 273 274! LLVMIR: %[[x:.*]] = load <2 x i64>, ptr %{{[0-9]}}, align 16 275! LLVMIR: %[[i2:.*]] = load i16, ptr %{{[0-9]}}, align 2 276! LLVMIR: %[[u:.*]] = urem i16 %[[i2]], 2 277! LLVMIR-BE: %[[s:.*]] = sub i16 1, %[[u]] 278! LLVMIR-LE: %[[r:.*]] = extractelement <2 x i64> %[[x]], i16 %[[u]] 279! LLVMIR-BE: %[[r:.*]] = extractelement <2 x i64> %[[x]], i16 %[[s]] 280! LLVMIR: store i64 %[[r]], ptr %{{[0-9]}}, align 8 281 282 r = vec_extract(x, i4) 283 284! LLVMIR: %[[x:.*]] = load <2 x i64>, ptr %{{[0-9]}}, align 16 285! LLVMIR: %[[i4:.*]] = load i32, ptr %{{[0-9]}}, align 4 286! LLVMIR: %[[u:.*]] = urem i32 %[[i4]], 2 287! LLVMIR-BE: %[[s:.*]] = sub i32 1, %[[u]] 288! LLVMIR-LE: %[[r:.*]] = extractelement <2 x i64> %[[x]], i32 %[[u]] 289! LLVMIR-BE: %[[r:.*]] = extractelement <2 x i64> %[[x]], i32 %[[s]] 290! LLVMIR: store i64 %[[r]], ptr %{{[0-9]}}, align 8 291 292 r = vec_extract(x, i8) 293 294! LLVMIR: %[[x:.*]] = load <2 x i64>, ptr %{{[0-9]}}, align 16 295! LLVMIR: %[[i8:.*]] = load i64, ptr %{{[0-9]}}, align 8 296! LLVMIR: %[[u:.*]] = urem i64 %[[i8]], 2 297! LLVMIR-BE: %[[s:.*]] = sub i64 1, %[[u]] 298! LLVMIR-LE: %[[r:.*]] = extractelement <2 x i64> %[[x]], i64 %[[u]] 299! LLVMIR-BE: %[[r:.*]] = extractelement <2 x i64> %[[x]], i64 %[[s]] 300! LLVMIR: store i64 %[[r]], ptr %{{[0-9]}}, align 8 301end subroutine vec_extract_testi64 302