codegen: fix memset unroll for small bytearrays, add 64-bit sets
authorArtem Pyanykh <artem.pyanykh@gmail.com>
Thu, 4 Apr 2019 10:43:38 +0000 (13:43 +0300)
committerMarge Bot <ben+marge-bot@smart-cactus.org>
Tue, 9 Apr 2019 14:30:13 +0000 (10:30 -0400)
commitaf4cea7f1411e5b99e2417d7c2d3d0e697093103
treeec9ef85347e5c8915e864573997c15aaa8cc5a73
parent36d380475d9056fdf93305985be3def00aaf6cf7
codegen: fix memset unroll for small bytearrays, add 64-bit sets

Fixes #16052

When the offset in `setByteArray#` is statically known, we can provide
better alignment guarantees then just 1 byte.

Also, memset can now do 64-bit wide sets.

The current memset intrinsic is not optimal however and can be
improved for the case when we know that we deal with

(baseAddress at known alignment) + offset

For instance, on 64-bit

`setByteArray# s 1# 23# 0#`

given that bytearray is 8 bytes aligned could be unrolled into
`movb, movw, movl, movq, movq`; but currently it is
`movb x23` since alignment of 1 is all we can embed into MO_Memset op.
compiler/codeGen/StgCmmPrim.hs
compiler/nativeGen/X86/CodeGen.hs
compiler/utils/Util.hs
testsuite/driver/testlib.py
testsuite/tests/codeGen/should_gen_asm/all.T
testsuite/tests/codeGen/should_gen_asm/bytearray-memset-unroll.asm [new file with mode: 0644]
testsuite/tests/codeGen/should_gen_asm/bytearray-memset-unroll.hs [new file with mode: 0644]