1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown | FileCheck %s
4 define 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)
10 call void @llvm.memset.p0.i32(ptr align 4 %ptr, i8 0, i32 8, i1 false)
14 define 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)
23 call void @llvm.memset.p0.i32(ptr align 4 %ptr, i8 0, i32 128, i1 false)
27 define 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)
35 call void @llvm.memset.p0.i32(ptr align 4 %ptr, i8 0, i32 512, i1 false)
39 define 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)
47 call void @llvm.memset.p0.i32(ptr align 4 %ptr, i8 0, i32 4096, i1 false)
51 define 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)
59 call void @llvm.memset.p0.i32(ptr align 4 %ptr, i8 0, i32 8192, i1 false)
63 define 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)
71 call void @llvm.memset.p0.i32(ptr align 4 %ptr, i8 0, i32 255, i1 false)
75 define 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)
84 call void @llvm.memset.p0.i32(ptr align 1 %ptr, i8 0, i32 256, i1 false)
88 define 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)
97 call void @llvm.memset.p0.i32(ptr align 2 %ptr, i8 0, i32 256, i1 false)
101 define 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)
110 call void @llvm.memset.p0.i32(ptr align 4 %ptr, i8 0, i32 256, i1 false)
114 define 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)
123 call void @llvm.memset.p0.i32(ptr align 8 %ptr, i8 0, i32 256, i1 false)
127 define 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)
136 call void @llvm.memset.p0.i64(ptr align 8 %ptr, i8 0, i64 128, i1 false)
140 declare void @llvm.memset.p0.i32(ptr nocapture writeonly, i8, i32, i1)