FRAME_BEGIN
 
        # x0..3 = s0..3
-       movdqa          0x00(%rdi),%xmm0
-       movdqa          0x10(%rdi),%xmm1
-       movdqa          0x20(%rdi),%xmm2
-       movdqa          0x30(%rdi),%xmm3
+       movdqu          0x00(%rdi),%xmm0
+       movdqu          0x10(%rdi),%xmm1
+       movdqu          0x20(%rdi),%xmm2
+       movdqu          0x30(%rdi),%xmm3
        movdqa          %xmm0,%xmm8
        movdqa          %xmm1,%xmm9
        movdqa          %xmm2,%xmm10
        # %edx: nrounds
        FRAME_BEGIN
 
-       movdqa          0x00(%rdi),%xmm0
-       movdqa          0x10(%rdi),%xmm1
-       movdqa          0x20(%rdi),%xmm2
-       movdqa          0x30(%rdi),%xmm3
+       movdqu          0x00(%rdi),%xmm0
+       movdqu          0x10(%rdi),%xmm1
+       movdqu          0x20(%rdi),%xmm2
+       movdqu          0x30(%rdi),%xmm3
 
        mov             %edx,%r8d
        call            chacha_permute
 
 #include <linux/module.h>
 #include <asm/simd.h>
 
-#define CHACHA_STATE_ALIGN 16
-
 asmlinkage void chacha_block_xor_ssse3(u32 *state, u8 *dst, const u8 *src,
                                       unsigned int len, int nrounds);
 asmlinkage void chacha_4block_xor_ssse3(u32 *state, u8 *dst, const u8 *src,
 
 void hchacha_block_arch(const u32 *state, u32 *stream, int nrounds)
 {
-       state = PTR_ALIGN(state, CHACHA_STATE_ALIGN);
-
        if (!static_branch_likely(&chacha_use_simd) || !crypto_simd_usable()) {
                hchacha_block_generic(state, stream, nrounds);
        } else {
 
 void chacha_init_arch(u32 *state, const u32 *key, const u8 *iv)
 {
-       state = PTR_ALIGN(state, CHACHA_STATE_ALIGN);
-
        chacha_init_generic(state, key, iv);
 }
 EXPORT_SYMBOL(chacha_init_arch);
 void chacha_crypt_arch(u32 *state, u8 *dst, const u8 *src, unsigned int bytes,
                       int nrounds)
 {
-       state = PTR_ALIGN(state, CHACHA_STATE_ALIGN);
-
        if (!static_branch_likely(&chacha_use_simd) || !crypto_simd_usable() ||
            bytes <= CHACHA_BLOCK_SIZE)
                return chacha_crypt_generic(state, dst, src, bytes, nrounds);
 static int chacha_simd_stream_xor(struct skcipher_request *req,
                                  const struct chacha_ctx *ctx, const u8 *iv)
 {
-       u32 *state, state_buf[16 + 2] __aligned(8);
+       u32 state[CHACHA_STATE_WORDS] __aligned(8);
        struct skcipher_walk walk;
        int err;
 
        err = skcipher_walk_virt(&walk, req, false);
 
-       BUILD_BUG_ON(CHACHA_STATE_ALIGN != 16);
-       state = PTR_ALIGN(state_buf + 0, CHACHA_STATE_ALIGN);
-
        chacha_init_generic(state, ctx->key, iv);
 
        while (walk.nbytes > 0) {
 {
        struct crypto_skcipher *tfm = crypto_skcipher_reqtfm(req);
        struct chacha_ctx *ctx = crypto_skcipher_ctx(tfm);
-       u32 *state, state_buf[16 + 2] __aligned(8);
+       u32 state[CHACHA_STATE_WORDS] __aligned(8);
        struct chacha_ctx subctx;
        u8 real_iv[16];
 
-       BUILD_BUG_ON(CHACHA_STATE_ALIGN != 16);
-       state = PTR_ALIGN(state_buf + 0, CHACHA_STATE_ALIGN);
        chacha_init_generic(state, ctx->key, req->iv);
 
        if (req->cryptlen > CHACHA_BLOCK_SIZE && crypto_simd_usable()) {