xref: /aosp_15_r20/external/llvm/test/CodeGen/X86/i64-mem-copy.ll (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=sse2 | FileCheck %s --check-prefix=X64
2*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -mtriple=i386-unknown-unknown -mattr=sse2 | FileCheck %s --check-prefix=X32
3*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -mtriple=i386-unknown-unknown -mattr=avx2 | FileCheck %s --check-prefix=X32AVX
4*9880d681SAndroid Build Coastguard Worker
5*9880d681SAndroid Build Coastguard Worker; Use movq or movsd to load / store i64 values if sse2 is available.
6*9880d681SAndroid Build Coastguard Worker; rdar://6659858
7*9880d681SAndroid Build Coastguard Worker
8*9880d681SAndroid Build Coastguard Workerdefine void @foo(i64* %x, i64* %y) {
9*9880d681SAndroid Build Coastguard Worker; X64-LABEL: foo:
10*9880d681SAndroid Build Coastguard Worker; X64:       # BB#0:
11*9880d681SAndroid Build Coastguard Worker; X64-NEXT:    movq (%rsi), %rax
12*9880d681SAndroid Build Coastguard Worker; X64-NEXT:    movq %rax, (%rdi)
13*9880d681SAndroid Build Coastguard Worker; X64-NEXT:    retq
14*9880d681SAndroid Build Coastguard Worker;
15*9880d681SAndroid Build Coastguard Worker; X32-LABEL: foo:
16*9880d681SAndroid Build Coastguard Worker; X32:       # BB#0:
17*9880d681SAndroid Build Coastguard Worker; X32-NEXT:    movl {{[0-9]+}}(%esp), %eax
18*9880d681SAndroid Build Coastguard Worker; X32-NEXT:    movl {{[0-9]+}}(%esp), %ecx
19*9880d681SAndroid Build Coastguard Worker; X32-NEXT:    movsd {{.*#+}} xmm0 = mem[0],zero
20*9880d681SAndroid Build Coastguard Worker; X32-NEXT:    movsd %xmm0, (%eax)
21*9880d681SAndroid Build Coastguard Worker; X32-NEXT:    retl
22*9880d681SAndroid Build Coastguard Worker  %tmp1 = load i64, i64* %y, align 8
23*9880d681SAndroid Build Coastguard Worker  store i64 %tmp1, i64* %x, align 8
24*9880d681SAndroid Build Coastguard Worker  ret void
25*9880d681SAndroid Build Coastguard Worker}
26*9880d681SAndroid Build Coastguard Worker
27*9880d681SAndroid Build Coastguard Worker; Verify that a 64-bit chunk extracted from a vector is stored with a movq
28*9880d681SAndroid Build Coastguard Worker; regardless of whether the system is 64-bit.
29*9880d681SAndroid Build Coastguard Worker
30*9880d681SAndroid Build Coastguard Workerdefine void @store_i64_from_vector(<8 x i16> %x, <8 x i16> %y, i64* %i) {
31*9880d681SAndroid Build Coastguard Worker; X64-LABEL: store_i64_from_vector:
32*9880d681SAndroid Build Coastguard Worker; X64:       # BB#0:
33*9880d681SAndroid Build Coastguard Worker; X64-NEXT:    paddw %xmm1, %xmm0
34*9880d681SAndroid Build Coastguard Worker; X64-NEXT:    movq %xmm0, (%rdi)
35*9880d681SAndroid Build Coastguard Worker; X64-NEXT:    retq
36*9880d681SAndroid Build Coastguard Worker;
37*9880d681SAndroid Build Coastguard Worker; X32-LABEL: store_i64_from_vector:
38*9880d681SAndroid Build Coastguard Worker; X32:       # BB#0:
39*9880d681SAndroid Build Coastguard Worker; X32-NEXT:    movl {{[0-9]+}}(%esp), %eax
40*9880d681SAndroid Build Coastguard Worker; X32-NEXT:    paddw %xmm1, %xmm0
41*9880d681SAndroid Build Coastguard Worker; X32-NEXT:    movq %xmm0, (%eax)
42*9880d681SAndroid Build Coastguard Worker; X32-NEXT:    retl
43*9880d681SAndroid Build Coastguard Worker  %z = add <8 x i16> %x, %y                          ; force execution domain
44*9880d681SAndroid Build Coastguard Worker  %bc = bitcast <8 x i16> %z to <2 x i64>
45*9880d681SAndroid Build Coastguard Worker  %vecext = extractelement <2 x i64> %bc, i32 0
46*9880d681SAndroid Build Coastguard Worker  store i64 %vecext, i64* %i, align 8
47*9880d681SAndroid Build Coastguard Worker  ret void
48*9880d681SAndroid Build Coastguard Worker}
49*9880d681SAndroid Build Coastguard Worker
50*9880d681SAndroid Build Coastguard Workerdefine void @store_i64_from_vector256(<16 x i16> %x, <16 x i16> %y, i64* %i) {
51*9880d681SAndroid Build Coastguard Worker; X32AVX-LABEL: store_i64_from_vector256:
52*9880d681SAndroid Build Coastguard Worker; X32AVX:       # BB#0:
53*9880d681SAndroid Build Coastguard Worker; X32AVX-NEXT:    movl {{[0-9]+}}(%esp), %eax
54*9880d681SAndroid Build Coastguard Worker; X32AVX-NEXT:    vpaddw %ymm1, %ymm0, %ymm0
55*9880d681SAndroid Build Coastguard Worker; X32AVX-NEXT:    vextracti128 $1, %ymm0, %xmm0
56*9880d681SAndroid Build Coastguard Worker; X32AVX-NEXT:    vmovq %xmm0, (%eax)
57*9880d681SAndroid Build Coastguard Worker; X32AVX-NEXT:    vzeroupper
58*9880d681SAndroid Build Coastguard Worker; X32AVX-NEXT:    retl
59*9880d681SAndroid Build Coastguard Worker  %z = add <16 x i16> %x, %y                          ; force execution domain
60*9880d681SAndroid Build Coastguard Worker  %bc = bitcast <16 x i16> %z to <4 x i64>
61*9880d681SAndroid Build Coastguard Worker  %vecext = extractelement <4 x i64> %bc, i32 2
62*9880d681SAndroid Build Coastguard Worker  store i64 %vecext, i64* %i, align 8
63*9880d681SAndroid Build Coastguard Worker  ret void
64*9880d681SAndroid Build Coastguard Worker}
65*9880d681SAndroid Build Coastguard Worker
66*9880d681SAndroid Build Coastguard Worker; PR23476
67*9880d681SAndroid Build Coastguard Worker; Handle extraction from a non-simple / pre-legalization type.
68*9880d681SAndroid Build Coastguard Worker
69*9880d681SAndroid Build Coastguard Workerdefine void @PR23476(<5 x i64> %in, i64* %out, i32 %index) {
70*9880d681SAndroid Build Coastguard Worker; X32-LABEL: PR23476:
71*9880d681SAndroid Build Coastguard Worker; X32:         movsd {{.*#+}} xmm0 = mem[0],zero
72*9880d681SAndroid Build Coastguard Worker; X32-NEXT:    movsd %xmm0, (%eax)
73*9880d681SAndroid Build Coastguard Worker  %ext = extractelement <5 x i64> %in, i32 %index
74*9880d681SAndroid Build Coastguard Worker  store i64 %ext, i64* %out, align 8
75*9880d681SAndroid Build Coastguard Worker  ret void
76*9880d681SAndroid Build Coastguard Worker}
77