@@ -336,3 +336,68 @@ void foo7() {
336336// OGCG: %[[TMP2:.*]] = load <4 x i32>, ptr %[[VEC]], align 16
337337// OGCG: %[[NEW_VEC:.*]] = insertelement <4 x i32> %[[TMP2]], i32 %[[RES]], i32 2
338338// OGCG: store <4 x i32> %[[NEW_VEC]], ptr %[[VEC]], align 16
339+
340+ void foo9 () {
341+ vi4 a = {1 , 2 , 3 , 4 };
342+ vi4 b = {5 , 6 , 7 , 8 };
343+
344+ vi4 shl = a << b;
345+ vi4 shr = a >> b;
346+ }
347+
348+ // CIR: %[[VEC_A:.*]] = cir.alloca !cir.vector<4 x !s32i>, !cir.ptr<!cir.vector<4 x !s32i>>, ["a", init]
349+ // CIR: %[[VEC_B:.*]] = cir.alloca !cir.vector<4 x !s32i>, !cir.ptr<!cir.vector<4 x !s32i>>, ["b", init]
350+ // CIR: %[[SHL_RES:.*]] = cir.alloca !cir.vector<4 x !s32i>, !cir.ptr<!cir.vector<4 x !s32i>>, ["shl", init]
351+ // CIR: %[[SHR_RES:.*]] = cir.alloca !cir.vector<4 x !s32i>, !cir.ptr<!cir.vector<4 x !s32i>>, ["shr", init]
352+ // CIR: %[[CONST_1:.*]] = cir.const #cir.int<1> : !s32i
353+ // CIR: %[[CONST_2:.*]] = cir.const #cir.int<2> : !s32i
354+ // CIR: %[[CONST_3:.*]] = cir.const #cir.int<3> : !s32i
355+ // CIR: %[[CONST_4:.*]] = cir.const #cir.int<4> : !s32i
356+ // CIR: %[[VEC_A_VAL:.*]] = cir.vec.create(%[[CONST_1]], %[[CONST_2]], %[[CONST_3]], %[[CONST_4]] :
357+ // CIR-SAME: !s32i, !s32i, !s32i, !s32i) : !cir.vector<4 x !s32i>
358+ // CIR: cir.store %[[VEC_A_VAL]], %[[VEC_A]] : !cir.vector<4 x !s32i>, !cir.ptr<!cir.vector<4 x !s32i>>
359+ // CIR: %[[CONST_5:.*]] = cir.const #cir.int<5> : !s32i
360+ // CIR: %[[CONST_6:.*]] = cir.const #cir.int<6> : !s32i
361+ // CIR: %[[CONST_7:.*]] = cir.const #cir.int<7> : !s32i
362+ // CIR: %[[CONST_8:.*]] = cir.const #cir.int<8> : !s32i
363+ // CIR: %[[VEC_B_VAL:.*]] = cir.vec.create(%[[CONST_5]], %[[CONST_6]], %[[CONST_7]], %[[CONST_8]] :
364+ // CIR-SAME: !s32i, !s32i, !s32i, !s32i) : !cir.vector<4 x !s32i>
365+ // CIR: cir.store %[[VEC_B_VAL]], %[[VEC_B]] : !cir.vector<4 x !s32i>, !cir.ptr<!cir.vector<4 x !s32i>>
366+ // CIR: %[[TMP_A:.*]] = cir.load %[[VEC_A]] : !cir.ptr<!cir.vector<4 x !s32i>>, !cir.vector<4 x !s32i>
367+ // CIR: %[[TMP_B:.*]] = cir.load %[[VEC_B]] : !cir.ptr<!cir.vector<4 x !s32i>>, !cir.vector<4 x !s32i>
368+ // CIR: %[[SHL:.*]] = cir.shift(left, %[[TMP_A]] : !cir.vector<4 x !s32i>, %[[TMP_B]] : !cir.vector<4 x !s32i>) -> !cir.vector<4 x !s32i>
369+ // CIR: cir.store %[[SHL]], %[[SHL_RES]] : !cir.vector<4 x !s32i>, !cir.ptr<!cir.vector<4 x !s32i>>
370+ // CIR: %[[TMP_A:.*]] = cir.load %[[VEC_A]] : !cir.ptr<!cir.vector<4 x !s32i>>, !cir.vector<4 x !s32i>
371+ // CIR: %[[TMP_B:.*]] = cir.load %[[VEC_B]] : !cir.ptr<!cir.vector<4 x !s32i>>, !cir.vector<4 x !s32i>
372+ // CIR: %[[SHR:.*]] = cir.shift(right, %[[TMP_A]] : !cir.vector<4 x !s32i>, %[[TMP_B]] : !cir.vector<4 x !s32i>) -> !cir.vector<4 x !s32i>
373+ // CIR: cir.store %[[SHR]], %[[SHR_RES]] : !cir.vector<4 x !s32i>, !cir.ptr<!cir.vector<4 x !s32i>>
374+
375+ // LLVM: %[[VEC_A:.*]] = alloca <4 x i32>, i64 1, align 16
376+ // LLVM: %[[VEC_B:.*]] = alloca <4 x i32>, i64 1, align 16
377+ // LLVM: %[[SHL_RES:.*]] = alloca <4 x i32>, i64 1, align 16
378+ // LLVM: %[[SHR_RES:.*]] = alloca <4 x i32>, i64 1, align 16
379+ // LLVM: store <4 x i32> <i32 1, i32 2, i32 3, i32 4>, ptr %[[VEC_A]], align 16
380+ // LLVM: store <4 x i32> <i32 5, i32 6, i32 7, i32 8>, ptr %[[VEC_B]], align 16
381+ // LLVM: %[[TMP_A:.*]] = load <4 x i32>, ptr %[[VEC_A]], align 16
382+ // LLVM: %[[TMP_B:.*]] = load <4 x i32>, ptr %[[VEC_B]], align 16
383+ // LLVM: %[[SHL:.*]] = shl <4 x i32> %[[TMP_A]], %[[TMP_B]]
384+ // LLVM: store <4 x i32> %[[SHL]], ptr %[[SHL_RES]], align 16
385+ // LLVM: %[[TMP_A:.*]] = load <4 x i32>, ptr %[[VEC_A]], align 16
386+ // LLVM: %[[TMP_B:.*]] = load <4 x i32>, ptr %[[VEC_B]], align 16
387+ // LLVM: %[[SHR:.*]] = ashr <4 x i32> %[[TMP_A]], %[[TMP_B]]
388+ // LLVM: store <4 x i32> %[[SHR]], ptr %[[SHR_RES]], align 16
389+
390+ // OGCG: %[[VEC_A:.*]] = alloca <4 x i32>, align 16
391+ // OGCG: %[[VEC_B:.*]] = alloca <4 x i32>, align 16
392+ // OGCG: %[[SHL_RES:.*]] = alloca <4 x i32>, align 16
393+ // OGCG: %[[SHR_RES:.*]] = alloca <4 x i32>, align 16
394+ // OGCG: store <4 x i32> <i32 1, i32 2, i32 3, i32 4>, ptr %[[VEC_A]], align 16
395+ // OGCG: store <4 x i32> <i32 5, i32 6, i32 7, i32 8>, ptr %[[VEC_B]], align 16
396+ // OGCG: %[[TMP_A:.*]] = load <4 x i32>, ptr %[[VEC_A]], align 16
397+ // OGCG: %[[TMP_B:.*]] = load <4 x i32>, ptr %[[VEC_B]], align 16
398+ // OGCG: %[[SHL:.*]] = shl <4 x i32> %[[TMP_A]], %[[TMP_B]]
399+ // OGCG: store <4 x i32> %[[SHL]], ptr %[[SHL_RES]], align 16
400+ // OGCG: %[[TMP_A:.*]] = load <4 x i32>, ptr %[[VEC_A]], align 16
401+ // OGCG: %[[TMP_B:.*]] = load <4 x i32>, ptr %[[VEC_B]], align 16
402+ // OGCG: %[[SHR:.*]] = ashr <4 x i32> %[[TMP_A]], %[[TMP_B]]
403+ // OGCG: store <4 x i32> %[[SHR]], ptr %[[SHR_RES]], align 16
0 commit comments