119 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 42; RUN: llc < %s | FileCheck %s3 4target datalayout = "e-m:x-p:32:32-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-f80:32-n8:16:32-a:0:32-S32"5target triple = "i386-pc-windows-gnu"6 7; This function uses esi as base pointer, the inline asm clobbers esi, so we8; should save esi using esp before the inline asm, and restore esi after the9; inline asm.10 11define i32 @clober_bp() {12; CHECK-LABEL: clober_bp:13; CHECK: # %bb.0: # %entry14; CHECK-NEXT: pushl %ebp15; CHECK-NEXT: .cfi_def_cfa_offset 816; CHECK-NEXT: .cfi_offset %ebp, -817; CHECK-NEXT: movl %esp, %ebp18; CHECK-NEXT: .cfi_def_cfa_register %ebp19; CHECK-NEXT: pushl %edi20; CHECK-NEXT: pushl %esi21; CHECK-NEXT: andl $-16, %esp22; CHECK-NEXT: subl $16, %esp23; CHECK-NEXT: movl %esp, %esi24; CHECK-NEXT: .cfi_offset %esi, -1625; CHECK-NEXT: .cfi_offset %edi, -1226; CHECK-NEXT: movl $4, 12(%esi)27; CHECK-NEXT: movl 12(%esi), %eax28; CHECK-NEXT: addl $3, %eax29; CHECK-NEXT: andl $-4, %eax30; CHECK-NEXT: calll __alloca31; CHECK-NEXT: movl %esp, %eax32; CHECK-NEXT: andl $-16, %eax33; CHECK-NEXT: movl %eax, %esp34; CHECK-NEXT: movl $1, (%eax)35; CHECK-NEXT: leal 8(%esi), %edi36; CHECK-NEXT: movl $4, %ecx37; CHECK-NEXT: pushl %esi38; CHECK-NEXT: movl %eax, %esi39; CHECK-NEXT: #APP40; CHECK-NEXT: rep movsb (%esi), %es:(%edi)41; CHECK-NEXT: #NO_APP42; CHECK-NEXT: popl %esi43; CHECK-NEXT: movl 8(%esi), %eax44; CHECK-NEXT: leal -8(%ebp), %esp45; CHECK-NEXT: popl %esi46; CHECK-NEXT: popl %edi47; CHECK-NEXT: popl %ebp48; CHECK-NEXT: retl49entry:50 %size = alloca i32, align 451 %g = alloca i32, align 452 store volatile i32 4, ptr %size, align 453 %len = load volatile i32, ptr %size, align 454 %var_array = alloca i8, i32 %len, align 1655 store i32 1, ptr %var_array, align 1656 %nil = call { ptr, ptr, i32 } asm "rep movsb", "={di},={si},={cx},0,1,2,~{memory},~{dirflag},~{fpsr},~{flags}"(ptr %g, ptr %var_array, i32 4)57 %retval = load i32, ptr %g, align 458 ret i32 %retval59}60 61; This function has the same code except the inline asm also clobbers62; frame pointer.63 64define i32 @clobber_bpfp() {65; CHECK-LABEL: clobber_bpfp:66; CHECK: # %bb.0: # %entry67; CHECK-NEXT: pushl %ebp68; CHECK-NEXT: .cfi_def_cfa_offset 869; CHECK-NEXT: .cfi_offset %ebp, -870; CHECK-NEXT: movl %esp, %ebp71; CHECK-NEXT: .cfi_def_cfa_register %ebp72; CHECK-NEXT: pushl %edi73; CHECK-NEXT: pushl %esi74; CHECK-NEXT: andl $-16, %esp75; CHECK-NEXT: subl $16, %esp76; CHECK-NEXT: movl %esp, %esi77; CHECK-NEXT: .cfi_offset %esi, -1678; CHECK-NEXT: .cfi_offset %edi, -1279; CHECK-NEXT: movl $4, 12(%esi)80; CHECK-NEXT: movl 12(%esi), %eax81; CHECK-NEXT: addl $3, %eax82; CHECK-NEXT: andl $-4, %eax83; CHECK-NEXT: calll __alloca84; CHECK-NEXT: movl %esp, %eax85; CHECK-NEXT: andl $-16, %eax86; CHECK-NEXT: movl %eax, %esp87; CHECK-NEXT: movl $1, (%eax)88; CHECK-NEXT: leal 8(%esi), %edi89; CHECK-NEXT: movl $4, %ecx90; CHECK-NEXT: pushl %ebp91; CHECK-NEXT: pushl %esi92; CHECK-NEXT: .cfi_remember_state93; CHECK-NEXT: .cfi_escape 0x0f, 0x06, 0x74, 0x04, 0x06, 0x11, 0x08, 0x22 #94; CHECK-NEXT: movl %eax, %esi95; CHECK-NEXT: #APP96; CHECK-NEXT: rep movsb (%esi), %es:(%edi)97; CHECK-NEXT: #NO_APP98; CHECK-NEXT: popl %esi99; CHECK-NEXT: popl %ebp100; CHECK-NEXT: .cfi_restore_state101; CHECK-NEXT: movl 8(%esi), %eax102; CHECK-NEXT: leal -8(%ebp), %esp103; CHECK-NEXT: popl %esi104; CHECK-NEXT: popl %edi105; CHECK-NEXT: popl %ebp106; CHECK-NEXT: retl107entry:108 %size = alloca i32, align 4109 %g = alloca i32, align 4110 store volatile i32 4, ptr %size, align 4111 %len = load volatile i32, ptr %size, align 4112 %var_array = alloca i8, i32 %len, align 16113 store i32 1, ptr %var_array, align 16114 %nil = call { ptr, ptr, i32 } asm "rep movsb", "={di},={si},={cx},0,1,2,~{memory},~{dirflag},~{fpsr},~{flags},~{ebp}"(ptr %g, ptr %var_array, i32 4)115 %retval = load i32, ptr %g, align 4116 ret i32 %retval117}118 119