On Fri, Oct 24, 2014 at 8:11 AM, Tejas Belagod <tejas.bela...@arm.com> wrote: > On 24/10/14 15:44, Segher Boessenkool wrote: >> >> On Thu, Oct 23, 2014 at 06:52:20PM +0100, Charles Baylis wrote: >>> >>> ( tl;dr: How do I handle intrinsic or builtin functions where there >>> are restrictions on the arguments which can't be represented in a C >>> function prototype? Do other ports have this problem, how do they >>> solve it? Language extension for C++98 to provide static_assert?) >> >> >> In the builtin expand, you can get the operands' predicates from the >> insn_data array entry for the RTL pattern generated for that builtin. >> If the predicate is false, do a copy_to_mode_reg; if then the predicate >> is still false, assume it had to be some constant and error out. >> >> This works well; I stole the method from the tile* ports. It may need >> tweaks for your port. > > > I think we already do that in the aarch64 port in aarch64-builtins.c when we > expand builtins. > > /* Handle constants only if the predicate allows it. */ > bool op_const_int_p = > (CONST_INT_P (arg) > && (*insn_data[icode].operand[operands_k].predicate) > (arg, insn_data[icode].operand[operands_k].mode)); > > > But the accuracy of the source position, as Charles says, is lost by the > time the expander kicks in. For eg. in this piece of code, > > #include "arm_neon.h" > > int16x4_t > xget_lane(int16x4_t a, int16x4_t b, int c) > { > return vqrdmulh_lane_s16 (a, b, 7); > } > > $ aarch64-none-elf-gcc -O3 cr.c -S > > In file included from cr.c:2:0: > /work/dev/arm/bin/install/lib/gcc/aarch64-none-elf/5.0.0/include/arm_neon.h: > In function 'xget_lane': > /work/dev/arm/bin/install/lib/gcc/aarch64-none-elf/5.0.0/include/arm_neon.h:19572:11: > error: lane out of range > return __builtin_aarch64_sqrdmulh_lanev4hi (__a, __b, __c); > > > The diagnostic issued points to the line in arm_neon.h, but we expect this > to point to the line in cr.c. I suspect we need something closer to the > front-end?
You need to change arm_neon.h to use the __artificial__ attribute as I mentioned before. Also please move away from "static inline" since they cannot be used from templates in C++98/03. Thanks, Andrew Pinski > > Thanks, > Tejas. >