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