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