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