@@ -194,4 +194,93 @@ TEST_F(ARMSelectionDAGTest, computeKnownBits_VBICIMM_cmode2_lhs_ones) {
194194 EXPECT_EQ (Known.Zero , APInt (32 , 0x0000AA00 ));
195195}
196196
197+
198+ // / VMOVIMM: Move immediate to vector register.
199+ // / cmode=0x0 puts imm8 in byte0 => per-lane constant = 0x000000AA.
200+ // / All bits are known since this creates a pure constant.
201+ TEST_F (ARMSelectionDAGTest, computeKnownBits_VMOVIMM) {
202+ SDLoc DL;
203+ EVT VT = MVT::v4i32;
204+
205+ // Encoded immediate: cmode=0x0, imm8=0xAA => per-lane = 0x000000AA
206+ SDValue EncSD =
207+ DAG->getTargetConstant (ARM_AM::createVMOVModImm (0x0 , 0xAA ), DL, MVT::i32 );
208+ SDValue Op = DAG->getNode (ARMISD::VMOVIMM, DL, VT, EncSD);
209+
210+ // VMOVIMM creates a constant, so all bits are known
211+ // Encoded (per-lane) = 00000000 00000000 00000000 10101010 (0x000000AA)
212+ // =>
213+ // Known.One = 00000000 00000000 00000000 10101010 (0x000000AA)
214+ // Known.Zero = 11111111 11111111 11111111 01010101 (0xFFFFFF55)
215+ APInt DemandedElts = APInt::getAllOnes (4 );
216+ KnownBits Known = DAG->computeKnownBits (Op, DemandedElts);
217+ EXPECT_EQ (Known.One , APInt (32 , 0x000000AA ));
218+ EXPECT_EQ (Known.Zero , APInt (32 , 0xFFFFFF55 ));
219+ }
220+
221+ // / VMOVIMM with cmode=0x2 (shifted 32-bit elements).
222+ // / imm8=0xAB, cmode=0x2 => per-lane = 0x0000AB00.
223+ TEST_F (ARMSelectionDAGTest, computeKnownBits_VMOVIMM_cmode2) {
224+ SDLoc DL;
225+ EVT VT = MVT::v4i32;
226+
227+ // Encoded immediate: cmode=0x2, imm8=0xAB => per-lane = 0x0000AB00
228+ SDValue EncSD =
229+ DAG->getTargetConstant (ARM_AM::createVMOVModImm (0x2 , 0xAB ), DL, MVT::i32 );
230+ SDValue Op = DAG->getNode (ARMISD::VMOVIMM, DL, VT, EncSD);
231+
232+ APInt DemandedElts = APInt::getAllOnes (4 );
233+ KnownBits Known = DAG->computeKnownBits (Op, DemandedElts);
234+ EXPECT_EQ (Known.One , APInt (32 , 0x0000AB00 ));
235+ EXPECT_EQ (Known.Zero , APInt (32 , 0xFFFF54FF ));
236+ }
237+
238+ // / VMVNIMM: Move NOT immediate to vector register.
239+ // / cmode=0x0 puts imm8 in byte0 => decoded = 0x000000AA, result = ~0x000000AA.
240+ // / All bits are known since this creates a pure constant (inverted).
241+ TEST_F (ARMSelectionDAGTest, computeKnownBits_VMVNIMM) {
242+ SDLoc DL;
243+ EVT VT = MVT::v4i32;
244+
245+ // Encoded immediate: cmode=0x0, imm8=0xAA => decoded = 0x000000AA
246+ // VMVNIMM inverts it => result = 0xFFFFFF55
247+ SDValue EncSD =
248+ DAG->getTargetConstant (ARM_AM::createVMOVModImm (0x0 , 0xAA ), DL, MVT::i32 );
249+ SDValue Op = DAG->getNode (ARMISD::VMVNIMM, DL, VT, EncSD);
250+
251+ // VMVNIMM creates ~constant, so all bits are known
252+ // Decoded (per-lane) = 00000000 00000000 00000000 10101010 (0x000000AA)
253+ // Inverted (per-lane) = 11111111 11111111 11111111 01010101 (0xFFFFFF55)
254+ // =>
255+ // Known.One = 11111111 11111111 11111111 01010101 (0xFFFFFF55)
256+ // Known.Zero = 00000000 00000000 00000000 10101010 (0x000000AA)
257+ APInt DemandedElts = APInt::getAllOnes (4 );
258+ KnownBits Known = DAG->computeKnownBits (Op, DemandedElts);
259+ EXPECT_EQ (Known.One , APInt (32 , 0xFFFFFF55 ));
260+ EXPECT_EQ (Known.Zero , APInt (32 , 0x000000AA ));
261+ }
262+
263+ // / VMVNIMM with cmode=0x2 (16-bit shifted elements).
264+ // / imm8=0xAA, cmode=0x2 => decoded = 0x0000AA00, result = ~0x0000AA00.
265+ TEST_F (ARMSelectionDAGTest, computeKnownBits_VMVNIMM_cmode2) {
266+ SDLoc DL;
267+ EVT VT = MVT::v4i32;
268+
269+ // Encoded immediate: cmode=0x2, imm8=0xAA => decoded = 0x0000AA00
270+ // VMVNIMM inverts it => result = 0xFFFF55FF
271+ SDValue EncSD =
272+ DAG->getTargetConstant (ARM_AM::createVMOVModImm (0x2 , 0xAA ), DL, MVT::i32 );
273+ SDValue Op = DAG->getNode (ARMISD::VMVNIMM, DL, VT, EncSD);
274+
275+ // Decoded (per-lane) = 00000000 00000000 10101010 00000000 (0x0000AA00)
276+ // Inverted (per-lane) = 11111111 11111111 01010101 11111111 (0xFFFF55FF)
277+ // =>
278+ // Known.One = 11111111 11111111 01010101 11111111 (0xFFFF55FF)
279+ // Known.Zero = 00000000 00000000 10101010 00000000 (0x0000AA00)
280+ APInt DemandedElts = APInt::getAllOnes (4 );
281+ KnownBits Known = DAG->computeKnownBits (Op, DemandedElts);
282+ EXPECT_EQ (Known.One , APInt (32 , 0xFFFF55FF ));
283+ EXPECT_EQ (Known.Zero , APInt (32 , 0x0000AA00 ));
284+ }
285+
197286} // end namespace llvm
0 commit comments