Use CreateVectorSplat to create a vector value

I used CreateVectorSplat to create a vector for a double variable x, e.g., <x, x>. I expected that it would work like _mm_set1_pd for sse or _mm256_broadcast_sd for avx. But it turned out that llc -O3 would create the following assembly. I don’t understand why it needs to move it to two xmm registers and then unpack it. Is it because of alignment?

movq %rcx, %rbx
vmovd %esi, %xmm4
vpbroadcastq %xmm4, %xmm5
vmovdqa %xmm5, 64(%rsp) # 16-byte Spill
vpextrq $1, %xmm5, %rax
cltq
vmovq %rax, %xmm4
vmovq %xmm5, %rcx
movslq %ecx, %rcx
vmovq %rcx, %xmm5
vpunpcklqdq %xmm4, %xmm5, %xmm4 # xmm4 = xmm5[0],xmm4[0]

Thanks,
Best