On 27 May 2013 09:21, Manu <turkey...@gmail.com> wrote: > Actually, I think the C counterpart is actually > __attribute__((__target__("targetstring"))), with bonus underscores ;) > > > On 27 May 2013 18:15, Manu <turkey...@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' { } Regards -- Iain Buclaw *(p < e ? p++ : p) = (c & 0x0f) + '0';