|
@@ -88,7 +88,20 @@ uint32_t simd_desc(uint32_t oprsz, uint32_t maxsz, int32_t data)
|
|
uint32_t desc = 0;
|
|
uint32_t desc = 0;
|
|
|
|
|
|
check_size_align(oprsz, maxsz, 0);
|
|
check_size_align(oprsz, maxsz, 0);
|
|
- tcg_debug_assert(data == sextract32(data, 0, SIMD_DATA_BITS));
|
|
|
|
|
|
+
|
|
|
|
+ /*
|
|
|
|
+ * We want to check that 'data' will fit into SIMD_DATA_BITS.
|
|
|
|
+ * However, some callers want to treat the data as a signed
|
|
|
|
+ * value (which they can later get back with simd_data())
|
|
|
|
+ * and some want to treat it as an unsigned value.
|
|
|
|
+ * So here we assert only that the data will fit into the
|
|
|
|
+ * field in at least one way. This means that some invalid
|
|
|
|
+ * values from the caller will not be detected, e.g. if the
|
|
|
|
+ * caller wants to handle the value as a signed integer but
|
|
|
|
+ * incorrectly passes us 1 << (SIMD_DATA_BITS - 1).
|
|
|
|
+ */
|
|
|
|
+ tcg_debug_assert(data == sextract32(data, 0, SIMD_DATA_BITS) ||
|
|
|
|
+ data == extract32(data, 0, SIMD_DATA_BITS));
|
|
|
|
|
|
oprsz = (oprsz / 8) - 1;
|
|
oprsz = (oprsz / 8) - 1;
|
|
maxsz = (maxsz / 8) - 1;
|
|
maxsz = (maxsz / 8) - 1;
|