xref: /llvm-project/llvm/test/CodeGen/X86/memset-minsize.ll (revision adc6a9e8189cc0a8a02a2fcea3f820ea2b402251)
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; RUN: llc < %s -mtriple=x86_64-unknown-unknown | FileCheck %s
3
4define void @tiny_memset_to_rep_stos(ptr %ptr) minsize nounwind {
5; CHECK-LABEL: tiny_memset_to_rep_stos:
6; CHECK:       # %bb.0: # %entry
7; CHECK-NEXT:    andq $0, (%rdi)
8; CHECK-NEXT:    retq
9entry:
10  call void @llvm.memset.p0.i32(ptr align 4 %ptr, i8 0, i32 8, i1 false)
11  ret void
12}
13
14define void @small_memset_to_rep_stos(ptr %ptr) minsize nounwind {
15; CHECK-LABEL: small_memset_to_rep_stos:
16; CHECK:       # %bb.0: # %entry
17; CHECK-NEXT:    pushq $32
18; CHECK-NEXT:    popq %rcx
19; CHECK-NEXT:    xorl %eax, %eax
20; CHECK-NEXT:    rep;stosl %eax, %es:(%rdi)
21; CHECK-NEXT:    retq
22entry:
23  call void @llvm.memset.p0.i32(ptr align 4 %ptr, i8 0, i32 128, i1 false)
24  ret void
25}
26
27define void @medium_memset_to_rep_stos(ptr %ptr) minsize nounwind {
28; CHECK-LABEL: medium_memset_to_rep_stos:
29; CHECK:       # %bb.0: # %entry
30; CHECK-NEXT:    movl $128, %ecx
31; CHECK-NEXT:    xorl %eax, %eax
32; CHECK-NEXT:    rep;stosl %eax, %es:(%rdi)
33; CHECK-NEXT:    retq
34entry:
35  call void @llvm.memset.p0.i32(ptr align 4 %ptr, i8 0, i32 512, i1 false)
36  ret void
37}
38
39define void @large_memset_to_rep_stos(ptr %ptr) minsize nounwind {
40; CHECK-LABEL: large_memset_to_rep_stos:
41; CHECK:       # %bb.0: # %entry
42; CHECK-NEXT:    movl $1024, %ecx # imm = 0x400
43; CHECK-NEXT:    xorl %eax, %eax
44; CHECK-NEXT:    rep;stosl %eax, %es:(%rdi)
45; CHECK-NEXT:    retq
46entry:
47  call void @llvm.memset.p0.i32(ptr align 4 %ptr, i8 0, i32 4096, i1 false)
48  ret void
49}
50
51define void @huge_memset_to_rep_stos(ptr %ptr) minsize nounwind {
52; CHECK-LABEL: huge_memset_to_rep_stos:
53; CHECK:       # %bb.0: # %entry
54; CHECK-NEXT:    movl $2048, %ecx # imm = 0x800
55; CHECK-NEXT:    xorl %eax, %eax
56; CHECK-NEXT:    rep;stosl %eax, %es:(%rdi)
57; CHECK-NEXT:    retq
58entry:
59  call void @llvm.memset.p0.i32(ptr align 4 %ptr, i8 0, i32 8192, i1 false)
60  ret void
61}
62
63define void @odd_length_memset_to_rep_stos(ptr %ptr) minsize nounwind {
64; CHECK-LABEL: odd_length_memset_to_rep_stos:
65; CHECK:       # %bb.0: # %entry
66; CHECK-NEXT:    movl $255, %ecx
67; CHECK-NEXT:    xorl %eax, %eax
68; CHECK-NEXT:    rep;stosb %al, %es:(%rdi)
69; CHECK-NEXT:    retq
70entry:
71  call void @llvm.memset.p0.i32(ptr align 4 %ptr, i8 0, i32 255, i1 false)
72  ret void
73}
74
75define void @align_1_memset_to_rep_stos(ptr %ptr) minsize nounwind {
76; CHECK-LABEL: align_1_memset_to_rep_stos:
77; CHECK:       # %bb.0: # %entry
78; CHECK-NEXT:    pushq $64
79; CHECK-NEXT:    popq %rcx
80; CHECK-NEXT:    xorl %eax, %eax
81; CHECK-NEXT:    rep;stosl %eax, %es:(%rdi)
82; CHECK-NEXT:    retq
83entry:
84  call void @llvm.memset.p0.i32(ptr align 1 %ptr, i8 0, i32 256, i1 false)
85  ret void
86}
87
88define void @align_2_memset_to_rep_stos(ptr %ptr) minsize nounwind {
89; CHECK-LABEL: align_2_memset_to_rep_stos:
90; CHECK:       # %bb.0: # %entry
91; CHECK-NEXT:    pushq $64
92; CHECK-NEXT:    popq %rcx
93; CHECK-NEXT:    xorl %eax, %eax
94; CHECK-NEXT:    rep;stosl %eax, %es:(%rdi)
95; CHECK-NEXT:    retq
96entry:
97  call void @llvm.memset.p0.i32(ptr align 2 %ptr, i8 0, i32 256, i1 false)
98  ret void
99}
100
101define void @align_4_memset_to_rep_stos(ptr %ptr) minsize nounwind {
102; CHECK-LABEL: align_4_memset_to_rep_stos:
103; CHECK:       # %bb.0: # %entry
104; CHECK-NEXT:    pushq $64
105; CHECK-NEXT:    popq %rcx
106; CHECK-NEXT:    xorl %eax, %eax
107; CHECK-NEXT:    rep;stosl %eax, %es:(%rdi)
108; CHECK-NEXT:    retq
109entry:
110  call void @llvm.memset.p0.i32(ptr align 4 %ptr, i8 0, i32 256, i1 false)
111  ret void
112}
113
114define void @align_8_memset_to_rep_stos(ptr %ptr) minsize nounwind {
115; CHECK-LABEL: align_8_memset_to_rep_stos:
116; CHECK:       # %bb.0: # %entry
117; CHECK-NEXT:    pushq $64
118; CHECK-NEXT:    popq %rcx
119; CHECK-NEXT:    xorl %eax, %eax
120; CHECK-NEXT:    rep;stosl %eax, %es:(%rdi)
121; CHECK-NEXT:    retq
122entry:
123  call void @llvm.memset.p0.i32(ptr align 8 %ptr, i8 0, i32 256, i1 false)
124  ret void
125}
126
127define void @small_memset_to_rep_stos_64(ptr %ptr) minsize nounwind {
128; CHECK-LABEL: small_memset_to_rep_stos_64:
129; CHECK:       # %bb.0: # %entry
130; CHECK-NEXT:    pushq $32
131; CHECK-NEXT:    popq %rcx
132; CHECK-NEXT:    xorl %eax, %eax
133; CHECK-NEXT:    rep;stosl %eax, %es:(%rdi)
134; CHECK-NEXT:    retq
135entry:
136  call void @llvm.memset.p0.i64(ptr align 8 %ptr, i8 0, i64 128, i1 false)
137  ret void
138}
139
140declare void @llvm.memset.p0.i32(ptr nocapture writeonly, i8, i32, i1)
141