brintos

brintos / llvm-project-archived public Read only

0
0
Text · 4.0 KiB · 2c39560 Raw
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