@@ -321,57 +321,111 @@ TEST_F(AArch64SelectionDAGTest, ComputeKnownBits_UADDO_CARRY) {
321321// Piggy-backing on the AArch64 tests to verify SelectionDAG::computeKnownBits.
322322TEST_F (AArch64SelectionDAGTest, ComputeKnownBits_MOVI) {
323323 SDLoc Loc;
324- auto Int8VT = EVT::getIntegerVT (Context, 8 );
325- auto Int16VT = EVT::getIntegerVT (Context, 16 );
326- auto Int32VT = EVT::getIntegerVT (Context, 32 );
327- auto Int64VT = EVT::getIntegerVT (Context, 64 );
328- auto N0 = DAG->getConstant (0xA5 , Loc, Int8VT);
324+ auto IntSca32VT = MVT::i32 ;
325+ auto Int8Vec8VT = MVT::v8i8;
326+ auto Int16Vec8VT = MVT::v16i8;
327+ auto Int4Vec16VT = MVT::v4i16;
328+ auto Int8Vec16VT = MVT::v8i16;
329+ auto Int2Vec32VT = MVT::v2i32;
330+ auto Int4Vec32VT = MVT::v4i32;
331+ auto IntVec64VT = MVT::v1i64;
332+ auto Int2Vec64VT = MVT::v2i64;
333+ auto N0 = DAG->getConstant (0x000000A5 , Loc, IntSca32VT);
329334 KnownBits Known;
330335
331- auto OpMOVIedit = DAG->getNode (AArch64ISD::MOVIedit, Loc, Int64VT , N0);
332- Known = DAG->computeKnownBits (OpMOVIedit );
336+ auto OpMOVIedit64 = DAG->getNode (AArch64ISD::MOVIedit, Loc, IntVec64VT , N0);
337+ Known = DAG->computeKnownBits (OpMOVIedit64 );
333338 EXPECT_EQ (Known.Zero , APInt (64 , 0x00FF00FFFF00FF00 ));
334339 EXPECT_EQ (Known.One , APInt (64 , 0xFF00FF0000FF00FF ));
335340
336- auto N1 = DAG->getConstant (16 , Loc, Int8VT);
337- auto OpMOVImsl = DAG->getNode (AArch64ISD::MOVImsl, Loc, Int32VT, N0, N1);
338- Known = DAG->computeKnownBits (OpMOVImsl);
341+ auto OpMOVIedit128 = DAG->getNode (AArch64ISD::MOVIedit, Loc, Int2Vec64VT, N0);
342+ Known = DAG->computeKnownBits (OpMOVIedit128);
343+ EXPECT_EQ (Known.Zero , APInt (64 , 0x00FF00FFFF00FF00 ));
344+ EXPECT_EQ (Known.One , APInt (64 , 0xFF00FF0000FF00FF ));
345+
346+ auto N1 = DAG->getConstant (264 , Loc, IntSca32VT);
347+ auto OpMOVImsl64 =
348+ DAG->getNode (AArch64ISD::MOVImsl, Loc, Int2Vec32VT, N0, N1);
349+ Known = DAG->computeKnownBits (OpMOVImsl64);
350+ EXPECT_EQ (Known.Zero , APInt (32 , 0xFFFF5A00 ));
351+ EXPECT_EQ (Known.One , APInt (32 , 0x0000A5FF ));
352+
353+ auto N2 = DAG->getConstant (272 , Loc, IntSca32VT);
354+ auto OpMOVImsl128 =
355+ DAG->getNode (AArch64ISD::MOVImsl, Loc, Int4Vec32VT, N0, N2);
356+ Known = DAG->computeKnownBits (OpMOVImsl128);
339357 EXPECT_EQ (Known.Zero , APInt (32 , 0xFF5A0000 ));
340358 EXPECT_EQ (Known.One , APInt (32 , 0x00A5FFFF ));
341359
342- auto OpMVNImsl = DAG->getNode (AArch64ISD::MVNImsl, Loc, Int32VT, N0, N1);
343- Known = DAG->computeKnownBits (OpMVNImsl);
360+ auto OpMVNImsl64 =
361+ DAG->getNode (AArch64ISD::MVNImsl, Loc, Int2Vec32VT, N0, N2);
362+ Known = DAG->computeKnownBits (OpMVNImsl64);
344363 EXPECT_EQ (Known.Zero , APInt (32 , 0x00A50000 ));
345364 EXPECT_EQ (Known.One , APInt (32 , 0xFF5AFFFF ));
346365
347- auto N2 = DAG->getConstant (16 , Loc, Int8VT);
348- auto OpMOVIshift32 =
349- DAG->getNode (AArch64ISD::MOVIshift, Loc, Int32VT, N0, N2);
350- Known = DAG->computeKnownBits (OpMOVIshift32);
351- EXPECT_EQ (Known.Zero , APInt (32 , 0xFF5AFFFF ));
352- EXPECT_EQ (Known.One , APInt (32 , 0x00A50000 ));
353-
354- auto OpMVNIshift32 =
355- DAG->getNode (AArch64ISD::MVNIshift, Loc, Int32VT, N0, N2);
356- Known = DAG->computeKnownBits (OpMVNIshift32);
357- EXPECT_EQ (Known.Zero , APInt (32 , 0x00A5FFFF ));
358- EXPECT_EQ (Known.One , APInt (32 , 0xFF5A0000 ));
359-
360- auto N3 = DAG->getConstant (8 , Loc, Int8VT);
361- auto OpMOVIshift16 =
362- DAG->getNode (AArch64ISD::MOVIshift, Loc, Int16VT, N0, N3);
363- Known = DAG->computeKnownBits (OpMOVIshift16);
366+ auto OpMVNImsl128 =
367+ DAG->getNode (AArch64ISD::MVNImsl, Loc, Int4Vec32VT, N0, N1);
368+ Known = DAG->computeKnownBits (OpMVNImsl128);
369+ EXPECT_EQ (Known.Zero , APInt (32 , 0x0000A500 ));
370+ EXPECT_EQ (Known.One , APInt (32 , 0xFFFF5AFF ));
371+
372+ auto N3 = DAG->getConstant (0 , Loc, IntSca32VT);
373+ auto OpMOVIshift2Vec32 =
374+ DAG->getNode (AArch64ISD::MOVIshift, Loc, Int2Vec32VT, N0, N3);
375+ Known = DAG->computeKnownBits (OpMOVIshift2Vec32);
376+ EXPECT_EQ (Known.Zero , APInt (32 , 0xFFFFFF5A ));
377+ EXPECT_EQ (Known.One , APInt (32 , 0x000000A5 ));
378+
379+ auto N4 = DAG->getConstant (24 , Loc, IntSca32VT);
380+ auto OpMOVIshift4Vec32 =
381+ DAG->getNode (AArch64ISD::MOVIshift, Loc, Int4Vec32VT, N0, N4);
382+ Known = DAG->computeKnownBits (OpMOVIshift4Vec32);
383+ EXPECT_EQ (Known.Zero , APInt (32 , 0x5AFFFFFF ));
384+ EXPECT_EQ (Known.One , APInt (32 , 0xA5000000 ));
385+
386+ auto OpMVNIshift2Vec32 =
387+ DAG->getNode (AArch64ISD::MVNIshift, Loc, Int2Vec32VT, N0, N4);
388+ Known = DAG->computeKnownBits (OpMVNIshift2Vec32);
389+ EXPECT_EQ (Known.Zero , APInt (32 , 0xA5FFFFFF ));
390+ EXPECT_EQ (Known.One , APInt (32 , 0x5A000000 ));
391+
392+ auto OpMVNIshift4Vec32 =
393+ DAG->getNode (AArch64ISD::MVNIshift, Loc, Int4Vec32VT, N0, N3);
394+ Known = DAG->computeKnownBits (OpMVNIshift4Vec32);
395+ EXPECT_EQ (Known.Zero , APInt (32 , 0x000000A5 ));
396+ EXPECT_EQ (Known.One , APInt (32 , 0xFFFFFF5A ));
397+
398+ auto OpMOVIshift4Vec16 =
399+ DAG->getNode (AArch64ISD::MOVIshift, Loc, Int4Vec16VT, N0, N3);
400+ Known = DAG->computeKnownBits (OpMOVIshift4Vec16);
401+ EXPECT_EQ (Known.One , APInt (16 , 0x00A5 ));
402+ EXPECT_EQ (Known.Zero , APInt (16 , 0xFF5A ));
403+
404+ auto OpMOVIshift8Vec16 =
405+ DAG->getNode (AArch64ISD::MOVIshift, Loc, Int8Vec16VT, N0, N1);
406+ Known = DAG->computeKnownBits (OpMOVIshift8Vec16);
364407 EXPECT_EQ (Known.One , APInt (16 , 0xA500 ));
365408 EXPECT_EQ (Known.Zero , APInt (16 , 0x5AFF ));
366409
367- auto OpMVNIshift16 =
368- DAG->getNode (AArch64ISD::MVNIshift, Loc, Int16VT , N0, N3 );
369- Known = DAG->computeKnownBits (OpMVNIshift16 );
410+ auto OpMVNIshift4Vec16 =
411+ DAG->getNode (AArch64ISD::MVNIshift, Loc, Int4Vec16VT , N0, N1 );
412+ Known = DAG->computeKnownBits (OpMVNIshift4Vec16 );
370413 EXPECT_EQ (Known.Zero , APInt (16 , 0xA5FF ));
371414 EXPECT_EQ (Known.One , APInt (16 , 0x5A00 ));
372415
373- auto OpMOVI = DAG->getNode (AArch64ISD::MOVI, Loc, Int8VT, N0);
374- Known = DAG->computeKnownBits (OpMOVI);
416+ auto OpMVNIshift8Vec16 =
417+ DAG->getNode (AArch64ISD::MVNIshift, Loc, Int8Vec16VT, N0, N3);
418+ Known = DAG->computeKnownBits (OpMVNIshift8Vec16);
419+ EXPECT_EQ (Known.Zero , APInt (16 , 0x00A5 ));
420+ EXPECT_EQ (Known.One , APInt (16 , 0xFF5A ));
421+
422+ auto OpMOVI8Vec8 = DAG->getNode (AArch64ISD::MOVI, Loc, Int8Vec8VT, N0);
423+ Known = DAG->computeKnownBits (OpMOVI8Vec8);
424+ EXPECT_EQ (Known.Zero , APInt (8 , 0x5A ));
425+ EXPECT_EQ (Known.One , APInt (8 , 0xA5 ));
426+
427+ auto OpMOVI16Vec8 = DAG->getNode (AArch64ISD::MOVI, Loc, Int16Vec8VT, N0);
428+ Known = DAG->computeKnownBits (OpMOVI16Vec8);
375429 EXPECT_EQ (Known.Zero , APInt (8 , 0x5A ));
376430 EXPECT_EQ (Known.One , APInt (8 , 0xA5 ));
377431}
0 commit comments