mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2025-12-25 13:00:09 +01:00
glsl: Fix undefined shifts.
Shifting into the sign bit is undefined, as is shifting by 32. Reviewed-by: Jordan Justen <jordan.l.justen@intel.com> Reviewed-by: Ian Romanick <ian.d.romanick@intel.com>
This commit is contained in:
parent
966a0dd720
commit
a5fcff6628
2 changed files with 7 additions and 7 deletions
|
|
@ -1539,10 +1539,10 @@ ir_expression::constant_expression_value(struct hash_table *variable_context)
|
|||
data.i[c] = -1;
|
||||
else {
|
||||
int count = 0;
|
||||
int top_bit = op[0]->type->base_type == GLSL_TYPE_UINT
|
||||
? 0 : v & (1 << 31);
|
||||
unsigned top_bit = op[0]->type->base_type == GLSL_TYPE_UINT
|
||||
? 0 : v & (1u << 31);
|
||||
|
||||
while (((v & (1 << 31)) == top_bit) && count != 32) {
|
||||
while (((v & (1u << 31)) == top_bit) && count != 32) {
|
||||
count++;
|
||||
v <<= 1;
|
||||
}
|
||||
|
|
@ -1721,7 +1721,7 @@ ir_expression::constant_expression_value(struct hash_table *variable_context)
|
|||
else if (offset + bits > 32)
|
||||
data.u[c] = 0; /* Undefined, per spec. */
|
||||
else {
|
||||
unsigned insert_mask = ((1 << bits) - 1) << offset;
|
||||
unsigned insert_mask = ((1ull << bits) - 1) << offset;
|
||||
|
||||
unsigned insert = op[1]->value.u[c];
|
||||
insert <<= offset;
|
||||
|
|
|
|||
|
|
@ -516,7 +516,7 @@ int bits = src0, offset = src1;
|
|||
if (offset < 0 || bits < 0 || offset + bits > 32)
|
||||
dst = 0; /* undefined per the spec */
|
||||
else
|
||||
dst = ((1 << bits)- 1) << offset;
|
||||
dst = ((1ull << bits) - 1) << offset;
|
||||
""")
|
||||
|
||||
opcode("ldexp", 0, tfloat, [0, 0], [tfloat, tint], "", """
|
||||
|
|
@ -578,7 +578,7 @@ if (bits == 0) {
|
|||
} else if (bits < 0 || offset < 0 || offset + bits > 32) {
|
||||
dst = 0; /* undefined per the spec */
|
||||
} else {
|
||||
dst = (base >> offset) & ((1 << bits) - 1);
|
||||
dst = (base >> offset) & ((1ull << bits) - 1);
|
||||
}
|
||||
""")
|
||||
opcode("ibitfield_extract", 0, tint,
|
||||
|
|
@ -618,7 +618,7 @@ if (bits == 0) {
|
|||
} else if (offset < 0 || bits < 0 || bits + offset > 32) {
|
||||
dst = 0;
|
||||
} else {
|
||||
unsigned mask = ((1 << bits) - 1) << offset;
|
||||
unsigned mask = ((1ull << bits) - 1) << offset;
|
||||
dst = (base & ~mask) | ((insert << bits) & mask);
|
||||
}
|
||||
""")
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue