June 07, 2019
https://issues.dlang.org/show_bug.cgi?id=19946

          Issue ID: 19946
           Summary: In betterC filling an array with a non-zero value
                    fails for types of size > 1 due to missing
                    _memset16/_memset32/etc.
           Product: D
           Version: D2
          Hardware: All
                OS: All
            Status: NEW
          Severity: normal
          Priority: P1
         Component: dmd
          Assignee: nobody@puremagic.com
          Reporter: n8sh.secondary@hotmail.com

Example of code that doesn't work:

```d
extern(C) void main()
{
    alias int3 = int[3];
    union U { ulong a = 1; uint[3] b; }

    // Can't set entire array slice to non-zero value unless type is size 1.
    { ushort[] a; a[] = 1; } //error: undefined reference to '_memset16'
    { int[] a; a[] = 1; } //error: undefined reference to '_memset32'
    { ulong[] a; a[] = 1; } //error: undefined reference to '_memset64'
    { float[] a; a[] = 1; } //error: undefined reference to '_memsetFloat'
    { double[] a; a[] = 1; } //error: undefined reference to '_memsetDouble'
    { cdouble[] a; a[] = cdouble.max; } //error: undefined reference to
'_memset128'
    { creal[] a; a[] = creal.max; } //error: undefined reference to
'_memset160'
    { int3[] a; int3 val = [1, 2, 3]; a[] = val; } //error: undefined reference
to '_memsetn'
    { U[] a; a[] = U.init; } //error: undefined reference to '_memset128ii'

    // Can't give all members of static array non-zero initial value unless
type is size 1.
    { ushort[4] a = 1; } //error: undefined reference to '_memset16'
    { int[4] a = 1; } //error: undefined reference to '_memset32'
    { ulong[4] a = 1; } //error: undefined reference to '_memset64'
    { float[4] a = 1; } //error: undefined reference to '_memsetFloat'
    { double[4] a = 1; } //error: undefined reference to '_memsetDouble'
    { cdouble[4] a = cdouble.max; } //error: undefined reference to
'_memset128'
    { creal[4] a = creal.max; } //error: undefined reference to '_memset160'
    { U[4] a = U.init; } //error: undefined reference to '_memset128ii'

    // Static arrays of types with non-zero init also fail if not explicitly
initialized.
    { wchar[4] a; } //error: undefined reference to '_memset16'
    { float[4] a; } //error: undefined reference to '_memsetFloat'
    { double[4] a; } //error: undefined reference to '_memsetDouble'
    { real[4] a; } //error: undefined reference to '_memset80'
    { cdouble[4] a; } //error: undefined reference to '_memset128'
    { creal[4] a; } //error: undefined reference to '_memset160'
    { U[4] a; } //error: undefined reference to '_memset128ii'

    // Static arrays of scalars wider than 8 bytes can't even be explicitly
initialized as zero.
    { real[4] a = 0; } //error: undefined reference to '_memset80'
    { cdouble[4] a = 0+0i; } //error: undefined reference to '_memset128'
    { creal[4] a = 0+0i; } //error: undefined reference to '_memset160'
    { U[4] a = U(0); } //error: undefined reference to '_memset128ii'

    // Sometimes there is trouble even when individually specifying each
element of the array.
    { int[4] a = [1, 1, 1, 1]; } //error: undefined reference to '_memset32'
    { int[4] a = [1, 2, 3, 4]; } //Works because compiler doesn't try to use
memset-alike.

    // These work.
    { char[10] a; } //Works because ubyte.sizeof == 1 so it can use memset.
    { wchar[2] a = [0x1234, 0x5678]; a[] = 0; } //Works because the compiler
realizes that it can use memset to zero the bits of a type regardless of its
width.
}
```

--