mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2025-12-22 22:10:10 +01:00
intel/common: Support bigger right-shifts with mi_builder
Because why not?
This commit is contained in:
parent
0d6dea0ac8
commit
316a98dec9
2 changed files with 20 additions and 3 deletions
|
|
@ -689,6 +689,18 @@ gen_mi_ushr32_imm(struct gen_mi_builder *b,
|
||||||
/* We right-shift by left-shifting by 32 - shift and taking the top 32 bits
|
/* We right-shift by left-shifting by 32 - shift and taking the top 32 bits
|
||||||
* of the result. This assumes the top 32 bits are zero.
|
* of the result. This assumes the top 32 bits are zero.
|
||||||
*/
|
*/
|
||||||
|
if (shift > 64)
|
||||||
|
return gen_mi_imm(0);
|
||||||
|
|
||||||
|
if (shift > 32) {
|
||||||
|
struct gen_mi_value tmp = gen_mi_new_gpr(b);
|
||||||
|
_gen_mi_copy_no_unref(b, gen_mi_value_half(tmp, false),
|
||||||
|
gen_mi_value_half(src, true));
|
||||||
|
_gen_mi_copy_no_unref(b, gen_mi_value_half(tmp, true), gen_mi_imm(0));
|
||||||
|
gen_mi_value_unref(b, src);
|
||||||
|
src = tmp;
|
||||||
|
shift -= 32;
|
||||||
|
}
|
||||||
assert(shift <= 32);
|
assert(shift <= 32);
|
||||||
struct gen_mi_value tmp = gen_mi_ishl_imm(b, src, 32 - shift);
|
struct gen_mi_value tmp = gen_mi_ishl_imm(b, src, 32 - shift);
|
||||||
struct gen_mi_value dst = gen_mi_new_gpr(b);
|
struct gen_mi_value dst = gen_mi_new_gpr(b);
|
||||||
|
|
|
||||||
|
|
@ -625,15 +625,20 @@ TEST_F(gen_mi_builder_test, ushr32_imm)
|
||||||
const uint64_t value = 0x0123456789abcdef;
|
const uint64_t value = 0x0123456789abcdef;
|
||||||
memcpy(input, &value, sizeof(value));
|
memcpy(input, &value, sizeof(value));
|
||||||
|
|
||||||
const unsigned max_shift = 31;
|
const unsigned max_shift = 64;
|
||||||
|
|
||||||
for (unsigned i = 0; i <= max_shift; i++)
|
for (unsigned i = 0; i <= max_shift; i++)
|
||||||
gen_mi_store(&b, out_mem64(i * 8), gen_mi_ushr32_imm(&b, in_mem64(0), i));
|
gen_mi_store(&b, out_mem64(i * 8), gen_mi_ushr32_imm(&b, in_mem64(0), i));
|
||||||
|
|
||||||
submit_batch();
|
submit_batch();
|
||||||
|
|
||||||
for (unsigned i = 0; i <= max_shift; i++)
|
for (unsigned i = 0; i <= max_shift; i++) {
|
||||||
EXPECT_EQ(*(uint64_t *)(output + i * 8), (value >> i) & UINT32_MAX);
|
if (i >= 64) {
|
||||||
|
EXPECT_EQ(*(uint64_t *)(output + i * 8), 0);
|
||||||
|
} else {
|
||||||
|
EXPECT_EQ(*(uint64_t *)(output + i * 8), (value >> i) & UINT32_MAX);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_F(gen_mi_builder_test, udiv32_imm)
|
TEST_F(gen_mi_builder_test, udiv32_imm)
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue