SIMD under LDC

Igor via Digitalmars-d-learn digitalmars-d-learn at puremagic.com
Mon Sep 11 04:55:45 PDT 2017


On Thursday, 7 September 2017 at 16:45:40 UTC, Igor wrote:
> On Thursday, 7 September 2017 at 15:24:13 UTC, Johan Engelen 
> wrote:
>> On Wednesday, 6 September 2017 at 20:43:01 UTC, Igor wrote:
>>>
>>> I opened a feature request on github. I also tried using the 
>>> gccbuiltins but I got this error:
>>>
>>> LLVM ERROR: Cannot select: 0x2199c96fd70: v16i8 = 
>>> X86ISD::PSHUFB 0x2199c74e9a8, 0x2199c74d6c0
>>
>> That's because SSSE3 instructions are not enabled by default, 
>> so the compiler isn't allowed to generate the PSHUFB 
>> instruction.
>> Some options you have:
>> 1. Set a cpu that has ssse3, e.g. compile with `-mcpu=native`
>> 2. Enable SSSE3: compile with `-mattr=+ssse3`
>> 3. Perhaps best for your case, enable SSSE3 for that function, 
>> importing the ldc.attributes module and using the 
>> @target("ssse3") UDA on that function.
>>
>> -Johan
>
> Thanks Johan. I tried this and now it does compile but it 
> crashes with Access Violation in debug build. In optimized 
> build it seems to be working though.

I will try to reproduce this in minimal project and open LDC bug 
if successful.

In the meantime can anyone tell me how to add an attribute to a 
function only if something is defined, since this doesn't work:

version(USE_SIMD_WITH_LDC) {
   import ldc.attributes;
   @target("ssse3")
} void funcThatUsesSIMD() {
   ...
   version(LDC) {
     import ldc.gccbuiltins_x86;
     c = __builtin_ia32_pshufb128(c, *simdMasks);
   } else {
     c = __simd(XMM.PSHUFB, c, *simdMasks);
   }
   ...
}


More information about the Digitalmars-d-learn mailing list