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(i32* %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  %0 = bitcast i32* %ptr to i8*
11  call void @llvm.memset.p0i8.i32(i8* align 4 %0, i8 0, i32 8, i1 false)
12  ret void
13}
14
15define void @small_memset_to_rep_stos(i32* %ptr) minsize nounwind {
16; CHECK-LABEL: small_memset_to_rep_stos:
17; CHECK:       # %bb.0: # %entry
18; CHECK-NEXT:    pushq $32
19; CHECK-NEXT:    popq %rcx
20; CHECK-NEXT:    xorl %eax, %eax
21; CHECK-NEXT:    rep;stosl %eax, %es:(%rdi)
22; CHECK-NEXT:    retq
23entry:
24  %0 = bitcast i32* %ptr to i8*
25  call void @llvm.memset.p0i8.i32(i8* align 4 %0, i8 0, i32 128, i1 false)
26  ret void
27}
28
29define void @medium_memset_to_rep_stos(i32* %ptr) minsize nounwind {
30; CHECK-LABEL: medium_memset_to_rep_stos:
31; CHECK:       # %bb.0: # %entry
32; CHECK-NEXT:    pushq %rax
33; CHECK-NEXT:    movl $512, %edx # imm = 0x200
34; CHECK-NEXT:    xorl %esi, %esi
35; CHECK-NEXT:    callq memset@PLT
36; CHECK-NEXT:    popq %rax
37; CHECK-NEXT:    retq
38entry:
39  %0 = bitcast i32* %ptr to i8*
40  call void @llvm.memset.p0i8.i32(i8* align 4 %0, i8 0, i32 512, i1 false)
41  ret void
42}
43
44define void @large_memset_to_rep_stos(i32* %ptr) minsize nounwind {
45; CHECK-LABEL: large_memset_to_rep_stos:
46; CHECK:       # %bb.0: # %entry
47; CHECK-NEXT:    pushq %rax
48; CHECK-NEXT:    movl $4096, %edx # imm = 0x1000
49; CHECK-NEXT:    xorl %esi, %esi
50; CHECK-NEXT:    callq memset@PLT
51; CHECK-NEXT:    popq %rax
52; CHECK-NEXT:    retq
53entry:
54  %0 = bitcast i32* %ptr to i8*
55  call void @llvm.memset.p0i8.i32(i8* align 4 %0, i8 0, i32 4096, i1 false)
56  ret void
57}
58
59define void @huge_memset_to_rep_stos(i32* %ptr) minsize nounwind {
60; CHECK-LABEL: huge_memset_to_rep_stos:
61; CHECK:       # %bb.0: # %entry
62; CHECK-NEXT:    pushq %rax
63; CHECK-NEXT:    movl $8192, %edx # imm = 0x2000
64; CHECK-NEXT:    xorl %esi, %esi
65; CHECK-NEXT:    callq memset@PLT
66; CHECK-NEXT:    popq %rax
67; CHECK-NEXT:    retq
68entry:
69  %0 = bitcast i32* %ptr to i8*
70  call void @llvm.memset.p0i8.i32(i8* align 4 %0, i8 0, i32 8192, i1 false)
71  ret void
72}
73
74define void @odd_length_memset_to_rep_stos(i32* %ptr) minsize nounwind {
75; CHECK-LABEL: odd_length_memset_to_rep_stos:
76; CHECK:       # %bb.0: # %entry
77; CHECK-NEXT:    pushq %rax
78; CHECK-NEXT:    movl $255, %edx
79; CHECK-NEXT:    xorl %esi, %esi
80; CHECK-NEXT:    callq memset@PLT
81; CHECK-NEXT:    popq %rax
82; CHECK-NEXT:    retq
83entry:
84  %0 = bitcast i32* %ptr to i8*
85  call void @llvm.memset.p0i8.i32(i8* align 4 %0, i8 0, i32 255, i1 false)
86  ret void
87}
88
89define void @align_1_memset_to_rep_stos(i8* %ptr) minsize nounwind {
90; CHECK-LABEL: align_1_memset_to_rep_stos:
91; CHECK:       # %bb.0: # %entry
92; CHECK-NEXT:    pushq %rax
93; CHECK-NEXT:    movl $256, %edx # imm = 0x100
94; CHECK-NEXT:    xorl %esi, %esi
95; CHECK-NEXT:    callq memset@PLT
96; CHECK-NEXT:    popq %rax
97; CHECK-NEXT:    retq
98entry:
99  call void @llvm.memset.p0i8.i32(i8* align 1 %ptr, i8 0, i32 256, i1 false)
100  ret void
101}
102
103define void @align_2_memset_to_rep_stos(i16* %ptr) minsize nounwind {
104; CHECK-LABEL: align_2_memset_to_rep_stos:
105; CHECK:       # %bb.0: # %entry
106; CHECK-NEXT:    pushq %rax
107; CHECK-NEXT:    movl $256, %edx # imm = 0x100
108; CHECK-NEXT:    xorl %esi, %esi
109; CHECK-NEXT:    callq memset@PLT
110; CHECK-NEXT:    popq %rax
111; CHECK-NEXT:    retq
112entry:
113  %0 = bitcast i16* %ptr to i8*
114  call void @llvm.memset.p0i8.i32(i8* align 2 %0, i8 0, i32 256, i1 false)
115  ret void
116}
117
118define void @align_4_memset_to_rep_stos(i16* %ptr) minsize nounwind {
119; CHECK-LABEL: align_4_memset_to_rep_stos:
120; CHECK:       # %bb.0: # %entry
121; CHECK-NEXT:    pushq %rax
122; CHECK-NEXT:    movl $256, %edx # imm = 0x100
123; CHECK-NEXT:    xorl %esi, %esi
124; CHECK-NEXT:    callq memset@PLT
125; CHECK-NEXT:    popq %rax
126; CHECK-NEXT:    retq
127entry:
128  %0 = bitcast i16* %ptr to i8*
129  call void @llvm.memset.p0i8.i32(i8* align 4 %0, i8 0, i32 256, i1 false)
130  ret void
131}
132
133define void @align_8_memset_to_rep_stos(i64* %ptr) minsize nounwind {
134; CHECK-LABEL: align_8_memset_to_rep_stos:
135; CHECK:       # %bb.0: # %entry
136; CHECK-NEXT:    pushq %rax
137; CHECK-NEXT:    movl $256, %edx # imm = 0x100
138; CHECK-NEXT:    xorl %esi, %esi
139; CHECK-NEXT:    callq memset@PLT
140; CHECK-NEXT:    popq %rax
141; CHECK-NEXT:    retq
142entry:
143  %0 = bitcast i64* %ptr to i8*
144  call void @llvm.memset.p0i8.i32(i8* align 8 %0, i8 0, i32 256, i1 false)
145  ret void
146}
147
148declare void @llvm.memset.p0i8.i32(i8* nocapture writeonly, i8, i32, i1)
149