#define SIMDE_TEST_ARM_NEON_INSN mla_lane #include "test-neon.h" #include "../../../simde/arm/neon/mla_lane.h" SIMDE_DIAGNOSTIC_DISABLE_UNREACHABLE_ static int test_simde_vmla_laneq_f32 (SIMDE_MUNIT_TEST_ARGS) { static const struct { float a[2]; float b[2]; float v[4]; int8_t lane; float r[2]; } test_vec[] = { { { SIMDE_FLOAT32_C( -73.46), SIMDE_FLOAT32_C( 513.31) }, { SIMDE_FLOAT32_C( 859.54), SIMDE_FLOAT32_C( 351.95) }, { SIMDE_FLOAT32_C( 623.37), SIMDE_FLOAT32_C( -773.90), SIMDE_FLOAT32_C( -85.33), SIMDE_FLOAT32_C( -870.53) }, INT8_C( 1), { SIMDE_FLOAT32_C(-665271.47), SIMDE_FLOAT32_C(-271860.79) } }, { { SIMDE_FLOAT32_C( -274.57), SIMDE_FLOAT32_C( 808.41) }, { SIMDE_FLOAT32_C( -90.97), SIMDE_FLOAT32_C( -714.05) }, { SIMDE_FLOAT32_C( -922.73), SIMDE_FLOAT32_C( -411.88), SIMDE_FLOAT32_C( 281.90), SIMDE_FLOAT32_C( -63.90) }, INT8_C( 2), { SIMDE_FLOAT32_C( -25919.01), SIMDE_FLOAT32_C(-200482.28) } }, { { SIMDE_FLOAT32_C( -741.09), SIMDE_FLOAT32_C( 445.38) }, { SIMDE_FLOAT32_C( -398.05), SIMDE_FLOAT32_C( -855.86) }, { SIMDE_FLOAT32_C( -570.81), SIMDE_FLOAT32_C( -970.95), SIMDE_FLOAT32_C( -485.13), SIMDE_FLOAT32_C( -172.61) }, INT8_C( 3), { SIMDE_FLOAT32_C( 67966.32), SIMDE_FLOAT32_C( 148175.37) } }, { { SIMDE_FLOAT32_C( 33.94), SIMDE_FLOAT32_C( 293.45) }, { SIMDE_FLOAT32_C( -588.66), SIMDE_FLOAT32_C( 519.96) }, { SIMDE_FLOAT32_C( -139.60), SIMDE_FLOAT32_C( 433.70), SIMDE_FLOAT32_C( 837.57), SIMDE_FLOAT32_C( -714.84) }, INT8_C( 3), { SIMDE_FLOAT32_C( 420831.65), SIMDE_FLOAT32_C(-371394.76) } }, { { SIMDE_FLOAT32_C( -795.09), SIMDE_FLOAT32_C( 16.24) }, { SIMDE_FLOAT32_C( -182.80), SIMDE_FLOAT32_C( 647.98) }, { SIMDE_FLOAT32_C( 196.21), SIMDE_FLOAT32_C( 269.55), SIMDE_FLOAT32_C( 855.47), SIMDE_FLOAT32_C( -864.67) }, INT8_C( 2), { SIMDE_FLOAT32_C(-157175.01), SIMDE_FLOAT32_C( 554343.69) } }, { { SIMDE_FLOAT32_C( -464.62), SIMDE_FLOAT32_C( 878.96) }, { SIMDE_FLOAT32_C( 482.06), SIMDE_FLOAT32_C( -189.13) }, { SIMDE_FLOAT32_C( 998.51), SIMDE_FLOAT32_C( 249.98), SIMDE_FLOAT32_C( -423.89), SIMDE_FLOAT32_C( 412.87) }, INT8_C( 2), { SIMDE_FLOAT32_C(-204805.03), SIMDE_FLOAT32_C( 81049.28) } }, { { SIMDE_FLOAT32_C( -949.96), SIMDE_FLOAT32_C( 459.88) }, { SIMDE_FLOAT32_C( -612.87), SIMDE_FLOAT32_C( 624.30) }, { SIMDE_FLOAT32_C( 216.59), SIMDE_FLOAT32_C( 639.02), SIMDE_FLOAT32_C( -234.22), SIMDE_FLOAT32_C( -127.73) }, INT8_C( 3), { SIMDE_FLOAT32_C( 77331.93), SIMDE_FLOAT32_C( -79281.96) } }, { { SIMDE_FLOAT32_C( -495.83), SIMDE_FLOAT32_C( -373.57) }, { SIMDE_FLOAT32_C( -270.56), SIMDE_FLOAT32_C( -712.92) }, { SIMDE_FLOAT32_C( 565.27), SIMDE_FLOAT32_C( 939.53), SIMDE_FLOAT32_C( 228.62), SIMDE_FLOAT32_C( -248.99) }, INT8_C( 1), { SIMDE_FLOAT32_C(-254695.07), SIMDE_FLOAT32_C(-670183.30) } }, }; simde_float32x2_t r, a, b; simde_float32x4_t v; for (int i = 0 ; i < 8 ; i++) { a = simde_vld1_f32(test_vec[i].a); b = simde_vld1_f32(test_vec[i].b); v = simde_vld1q_f32(test_vec[i].v); switch(test_vec[i].lane) { case 0: r = simde_vmla_laneq_f32(a, b, v, 0); break; case 1: r = simde_vmla_laneq_f32(a, b, v, 1); break; case 2: r = simde_vmla_laneq_f32(a, b, v, 2); break; case 3: r = simde_vmla_laneq_f32(a, b, v, 3); break; default: HEDLEY_UNREACHABLE(); r = simde_vdup_n_f32(0); break; } simde_test_arm_neon_assert_equal_f32x2(r, simde_vld1_f32(test_vec[i].r), 1); } return 0; } static int test_simde_vmla_lane_f32 (SIMDE_MUNIT_TEST_ARGS) { #if 1 static const struct { float a[2]; float b[2]; float v[2]; int8_t lane; float r[2]; } test_vec[] = { { { SIMDE_FLOAT32_C( -816.78), SIMDE_FLOAT32_C( -682.00) }, { SIMDE_FLOAT32_C( -795.28), SIMDE_FLOAT32_C( 90.29) }, { SIMDE_FLOAT32_C( -130.28), SIMDE_FLOAT32_C( -447.42) }, INT8_C( 0), { SIMDE_FLOAT32_C(102792.30), SIMDE_FLOAT32_C(-12444.98) } }, { { SIMDE_FLOAT32_C( -476.32), SIMDE_FLOAT32_C( 185.93) }, { SIMDE_FLOAT32_C( 161.27), SIMDE_FLOAT32_C( -62.08) }, { SIMDE_FLOAT32_C( -608.20), SIMDE_FLOAT32_C( 443.90) }, INT8_C( 0), { SIMDE_FLOAT32_C(-98560.74), SIMDE_FLOAT32_C( 37942.99) } }, { { SIMDE_FLOAT32_C( 620.34), SIMDE_FLOAT32_C( 537.90) }, { SIMDE_FLOAT32_C( -324.75), SIMDE_FLOAT32_C( -532.78) }, { SIMDE_FLOAT32_C( -706.05), SIMDE_FLOAT32_C( 656.04) }, INT8_C( 0), { SIMDE_FLOAT32_C(229910.08), SIMDE_FLOAT32_C(376707.25) } }, { { SIMDE_FLOAT32_C( 211.34), SIMDE_FLOAT32_C( 292.01) }, { SIMDE_FLOAT32_C( 391.18), SIMDE_FLOAT32_C( -470.30) }, { SIMDE_FLOAT32_C( -654.28), SIMDE_FLOAT32_C( 25.97) }, INT8_C( 1), { SIMDE_FLOAT32_C( 10370.28), SIMDE_FLOAT32_C(-11921.68) } }, { { SIMDE_FLOAT32_C( -405.66), SIMDE_FLOAT32_C( -583.58) }, { SIMDE_FLOAT32_C( -51.80), SIMDE_FLOAT32_C( -222.44) }, { SIMDE_FLOAT32_C( -265.59), SIMDE_FLOAT32_C( 152.92) }, INT8_C( 1), { SIMDE_FLOAT32_C( -8326.92), SIMDE_FLOAT32_C(-34599.10) } }, { { SIMDE_FLOAT32_C( 604.13), SIMDE_FLOAT32_C( 705.50) }, { SIMDE_FLOAT32_C( -6.67), SIMDE_FLOAT32_C( -872.19) }, { SIMDE_FLOAT32_C( -108.57), SIMDE_FLOAT32_C( -845.39) }, INT8_C( 1), { SIMDE_FLOAT32_C( 6242.88), SIMDE_FLOAT32_C(738046.25) } }, { { SIMDE_FLOAT32_C( 283.23), SIMDE_FLOAT32_C( 598.51) }, { SIMDE_FLOAT32_C( -945.20), SIMDE_FLOAT32_C( -96.43) }, { SIMDE_FLOAT32_C( 136.41), SIMDE_FLOAT32_C( -269.94) }, INT8_C( 0), { SIMDE_FLOAT32_C(-128651.51), SIMDE_FLOAT32_C(-12555.51) } }, { { SIMDE_FLOAT32_C( 430.36), SIMDE_FLOAT32_C( -613.90) }, { SIMDE_FLOAT32_C( 413.02), SIMDE_FLOAT32_C( -358.30) }, { SIMDE_FLOAT32_C( 678.10), SIMDE_FLOAT32_C( -195.80) }, INT8_C( 0), { SIMDE_FLOAT32_C(280499.22), SIMDE_FLOAT32_C(-243577.12) } }, }; simde_float32x2_t r, a, b, v; for (int i = 0 ; i < 8 ; i++) { a = simde_vld1_f32(test_vec[i].a); b = simde_vld1_f32(test_vec[i].b); v = simde_vld1_f32(test_vec[i].v); switch(test_vec[i].lane) { case 0: r = simde_vmla_lane_f32(a, b, v, 0); break; case 1: r = simde_vmla_lane_f32(a, b, v, 1); break; default: HEDLEY_UNREACHABLE(); r = simde_vdup_n_f32(0); break; } simde_test_arm_neon_assert_equal_f32x2(r, simde_vld1_f32(test_vec[i].r), 1); } return 0; #else fputc('\n', stdout); for (int i = 0 ; i < 8 ; i++) { simde_float32x2_t a = simde_test_arm_neon_random_f32x2(-1000.0f, 1000.0f); simde_float32x2_t b = simde_test_arm_neon_random_f32x2(-1000.0f, 1000.0f); simde_float32x2_t v = simde_test_arm_neon_random_f32x2(-1000.0f, 1000.0f); int8_t lane = simde_test_codegen_random_i8() & 1; simde_float32x2_t r; SIMDE_CONSTIFY_2_(simde_vmla_lane_f32, r, (HEDLEY_UNREACHABLE(), simde_vdup_n_f32(0)), lane, a, b, v); simde_test_arm_neon_write_f32x2(2, a, SIMDE_TEST_VEC_POS_FIRST); simde_test_arm_neon_write_f32x2(2, b, SIMDE_TEST_VEC_POS_MIDDLE); simde_test_arm_neon_write_f32x2(2, v, SIMDE_TEST_VEC_POS_MIDDLE); simde_test_codegen_write_i8(2, lane, SIMDE_TEST_VEC_POS_MIDDLE); simde_test_arm_neon_write_f32x2(2, r, SIMDE_TEST_VEC_POS_LAST); } return 1; #endif } static int test_simde_vmla_laneq_s16 (SIMDE_MUNIT_TEST_ARGS) { static const struct { int16_t a[4]; int16_t b[4]; int16_t v[8]; int8_t lane; int16_t r[4]; } test_vec[] = { { { -INT16_C( 81), -INT16_C( 48), INT16_C( 94), INT16_C( 69) }, { INT16_C( 40), -INT16_C( 89), -INT16_C( 92), INT16_C( 90) }, { INT16_C( 94), INT16_C( 38), -INT16_C( 15), -INT16_C( 13), -INT16_C( 79), -INT16_C( 41), -INT16_C( 66), INT16_C( 0) }, INT8_C( 0), { INT16_C( 3679), -INT16_C( 8414), -INT16_C( 8554), INT16_C( 8529) } }, { { -INT16_C( 14), -INT16_C( 78), -INT16_C( 58), -INT16_C( 39) }, { -INT16_C( 85), -INT16_C( 52), INT16_C( 85), INT16_C( 77) }, { INT16_C( 76), -INT16_C( 10), INT16_C( 26), INT16_C( 82), -INT16_C( 46), INT16_C( 48), -INT16_C( 40), INT16_C( 93) }, INT8_C( 6), { INT16_C( 3386), INT16_C( 2002), -INT16_C( 3458), -INT16_C( 3119) } }, { { INT16_C( 82), -INT16_C( 97), INT16_C( 61), INT16_C( 86) }, { INT16_C( 78), -INT16_C( 66), INT16_C( 69), -INT16_C( 34) }, { INT16_C( 79), -INT16_C( 74), INT16_C( 4), -INT16_C( 49), INT16_C( 22), -INT16_C( 87), -INT16_C( 48), -INT16_C( 37) }, INT8_C( 0), { INT16_C( 6244), -INT16_C( 5311), INT16_C( 5512), -INT16_C( 2600) } }, { { -INT16_C( 3), -INT16_C( 26), INT16_C( 68), INT16_C( 10) }, { INT16_C( 9), -INT16_C( 39), INT16_C( 24), -INT16_C( 13) }, { -INT16_C( 39), -INT16_C( 87), -INT16_C( 79), INT16_C( 42), -INT16_C( 23), INT16_C( 56), -INT16_C( 22), -INT16_C( 41) }, INT8_C( 7), { -INT16_C( 372), INT16_C( 1573), -INT16_C( 916), INT16_C( 543) } }, { { INT16_C( 0), -INT16_C( 60), -INT16_C( 14), -INT16_C( 40) }, { -INT16_C( 46), -INT16_C( 13), INT16_C( 45), -INT16_C( 6) }, { -INT16_C( 39), INT16_C( 97), INT16_C( 59), -INT16_C( 65), -INT16_C( 22), -INT16_C( 35), -INT16_C( 62), INT16_C( 51) }, INT8_C( 0), { INT16_C( 1794), INT16_C( 447), -INT16_C( 1769), INT16_C( 194) } }, { { -INT16_C( 72), INT16_C( 43), INT16_C( 0), -INT16_C( 15) }, { -INT16_C( 96), INT16_C( 98), -INT16_C( 5), INT16_C( 88) }, { INT16_C( 70), INT16_C( 21), -INT16_C( 54), -INT16_C( 29), INT16_C( 83), INT16_C( 62), INT16_C( 7), -INT16_C( 7) }, INT8_C( 7), { INT16_C( 600), -INT16_C( 643), INT16_C( 35), -INT16_C( 631) } }, { { -INT16_C( 57), -INT16_C( 65), INT16_C( 87), INT16_C( 11) }, { -INT16_C( 36), -INT16_C( 26), INT16_C( 46), INT16_C( 29) }, { -INT16_C( 82), INT16_C( 96), INT16_C( 14), INT16_C( 54), -INT16_C( 42), INT16_C( 5), -INT16_C( 47), -INT16_C( 37) }, INT8_C( 5), { -INT16_C( 237), -INT16_C( 195), INT16_C( 317), INT16_C( 156) } }, { { INT16_C( 46), -INT16_C( 88), -INT16_C( 14), -INT16_C( 73) }, { -INT16_C( 12), INT16_C( 31), INT16_C( 0), -INT16_C( 48) }, { -INT16_C( 96), -INT16_C( 87), -INT16_C( 55), -INT16_C( 93), -INT16_C( 55), -INT16_C( 34), INT16_C( 63), INT16_C( 65) }, INT8_C( 1), { INT16_C( 1090), -INT16_C( 2785), -INT16_C( 14), INT16_C( 4103) } }, }; simde_int16x4_t r, a, b; simde_int16x8_t v; for (int i = 0 ; i < 8 ; i++) { a = simde_vld1_s16(test_vec[i].a); b = simde_vld1_s16(test_vec[i].b); v = simde_vld1q_s16(test_vec[i].v); switch(test_vec[i].lane) { case 0: r = simde_vmla_laneq_s16(a, b, v, 0); break; case 1: r = simde_vmla_laneq_s16(a, b, v, 1); break; case 2: r = simde_vmla_laneq_s16(a, b, v, 2); break; case 3: r = simde_vmla_laneq_s16(a, b, v, 3); break; case 4: r = simde_vmla_laneq_s16(a, b, v, 4); break; case 5: r = simde_vmla_laneq_s16(a, b, v, 5); break; case 6: r = simde_vmla_laneq_s16(a, b, v, 6); break; case 7: r = simde_vmla_laneq_s16(a, b, v, 7); break; default: HEDLEY_UNREACHABLE(); r = simde_vdup_n_s16(0); break; } simde_test_arm_neon_assert_equal_i16x4(r, simde_vld1_s16(test_vec[i].r)); } return 0; } static int test_simde_vmla_lane_s16 (SIMDE_MUNIT_TEST_ARGS) { #if 1 static const struct { int16_t a[4]; int16_t b[4]; int16_t v[4]; int8_t lane; int16_t r[4]; } test_vec[] = { { { -INT16_C( 8363), INT16_C( 18244), INT16_C( 7549), -INT16_C( 29838) }, { -INT16_C( 3227), INT16_C( 11543), -INT16_C( 29487), INT16_C( 4163) }, { INT16_C( 10620), INT16_C( 22760), -INT16_C( 28728), INT16_C( 11437) }, INT8_C( 2), { INT16_C( 28989), INT16_C( 23100), -INT16_C( 8251), -INT16_C( 21302) } }, { { INT16_C( 22862), INT16_C( 28944), INT16_C( 22233), -INT16_C( 17978) }, { INT16_C( 3739), -INT16_C( 18378), -INT16_C( 16000), INT16_C( 29469) }, { INT16_C( 19160), INT16_C( 25668), INT16_C( 21646), -INT16_C( 18463) }, INT8_C( 0), { INT16_C( 31254), INT16_C( 31392), -INT16_C( 25895), INT16_C( 15422) } }, { { INT16_C( 32569), -INT16_C( 6453), INT16_C( 24235), INT16_C( 1076) }, { -INT16_C( 22930), -INT16_C( 15138), -INT16_C( 26772), INT16_C( 31327) }, { INT16_C( 6093), -INT16_C( 28934), INT16_C( 27956), INT16_C( 32615) }, INT8_C( 1), { INT16_C( 2725), INT16_C( 19351), INT16_C( 9763), INT16_C( 14074) } }, { { INT16_C( 3531), -INT16_C( 21498), INT16_C( 17092), INT16_C( 17382) }, { -INT16_C( 13298), INT16_C( 27886), -INT16_C( 3327), -INT16_C( 22566) }, { -INT16_C( 24879), INT16_C( 26643), -INT16_C( 28930), INT16_C( 5429) }, INT8_C( 0), { INT16_C( 18745), INT16_C( 32340), INT16_C( 17557), -INT16_C( 10016) } }, { { INT16_C( 19139), INT16_C( 10998), -INT16_C( 22583), -INT16_C( 10506) }, { -INT16_C( 23891), -INT16_C( 3942), -INT16_C( 8824), INT16_C( 22014) }, { INT16_C( 27339), -INT16_C( 16810), -INT16_C( 700), -INT16_C( 7537) }, INT8_C( 0), { -INT16_C( 5134), -INT16_C( 18156), -INT16_C( 23903), INT16_C( 13152) } }, { { -INT16_C( 7945), INT16_C( 11422), INT16_C( 10230), INT16_C( 16624) }, { INT16_C( 6685), -INT16_C( 15351), -INT16_C( 8432), -INT16_C( 19598) }, { INT16_C( 25209), INT16_C( 22075), -INT16_C( 28576), -INT16_C( 13791) }, INT8_C( 2), { -INT16_C( 1065), -INT16_C( 16386), -INT16_C( 12810), -INT16_C( 21584) } }, { { INT16_C( 3808), INT16_C( 28643), -INT16_C( 2832), -INT16_C( 11929) }, { -INT16_C( 27758), -INT16_C( 17977), INT16_C( 1923), -INT16_C( 24874) }, { -INT16_C( 25840), -INT16_C( 4178), INT16_C( 24845), INT16_C( 28520) }, INT8_C( 1), { -INT16_C( 21988), INT16_C( 32293), INT16_C( 23802), -INT16_C( 28453) } }, { { -INT16_C( 12354), -INT16_C( 8403), INT16_C( 5273), -INT16_C( 22593) }, { INT16_C( 12279), -INT16_C( 5225), INT16_C( 26774), INT16_C( 10622) }, { INT16_C( 14127), INT16_C( 13997), INT16_C( 19214), -INT16_C( 22202) }, INT8_C( 1), { INT16_C( 21417), -INT16_C( 4552), INT16_C( 26103), INT16_C( 17893) } }, }; simde_int16x4_t r, a, b, v; for (int i = 0 ; i < 8 ; i++) { a = simde_vld1_s16(test_vec[i].a); b = simde_vld1_s16(test_vec[i].b); v = simde_vld1_s16(test_vec[i].v); switch(test_vec[i].lane) { case 0: r = simde_vmla_lane_s16(a, b, v, 0); break; case 1: r = simde_vmla_lane_s16(a, b, v, 1); break; case 2: r = simde_vmla_lane_s16(a, b, v, 2); break; case 3: r = simde_vmla_lane_s16(a, b, v, 3); break; default: HEDLEY_UNREACHABLE(); r = simde_vdup_n_s16(0); break; } simde_test_arm_neon_assert_equal_i16x4(r, simde_vld1_s16(test_vec[i].r)); } return 0; #else fputc('\n', stdout); for (int i = 0 ; i < 8 ; i++) { simde_int16x4_t a = simde_test_arm_neon_random_i16x4(); simde_int16x4_t b = simde_test_arm_neon_random_i16x4(); simde_int16x4_t v = simde_test_arm_neon_random_i16x4(); int8_t lane = simde_test_codegen_random_i8() & 3; simde_int16x4_t r; SIMDE_CONSTIFY_4_(simde_vmla_lane_s16, r, (HEDLEY_UNREACHABLE(), simde_vdup_n_s16(0)), lane, a, b, v); simde_test_arm_neon_write_i16x4(2, a, SIMDE_TEST_VEC_POS_FIRST); simde_test_arm_neon_write_i16x4(2, b, SIMDE_TEST_VEC_POS_MIDDLE); simde_test_arm_neon_write_i16x4(2, v, SIMDE_TEST_VEC_POS_MIDDLE); simde_test_codegen_write_i8(2, lane, SIMDE_TEST_VEC_POS_MIDDLE); simde_test_arm_neon_write_i16x4(2, r, SIMDE_TEST_VEC_POS_LAST); } return 1; #endif } static int test_simde_vmla_laneq_s32 (SIMDE_MUNIT_TEST_ARGS) { static const struct { int32_t a[2]; int32_t b[2]; int32_t v[4]; int8_t lane; int32_t r[2]; } test_vec[] = { { { INT32_C( 3861), INT32_C( 5159) }, { INT32_C( 9760), -INT32_C( 3715) }, { -INT32_C( 9595), -INT32_C( 2488), INT32_C( 4866), -INT32_C( 5704) }, INT8_C( 2), { INT32_C( 47496021), -INT32_C( 18072031) } }, { { INT32_C( 5007), -INT32_C( 7329) }, { -INT32_C( 6236), INT32_C( 6988) }, { -INT32_C( 612), INT32_C( 5079), -INT32_C( 8538), -INT32_C( 3459) }, INT8_C( 1), { -INT32_C( 31667637), INT32_C( 35484723) } }, { { INT32_C( 1305), -INT32_C( 87) }, { -INT32_C( 3936), INT32_C( 9528) }, { INT32_C( 7150), -INT32_C( 961), INT32_C( 3279), -INT32_C( 1449) }, INT8_C( 1), { INT32_C( 3783801), -INT32_C( 9156495) } }, { { -INT32_C( 1929), -INT32_C( 1565) }, { INT32_C( 3306), -INT32_C( 8150) }, { -INT32_C( 4113), -INT32_C( 7811), -INT32_C( 7275), INT32_C( 2429) }, INT8_C( 2), { -INT32_C( 24053079), INT32_C( 59289685) } }, { { INT32_C( 3468), INT32_C( 5295) }, { INT32_C( 1666), -INT32_C( 3947) }, { INT32_C( 6721), -INT32_C( 1160), INT32_C( 6628), INT32_C( 2152) }, INT8_C( 0), { INT32_C( 11200654), -INT32_C( 26522492) } }, { { INT32_C( 4696), INT32_C( 717) }, { -INT32_C( 7531), -INT32_C( 1614) }, { INT32_C( 129), -INT32_C( 7076), -INT32_C( 1025), -INT32_C( 5723) }, INT8_C( 3), { INT32_C( 43104609), INT32_C( 9237639) } }, { { -INT32_C( 764), INT32_C( 296) }, { -INT32_C( 8065), INT32_C( 1700) }, { INT32_C( 8396), -INT32_C( 25), INT32_C( 6189), INT32_C( 6350) }, INT8_C( 3), { -INT32_C( 51213514), INT32_C( 10795296) } }, { { -INT32_C( 9807), -INT32_C( 6609) }, { -INT32_C( 9863), INT32_C( 1251) }, { INT32_C( 5518), INT32_C( 9557), -INT32_C( 3314), -INT32_C( 1340) }, INT8_C( 1), { -INT32_C( 94270498), INT32_C( 11949198) } }, }; simde_int32x2_t r, a, b; simde_int32x4_t v; for (int i = 0 ; i < 8 ; i++) { a = simde_vld1_s32(test_vec[i].a); b = simde_vld1_s32(test_vec[i].b); v = simde_vld1q_s32(test_vec[i].v); switch(test_vec[i].lane) { case 0: r = simde_vmla_laneq_s32(a, b, v, 0); break; case 1: r = simde_vmla_laneq_s32(a, b, v, 1); break; case 2: r = simde_vmla_laneq_s32(a, b, v, 2); break; case 3: r = simde_vmla_laneq_s32(a, b, v, 3); break; default: HEDLEY_UNREACHABLE(); r = simde_vdup_n_s32(0); break; } simde_test_arm_neon_assert_equal_i32x2(r, simde_vld1_s32(test_vec[i].r)); } return 0; } static int test_simde_vmla_lane_s32 (SIMDE_MUNIT_TEST_ARGS) { #if 1 static const struct { int32_t a[2]; int32_t b[2]; int32_t v[2]; int8_t lane; int32_t r[2]; } test_vec[] = { { { -INT32_C( 1677892667), -INT32_C( 731162875) }, { INT32_C( 1367126076), -INT32_C( 980313240) }, { INT32_C( 1778607037), INT32_C( 1770572205) }, INT8_C( 1), { -INT32_C( 813721519), -INT32_C( 501873587) } }, { { -INT32_C( 513060676), INT32_C( 681990085) }, { -INT32_C( 1423097516), INT32_C( 1575485869) }, { INT32_C( 432355710), INT32_C( 785877963) }, INT8_C( 0), { -INT32_C( 1360974828), INT32_C( 945270763) } }, { { -INT32_C( 916923583), -INT32_C( 1803214012) }, { -INT32_C( 447125618), INT32_C( 1329168909) }, { -INT32_C( 1308826193), INT32_C( 103766477) }, INT8_C( 0), { -INT32_C( 1461671085), INT32_C( 804694823) } }, { { INT32_C( 531222856), -INT32_C( 614450945) }, { -INT32_C( 1289803120), INT32_C( 373470383) }, { -INT32_C( 1893456115), INT32_C( 1178563425) }, INT8_C( 1), { -INT32_C( 670588456), -INT32_C( 1830663090) } }, { { INT32_C( 533206000), -INT32_C( 345512423) }, { -INT32_C( 924153968), INT32_C( 291030503) }, { -INT32_C( 1715401755), INT32_C( 1973868365) }, INT8_C( 1), { INT32_C( 1032636992), -INT32_C( 1743098476) } }, { { INT32_C( 1970198070), INT32_C( 795204892) }, { -INT32_C( 1941404507), INT32_C( 1914450923) }, { -INT32_C( 480582626), INT32_C( 1204316988) }, INT8_C( 0), { INT32_C( 1829983628), INT32_C( 1318010534) } }, { { INT32_C( 134518113), -INT32_C( 532742390) }, { INT32_C( 1274852206), -INT32_C( 1661916392) }, { -INT32_C( 1484292749), INT32_C( 2110126745) }, INT8_C( 0), { -INT32_C( 282597941), -INT32_C( 2075651374) } }, { { INT32_C( 1908390312), -INT32_C( 1781339136) }, { -INT32_C( 274736400), -INT32_C( 883065064) }, { -INT32_C( 1495029381), INT32_C( 387612570) }, INT8_C( 1), { -INT32_C( 1310294520), INT32_C( 1586382960) } }, }; simde_int32x2_t r, a, b, v; for (int i = 0 ; i < 8 ; i++) { a = simde_vld1_s32(test_vec[i].a); b = simde_vld1_s32(test_vec[i].b); v = simde_vld1_s32(test_vec[i].v); switch(test_vec[i].lane) { case 0: r = simde_vmla_lane_s32(a, b, v, 0); break; case 1: r = simde_vmla_lane_s32(a, b, v, 1); break; default: HEDLEY_UNREACHABLE(); r = simde_vdup_n_s32(0); break; } simde_test_arm_neon_assert_equal_i32x2(r, simde_vld1_s32(test_vec[i].r)); } return 0; #else fputc('\n', stdout); for (int i = 0 ; i < 8 ; i++) { simde_int32x2_t a = simde_test_arm_neon_random_i32x2(); simde_int32x2_t b = simde_test_arm_neon_random_i32x2(); simde_int32x2_t v = simde_test_arm_neon_random_i32x2(); int8_t lane = simde_test_codegen_random_i8() & 1; simde_int32x2_t r; SIMDE_CONSTIFY_2_(simde_vmla_lane_s32, r, (HEDLEY_UNREACHABLE(), simde_vdup_n_s32(0)), lane, a, b, v); simde_test_arm_neon_write_i32x2(2, a, SIMDE_TEST_VEC_POS_FIRST); simde_test_arm_neon_write_i32x2(2, b, SIMDE_TEST_VEC_POS_MIDDLE); simde_test_arm_neon_write_i32x2(2, v, SIMDE_TEST_VEC_POS_MIDDLE); simde_test_codegen_write_i8(2, lane, SIMDE_TEST_VEC_POS_MIDDLE); simde_test_arm_neon_write_i32x2(2, r, SIMDE_TEST_VEC_POS_LAST); } return 1; #endif } static int test_simde_vmla_laneq_u16 (SIMDE_MUNIT_TEST_ARGS) { static const struct { uint16_t a[4]; uint16_t b[4]; uint16_t v[8]; int8_t lane; uint16_t r[4]; } test_vec[] = { { { UINT16_C( 144), UINT16_C( 34), UINT16_C( 24), UINT16_C( 53) }, { UINT16_C( 114), UINT16_C( 151), UINT16_C( 196), UINT16_C( 168) }, { UINT16_C( 9), UINT16_C( 121), UINT16_C( 98), UINT16_C( 37), UINT16_C( 85), UINT16_C( 143), UINT16_C( 114), UINT16_C( 77) }, INT8_C( 7), { UINT16_C( 8922), UINT16_C( 11661), UINT16_C( 15116), UINT16_C( 12989) } }, { { UINT16_C( 46), UINT16_C( 26), UINT16_C( 172), UINT16_C( 157) }, { UINT16_C( 130), UINT16_C( 10), UINT16_C( 72), UINT16_C( 144) }, { UINT16_C( 79), UINT16_C( 48), UINT16_C( 31), UINT16_C( 47), UINT16_C( 141), UINT16_C( 75), UINT16_C( 11), UINT16_C( 0) }, INT8_C( 4), { UINT16_C( 18376), UINT16_C( 1436), UINT16_C( 10324), UINT16_C( 20461) } }, { { UINT16_C( 66), UINT16_C( 115), UINT16_C( 17), UINT16_C( 182) }, { UINT16_C( 171), UINT16_C( 62), UINT16_C( 79), UINT16_C( 160) }, { UINT16_C( 149), UINT16_C( 107), UINT16_C( 55), UINT16_C( 109), UINT16_C( 135), UINT16_C( 105), UINT16_C( 116), UINT16_C( 12) }, INT8_C( 6), { UINT16_C( 19902), UINT16_C( 7307), UINT16_C( 9181), UINT16_C( 18742) } }, { { UINT16_C( 162), UINT16_C( 21), UINT16_C( 179), UINT16_C( 140) }, { UINT16_C( 116), UINT16_C( 164), UINT16_C( 124), UINT16_C( 121) }, { UINT16_C( 70), UINT16_C( 9), UINT16_C( 107), UINT16_C( 156), UINT16_C( 122), UINT16_C( 174), UINT16_C( 56), UINT16_C( 136) }, INT8_C( 4), { UINT16_C( 14314), UINT16_C( 20029), UINT16_C( 15307), UINT16_C( 14902) } }, { { UINT16_C( 156), UINT16_C( 33), UINT16_C( 163), UINT16_C( 127) }, { UINT16_C( 32), UINT16_C( 12), UINT16_C( 90), UINT16_C( 82) }, { UINT16_C( 97), UINT16_C( 190), UINT16_C( 0), UINT16_C( 43), UINT16_C( 37), UINT16_C( 42), UINT16_C( 81), UINT16_C( 151) }, INT8_C( 6), { UINT16_C( 2748), UINT16_C( 1005), UINT16_C( 7453), UINT16_C( 6769) } }, { { UINT16_C( 86), UINT16_C( 68), UINT16_C( 183), UINT16_C( 186) }, { UINT16_C( 7), UINT16_C( 118), UINT16_C( 191), UINT16_C( 83) }, { UINT16_C( 139), UINT16_C( 109), UINT16_C( 165), UINT16_C( 138), UINT16_C( 63), UINT16_C( 145), UINT16_C( 122), UINT16_C( 104) }, INT8_C( 5), { UINT16_C( 1101), UINT16_C( 17178), UINT16_C( 27878), UINT16_C( 12221) } }, { { UINT16_C( 66), UINT16_C( 140), UINT16_C( 133), UINT16_C( 129) }, { UINT16_C( 164), UINT16_C( 44), UINT16_C( 50), UINT16_C( 9) }, { UINT16_C( 4), UINT16_C( 13), UINT16_C( 156), UINT16_C( 115), UINT16_C( 28), UINT16_C( 5), UINT16_C( 57), UINT16_C( 186) }, INT8_C( 5), { UINT16_C( 886), UINT16_C( 360), UINT16_C( 383), UINT16_C( 174) } }, { { UINT16_C( 147), UINT16_C( 6), UINT16_C( 29), UINT16_C( 23) }, { UINT16_C( 196), UINT16_C( 120), UINT16_C( 91), UINT16_C( 101) }, { UINT16_C( 183), UINT16_C( 144), UINT16_C( 66), UINT16_C( 70), UINT16_C( 187), UINT16_C( 197), UINT16_C( 140), UINT16_C( 144) }, INT8_C( 6), { UINT16_C( 27587), UINT16_C( 16806), UINT16_C( 12769), UINT16_C( 14163) } }, }; simde_uint16x4_t r, a, b; simde_uint16x8_t v; for (int i = 0 ; i < 8 ; i++) { a = simde_vld1_u16(test_vec[i].a); b = simde_vld1_u16(test_vec[i].b); v = simde_vld1q_u16(test_vec[i].v); switch(test_vec[i].lane) { case 0: r = simde_vmla_laneq_u16(a, b, v, 0); break; case 1: r = simde_vmla_laneq_u16(a, b, v, 1); break; case 2: r = simde_vmla_laneq_u16(a, b, v, 2); break; case 3: r = simde_vmla_laneq_u16(a, b, v, 3); break; case 4: r = simde_vmla_laneq_u16(a, b, v, 4); break; case 5: r = simde_vmla_laneq_u16(a, b, v, 5); break; case 6: r = simde_vmla_laneq_u16(a, b, v, 6); break; case 7: r = simde_vmla_laneq_u16(a, b, v, 7); break; default: HEDLEY_UNREACHABLE(); r = simde_vdup_n_u16(0); break; } simde_test_arm_neon_assert_equal_u16x4(r, simde_vld1_u16(test_vec[i].r)); } return 0; } static int test_simde_vmla_lane_u16 (SIMDE_MUNIT_TEST_ARGS) { #if 1 static const struct { uint16_t a[4]; uint16_t b[4]; uint16_t v[4]; int8_t lane; uint16_t r[4]; } test_vec[] = { { { UINT16_C(24938), UINT16_C(12997), UINT16_C(36716), UINT16_C(45604) }, { UINT16_C(53368), UINT16_C(42594), UINT16_C(35304), UINT16_C(54457) }, { UINT16_C(16938), UINT16_C(21817), UINT16_C(27865), UINT16_C( 3610) }, INT8_C( 0), { UINT16_C(34074), UINT16_C(49881), UINT16_C(65404), UINT16_C(19070) } }, { { UINT16_C(12202), UINT16_C(60429), UINT16_C(63791), UINT16_C(36950) }, { UINT16_C(35006), UINT16_C(19964), UINT16_C(44972), UINT16_C(31941) }, { UINT16_C(27409), UINT16_C(39524), UINT16_C(14628), UINT16_C(26564) }, INT8_C( 2), { UINT16_C(47202), UINT16_C(65405), UINT16_C(63839), UINT16_C(63754) } }, { { UINT16_C(16409), UINT16_C(13535), UINT16_C( 8014), UINT16_C(32222) }, { UINT16_C(51756), UINT16_C( 9644), UINT16_C(15392), UINT16_C(43491) }, { UINT16_C(12345), UINT16_C(59477), UINT16_C(54005), UINT16_C(24825) }, INT8_C( 2), { UINT16_C(54325), UINT16_C(23163), UINT16_C(59886), UINT16_C(18973) } }, { { UINT16_C(34195), UINT16_C(22383), UINT16_C(58092), UINT16_C(11377) }, { UINT16_C(42433), UINT16_C(57467), UINT16_C(63619), UINT16_C(19725) }, { UINT16_C(12965), UINT16_C(57709), UINT16_C( 5654), UINT16_C(17946) }, INT8_C( 0), { UINT16_C( 3320), UINT16_C( 3254), UINT16_C(42331), UINT16_C(24530) } }, { { UINT16_C(15362), UINT16_C(64318), UINT16_C(29852), UINT16_C( 8590) }, { UINT16_C(59108), UINT16_C(50701), UINT16_C(14935), UINT16_C(64647) }, { UINT16_C(26549), UINT16_C(44415), UINT16_C(52340), UINT16_C(42834) }, INT8_C( 1), { UINT16_C(56094), UINT16_C( 1201), UINT16_C(12485), UINT16_C(41863) } }, { { UINT16_C(48436), UINT16_C(20048), UINT16_C(48131), UINT16_C(16209) }, { UINT16_C(19706), UINT16_C(28380), UINT16_C(64987), UINT16_C(49490) }, { UINT16_C( 6155), UINT16_C(17688), UINT16_C( 5279), UINT16_C( 2042) }, INT8_C( 3), { UINT16_C(48984), UINT16_C(38184), UINT16_C(41185), UINT16_C(18277) } }, { { UINT16_C(31655), UINT16_C(64095), UINT16_C(38946), UINT16_C(57134) }, { UINT16_C(31976), UINT16_C(42211), UINT16_C( 8909), UINT16_C( 6814) }, { UINT16_C( 3582), UINT16_C(64757), UINT16_C(46687), UINT16_C(30727) }, INT8_C( 2), { UINT16_C(50623), UINT16_C(35996), UINT16_C(16437), UINT16_C( 5072) } }, { { UINT16_C( 5964), UINT16_C(18146), UINT16_C(29982), UINT16_C(39661) }, { UINT16_C(59348), UINT16_C(27836), UINT16_C(39957), UINT16_C(37461) }, { UINT16_C(63871), UINT16_C(41311), UINT16_C(31128), UINT16_C(42400) }, INT8_C( 2), { UINT16_C(61740), UINT16_C(45698), UINT16_C( 3734), UINT16_C(43621) } }, }; simde_uint16x4_t r, a, b, v; for (int i = 0 ; i < 8 ; i++) { a = simde_vld1_u16(test_vec[i].a); b = simde_vld1_u16(test_vec[i].b); v = simde_vld1_u16(test_vec[i].v); switch(test_vec[i].lane) { case 0: r = simde_vmla_lane_u16(a, b, v, 0); break; case 1: r = simde_vmla_lane_u16(a, b, v, 1); break; case 2: r = simde_vmla_lane_u16(a, b, v, 2); break; case 3: r = simde_vmla_lane_u16(a, b, v, 3); break; default: HEDLEY_UNREACHABLE(); r = simde_vdup_n_u16(0); break; } simde_test_arm_neon_assert_equal_u16x4(r, simde_vld1_u16(test_vec[i].r)); } return 0; #else fputc('\n', stdout); for (int i = 0 ; i < 8 ; i++) { simde_uint16x4_t a = simde_test_arm_neon_random_u16x4(); simde_uint16x4_t b = simde_test_arm_neon_random_u16x4(); simde_uint16x4_t v = simde_test_arm_neon_random_u16x4(); int8_t lane = simde_test_codegen_random_i8() & 3; simde_uint16x4_t r; SIMDE_CONSTIFY_4_(simde_vmla_lane_u16, r, (HEDLEY_UNREACHABLE(), simde_vdup_n_u16(0)), lane, a, b, v); simde_test_arm_neon_write_u16x4(2, a, SIMDE_TEST_VEC_POS_FIRST); simde_test_arm_neon_write_u16x4(2, b, SIMDE_TEST_VEC_POS_MIDDLE); simde_test_arm_neon_write_u16x4(2, v, SIMDE_TEST_VEC_POS_MIDDLE); simde_test_codegen_write_i8(2, lane, SIMDE_TEST_VEC_POS_MIDDLE); simde_test_arm_neon_write_u16x4(2, r, SIMDE_TEST_VEC_POS_LAST); } return 1; #endif } static int test_simde_vmla_laneq_u32 (SIMDE_MUNIT_TEST_ARGS) { static const struct { uint32_t a[2]; uint32_t b[2]; uint32_t v[4]; int8_t lane; uint32_t r[2]; } test_vec[] = { { { UINT32_C( 779), UINT32_C( 9897) }, { UINT32_C( 19930), UINT32_C( 9507) }, { UINT32_C( 6030), UINT32_C( 14920), UINT32_C( 631), UINT32_C( 3218) }, INT8_C( 0), { UINT32_C(120178679), UINT32_C( 57337107) } }, { { UINT32_C( 7008), UINT32_C( 13810) }, { UINT32_C( 4541), UINT32_C( 1104) }, { UINT32_C( 14960), UINT32_C( 1169), UINT32_C( 14367), UINT32_C( 15281) }, INT8_C( 1), { UINT32_C( 5315437), UINT32_C( 1304386) } }, { { UINT32_C( 19257), UINT32_C( 3056) }, { UINT32_C( 3291), UINT32_C( 3783) }, { UINT32_C( 7597), UINT32_C( 18771), UINT32_C( 5171), UINT32_C( 7806) }, INT8_C( 0), { UINT32_C( 25020984), UINT32_C( 28742507) } }, { { UINT32_C( 14218), UINT32_C( 15283) }, { UINT32_C( 17057), UINT32_C( 19454) }, { UINT32_C( 18483), UINT32_C( 19832), UINT32_C( 11066), UINT32_C( 2085) }, INT8_C( 3), { UINT32_C( 35578063), UINT32_C( 40576873) } }, { { UINT32_C( 19077), UINT32_C( 672) }, { UINT32_C( 13358), UINT32_C( 7702) }, { UINT32_C( 305), UINT32_C( 13216), UINT32_C( 15048), UINT32_C( 13974) }, INT8_C( 0), { UINT32_C( 4093267), UINT32_C( 2349782) } }, { { UINT32_C( 12243), UINT32_C( 2054) }, { UINT32_C( 15731), UINT32_C( 15822) }, { UINT32_C( 13246), UINT32_C( 4996), UINT32_C( 14773), UINT32_C( 18150) }, INT8_C( 1), { UINT32_C( 78604319), UINT32_C( 79048766) } }, { { UINT32_C( 16357), UINT32_C( 12567) }, { UINT32_C( 10743), UINT32_C( 126) }, { UINT32_C( 14907), UINT32_C( 9502), UINT32_C( 2633), UINT32_C( 4175) }, INT8_C( 2), { UINT32_C( 28302676), UINT32_C( 344325) } }, { { UINT32_C( 18517), UINT32_C( 19015) }, { UINT32_C( 12624), UINT32_C( 4257) }, { UINT32_C( 17459), UINT32_C( 18980), UINT32_C( 11775), UINT32_C( 17522) }, INT8_C( 3), { UINT32_C(221216245), UINT32_C( 74610169) } }, }; simde_uint32x2_t r, a, b; simde_uint32x4_t v; for (int i = 0 ; i < 8 ; i++) { a = simde_vld1_u32(test_vec[i].a); b = simde_vld1_u32(test_vec[i].b); v = simde_vld1q_u32(test_vec[i].v); switch(test_vec[i].lane) { case 0: r = simde_vmla_laneq_u32(a, b, v, 0); break; case 1: r = simde_vmla_laneq_u32(a, b, v, 1); break; case 2: r = simde_vmla_laneq_u32(a, b, v, 2); break; case 3: r = simde_vmla_laneq_u32(a, b, v, 3); break; default: HEDLEY_UNREACHABLE(); r = simde_vdup_n_u32(0); break; } simde_test_arm_neon_assert_equal_u32x2(r, simde_vld1_u32(test_vec[i].r)); } return 0; } static int test_simde_vmla_lane_u32 (SIMDE_MUNIT_TEST_ARGS) { #if 1 static const struct { uint32_t a[2]; uint32_t b[2]; uint32_t v[2]; int8_t lane; uint32_t r[2]; } test_vec[] = { { { UINT32_C(2312484602), UINT32_C(3397139468) }, { UINT32_C( 730399489), UINT32_C(3125101749) }, { UINT32_C(2008462712), UINT32_C(2806817902) }, INT8_C( 1), { UINT32_C(2414716264), UINT32_C(2902439378) } }, { { UINT32_C(1555760104), UINT32_C(2975213307) }, { UINT32_C( 952033531), UINT32_C(1597605980) }, { UINT32_C(1444176914), UINT32_C(1607388842) }, INT8_C( 1), { UINT32_C(3548406934), UINT32_C( 390904851) } }, { { UINT32_C(2435435845), UINT32_C(2004534388) }, { UINT32_C(2792543872), UINT32_C( 228664365) }, { UINT32_C(1785321954), UINT32_C(2004666643) }, INT8_C( 1), { UINT32_C(2082093253), UINT32_C(1889781963) } }, { { UINT32_C(2695635410), UINT32_C(1306866048) }, { UINT32_C( 532772698), UINT32_C(3349101041) }, { UINT32_C(3488892331), UINT32_C(3232825830) }, INT8_C( 1), { UINT32_C(4012816046), UINT32_C( 365834502) } }, { { UINT32_C(2553598748), UINT32_C(1818956106) }, { UINT32_C(4008446909), UINT32_C(1749629681) }, { UINT32_C( 878274811), UINT32_C(1289756679) }, INT8_C( 1), { UINT32_C( 58770759), UINT32_C(2359938529) } }, { { UINT32_C(1628844719), UINT32_C(3313336818) }, { UINT32_C(3339720117), UINT32_C(2357492864) }, { UINT32_C(2726130536), UINT32_C( 614393276) }, INT8_C( 0), { UINT32_C(2629849911), UINT32_C( 700290546) } }, { { UINT32_C(2992516050), UINT32_C(2841801591) }, { UINT32_C( 194823050), UINT32_C(1438736704) }, { UINT32_C(3990259825), UINT32_C(2136367628) }, INT8_C( 1), { UINT32_C(1726884426), UINT32_C( 556630647) } }, { { UINT32_C(2529442808), UINT32_C(2322137695) }, { UINT32_C(3556842336), UINT32_C(1079946109) }, { UINT32_C(2826987847), UINT32_C(2988103210) }, INT8_C( 0), { UINT32_C(2269983640), UINT32_C(4286633738) } }, }; simde_uint32x2_t r, a, b, v; for (int i = 0 ; i < 8 ; i++) { a = simde_vld1_u32(test_vec[i].a); b = simde_vld1_u32(test_vec[i].b); v = simde_vld1_u32(test_vec[i].v); switch(test_vec[i].lane) { case 0: r = simde_vmla_lane_u32(a, b, v, 0); break; case 1: r = simde_vmla_lane_u32(a, b, v, 1); break; default: HEDLEY_UNREACHABLE(); r = simde_vdup_n_u32(0); break; } simde_test_arm_neon_assert_equal_u32x2(r, simde_vld1_u32(test_vec[i].r)); } return 0; #else fputc('\n', stdout); for (int i = 0 ; i < 8 ; i++) { simde_uint32x2_t a = simde_test_arm_neon_random_u32x2(); simde_uint32x2_t b = simde_test_arm_neon_random_u32x2(); simde_uint32x2_t v = simde_test_arm_neon_random_u32x2(); int8_t lane = simde_test_codegen_random_i8() & 1; simde_uint32x2_t r; SIMDE_CONSTIFY_2_(simde_vmla_lane_u32, r, (HEDLEY_UNREACHABLE(), simde_vdup_n_u32(0)), lane, a, b, v); simde_test_arm_neon_write_u32x2(2, a, SIMDE_TEST_VEC_POS_FIRST); simde_test_arm_neon_write_u32x2(2, b, SIMDE_TEST_VEC_POS_MIDDLE); simde_test_arm_neon_write_u32x2(2, v, SIMDE_TEST_VEC_POS_MIDDLE); simde_test_codegen_write_i8(2, lane, SIMDE_TEST_VEC_POS_MIDDLE); simde_test_arm_neon_write_u32x2(2, r, SIMDE_TEST_VEC_POS_LAST); } return 1; #endif } static int test_simde_vmlaq_lane_f32 (SIMDE_MUNIT_TEST_ARGS) { #if 1 static const struct { float a[4]; float b[4]; float v[2]; int8_t lane; float r[4]; } test_vec[] = { { { SIMDE_FLOAT32_C( 648.31), SIMDE_FLOAT32_C( 897.29), SIMDE_FLOAT32_C( -773.49), SIMDE_FLOAT32_C( 917.71) }, { SIMDE_FLOAT32_C( -138.23), SIMDE_FLOAT32_C( -297.76), SIMDE_FLOAT32_C( 935.07), SIMDE_FLOAT32_C( -483.60) }, { SIMDE_FLOAT32_C( -953.66), SIMDE_FLOAT32_C( 360.53) }, INT8_C( 0), { SIMDE_FLOAT32_C(132472.72), SIMDE_FLOAT32_C(284859.09), SIMDE_FLOAT32_C(-892512.31), SIMDE_FLOAT32_C(462107.69) } }, { { SIMDE_FLOAT32_C( -713.70), SIMDE_FLOAT32_C( 72.02), SIMDE_FLOAT32_C( 505.39), SIMDE_FLOAT32_C( -410.47) }, { SIMDE_FLOAT32_C( 842.08), SIMDE_FLOAT32_C( 986.12), SIMDE_FLOAT32_C( -506.67), SIMDE_FLOAT32_C( -516.98) }, { SIMDE_FLOAT32_C( 668.61), SIMDE_FLOAT32_C( 247.66) }, INT8_C( 0), { SIMDE_FLOAT32_C(562309.44), SIMDE_FLOAT32_C(659401.69), SIMDE_FLOAT32_C(-338259.25), SIMDE_FLOAT32_C(-346068.44) } }, { { SIMDE_FLOAT32_C( -476.42), SIMDE_FLOAT32_C( -326.08), SIMDE_FLOAT32_C( -377.79), SIMDE_FLOAT32_C( 139.47) }, { SIMDE_FLOAT32_C( -585.78), SIMDE_FLOAT32_C( 724.87), SIMDE_FLOAT32_C( 305.39), SIMDE_FLOAT32_C( -586.36) }, { SIMDE_FLOAT32_C( 533.91), SIMDE_FLOAT32_C( -46.30) }, INT8_C( 0), { SIMDE_FLOAT32_C(-313230.22), SIMDE_FLOAT32_C(386689.22), SIMDE_FLOAT32_C(162672.98), SIMDE_FLOAT32_C(-312923.97) } }, { { SIMDE_FLOAT32_C( 760.42), SIMDE_FLOAT32_C( -128.59), SIMDE_FLOAT32_C( 172.70), SIMDE_FLOAT32_C( -537.34) }, { SIMDE_FLOAT32_C( -193.52), SIMDE_FLOAT32_C( 689.10), SIMDE_FLOAT32_C( -491.00), SIMDE_FLOAT32_C( -832.99) }, { SIMDE_FLOAT32_C( 327.17), SIMDE_FLOAT32_C( -204.71) }, INT8_C( 1), { SIMDE_FLOAT32_C( 40375.90), SIMDE_FLOAT32_C(-141194.25), SIMDE_FLOAT32_C(100685.32), SIMDE_FLOAT32_C(169984.05) } }, { { SIMDE_FLOAT32_C( -167.44), SIMDE_FLOAT32_C( 384.82), SIMDE_FLOAT32_C( 81.12), SIMDE_FLOAT32_C( -181.32) }, { SIMDE_FLOAT32_C( 878.15), SIMDE_FLOAT32_C( 564.14), SIMDE_FLOAT32_C( -512.72), SIMDE_FLOAT32_C( 125.81) }, { SIMDE_FLOAT32_C( -390.39), SIMDE_FLOAT32_C( 10.87) }, INT8_C( 0), { SIMDE_FLOAT32_C(-342988.44), SIMDE_FLOAT32_C(-219849.81), SIMDE_FLOAT32_C(200241.88), SIMDE_FLOAT32_C(-49296.29) } }, { { SIMDE_FLOAT32_C( 231.82), SIMDE_FLOAT32_C( -849.67), SIMDE_FLOAT32_C( -786.05), SIMDE_FLOAT32_C( -43.32) }, { SIMDE_FLOAT32_C( 455.72), SIMDE_FLOAT32_C( -372.41), SIMDE_FLOAT32_C( -509.41), SIMDE_FLOAT32_C( -590.58) }, { SIMDE_FLOAT32_C( -61.48), SIMDE_FLOAT32_C( -748.99) }, INT8_C( 0), { SIMDE_FLOAT32_C(-27785.85), SIMDE_FLOAT32_C( 22046.10), SIMDE_FLOAT32_C( 30532.48), SIMDE_FLOAT32_C( 36265.54) } }, { { SIMDE_FLOAT32_C( -888.78), SIMDE_FLOAT32_C( -286.33), SIMDE_FLOAT32_C( -912.68), SIMDE_FLOAT32_C( 800.32) }, { SIMDE_FLOAT32_C( 222.67), SIMDE_FLOAT32_C( -745.67), SIMDE_FLOAT32_C( 127.49), SIMDE_FLOAT32_C( -982.04) }, { SIMDE_FLOAT32_C( 493.37), SIMDE_FLOAT32_C( 960.04) }, INT8_C( 0), { SIMDE_FLOAT32_C(108969.91), SIMDE_FLOAT32_C(-368177.53), SIMDE_FLOAT32_C( 61987.06), SIMDE_FLOAT32_C(-483708.75) } }, { { SIMDE_FLOAT32_C( -425.51), SIMDE_FLOAT32_C( -221.28), SIMDE_FLOAT32_C( 280.93), SIMDE_FLOAT32_C( -861.37) }, { SIMDE_FLOAT32_C( 266.00), SIMDE_FLOAT32_C( -593.26), SIMDE_FLOAT32_C( -251.76), SIMDE_FLOAT32_C( -723.13) }, { SIMDE_FLOAT32_C( -793.53), SIMDE_FLOAT32_C( 980.05) }, INT8_C( 1), { SIMDE_FLOAT32_C(260267.78), SIMDE_FLOAT32_C(-581645.69), SIMDE_FLOAT32_C(-246456.44), SIMDE_FLOAT32_C(-709564.94) } }, }; simde_float32x4_t r, a, b; simde_float32x2_t v; for (int i = 0 ; i < 8 ; i++) { a = simde_vld1q_f32(test_vec[i].a); b = simde_vld1q_f32(test_vec[i].b); v = simde_vld1_f32(test_vec[i].v); switch(test_vec[i].lane) { case 0: r = simde_vmlaq_lane_f32(a, b, v, 0); break; case 1: r = simde_vmlaq_lane_f32(a, b, v, 1); break; default: HEDLEY_UNREACHABLE(); r = simde_vdupq_n_f32(0); break; } simde_test_arm_neon_assert_equal_f32x4(r, simde_vld1q_f32(test_vec[i].r), 1); } return 0; #else fputc('\n', stdout); for (int i = 0 ; i < 8 ; i++) { simde_float32x4_t a = simde_test_arm_neon_random_f32x4(-1000.0f, 1000.0f); simde_float32x4_t b = simde_test_arm_neon_random_f32x4(-1000.0f, 1000.0f); simde_float32x2_t v = simde_test_arm_neon_random_f32x2(-1000.0f, 1000.0f); int8_t lane = simde_test_codegen_random_i8() & 1; simde_float32x4_t r; SIMDE_CONSTIFY_2_(simde_vmlaq_lane_f32, r, (HEDLEY_UNREACHABLE(), simde_vdupq_n_f32(0)), lane, a, b, v); simde_test_arm_neon_write_f32x4(2, a, SIMDE_TEST_VEC_POS_FIRST); simde_test_arm_neon_write_f32x4(2, b, SIMDE_TEST_VEC_POS_MIDDLE); simde_test_arm_neon_write_f32x2(2, v, SIMDE_TEST_VEC_POS_MIDDLE); simde_test_codegen_write_i8(2, lane, SIMDE_TEST_VEC_POS_MIDDLE); simde_test_arm_neon_write_f32x4(2, r, SIMDE_TEST_VEC_POS_LAST); } return 1; #endif } static int test_simde_vmlaq_lane_s16 (SIMDE_MUNIT_TEST_ARGS) { #if 1 static const struct { int16_t a[8]; int16_t b[8]; int16_t v[4]; int8_t lane; int16_t r[8]; } test_vec[] = { { { INT16_C( 28467), -INT16_C( 7305), -INT16_C( 26990), -INT16_C( 25666), -INT16_C( 14573), -INT16_C( 10172), INT16_C( 16657), INT16_C( 13285) }, { INT16_C( 31301), INT16_C( 32005), -INT16_C( 17012), -INT16_C( 28293), INT16_C( 23125), -INT16_C( 32259), INT16_C( 14073), INT16_C( 11642) }, { -INT16_C( 3675), INT16_C( 14352), -INT16_C( 12665), -INT16_C( 25901) }, INT8_C( 2), { INT16_C( 28566), -INT16_C( 10470), INT16_C( 13158), INT16_C( 19867), -INT16_C( 12314), -INT16_C( 1361), -INT16_C( 25504), INT16_C( 23355) } }, { { INT16_C( 29207), INT16_C( 22695), -INT16_C( 9385), -INT16_C( 11875), INT16_C( 7136), -INT16_C( 25250), -INT16_C( 4202), -INT16_C( 3597) }, { INT16_C( 29932), INT16_C( 8938), INT16_C( 6126), -INT16_C( 8248), INT16_C( 40), -INT16_C( 2458), INT16_C( 211), -INT16_C( 5492) }, { INT16_C( 13426), -INT16_C( 14014), -INT16_C( 8177), -INT16_C( 4198) }, INT8_C( 3), { INT16_C( 7183), -INT16_C( 12437), INT16_C( 29315), INT16_C( 10221), -INT16_C( 29712), INT16_C( 4282), INT16_C( 27524), -INT16_C( 16853) } }, { { -INT16_C( 29448), -INT16_C( 5999), -INT16_C( 32129), -INT16_C( 3116), -INT16_C( 2195), -INT16_C( 31519), -INT16_C( 16193), -INT16_C( 16468) }, { -INT16_C( 23770), INT16_C( 9874), INT16_C( 31791), INT16_C( 25496), INT16_C( 25022), -INT16_C( 24974), INT16_C( 25084), -INT16_C( 2919) }, { INT16_C( 11246), INT16_C( 28124), -INT16_C( 20051), INT16_C( 6753) }, INT8_C( 0), { -INT16_C( 25524), INT16_C( 19021), -INT16_C( 9423), INT16_C( 4900), -INT16_C( 16367), -INT16_C( 1827), INT16_C( 11527), -INT16_C( 10006) } }, { { -INT16_C( 24766), INT16_C( 871), INT16_C( 9803), -INT16_C( 4567), INT16_C( 20664), INT16_C( 13342), -INT16_C( 32280), INT16_C( 19186) }, { -INT16_C( 28172), INT16_C( 21830), INT16_C( 14890), INT16_C( 21827), -INT16_C( 20201), -INT16_C( 14333), INT16_C( 7442), INT16_C( 21616) }, { -INT16_C( 10308), INT16_C( 2135), -INT16_C( 32259), -INT16_C( 18954) }, INT8_C( 1), { -INT16_C( 9938), INT16_C( 11825), INT16_C( 14993), -INT16_C( 18), INT16_C( 14217), INT16_C( 17699), -INT16_C( 3322), INT16_C( 32002) } }, { { -INT16_C( 5868), -INT16_C( 26951), INT16_C( 987), INT16_C( 27786), -INT16_C( 8375), -INT16_C( 31593), -INT16_C( 5085), -INT16_C( 11109) }, { INT16_C( 25583), INT16_C( 3558), INT16_C( 15059), -INT16_C( 21815), -INT16_C( 11886), INT16_C( 5031), INT16_C( 23752), -INT16_C( 8988) }, { -INT16_C( 25275), INT16_C( 8306), -INT16_C( 863), -INT16_C( 5491) }, INT8_C( 0), { INT16_C( 27519), INT16_C( 25527), INT16_C( 17850), -INT16_C( 17993), -INT16_C( 6749), INT16_C( 15258), -INT16_C( 27125), INT16_C( 12815) } }, { { INT16_C( 28196), INT16_C( 4351), -INT16_C( 11511), INT16_C( 27648), INT16_C( 3513), -INT16_C( 3265), -INT16_C( 5674), -INT16_C( 22395) }, { -INT16_C( 26480), -INT16_C( 5008), INT16_C( 19580), INT16_C( 6705), INT16_C( 21183), -INT16_C( 17477), -INT16_C( 23073), INT16_C( 919) }, { -INT16_C( 27116), INT16_C( 7443), INT16_C( 4969), INT16_C( 8842) }, INT8_C( 0), { -INT16_C( 18076), INT16_C( 10687), INT16_C( 29881), INT16_C( 11732), INT16_C( 28325), INT16_C( 12251), -INT16_C( 30398), INT16_C( 27217) } }, { { INT16_C( 5833), -INT16_C( 19465), -INT16_C( 24677), INT16_C( 13379), INT16_C( 12303), INT16_C( 23472), -INT16_C( 13727), -INT16_C( 19686) }, { -INT16_C( 10619), INT16_C( 11154), -INT16_C( 27283), INT16_C( 1087), INT16_C( 23721), -INT16_C( 17299), -INT16_C( 28442), -INT16_C( 20259) }, { -INT16_C( 11098), INT16_C( 16739), -INT16_C( 22925), -INT16_C( 32139) }, INT8_C( 2), { -INT16_C( 19832), -INT16_C( 3443), INT16_C( 28050), -INT16_C( 2416), INT16_C( 26106), -INT16_C( 20825), INT16_C( 1459), INT16_C( 29793) } }, { { -INT16_C( 8922), -INT16_C( 4040), -INT16_C( 5128), -INT16_C( 12682), -INT16_C( 24194), INT16_C( 4923), INT16_C( 16352), INT16_C( 15548) }, { INT16_C( 31149), INT16_C( 15651), -INT16_C( 11434), INT16_C( 10979), INT16_C( 9270), -INT16_C( 9059), INT16_C( 8090), -INT16_C( 16205) }, { -INT16_C( 5124), -INT16_C( 2896), INT16_C( 9942), INT16_C( 21698) }, INT8_C( 3), { -INT16_C( 10688), -INT16_C( 16194), INT16_C( 19236), -INT16_C( 13700), -INT16_C( 13718), -INT16_C( 14795), -INT16_C( 17772), INT16_C( 98) } }, }; simde_int16x8_t r, a, b; simde_int16x4_t v; for (int i = 0 ; i < 8 ; i++) { a = simde_vld1q_s16(test_vec[i].a); b = simde_vld1q_s16(test_vec[i].b); v = simde_vld1_s16(test_vec[i].v); switch(test_vec[i].lane) { case 0: r = simde_vmlaq_lane_s16(a, b, v, 0); break; case 1: r = simde_vmlaq_lane_s16(a, b, v, 1); break; case 2: r = simde_vmlaq_lane_s16(a, b, v, 2); break; case 3: r = simde_vmlaq_lane_s16(a, b, v, 3); break; default: HEDLEY_UNREACHABLE(); r = simde_vdupq_n_s16(0); break; } simde_test_arm_neon_assert_equal_i16x8(r, simde_vld1q_s16(test_vec[i].r)); } return 0; #else fputc('\n', stdout); for (int i = 0 ; i < 8 ; i++) { simde_int16x8_t a = simde_test_arm_neon_random_i16x8(); simde_int16x8_t b = simde_test_arm_neon_random_i16x8(); simde_int16x4_t v = simde_test_arm_neon_random_i16x4(); int8_t lane = simde_test_codegen_random_i8() & 3; simde_int16x8_t r; SIMDE_CONSTIFY_4_(simde_vmlaq_lane_s16, r, (HEDLEY_UNREACHABLE(), simde_vdupq_n_s16(0)), lane, a, b, v); simde_test_arm_neon_write_i16x8(2, a, SIMDE_TEST_VEC_POS_FIRST); simde_test_arm_neon_write_i16x8(2, b, SIMDE_TEST_VEC_POS_MIDDLE); simde_test_arm_neon_write_i16x4(2, v, SIMDE_TEST_VEC_POS_MIDDLE); simde_test_codegen_write_i8(2, lane, SIMDE_TEST_VEC_POS_MIDDLE); simde_test_arm_neon_write_i16x8(2, r, SIMDE_TEST_VEC_POS_LAST); } return 1; #endif } static int test_simde_vmlaq_lane_s32 (SIMDE_MUNIT_TEST_ARGS) { #if 1 static const struct { int32_t a[4]; int32_t b[4]; int32_t v[2]; int8_t lane; int32_t r[4]; } test_vec[] = { { { -INT32_C( 1901227562), INT32_C( 1506304066), INT32_C( 10101458), -INT32_C( 929349876) }, { -INT32_C( 724051569), INT32_C( 111411401), INT32_C( 372195801), INT32_C( 1276217462) }, { INT32_C( 1541127961), -INT32_C( 239820001) }, INT8_C( 1), { INT32_C( 1541601063), INT32_C( 1517843353), INT32_C( 1557415705), INT32_C( 831907670) } }, { { -INT32_C( 1915555250), INT32_C( 1713216141), INT32_C( 1915744626), -INT32_C( 682936938) }, { -INT32_C( 313695643), INT32_C( 839293555), INT32_C( 407986549), INT32_C( 1692222229) }, { -INT32_C( 1024348363), -INT32_C( 1138225590) }, INT8_C( 0), { -INT32_C( 1070572489), -INT32_C( 783077028), -INT32_C( 2050156117), INT32_C( 179991535) } }, { { -INT32_C( 1936314793), -INT32_C( 604934791), INT32_C( 1431297723), INT32_C( 1170899428) }, { INT32_C( 375120595), INT32_C( 1867235263), -INT32_C( 1078391376), -INT32_C( 1933609675) }, { INT32_C( 471356835), INT32_C( 2113407682) }, INT8_C( 0), { -INT32_C( 1557157456), -INT32_C( 1111560426), INT32_C( 1647248843), INT32_C( 1049934755) } }, { { -INT32_C( 926035385), INT32_C( 2124092060), INT32_C( 742306157), INT32_C( 165522940) }, { -INT32_C( 616653722), -INT32_C( 1333867941), -INT32_C( 311256349), -INT32_C( 640290670) }, { INT32_C( 1604494018), INT32_C( 584924597) }, INT8_C( 1), { INT32_C( 1197782117), INT32_C( 1158075379), INT32_C( 958745324), INT32_C( 444436278) } }, { { -INT32_C( 924102885), -INT32_C( 936446676), -INT32_C( 31258317), INT32_C( 585225095) }, { INT32_C( 901041733), INT32_C( 1190694563), INT32_C( 1845188400), INT32_C( 1348214068) }, { -INT32_C( 1743239060), INT32_C( 1885357885) }, INT8_C( 0), { -INT32_C( 1716667337), -INT32_C( 932120080), -INT32_C( 1053732493), -INT32_C( 1898658441) } }, { { INT32_C( 1457024643), INT32_C( 496826959), INT32_C( 1019335086), INT32_C( 543950793) }, { INT32_C( 525720066), INT32_C( 2123146550), INT32_C( 79373501), INT32_C( 139799685) }, { -INT32_C( 362861158), -INT32_C( 720897241) }, INT8_C( 0), { INT32_C( 42855863), -INT32_C( 1572021557), INT32_C( 1592665184), INT32_C( 869740747) } }, { { -INT32_C( 812248376), INT32_C( 1490138750), -INT32_C( 1332743925), -INT32_C( 1586623107) }, { -INT32_C( 182029623), -INT32_C( 191942713), -INT32_C( 1994688114), INT32_C( 1230369153) }, { -INT32_C( 2129007869), -INT32_C( 1378162014) }, INT8_C( 1), { -INT32_C( 1426034694), INT32_C( 663738476), INT32_C( 167422183), INT32_C( 1835715359) } }, { { INT32_C( 1985502825), INT32_C( 1044380364), INT32_C( 1325806624), INT32_C( 1037957828) }, { INT32_C( 129918486), -INT32_C( 1492514628), INT32_C( 189369121), -INT32_C( 823658651) }, { INT32_C( 558186325), INT32_C( 1516209209) }, INT8_C( 1), { -INT32_C( 91590321), -INT32_C( 239018840), -INT32_C( 111005063), INT32_C( 999236673) } }, }; simde_int32x4_t r, a, b; simde_int32x2_t v; for (int i = 0 ; i < 8 ; i++) { a = simde_vld1q_s32(test_vec[i].a); b = simde_vld1q_s32(test_vec[i].b); v = simde_vld1_s32(test_vec[i].v); switch(test_vec[i].lane) { case 0: r = simde_vmlaq_lane_s32(a, b, v, 0); break; case 1: r = simde_vmlaq_lane_s32(a, b, v, 1); break; default: HEDLEY_UNREACHABLE(); r = simde_vdupq_n_s32(0); break; } simde_test_arm_neon_assert_equal_i32x4(r, simde_vld1q_s32(test_vec[i].r)); } return 0; #else fputc('\n', stdout); for (int i = 0 ; i < 8 ; i++) { simde_int32x4_t a = simde_test_arm_neon_random_i32x4(); simde_int32x4_t b = simde_test_arm_neon_random_i32x4(); simde_int32x2_t v = simde_test_arm_neon_random_i32x2(); int8_t lane = simde_test_codegen_random_i8() & 1; simde_int32x4_t r; SIMDE_CONSTIFY_2_(simde_vmlaq_lane_s32, r, (HEDLEY_UNREACHABLE(), simde_vdupq_n_s32(0)), lane, a, b, v); simde_test_arm_neon_write_i32x4(2, a, SIMDE_TEST_VEC_POS_FIRST); simde_test_arm_neon_write_i32x4(2, b, SIMDE_TEST_VEC_POS_MIDDLE); simde_test_arm_neon_write_i32x2(2, v, SIMDE_TEST_VEC_POS_MIDDLE); simde_test_codegen_write_i8(2, lane, SIMDE_TEST_VEC_POS_MIDDLE); simde_test_arm_neon_write_i32x4(2, r, SIMDE_TEST_VEC_POS_LAST); } return 1; #endif } static int test_simde_vmlaq_lane_u16 (SIMDE_MUNIT_TEST_ARGS) { #if 1 static const struct { uint16_t a[8]; uint16_t b[8]; uint16_t v[4]; int8_t lane; uint16_t r[8]; } test_vec[] = { { { UINT16_C(42664), UINT16_C(43275), UINT16_C(38735), UINT16_C(35292), UINT16_C( 8900), UINT16_C(58767), UINT16_C(34556), UINT16_C(44209) }, { UINT16_C(30267), UINT16_C(58512), UINT16_C(42143), UINT16_C(34235), UINT16_C(18555), UINT16_C(23535), UINT16_C(64588), UINT16_C(62794) }, { UINT16_C(21922), UINT16_C(61854), UINT16_C(31724), UINT16_C(45178) }, INT8_C( 1), { UINT16_C(10770), UINT16_C(18923), UINT16_C(57457), UINT16_C( 7750), UINT16_C(43438), UINT16_C(41489), UINT16_C(51684), UINT16_C(47709) } }, { { UINT16_C(38410), UINT16_C(37017), UINT16_C(17735), UINT16_C(48587), UINT16_C(45270), UINT16_C(31325), UINT16_C(57963), UINT16_C(46069) }, { UINT16_C(20690), UINT16_C(52991), UINT16_C(62618), UINT16_C(61297), UINT16_C(25235), UINT16_C( 3804), UINT16_C(36061), UINT16_C(59307) }, { UINT16_C(17442), UINT16_C(27255), UINT16_C(17289), UINT16_C(24359) }, INT8_C( 3), { UINT16_C(54280), UINT16_C(47730), UINT16_C(44733), UINT16_C( 9986), UINT16_C(16955), UINT16_C(25057), UINT16_C(23318), UINT16_C(29698) } }, { { UINT16_C(55940), UINT16_C(26462), UINT16_C( 4559), UINT16_C( 8249), UINT16_C( 1808), UINT16_C( 1466), UINT16_C(43640), UINT16_C(56216) }, { UINT16_C(42630), UINT16_C( 4792), UINT16_C(40785), UINT16_C(38197), UINT16_C(40726), UINT16_C(22814), UINT16_C(32454), UINT16_C(19276) }, { UINT16_C(43608), UINT16_C(10162), UINT16_C(60347), UINT16_C(52295) }, INT8_C( 2), { UINT16_C(32870), UINT16_C(64454), UINT16_C(52474), UINT16_C(50416), UINT16_C(28194), UINT16_C(43172), UINT16_C( 1818), UINT16_C(40988) } }, { { UINT16_C(53506), UINT16_C(44139), UINT16_C(18025), UINT16_C( 3890), UINT16_C(17662), UINT16_C(40288), UINT16_C(62841), UINT16_C( 6323) }, { UINT16_C( 3347), UINT16_C(37343), UINT16_C(10841), UINT16_C( 1257), UINT16_C( 4572), UINT16_C(51135), UINT16_C(35672), UINT16_C(23225) }, { UINT16_C( 9308), UINT16_C(50438), UINT16_C(14442), UINT16_C(26836) }, INT8_C( 1), { UINT16_C(48756), UINT16_C(45733), UINT16_C(49535), UINT16_C(31144), UINT16_C(64550), UINT16_C(18138), UINT16_C(61833), UINT16_C(38409) } }, { { UINT16_C( 1332), UINT16_C(10742), UINT16_C( 4025), UINT16_C(50749), UINT16_C(52974), UINT16_C( 6175), UINT16_C( 9144), UINT16_C(51700) }, { UINT16_C(48099), UINT16_C(28193), UINT16_C(31860), UINT16_C(39371), UINT16_C(36994), UINT16_C(47875), UINT16_C(27749), UINT16_C(39224) }, { UINT16_C(11889), UINT16_C(10947), UINT16_C( 61), UINT16_C(11248) }, INT8_C( 2), { UINT16_C(51787), UINT16_C(26579), UINT16_C(46941), UINT16_C(27548), UINT16_C(15848), UINT16_C(42966), UINT16_C(63433), UINT16_C(19532) } }, { { UINT16_C(17168), UINT16_C(13190), UINT16_C(20279), UINT16_C(61974), UINT16_C(34161), UINT16_C(60775), UINT16_C( 80), UINT16_C(57455) }, { UINT16_C(10755), UINT16_C(28485), UINT16_C(57186), UINT16_C(37345), UINT16_C( 2978), UINT16_C(41678), UINT16_C(64252), UINT16_C( 3184) }, { UINT16_C(63293), UINT16_C(30015), UINT16_C(22086), UINT16_C(46951) }, INT8_C( 3), { UINT16_C(20293), UINT16_C(19273), UINT16_C(15781), UINT16_C(31389), UINT16_C( 415), UINT16_C(45129), UINT16_C( 8116), UINT16_C(61823) } }, { { UINT16_C(42190), UINT16_C(52779), UINT16_C( 2836), UINT16_C(16082), UINT16_C(16721), UINT16_C(12449), UINT16_C(12834), UINT16_C(11986) }, { UINT16_C(29696), UINT16_C(64042), UINT16_C(14052), UINT16_C(56120), UINT16_C(44405), UINT16_C(52002), UINT16_C(55572), UINT16_C(58278) }, { UINT16_C(53630), UINT16_C(37553), UINT16_C(33757), UINT16_C(11984) }, INT8_C( 1), { UINT16_C(55502), UINT16_C(47413), UINT16_C( 1720), UINT16_C(49290), UINT16_C(59702), UINT16_C( 1827), UINT16_C(45302), UINT16_C(16536) } }, { { UINT16_C(24177), UINT16_C(41959), UINT16_C( 5424), UINT16_C(42148), UINT16_C(40511), UINT16_C(30088), UINT16_C(25814), UINT16_C(33771) }, { UINT16_C(46726), UINT16_C(24472), UINT16_C(31581), UINT16_C(11997), UINT16_C(28460), UINT16_C(45067), UINT16_C(14656), UINT16_C(45429) }, { UINT16_C(23703), UINT16_C(51029), UINT16_C(63858), UINT16_C(45419) }, INT8_C( 3), { UINT16_C(20083), UINT16_C(45167), UINT16_C(61967), UINT16_C( 2051), UINT16_C(33187), UINT16_C(42273), UINT16_C(37526), UINT16_C(38098) } }, }; simde_uint16x8_t r, a, b; simde_uint16x4_t v; for (int i = 0 ; i < 8 ; i++) { a = simde_vld1q_u16(test_vec[i].a); b = simde_vld1q_u16(test_vec[i].b); v = simde_vld1_u16(test_vec[i].v); switch(test_vec[i].lane) { case 0: r = simde_vmlaq_lane_u16(a, b, v, 0); break; case 1: r = simde_vmlaq_lane_u16(a, b, v, 1); break; case 2: r = simde_vmlaq_lane_u16(a, b, v, 2); break; case 3: r = simde_vmlaq_lane_u16(a, b, v, 3); break; default: HEDLEY_UNREACHABLE(); r = simde_vdupq_n_u16(0); break; } simde_test_arm_neon_assert_equal_u16x8(r, simde_vld1q_u16(test_vec[i].r)); } return 0; #else fputc('\n', stdout); for (int i = 0 ; i < 8 ; i++) { simde_uint16x8_t a = simde_test_arm_neon_random_u16x8(); simde_uint16x8_t b = simde_test_arm_neon_random_u16x8(); simde_uint16x4_t v = simde_test_arm_neon_random_u16x4(); int8_t lane = simde_test_codegen_random_i8() & 3; simde_uint16x8_t r; SIMDE_CONSTIFY_4_(simde_vmlaq_lane_u16, r, (HEDLEY_UNREACHABLE(), simde_vdupq_n_u16(0)), lane, a, b, v); simde_test_arm_neon_write_u16x8(2, a, SIMDE_TEST_VEC_POS_FIRST); simde_test_arm_neon_write_u16x8(2, b, SIMDE_TEST_VEC_POS_MIDDLE); simde_test_arm_neon_write_u16x4(2, v, SIMDE_TEST_VEC_POS_MIDDLE); simde_test_codegen_write_i8(2, lane, SIMDE_TEST_VEC_POS_MIDDLE); simde_test_arm_neon_write_u16x8(2, r, SIMDE_TEST_VEC_POS_LAST); } return 1; #endif } static int test_simde_vmlaq_lane_u32 (SIMDE_MUNIT_TEST_ARGS) { #if 1 static const struct { uint32_t a[4]; uint32_t b[4]; uint32_t v[2]; int8_t lane; uint32_t r[4]; } test_vec[] = { { { UINT32_C(4049857574), UINT32_C(4004185250), UINT32_C(3183129877), UINT32_C(2494230254) }, { UINT32_C(3135721086), UINT32_C(1529636560), UINT32_C(3772764706), UINT32_C( 295409387) }, { UINT32_C( 620953475), UINT32_C( 403942915) }, INT8_C( 1), { UINT32_C(4241324960), UINT32_C(1333893394), UINT32_C(1236486011), UINT32_C(3313659311) } }, { { UINT32_C(3159545293), UINT32_C(3443189375), UINT32_C( 882767310), UINT32_C(4082628897) }, { UINT32_C(1876899800), UINT32_C(3522359506), UINT32_C(2715097075), UINT32_C(4144295210) }, { UINT32_C(1119049411), UINT32_C( 185658941) }, INT8_C( 1), { UINT32_C(2951607365), UINT32_C(3273753737), UINT32_C(3503854773), UINT32_C( 77695011) } }, { { UINT32_C(2785296301), UINT32_C(3447715734), UINT32_C(3349212886), UINT32_C(4156191200) }, { UINT32_C( 874601286), UINT32_C(3069646943), UINT32_C(3136502220), UINT32_C(4154326601) }, { UINT32_C(3567100221), UINT32_C(1872829592) }, INT8_C( 0), { UINT32_C(4266394971), UINT32_C(1794606393), UINT32_C(2903179378), UINT32_C(3155227205) } }, { { UINT32_C(3018470977), UINT32_C(1274667504), UINT32_C( 464137474), UINT32_C(1592221732) }, { UINT32_C(1369940307), UINT32_C(3750731326), UINT32_C(1484219196), UINT32_C(1180952068) }, { UINT32_C( 217664796), UINT32_C( 827847215) }, INT8_C( 0), { UINT32_C(3682652757), UINT32_C(3298154168), UINT32_C( 116265874), UINT32_C( 132627604) } }, { { UINT32_C(1648643074), UINT32_C(3568738867), UINT32_C(3893495626), UINT32_C(4179947926) }, { UINT32_C(1342078313), UINT32_C( 762070240), UINT32_C( 794589245), UINT32_C(3528429264) }, { UINT32_C( 238327002), UINT32_C(2162354742) }, INT8_C( 0), { UINT32_C(3637496684), UINT32_C(1480247539), UINT32_C(1958195004), UINT32_C(1907674806) } }, { { UINT32_C(3867699701), UINT32_C( 172982925), UINT32_C(3303710592), UINT32_C(2197886987) }, { UINT32_C( 39006324), UINT32_C( 350037376), UINT32_C(1145760602), UINT32_C(3258371021) }, { UINT32_C(3249127220), UINT32_C(3251435585) }, INT8_C( 1), { UINT32_C( 621287273), UINT32_C(4106881037), UINT32_C( 363303258), UINT32_C(3702877976) } }, { { UINT32_C(3466757558), UINT32_C(3057854086), UINT32_C(2671134073), UINT32_C( 234441250) }, { UINT32_C(1624980885), UINT32_C( 865377652), UINT32_C(1064588614), UINT32_C(3637916961) }, { UINT32_C(1084651962), UINT32_C( 418834847) }, INT8_C( 1), { UINT32_C(2802344513), UINT32_C( 811042194), UINT32_C(1800925683), UINT32_C(3608498849) } }, { { UINT32_C(2001844013), UINT32_C(3993788336), UINT32_C(3613551674), UINT32_C(1444844800) }, { UINT32_C(1048009993), UINT32_C(2901954355), UINT32_C(3746248950), UINT32_C(1527669806) }, { UINT32_C(3436404763), UINT32_C(4189773759) }, INT8_C( 0), { UINT32_C(2872502048), UINT32_C( 888723985), UINT32_C(2490347052), UINT32_C(2417911258) } }, }; simde_uint32x4_t r, a, b; simde_uint32x2_t v; for (int i = 0 ; i < 8 ; i++) { a = simde_vld1q_u32(test_vec[i].a); b = simde_vld1q_u32(test_vec[i].b); v = simde_vld1_u32(test_vec[i].v); switch(test_vec[i].lane) { case 0: r = simde_vmlaq_lane_u32(a, b, v, 0); break; case 1: r = simde_vmlaq_lane_u32(a, b, v, 1); break; default: HEDLEY_UNREACHABLE(); r = simde_vdupq_n_u32(0); break; } simde_test_arm_neon_assert_equal_u32x4(r, simde_vld1q_u32(test_vec[i].r)); } return 0; #else fputc('\n', stdout); for (int i = 0 ; i < 8 ; i++) { simde_uint32x4_t a = simde_test_arm_neon_random_u32x4(); simde_uint32x4_t b = simde_test_arm_neon_random_u32x4(); simde_uint32x2_t v = simde_test_arm_neon_random_u32x2(); int8_t lane = simde_test_codegen_random_i8() & 1; simde_uint32x4_t r; SIMDE_CONSTIFY_2_(simde_vmlaq_lane_u32, r, (HEDLEY_UNREACHABLE(), simde_vdupq_n_u32(0)), lane, a, b, v); simde_test_arm_neon_write_u32x4(2, a, SIMDE_TEST_VEC_POS_FIRST); simde_test_arm_neon_write_u32x4(2, b, SIMDE_TEST_VEC_POS_MIDDLE); simde_test_arm_neon_write_u32x2(2, v, SIMDE_TEST_VEC_POS_MIDDLE); simde_test_codegen_write_i8(2, lane, SIMDE_TEST_VEC_POS_MIDDLE); simde_test_arm_neon_write_u32x4(2, r, SIMDE_TEST_VEC_POS_LAST); } return 1; #endif } static int test_simde_vmlaq_laneq_f32 (SIMDE_MUNIT_TEST_ARGS) { static const struct { float a[4]; float b[4]; float v[4]; int8_t lane; float r[4]; } test_vec[] = { { { SIMDE_FLOAT32_C( 8442.05), SIMDE_FLOAT32_C( -1389.69), SIMDE_FLOAT32_C( -7758.59), SIMDE_FLOAT32_C( 9540.76) }, { SIMDE_FLOAT32_C( 6942.28), SIMDE_FLOAT32_C( 8460.25), SIMDE_FLOAT32_C( -6145.94), SIMDE_FLOAT32_C( -5237.55) }, { SIMDE_FLOAT32_C( 6.77), SIMDE_FLOAT32_C( -67.83), SIMDE_FLOAT32_C( 8178.24), SIMDE_FLOAT32_C( 8618.63) }, INT8_C( 0), { SIMDE_FLOAT32_C( 55441.29), SIMDE_FLOAT32_C( 55886.20), SIMDE_FLOAT32_C(-49366.60), SIMDE_FLOAT32_C(-25917.45) } }, { { SIMDE_FLOAT32_C( 5329.09), SIMDE_FLOAT32_C( -8842.70), SIMDE_FLOAT32_C( 1083.15), SIMDE_FLOAT32_C( 2779.22) }, { SIMDE_FLOAT32_C( -5037.14), SIMDE_FLOAT32_C( -4543.60), SIMDE_FLOAT32_C( -1131.52), SIMDE_FLOAT32_C( 4145.12) }, { SIMDE_FLOAT32_C( 4928.14), SIMDE_FLOAT32_C( -3195.41), SIMDE_FLOAT32_C( 9422.83), SIMDE_FLOAT32_C( 529.15) }, INT8_C( 1), { SIMDE_FLOAT32_C(16101056.62), SIMDE_FLOAT32_C(14509822.18), SIMDE_FLOAT32_C(3616753.47), SIMDE_FLOAT32_C(-13242578.68) } }, { { SIMDE_FLOAT32_C( 3210.16), SIMDE_FLOAT32_C( -8073.64), SIMDE_FLOAT32_C( -1871.73), SIMDE_FLOAT32_C( 7766.76) }, { SIMDE_FLOAT32_C( 8132.39), SIMDE_FLOAT32_C( -6406.75), SIMDE_FLOAT32_C( -1445.99), SIMDE_FLOAT32_C( 9952.74) }, { SIMDE_FLOAT32_C( -5644.48), SIMDE_FLOAT32_C( 639.33), SIMDE_FLOAT32_C( -1095.59), SIMDE_FLOAT32_C( -658.50) }, INT8_C( 0), { SIMDE_FLOAT32_C(-45899902.55), SIMDE_FLOAT32_C(36154698.60), SIMDE_FLOAT32_C(8159989.91), SIMDE_FLOAT32_C(-56170275.12) } }, { { SIMDE_FLOAT32_C( 9159.77), SIMDE_FLOAT32_C( -4542.00), SIMDE_FLOAT32_C( 9445.80), SIMDE_FLOAT32_C( -2110.99) }, { SIMDE_FLOAT32_C( -9801.74), SIMDE_FLOAT32_C( 1886.98), SIMDE_FLOAT32_C( 75.78), SIMDE_FLOAT32_C( -3125.09) }, { SIMDE_FLOAT32_C( 637.73), SIMDE_FLOAT32_C( -6924.14), SIMDE_FLOAT32_C( 4915.85), SIMDE_FLOAT32_C( -4312.70) }, INT8_C( 2), { SIMDE_FLOAT32_C(-48174723.81), SIMDE_FLOAT32_C(9271568.63), SIMDE_FLOAT32_C(381968.91), SIMDE_FLOAT32_C(-15364584.67) } }, { { SIMDE_FLOAT32_C( 8169.70), SIMDE_FLOAT32_C( -7479.28), SIMDE_FLOAT32_C( 3348.22), SIMDE_FLOAT32_C( 9587.11) }, { SIMDE_FLOAT32_C( 8706.77), SIMDE_FLOAT32_C( 3214.14), SIMDE_FLOAT32_C( 4481.19), SIMDE_FLOAT32_C( 2317.74) }, { SIMDE_FLOAT32_C( 6486.86), SIMDE_FLOAT32_C( -4651.54), SIMDE_FLOAT32_C( -6489.10), SIMDE_FLOAT32_C( -2517.83) }, INT8_C( 3), { SIMDE_FLOAT32_C(-21913997.01), SIMDE_FLOAT32_C(-8100137.40), SIMDE_FLOAT32_C(-11279526.40), SIMDE_FLOAT32_C(-5826088.19) } }, { { SIMDE_FLOAT32_C( 3469.51), SIMDE_FLOAT32_C( 2478.92), SIMDE_FLOAT32_C( 3545.43), SIMDE_FLOAT32_C( 7751.36) }, { SIMDE_FLOAT32_C( -6649.73), SIMDE_FLOAT32_C( -7867.38), SIMDE_FLOAT32_C( 615.31), SIMDE_FLOAT32_C( 7194.09) }, { SIMDE_FLOAT32_C( -94.57), SIMDE_FLOAT32_C( 6945.08), SIMDE_FLOAT32_C( -3326.00), SIMDE_FLOAT32_C( 9571.16) }, INT8_C( 1), { SIMDE_FLOAT32_C(-46179437.32), SIMDE_FLOAT32_C(-54637104.57), SIMDE_FLOAT32_C(4276922.60), SIMDE_FLOAT32_C(49971281.94) } }, { { SIMDE_FLOAT32_C( -114.66), SIMDE_FLOAT32_C( -857.24), SIMDE_FLOAT32_C( 5238.98), SIMDE_FLOAT32_C( 8989.32) }, { SIMDE_FLOAT32_C( 414.11), SIMDE_FLOAT32_C( -4411.42), SIMDE_FLOAT32_C( -3370.65), SIMDE_FLOAT32_C( -285.04) }, { SIMDE_FLOAT32_C( 9685.87), SIMDE_FLOAT32_C( -5631.83), SIMDE_FLOAT32_C( 6655.15), SIMDE_FLOAT32_C( -1696.69) }, INT8_C( 2), { SIMDE_FLOAT32_C(2755849.51), SIMDE_FLOAT32_C(-29359519.05), SIMDE_FLOAT32_C(-22426942.37), SIMDE_FLOAT32_C(-1887994.64) } }, { { SIMDE_FLOAT32_C( -7938.21), SIMDE_FLOAT32_C( 4723.86), SIMDE_FLOAT32_C( 4094.72), SIMDE_FLOAT32_C( 8367.37) }, { SIMDE_FLOAT32_C( -2636.63), SIMDE_FLOAT32_C( -3127.64), SIMDE_FLOAT32_C( 8864.91), SIMDE_FLOAT32_C( 2740.01) }, { SIMDE_FLOAT32_C( -8938.37), SIMDE_FLOAT32_C( -1798.64), SIMDE_FLOAT32_C( -8001.07), SIMDE_FLOAT32_C( 9705.11) }, INT8_C( 2), { SIMDE_FLOAT32_C(21087922.98), SIMDE_FLOAT32_C(25029190.43), SIMDE_FLOAT32_C(-70924670.73), SIMDE_FLOAT32_C(-21914644.44) } }, }; simde_float32x4_t r, a, b, v; for (size_t i = 0 ; i < (sizeof(test_vec) / sizeof(test_vec[0])) ; i++) { a = simde_vld1q_f32(test_vec[i].a); b = simde_vld1q_f32(test_vec[i].b); v = simde_vld1q_f32(test_vec[i].v); switch(test_vec[i].lane) { case 0: r = simde_vmlaq_laneq_f32(a, b, v, 0); break; case 1: r = simde_vmlaq_laneq_f32(a, b, v, 1); break; case 2: r = simde_vmlaq_laneq_f32(a, b, v, 2); break; case 3: r = simde_vmlaq_laneq_f32(a, b, v, 3); break; default: HEDLEY_UNREACHABLE(); r = simde_vdupq_n_f32(0); break; } simde_test_arm_neon_assert_equal_f32x4(r, simde_vld1q_f32(test_vec[i].r), 1); } return 0; } static int test_simde_vmlaq_laneq_s16 (SIMDE_MUNIT_TEST_ARGS) { static const struct { int16_t a[8]; int16_t b[8]; int16_t v[8]; int8_t lane; int16_t r[8]; } test_vec[] = { { { INT16_C( 27), -INT16_C( 14), INT16_C( 80), -INT16_C( 68), -INT16_C( 60), INT16_C( 13), -INT16_C( 19), INT16_C( 58) }, { -INT16_C( 62), INT16_C( 96), INT16_C( 88), -INT16_C( 24), -INT16_C( 69), INT16_C( 66), -INT16_C( 11), -INT16_C( 43) }, { -INT16_C( 5), -INT16_C( 2), -INT16_C( 9), -INT16_C( 77), -INT16_C( 68), INT16_C( 65), -INT16_C( 81), INT16_C( 39) }, INT8_C( 4), { INT16_C( 4243), -INT16_C( 6542), -INT16_C( 5904), INT16_C( 1564), INT16_C( 4632), -INT16_C( 4475), INT16_C( 729), INT16_C( 2982) } }, { { INT16_C( 86), -INT16_C( 77), -INT16_C( 26), -INT16_C( 24), INT16_C( 84), -INT16_C( 17), -INT16_C( 35), INT16_C( 34) }, { -INT16_C( 72), -INT16_C( 12), -INT16_C( 48), INT16_C( 50), INT16_C( 17), INT16_C( 41), -INT16_C( 78), -INT16_C( 73) }, { INT16_C( 42), INT16_C( 24), INT16_C( 40), -INT16_C( 89), -INT16_C( 28), INT16_C( 60), -INT16_C( 2), INT16_C( 52) }, INT8_C( 2), { -INT16_C( 2794), -INT16_C( 557), -INT16_C( 1946), INT16_C( 1976), INT16_C( 764), INT16_C( 1623), -INT16_C( 3155), -INT16_C( 2886) } }, { { INT16_C( 70), INT16_C( 1), INT16_C( 23), -INT16_C( 44), -INT16_C( 5), INT16_C( 65), -INT16_C( 27), INT16_C( 23) }, { INT16_C( 92), -INT16_C( 88), -INT16_C( 41), -INT16_C( 89), -INT16_C( 37), INT16_C( 63), -INT16_C( 44), -INT16_C( 77) }, { -INT16_C( 74), INT16_C( 29), -INT16_C( 58), -INT16_C( 38), -INT16_C( 71), INT16_C( 98), INT16_C( 26), INT16_C( 3) }, INT8_C( 5), { INT16_C( 9086), -INT16_C( 8623), -INT16_C( 3995), -INT16_C( 8766), -INT16_C( 3631), INT16_C( 6239), -INT16_C( 4339), -INT16_C( 7523) } }, { { -INT16_C( 1), -INT16_C( 60), -INT16_C( 20), INT16_C( 28), INT16_C( 36), -INT16_C( 98), INT16_C( 95), INT16_C( 19) }, { -INT16_C( 43), -INT16_C( 59), INT16_C( 41), -INT16_C( 12), -INT16_C( 73), -INT16_C( 34), INT16_C( 76), -INT16_C( 31) }, { INT16_C( 0), -INT16_C( 92), -INT16_C( 26), -INT16_C( 76), -INT16_C( 39), INT16_C( 62), INT16_C( 29), INT16_C( 22) }, INT8_C( 2), { INT16_C( 1117), INT16_C( 1474), -INT16_C( 1086), INT16_C( 340), INT16_C( 1934), INT16_C( 786), -INT16_C( 1881), INT16_C( 825) } }, { { INT16_C( 76), INT16_C( 78), -INT16_C( 52), INT16_C( 59), INT16_C( 75), -INT16_C( 12), INT16_C( 26), -INT16_C( 48) }, { -INT16_C( 7), INT16_C( 21), INT16_C( 1), -INT16_C( 9), INT16_C( 71), INT16_C( 57), -INT16_C( 36), -INT16_C( 12) }, { -INT16_C( 23), INT16_C( 6), -INT16_C( 38), INT16_C( 79), -INT16_C( 62), -INT16_C( 58), -INT16_C( 3), -INT16_C( 5) }, INT8_C( 7), { INT16_C( 111), -INT16_C( 27), -INT16_C( 57), INT16_C( 104), -INT16_C( 280), -INT16_C( 297), INT16_C( 206), INT16_C( 12) } }, { { INT16_C( 3), -INT16_C( 47), -INT16_C( 89), INT16_C( 58), -INT16_C( 22), INT16_C( 26), -INT16_C( 49), INT16_C( 6) }, { INT16_C( 72), INT16_C( 78), -INT16_C( 54), INT16_C( 0), INT16_C( 12), -INT16_C( 22), -INT16_C( 87), INT16_C( 4) }, { -INT16_C( 89), -INT16_C( 84), INT16_C( 65), INT16_C( 20), -INT16_C( 27), -INT16_C( 19), INT16_C( 47), -INT16_C( 12) }, INT8_C( 6), { INT16_C( 3387), INT16_C( 3619), -INT16_C( 2627), INT16_C( 58), INT16_C( 542), -INT16_C( 1008), -INT16_C( 4138), INT16_C( 194) } }, { { INT16_C( 97), -INT16_C( 3), -INT16_C( 86), INT16_C( 62), -INT16_C( 5), -INT16_C( 50), -INT16_C( 91), INT16_C( 81) }, { INT16_C( 47), INT16_C( 49), INT16_C( 4), INT16_C( 4), -INT16_C( 40), INT16_C( 55), -INT16_C( 34), INT16_C( 85) }, { INT16_C( 56), INT16_C( 35), -INT16_C( 72), INT16_C( 64), INT16_C( 52), INT16_C( 80), INT16_C( 12), INT16_C( 48) }, INT8_C( 4), { INT16_C( 2541), INT16_C( 2545), INT16_C( 122), INT16_C( 270), -INT16_C( 2085), INT16_C( 2810), -INT16_C( 1859), INT16_C( 4501) } }, { { INT16_C( 10), INT16_C( 42), -INT16_C( 53), -INT16_C( 66), INT16_C( 95), -INT16_C( 34), -INT16_C( 15), -INT16_C( 84) }, { -INT16_C( 19), INT16_C( 87), -INT16_C( 77), -INT16_C( 65), -INT16_C( 80), INT16_C( 4), INT16_C( 74), INT16_C( 63) }, { -INT16_C( 70), -INT16_C( 67), INT16_C( 63), -INT16_C( 62), -INT16_C( 20), INT16_C( 44), INT16_C( 15), INT16_C( 79) }, INT8_C( 7), { -INT16_C( 1491), INT16_C( 6915), -INT16_C( 6136), -INT16_C( 5201), -INT16_C( 6225), INT16_C( 282), INT16_C( 5831), INT16_C( 4893) } }, }; simde_int16x8_t r, a, b, v; for (size_t i = 0 ; i < (sizeof(test_vec) / sizeof(test_vec[0])) ; i++) { a = simde_vld1q_s16(test_vec[i].a); b = simde_vld1q_s16(test_vec[i].b); v = simde_vld1q_s16(test_vec[i].v); switch(test_vec[i].lane) { case 0: r = simde_vmlaq_laneq_s16(a, b, v, 0); break; case 1: r = simde_vmlaq_laneq_s16(a, b, v, 1); break; case 2: r = simde_vmlaq_laneq_s16(a, b, v, 2); break; case 3: r = simde_vmlaq_laneq_s16(a, b, v, 3); break; case 4: r = simde_vmlaq_laneq_s16(a, b, v, 4); break; case 5: r = simde_vmlaq_laneq_s16(a, b, v, 5); break; case 6: r = simde_vmlaq_laneq_s16(a, b, v, 6); break; case 7: r = simde_vmlaq_laneq_s16(a, b, v, 7); break; default: HEDLEY_UNREACHABLE(); r = simde_vdupq_n_s16(0); break; } simde_test_arm_neon_assert_equal_i16x8(r, simde_vld1q_s16(test_vec[i].r)); } return 0; } static int test_simde_vmlaq_laneq_s32 (SIMDE_MUNIT_TEST_ARGS) { static const struct { int32_t a[4]; int32_t b[4]; int32_t v[4]; int8_t lane; int32_t r[4]; } test_vec[] = { { { -INT32_C( 6136), INT32_C( 1298), -INT32_C( 4397), -INT32_C( 2313) }, { -INT32_C( 2459), INT32_C( 5639), INT32_C( 944), INT32_C( 7600) }, { -INT32_C( 5378), INT32_C( 8852), -INT32_C( 9600), INT32_C( 9935) }, INT8_C( 1), { -INT32_C(21773204), INT32_C(49917726), INT32_C( 8351891), INT32_C(67272887) } }, { { -INT32_C( 9404), INT32_C( 567), -INT32_C( 6346), -INT32_C( 3906) }, { INT32_C( 6125), INT32_C( 4990), INT32_C( 5704), INT32_C( 3511) }, { INT32_C( 7787), INT32_C( 7196), INT32_C( 1911), INT32_C( 9234) }, INT8_C( 3), { INT32_C(56548846), INT32_C(46078227), INT32_C(52664390), INT32_C(32416668) } }, { { INT32_C( 124), INT32_C( 1315), -INT32_C( 398), -INT32_C( 8335) }, { INT32_C( 4856), -INT32_C( 218), INT32_C( 9898), INT32_C( 5450) }, { INT32_C( 3364), -INT32_C( 8289), -INT32_C( 5348), -INT32_C( 4660) }, INT8_C( 2), { -INT32_C(25969764), INT32_C( 1167179), -INT32_C(52934902), -INT32_C(29154935) } }, { { -INT32_C( 7741), -INT32_C( 5638), -INT32_C( 1216), -INT32_C( 4399) }, { -INT32_C( 7004), -INT32_C( 7954), -INT32_C( 5842), -INT32_C( 4473) }, { INT32_C( 4738), -INT32_C( 4541), INT32_C( 3190), INT32_C( 5887) }, INT8_C( 3), { -INT32_C(41240289), -INT32_C(46830836), -INT32_C(34393070), -INT32_C(26336950) } }, { { -INT32_C( 4228), INT32_C( 9643), -INT32_C( 6720), INT32_C( 2725) }, { INT32_C( 8556), -INT32_C( 5884), -INT32_C( 3313), INT32_C( 3496) }, { -INT32_C( 9409), -INT32_C( 9792), INT32_C( 284), -INT32_C( 1614) }, INT8_C( 0), { -INT32_C(80507632), INT32_C(55372199), INT32_C(31165297), -INT32_C(32891139) } }, { { INT32_C( 1341), -INT32_C( 617), -INT32_C( 8745), -INT32_C( 4860) }, { INT32_C( 4084), -INT32_C( 5463), -INT32_C( 1722), -INT32_C( 9232) }, { INT32_C( 5013), -INT32_C( 9923), INT32_C( 4345), -INT32_C( 7885) }, INT8_C( 2), { INT32_C(17746321), -INT32_C(23737352), -INT32_C( 7490835), -INT32_C(40117900) } }, { { -INT32_C( 4259), -INT32_C( 3605), -INT32_C( 5933), -INT32_C( 2164) }, { INT32_C( 4526), INT32_C( 5427), -INT32_C( 8312), INT32_C( 6713) }, { INT32_C( 108), INT32_C( 2835), INT32_C( 3642), -INT32_C( 9015) }, INT8_C( 3), { -INT32_C(40806149), -INT32_C(48928010), INT32_C(74926747), -INT32_C(60519859) } }, { { INT32_C( 8687), INT32_C( 3316), INT32_C( 4039), INT32_C( 4869) }, { INT32_C( 1050), INT32_C( 4513), -INT32_C( 1617), -INT32_C( 4470) }, { INT32_C( 1370), -INT32_C( 1457), -INT32_C( 7408), -INT32_C( 7365) }, INT8_C( 3), { -INT32_C( 7724563), -INT32_C(33234929), INT32_C(11913244), INT32_C(32926419) } }, }; simde_int32x4_t r, a, b, v; for (size_t i = 0 ; i < (sizeof(test_vec) / sizeof(test_vec[0])) ; i++) { a = simde_vld1q_s32(test_vec[i].a); b = simde_vld1q_s32(test_vec[i].b); v = simde_vld1q_s32(test_vec[i].v); switch(test_vec[i].lane) { case 0: r = simde_vmlaq_laneq_s32(a, b, v, 0); break; case 1: r = simde_vmlaq_laneq_s32(a, b, v, 1); break; case 2: r = simde_vmlaq_laneq_s32(a, b, v, 2); break; case 3: r = simde_vmlaq_laneq_s32(a, b, v, 3); break; default: HEDLEY_UNREACHABLE(); r = simde_vdupq_n_s32(0); break; } simde_test_arm_neon_assert_equal_i32x4(r, simde_vld1q_s32(test_vec[i].r)); } return 0; } static int test_simde_vmlaq_laneq_u16 (SIMDE_MUNIT_TEST_ARGS) { static const struct { uint16_t a[8]; uint16_t b[8]; uint16_t v[8]; int8_t lane; uint16_t r[8]; } test_vec[] = { { { UINT16_C( 34), UINT16_C( 55), UINT16_C( 53), UINT16_C( 65), UINT16_C( 8), UINT16_C( 110), UINT16_C( 158), UINT16_C( 151) }, { UINT16_C( 173), UINT16_C( 56), UINT16_C( 100), UINT16_C( 187), UINT16_C( 53), UINT16_C( 174), UINT16_C( 100), UINT16_C( 199) }, { UINT16_C( 143), UINT16_C( 106), UINT16_C( 85), UINT16_C( 161), UINT16_C( 154), UINT16_C( 119), UINT16_C( 79), UINT16_C( 80) }, INT8_C( 1), { UINT16_C( 18372), UINT16_C( 5991), UINT16_C( 10653), UINT16_C( 19887), UINT16_C( 5626), UINT16_C( 18554), UINT16_C( 10758), UINT16_C( 21245) } }, { { UINT16_C( 60), UINT16_C( 195), UINT16_C( 16), UINT16_C( 37), UINT16_C( 149), UINT16_C( 107), UINT16_C( 153), UINT16_C( 113) }, { UINT16_C( 164), UINT16_C( 111), UINT16_C( 177), UINT16_C( 35), UINT16_C( 15), UINT16_C( 27), UINT16_C( 192), UINT16_C( 69) }, { UINT16_C( 35), UINT16_C( 136), UINT16_C( 42), UINT16_C( 13), UINT16_C( 121), UINT16_C( 151), UINT16_C( 152), UINT16_C( 185) }, INT8_C( 2), { UINT16_C( 6948), UINT16_C( 4857), UINT16_C( 7450), UINT16_C( 1507), UINT16_C( 779), UINT16_C( 1241), UINT16_C( 8217), UINT16_C( 3011) } }, { { UINT16_C( 76), UINT16_C( 110), UINT16_C( 183), UINT16_C( 176), UINT16_C( 10), UINT16_C( 39), UINT16_C( 127), UINT16_C( 64) }, { UINT16_C( 71), UINT16_C( 190), UINT16_C( 18), UINT16_C( 165), UINT16_C( 189), UINT16_C( 156), UINT16_C( 101), UINT16_C( 164) }, { UINT16_C( 19), UINT16_C( 88), UINT16_C( 194), UINT16_C( 90), UINT16_C( 177), UINT16_C( 34), UINT16_C( 165), UINT16_C( 63) }, INT8_C( 3), { UINT16_C( 6466), UINT16_C( 17210), UINT16_C( 1803), UINT16_C( 15026), UINT16_C( 17020), UINT16_C( 14079), UINT16_C( 9217), UINT16_C( 14824) } }, { { UINT16_C( 192), UINT16_C( 2), UINT16_C( 111), UINT16_C( 133), UINT16_C( 8), UINT16_C( 69), UINT16_C( 147), UINT16_C( 41) }, { UINT16_C( 7), UINT16_C( 183), UINT16_C( 162), UINT16_C( 21), UINT16_C( 61), UINT16_C( 125), UINT16_C( 33), UINT16_C( 127) }, { UINT16_C( 29), UINT16_C( 195), UINT16_C( 86), UINT16_C( 0), UINT16_C( 59), UINT16_C( 89), UINT16_C( 99), UINT16_C( 9) }, INT8_C( 0), { UINT16_C( 395), UINT16_C( 5309), UINT16_C( 4809), UINT16_C( 742), UINT16_C( 1777), UINT16_C( 3694), UINT16_C( 1104), UINT16_C( 3724) } }, { { UINT16_C( 95), UINT16_C( 15), UINT16_C( 0), UINT16_C( 138), UINT16_C( 174), UINT16_C( 104), UINT16_C( 186), UINT16_C( 105) }, { UINT16_C( 66), UINT16_C( 149), UINT16_C( 50), UINT16_C( 79), UINT16_C( 177), UINT16_C( 169), UINT16_C( 40), UINT16_C( 125) }, { UINT16_C( 67), UINT16_C( 103), UINT16_C( 80), UINT16_C( 199), UINT16_C( 172), UINT16_C( 94), UINT16_C( 82), UINT16_C( 142) }, INT8_C( 1), { UINT16_C( 6893), UINT16_C( 15362), UINT16_C( 5150), UINT16_C( 8275), UINT16_C( 18405), UINT16_C( 17511), UINT16_C( 4306), UINT16_C( 12980) } }, { { UINT16_C( 123), UINT16_C( 187), UINT16_C( 45), UINT16_C( 103), UINT16_C( 65), UINT16_C( 124), UINT16_C( 98), UINT16_C( 75) }, { UINT16_C( 169), UINT16_C( 102), UINT16_C( 113), UINT16_C( 164), UINT16_C( 59), UINT16_C( 171), UINT16_C( 72), UINT16_C( 38) }, { UINT16_C( 174), UINT16_C( 143), UINT16_C( 134), UINT16_C( 24), UINT16_C( 81), UINT16_C( 150), UINT16_C( 186), UINT16_C( 119) }, INT8_C( 0), { UINT16_C( 29529), UINT16_C( 17935), UINT16_C( 19707), UINT16_C( 28639), UINT16_C( 10331), UINT16_C( 29878), UINT16_C( 12626), UINT16_C( 6687) } }, { { UINT16_C( 185), UINT16_C( 79), UINT16_C( 109), UINT16_C( 44), UINT16_C( 147), UINT16_C( 9), UINT16_C( 91), UINT16_C( 66) }, { UINT16_C( 28), UINT16_C( 160), UINT16_C( 34), UINT16_C( 60), UINT16_C( 182), UINT16_C( 5), UINT16_C( 85), UINT16_C( 164) }, { UINT16_C( 132), UINT16_C( 144), UINT16_C( 59), UINT16_C( 73), UINT16_C( 4), UINT16_C( 50), UINT16_C( 128), UINT16_C( 152) }, INT8_C( 0), { UINT16_C( 3881), UINT16_C( 21199), UINT16_C( 4597), UINT16_C( 7964), UINT16_C( 24171), UINT16_C( 669), UINT16_C( 11311), UINT16_C( 21714) } }, { { UINT16_C( 46), UINT16_C( 41), UINT16_C( 184), UINT16_C( 128), UINT16_C( 76), UINT16_C( 168), UINT16_C( 192), UINT16_C( 166) }, { UINT16_C( 10), UINT16_C( 186), UINT16_C( 84), UINT16_C( 64), UINT16_C( 186), UINT16_C( 53), UINT16_C( 70), UINT16_C( 100) }, { UINT16_C( 89), UINT16_C( 87), UINT16_C( 23), UINT16_C( 67), UINT16_C( 27), UINT16_C( 149), UINT16_C( 191), UINT16_C( 113) }, INT8_C( 0), { UINT16_C( 936), UINT16_C( 16595), UINT16_C( 7660), UINT16_C( 5824), UINT16_C( 16630), UINT16_C( 4885), UINT16_C( 6422), UINT16_C( 9066) } }, }; simde_uint16x8_t r, a, b, v; for (size_t i = 0 ; i < (sizeof(test_vec) / sizeof(test_vec[0])) ; i++) { a = simde_vld1q_u16(test_vec[i].a); b = simde_vld1q_u16(test_vec[i].b); v = simde_vld1q_u16(test_vec[i].v); switch(test_vec[i].lane) { case 0: r = simde_vmlaq_laneq_u16(a, b, v, 0); break; case 1: r = simde_vmlaq_laneq_u16(a, b, v, 1); break; case 2: r = simde_vmlaq_laneq_u16(a, b, v, 2); break; case 3: r = simde_vmlaq_laneq_u16(a, b, v, 3); break; case 4: r = simde_vmlaq_laneq_u16(a, b, v, 4); break; case 5: r = simde_vmlaq_laneq_u16(a, b, v, 5); break; case 6: r = simde_vmlaq_laneq_u16(a, b, v, 6); break; case 7: r = simde_vmlaq_laneq_u16(a, b, v, 7); break; default: HEDLEY_UNREACHABLE(); r = simde_vdupq_n_u16(0); break; } simde_test_arm_neon_assert_equal_u16x8(r, simde_vld1q_u16(test_vec[i].r)); } return 0; } static int test_simde_vmlaq_laneq_u32 (SIMDE_MUNIT_TEST_ARGS) { static const struct { uint32_t a[4]; uint32_t b[4]; uint32_t v[4]; int8_t lane; uint32_t r[4]; } test_vec[] = { { { UINT32_C( 17966), UINT32_C( 9668), UINT32_C( 3899), UINT32_C( 1740) }, { UINT32_C( 9644), UINT32_C( 8215), UINT32_C( 11766), UINT32_C( 5182) }, { UINT32_C( 8131), UINT32_C( 6197), UINT32_C( 18142), UINT32_C( 5160) }, INT8_C( 1), { UINT32_C( 59781834), UINT32_C( 50918023), UINT32_C( 72917801), UINT32_C( 32114594) } }, { { UINT32_C( 14022), UINT32_C( 5194), UINT32_C( 11502), UINT32_C( 5635) }, { UINT32_C( 877), UINT32_C( 10991), UINT32_C( 5463), UINT32_C( 659) }, { UINT32_C( 5178), UINT32_C( 1188), UINT32_C( 9464), UINT32_C( 1436) }, INT8_C( 1), { UINT32_C( 1055898), UINT32_C( 13062502), UINT32_C( 6501546), UINT32_C( 788527) } }, { { UINT32_C( 18302), UINT32_C( 8019), UINT32_C( 7939), UINT32_C( 15138) }, { UINT32_C( 13816), UINT32_C( 3641), UINT32_C( 16263), UINT32_C( 7916) }, { UINT32_C( 3757), UINT32_C( 13705), UINT32_C( 13542), UINT32_C( 4003) }, INT8_C( 0), { UINT32_C( 51925014), UINT32_C( 13687256), UINT32_C( 61108030), UINT32_C( 29755550) } }, { { UINT32_C( 19118), UINT32_C( 5278), UINT32_C( 12843), UINT32_C( 9921) }, { UINT32_C( 14624), UINT32_C( 9994), UINT32_C( 2130), UINT32_C( 2980) }, { UINT32_C( 11531), UINT32_C( 2465), UINT32_C( 7359), UINT32_C( 14489) }, INT8_C( 2), { UINT32_C( 107637134), UINT32_C( 73551124), UINT32_C( 15687513), UINT32_C( 21939741) } }, { { UINT32_C( 6232), UINT32_C( 4537), UINT32_C( 1814), UINT32_C( 3971) }, { UINT32_C( 12752), UINT32_C( 14106), UINT32_C( 17693), UINT32_C( 1938) }, { UINT32_C( 44), UINT32_C( 178), UINT32_C( 1791), UINT32_C( 12350) }, INT8_C( 3), { UINT32_C( 157493432), UINT32_C( 174213637), UINT32_C( 218510364), UINT32_C( 23938271) } }, { { UINT32_C( 8462), UINT32_C( 4455), UINT32_C( 11958), UINT32_C( 11866) }, { UINT32_C( 5206), UINT32_C( 11522), UINT32_C( 9962), UINT32_C( 11203) }, { UINT32_C( 9268), UINT32_C( 17392), UINT32_C( 13804), UINT32_C( 10799) }, INT8_C( 2), { UINT32_C( 71872086), UINT32_C( 159054143), UINT32_C( 137527406), UINT32_C( 154658078) } }, { { UINT32_C( 15528), UINT32_C( 7021), UINT32_C( 16870), UINT32_C( 13050) }, { UINT32_C( 10135), UINT32_C( 12640), UINT32_C( 13287), UINT32_C( 19824) }, { UINT32_C( 19598), UINT32_C( 1381), UINT32_C( 6284), UINT32_C( 6134) }, INT8_C( 3), { UINT32_C( 62183618), UINT32_C( 77540781), UINT32_C( 81519328), UINT32_C( 121613466) } }, { { UINT32_C( 10824), UINT32_C( 10467), UINT32_C( 17351), UINT32_C( 9295) }, { UINT32_C( 19858), UINT32_C( 16339), UINT32_C( 10310), UINT32_C( 9300) }, { UINT32_C( 13406), UINT32_C( 3924), UINT32_C( 16158), UINT32_C( 10460) }, INT8_C( 2), { UINT32_C( 320876388), UINT32_C( 264016029), UINT32_C( 166606331), UINT32_C( 150278695) } }, }; simde_uint32x4_t r, a, b, v; for (size_t i = 0 ; i < (sizeof(test_vec) / sizeof(test_vec[0])) ; i++) { a = simde_vld1q_u32(test_vec[i].a); b = simde_vld1q_u32(test_vec[i].b); v = simde_vld1q_u32(test_vec[i].v); switch(test_vec[i].lane) { case 0: r = simde_vmlaq_laneq_u32(a, b, v, 0); break; case 1: r = simde_vmlaq_laneq_u32(a, b, v, 1); break; case 2: r = simde_vmlaq_laneq_u32(a, b, v, 2); break; case 3: r = simde_vmlaq_laneq_u32(a, b, v, 3); break; default: HEDLEY_UNREACHABLE(); r = simde_vdupq_n_u32(0); break; } simde_test_arm_neon_assert_equal_u32x4(r, simde_vld1q_u32(test_vec[i].r)); } return 0; } SIMDE_TEST_FUNC_LIST_BEGIN SIMDE_TEST_FUNC_LIST_ENTRY(vmla_lane_f32) SIMDE_TEST_FUNC_LIST_ENTRY(vmla_lane_s16) SIMDE_TEST_FUNC_LIST_ENTRY(vmla_lane_s32) SIMDE_TEST_FUNC_LIST_ENTRY(vmla_lane_u16) SIMDE_TEST_FUNC_LIST_ENTRY(vmla_lane_u32) SIMDE_TEST_FUNC_LIST_ENTRY(vmla_laneq_f32) SIMDE_TEST_FUNC_LIST_ENTRY(vmla_laneq_s16) SIMDE_TEST_FUNC_LIST_ENTRY(vmla_laneq_s32) SIMDE_TEST_FUNC_LIST_ENTRY(vmla_laneq_u16) SIMDE_TEST_FUNC_LIST_ENTRY(vmla_laneq_u32) SIMDE_TEST_FUNC_LIST_ENTRY(vmlaq_lane_f32) SIMDE_TEST_FUNC_LIST_ENTRY(vmlaq_lane_s16) SIMDE_TEST_FUNC_LIST_ENTRY(vmlaq_lane_s32) SIMDE_TEST_FUNC_LIST_ENTRY(vmlaq_lane_u16) SIMDE_TEST_FUNC_LIST_ENTRY(vmlaq_lane_u32) SIMDE_TEST_FUNC_LIST_ENTRY(vmlaq_laneq_f32) SIMDE_TEST_FUNC_LIST_ENTRY(vmlaq_laneq_s16) SIMDE_TEST_FUNC_LIST_ENTRY(vmlaq_laneq_s32) SIMDE_TEST_FUNC_LIST_ENTRY(vmlaq_laneq_u16) SIMDE_TEST_FUNC_LIST_ENTRY(vmlaq_laneq_u32) SIMDE_TEST_FUNC_LIST_END #include "test-neon-footer.h"