/* Start of MI_MATH section */
#if GEN_GEN >= 8 || GEN_IS_HASWELL
+#define EXPECT_EQ_IMM(x, imm) EXPECT_EQ(x, gen_mi_value_to_u64(imm))
+
/* Test adding of immediates of all kinds including
*
* - All zeroes
for (unsigned i = 0; i < ARRAY_SIZE(values); i++) {
for (unsigned j = 0; j < ARRAY_SIZE(values); j++) {
- gen_mi_store(&b, out_mem32(i * 64 + j * 8 + 0),
+ gen_mi_store(&b, out_mem64(i * 128 + j * 16 + 0),
gen_mi_ult(&b, in_mem64(i * 8), in_mem64(j * 8)));
- gen_mi_store(&b, out_mem32(i * 64 + j * 8 + 4),
+ gen_mi_store(&b, out_mem64(i * 128 + j * 16 + 8),
gen_mi_uge(&b, in_mem64(i * 8), in_mem64(j * 8)));
}
}
for (unsigned i = 0; i < ARRAY_SIZE(values); i++) {
for (unsigned j = 0; j < ARRAY_SIZE(values); j++) {
- uint32_t *out_u32 = (uint32_t *)(output + i * 64 + j * 8);
- EXPECT_EQ(out_u32[0], values[i] < values[j] ? ~0u : 0u);
- EXPECT_EQ(out_u32[1], values[i] >= values[j] ? ~0u : 0u);
+ uint64_t *out_u64 = (uint64_t *)(output + i * 128 + j * 16);
+ EXPECT_EQ_IMM(out_u64[0], gen_mi_ult(&b, gen_mi_imm(values[i]),
+ gen_mi_imm(values[j])));
+ EXPECT_EQ_IMM(out_u64[1], gen_mi_uge(&b, gen_mi_imm(values[i]),
+ gen_mi_imm(values[j])));
}
}
}
submit_batch();
- EXPECT_EQ(*(uint64_t *)output, values[0] & values[1]);
+ EXPECT_EQ_IMM(*(uint64_t *)output, gen_mi_iand(&b, gen_mi_imm(values[0]),
+ gen_mi_imm(values[1])));
}
TEST_F(gen_mi_builder_test, imul_imm)
for (unsigned i = 0; i < ARRAY_SIZE(lhs); i++) {
for (unsigned j = 0; j < ARRAY_SIZE(rhs); j++) {
- EXPECT_EQ(*(uint64_t *)(output + i * 160 + j * 8), lhs[i] * rhs[j]);
+ EXPECT_EQ_IMM(*(uint64_t *)(output + i * 160 + j * 8),
+ gen_mi_imul_imm(&b, gen_mi_imm(lhs[i]), rhs[j]));
}
}
}
submit_batch();
for (unsigned i = 0; i <= max_shift; i++) {
- if (i >= 64) {
- EXPECT_EQ(*(uint64_t *)(output + i * 8), 0);
- } else {
- EXPECT_EQ(*(uint64_t *)(output + i * 8), value << i);
- }
+ EXPECT_EQ_IMM(*(uint64_t *)(output + i * 8),
+ gen_mi_ishl_imm(&b, gen_mi_imm(value), i));
}
}
submit_batch();
for (unsigned i = 0; i <= max_shift; i++) {
- if (i >= 64) {
- EXPECT_EQ(*(uint64_t *)(output + i * 8), 0);
- } else {
- EXPECT_EQ(*(uint64_t *)(output + i * 8), (value >> i) & UINT32_MAX);
- }
+ EXPECT_EQ_IMM(*(uint64_t *)(output + i * 8),
+ gen_mi_ushr32_imm(&b, gen_mi_imm(value), i));
}
}
for (unsigned i = 0; i < ARRAY_SIZE(values); i++) {
for (unsigned j = 0; j < ARRAY_SIZE(values); j++) {
- EXPECT_EQ(*(uint32_t *)(output + i * 80 + j * 4),
- values[i] / values[j]);
+ EXPECT_EQ_IMM(*(uint32_t *)(output + i * 80 + j * 4),
+ gen_mi_udiv32_imm(&b, gen_mi_imm(values[i]), values[j]));
}
}
}