Changing "target" parameter via attribute
Iain Buclaw
ibuclaw at ubuntu.com
Mon May 27 03:38:17 PDT 2013
On 27 May 2013 11:18, Manu <turkeyman at gmail.com> wrote:
> On 27 May 2013 19:01, Iain Buclaw <ibuclaw at ubuntu.com> wrote:
>>
>> On 27 May 2013 09:21, Manu <turkeyman at gmail.com> wrote:
>> > Actually, I think the C counterpart is actually
>> > __attribute__((__target__("targetstring"))), with bonus underscores ;)
>> >
>> >
>> > On 27 May 2013 18:15, Manu <turkeyman at gmail.com> wrote:
>> >>
>> >> So we talked about this at DConf.
>> >>
>> >> Working on std.simd, I need to be able to change the target parameter
>> >> on a
>> >> per-function basis.
>> >> GCC supports this via: __attribute__((target("sse2"))) for instance.
>> >>
>> >> I need the ability to set this from D, but the trick is, I need to be
>> >> able
>> >> to set the target string according to a template arg.
>> >>
>> >> Eg:
>> >> enum Targets { SSE2, SSE3 };
>> >> enum targets[] = [ "sse2", "sse3" ];
>> >>
>> >> @attribute("target", targets[T]) // <- attribute needs to refer to
>> >> the
>> >> template arg T
>> >> void func(Targets T)();
>> >>
>> >>
>>
>> I'll turn on rudimentary support, as the backend takes care of pretty
>> much all the work. But I think this should work as UDAs work off CTFE
>> with string manipulation.
>>
>>
>> >> {
>> >> // this way, it is possibly to produce dynamic selection of code
>> >> paths
>> >> optimised for different CPU features (a task which is usually very
>> >> tedious
>> >> in C/C++)
>> >> func!(Targets.SSE2)();
>> >> }
>> >>
>> >
>>
>> As a small experiment, I could turn on versioning for these
>> functions... However is only available for x86 targets.
>>
>> eg:
>>
>> void foo() @target("sse") // mangled 'foo.sse'
>> {
>> }
>>
>> void foo() @target("mmx") // mangled 'foo.mmx'
>> {
>> }
>
>
> I'm confused, are you suggesting to handle these particular values
> explicitly in gdc?
> I was giving examples of the code I want to write (and work). I can handle
> this in std.simd.
> I don't think there's any reason to handle arch-specific cases like that in
> gdc.
>
> Or rather, was the point you were trying to make here the possible support
> of a @target() attribute (which affects the mangling), rather than
> @attribute("target")?
OK, if your confused, I won't do it then... :)
--
Iain Buclaw
*(p < e ? p++ : p) = (c & 0x0f) + '0';
More information about the D.gnu
mailing list