@@ -7174,6 +7174,52 @@ ASSEMBLER_TEST_RUN(VsshlxLargeNegativeCount, test) {
71747174 " ret\n " );
71757175}
71767176
7177+ ASSEMBLER_TEST_GENERATE (Vushlw, assembler) {
7178+ __ fldrq (V0 , Address (R0 , 0 ));
7179+ __ fldrq (V1 , Address (R0 , 16 ));
7180+ __ vushlw (V2 , V0 , V1 );
7181+ __ fstrq (V2 , Address (R0 , 32 ));
7182+ __ ret ();
7183+ }
7184+
7185+ ASSEMBLER_TEST_RUN (Vushlw, test) {
7186+ typedef void (*VushlwCode)(intptr_t ) DART_UNUSED ;
7187+ struct {
7188+ uint32_t values[4 ];
7189+ int32_t shifts[4 ];
7190+ uint32_t result[4 ];
7191+ } buffer;
7192+ auto check = [&](const uint32_t (&values)[4 ], const int32_t (&shifts)[4 ],
7193+ const uint32_t (&expected)[4 ]) {
7194+ for (intptr_t i = 0 ; i < 4 ; i++) {
7195+ buffer.values [i] = values[i];
7196+ buffer.shifts [i] = shifts[i];
7197+ buffer.result [i] = 0xAAAAAAAA ;
7198+ }
7199+ EXECUTE_TEST_CODE_INTPTR_INTPTR (VushlwCode, test->entry (),
7200+ reinterpret_cast <intptr_t >(&buffer));
7201+ for (intptr_t i = 0 ; i < 4 ; i++) {
7202+ EXPECT_EQ (expected[i], buffer.result [i]);
7203+ }
7204+ };
7205+ const uint32_t values[4 ] = {0xFFFFFFF8 , 8 , 0x80000000 , 0x7FFFFFFF };
7206+ // A positive count shifts left.
7207+ check (values, {2 , 2 , 2 , 2 }, {0xFFFFFFE0 , 32 , 0 , 0xFFFFFFFC });
7208+ // A negative count shifts right, filling with zeros.
7209+ check (values, {-1 , -1 , -1 , -1 }, {0x7FFFFFFC , 4 , 0x40000000 , 0x3FFFFFFF });
7210+ // A shift of 32 or more in either direction shifts every bit out.
7211+ check (values, {32 , 32 , 32 , 32 }, {0 , 0 , 0 , 0 });
7212+ check (values, {-32 , -32 , -32 , -32 }, {0 , 0 , 0 , 0 });
7213+ // Each lane uses its own count.
7214+ check (values, {2 , -1 , 32 , -32 }, {0xFFFFFFE0 , 4 , 0 , 0 });
7215+ EXPECT_DISASSEMBLY (
7216+ " fldrq v0, [r0]\n "
7217+ " fldrq v1, [r0, #16]\n "
7218+ " vushlw v2, v0, v1\n "
7219+ " fstrq v2, [r0, #32]\n "
7220+ " ret\n " );
7221+ }
7222+
71777223ASSEMBLER_TEST_GENERATE (Vsubw, assembler) {
71787224 __ LoadImmediate (R4 , 31 );
71797225 __ LoadImmediate (R5 , 10 );
0 commit comments