@@ -990,6 +990,7 @@ void foo14() {
990990// OGCG: %[[TMP_B:.*]] = load <4 x float>, ptr %[[VEC_B]], align 16
991991// OGCG: %[[GE:.*]] = fcmp oge <4 x float> %[[TMP_A]], %[[TMP_B]]
992992// OGCG: %[[RES:.*]] = sext <4 x i1> %[[GE]] to <4 x i32>
993+ // OGCG: store <4 x i32> %[[RES]], ptr {{.*}}, align 16
993994
994995void foo15 () {
995996 vi4 a;
@@ -1092,6 +1093,69 @@ void foo17() {
10921093// OGCG: %[[TMP:.*]] = load <2 x double>, ptr %[[VEC_A]], align 16
10931094// OGCG: %[[RES:.*]]= fptoui <2 x double> %[[TMP]] to <2 x i16>
10941095
1096+ void foo18 () {
1097+ vi4 a = {1 , 2 , 3 , 4 };
1098+ vi4 shl = a << 3 ;
1099+
1100+ uvi4 b = {1u , 2u , 3u , 4u };
1101+ uvi4 shr = b >> 3u ;
1102+ }
1103+
1104+ // CIR: %[[VEC_A:.*]] = cir.alloca !cir.vector<4 x !s32i>, !cir.ptr<!cir.vector<4 x !s32i>>, ["a", init]
1105+ // CIR: %[[SHL_RES:.*]] = cir.alloca !cir.vector<4 x !s32i>, !cir.ptr<!cir.vector<4 x !s32i>>, ["shl", init]
1106+ // CIR: %[[VEC_B:.*]] = cir.alloca !cir.vector<4 x !u32i>, !cir.ptr<!cir.vector<4 x !u32i>>, ["b", init]
1107+ // CIR: %[[SHR_RES:.*]] = cir.alloca !cir.vector<4 x !u32i>, !cir.ptr<!cir.vector<4 x !u32i>>, ["shr", init]
1108+ // CIR: %[[CONST_1:.*]] = cir.const #cir.int<1> : !s32i
1109+ // CIR: %[[CONST_2:.*]] = cir.const #cir.int<2> : !s32i
1110+ // CIR: %[[CONST_3:.*]] = cir.const #cir.int<3> : !s32i
1111+ // CIR: %[[CONST_4:.*]] = cir.const #cir.int<4> : !s32i
1112+ // CIR: %[[VEC_A_VAL:.*]] = cir.vec.create(%[[CONST_1]], %[[CONST_2]], %[[CONST_3]], %[[CONST_4]] :
1113+ // CIR-SAME: !s32i, !s32i, !s32i, !s32i) : !cir.vector<4 x !s32i>
1114+ // CIR: cir.store{{.*}} %[[VEC_A_VAL]], %[[VEC_A]] : !cir.vector<4 x !s32i>, !cir.ptr<!cir.vector<4 x !s32i>>
1115+ // CIR: %[[TMP_A:.*]] = cir.load{{.*}} %[[VEC_A]] : !cir.ptr<!cir.vector<4 x !s32i>>, !cir.vector<4 x !s32i>
1116+ // CIR: %[[SH_AMOUNT:.*]] = cir.const #cir.int<3> : !s32i
1117+ // CIR: %[[SPLAT_VEC:.*]] = cir.vec.splat %[[SH_AMOUNT]] : !s32i, !cir.vector<4 x !s32i>
1118+ // CIR: %[[SHL:.*]] = cir.shift(left, %[[TMP_A]] : !cir.vector<4 x !s32i>, %[[SPLAT_VEC]] : !cir.vector<4 x !s32i>) -> !cir.vector<4 x !s32i>
1119+ // CIR: cir.store{{.*}} %[[SHL]], %[[SHL_RES]] : !cir.vector<4 x !s32i>, !cir.ptr<!cir.vector<4 x !s32i>>
1120+ // CIR: %[[CONST_1:.*]] = cir.const #cir.int<1> : !u32i
1121+ // CIR: %[[CONST_2:.*]] = cir.const #cir.int<2> : !u32i
1122+ // CIR: %[[CONST_3:.*]] = cir.const #cir.int<3> : !u32i
1123+ // CIR: %[[CONST_4:.*]] = cir.const #cir.int<4> : !u32i
1124+ // CIR: %[[VEC_B_VAL:.*]] = cir.vec.create(%[[CONST_1]], %[[CONST_2]], %[[CONST_3]], %[[CONST_4]] :
1125+ // CIR-SAME: !u32i, !u32i, !u32i, !u32i) : !cir.vector<4 x !u32i>
1126+ // CIR: cir.store{{.*}} %[[VEC_B_VAL]], %[[VEC_B]] : !cir.vector<4 x !u32i>, !cir.ptr<!cir.vector<4 x !u32i>>
1127+ // CIR: %[[TMP_B:.*]] = cir.load{{.*}} %[[VEC_B]] : !cir.ptr<!cir.vector<4 x !u32i>>, !cir.vector<4 x !u32i>
1128+ // CIR: %[[SH_AMOUNT:.*]] = cir.const #cir.int<3> : !u32i
1129+ // CIR: %[[SPLAT_VEC:.*]] = cir.vec.splat %[[SH_AMOUNT]] : !u32i, !cir.vector<4 x !u32i>
1130+ // CIR: %[[SHR:.*]] = cir.shift(right, %[[TMP_B]] : !cir.vector<4 x !u32i>, %[[SPLAT_VEC]] : !cir.vector<4 x !u32i>) -> !cir.vector<4 x !u32i>
1131+ // CIR: cir.store{{.*}} %[[SHR]], %[[SHR_RES]] : !cir.vector<4 x !u32i>, !cir.ptr<!cir.vector<4 x !u32i>>
1132+
1133+ // LLVM: %[[VEC_A:.*]] = alloca <4 x i32>, i64 1, align 16
1134+ // LLVM: %[[SHL_RES:.*]] = alloca <4 x i32>, i64 1, align 16
1135+ // LLVM: %[[VEC_B:.*]] = alloca <4 x i32>, i64 1, align 16
1136+ // LLVM: %[[SHR_RES:.*]] = alloca <4 x i32>, i64 1, align 16
1137+ // LLVM: store <4 x i32> <i32 1, i32 2, i32 3, i32 4>, ptr %[[VEC_A]], align 16
1138+ // LLVM: %[[TMP_A:.*]] = load <4 x i32>, ptr %[[VEC_A]], align 16
1139+ // LLVM: %[[SHL:.*]] = shl <4 x i32> %[[TMP_A]], splat (i32 3)
1140+ // LLVM: store <4 x i32> %[[SHL]], ptr %[[SHL_RES]], align 16
1141+ // LLVM: store <4 x i32> <i32 1, i32 2, i32 3, i32 4>, ptr %[[VEC_B]], align 16
1142+ // LLVM: %[[TMP_B:.*]] = load <4 x i32>, ptr %[[VEC_B]], align 16
1143+ // LLVM: %[[SHR:.*]] = lshr <4 x i32> %[[TMP_B]], splat (i32 3)
1144+ // LLVM: store <4 x i32> %[[SHR]], ptr %[[SHR_RES]], align 16
1145+
1146+ // OGCG: %[[VEC_A:.*]] = alloca <4 x i32>, align 16
1147+ // OGCG: %[[SHL_RES:.*]] = alloca <4 x i32>, align 16
1148+ // OGCG: %[[VEC_B:.*]] = alloca <4 x i32>, align 16
1149+ // OGCG: %[[SHR_RES:.*]] = alloca <4 x i32>, align 16
1150+ // OGCG: store <4 x i32> <i32 1, i32 2, i32 3, i32 4>, ptr %[[VEC_A]], align 16
1151+ // OGCG: %[[TMP_A:.*]] = load <4 x i32>, ptr %[[VEC_A]], align 16
1152+ // OGCG: %[[SHL:.*]] = shl <4 x i32> %[[TMP_A]], splat (i32 3)
1153+ // OGCG: store <4 x i32> %[[SHL]], ptr %[[SHL_RES]], align 16
1154+ // OGCG: store <4 x i32> <i32 1, i32 2, i32 3, i32 4>, ptr %[[VEC_B]], align 16
1155+ // OGCG: %[[TMP_B:.*]] = load <4 x i32>, ptr %[[VEC_B]], align 16
1156+ // OGCG: %[[SHR:.*]] = lshr <4 x i32> %[[TMP_B]], splat (i32 3)
1157+ // OGCG: store <4 x i32> %[[SHR]], ptr %[[SHR_RES]], align 16
1158+
10951159void foo19 () {
10961160 vi4 a;
10971161 vi4 b;
0 commit comments