On 11/07/2024 22:42, Christophe Lyon wrote:
+  bool
+  check (function_checker &c) const override
+  {
+    if (c.mode_suffix_id == MODE_none)
+      return true;
+
+    unsigned int bits = c.type_suffix (0).element_bits;
+    return c.require_immediate_range (1, 1, bits);
+  }

When trying to understand how this worked I bumped into the following:

If you pass a value that's not in the appropriate range like 33, you'll see:

vcvt.c:5:10: error: passing 33 to argument 2 of 'vcvtq_n', which expects a value in the range [1, 32]

If you however pick a negative number like -3? You get:
vcvt.c:5:10: error: argument 2 of 'vcvtq_n' must be an integer constant expression

This is somewhat confusing and yes we could change the message to say 'must be a positive integer constant expression', which might be clear enough in this case, but less so if you do something like 1<<7 for this intrinsic, because the signature looks like:

> +     build_all (b, "v0,v1,ss8", group, MODE_n, preserve_user_namespace);

which converts the immediate to a signed 8-bit value, making 1<<7 a negative number, and the intrinsic specs defines the parameter as a signed 32-bit integer. So if a user accidentally passes 1<<7 here, they will get: vcvt.c:5:10: error: argument 2 of 'vcvtq_n' must be an integer constant expression

Potentially making users think GCC does not support inline evaluation for these parameters, which would be sad.

So we should at least change the signature to be "v0,v1,ss32", but I suggest we deviate and make the last parameter in the signature either a su32 or a su64. As the framework code expects this value to fit into a uhwi, which I suspect is because SVE always defines the parameters as uint64_t constants, i.e. svxar_n_s64, disclaimer I didn't check all SVE intrinsics.

Initially I was going to suggest fold_converting the arg in 'function_checker::require_immediate' into a long_long_unsigned_type_node, which also does what we want in these examples, but perhaps going the signature way is cleaner and more inline with the framework as is. We probably want to keep it as much as SVE as possible, so we can 'borrow' code more easily if the need arises.

@Richard S: I added you to this review as you know the SVE intrinsic code better than most (if not all). So hopefully you can let us know if you have an opinion on this.

Kind Regards,
Andre


Reply via email to