|  | ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 5 | 
|  | ; Test setjmp store jmp_buf | 
|  | ; Return address in slot 2. | 
|  | ; Backchain value is stored in slot 3 for -mbackchain option. | 
|  | ; Stack Pointer in slot 4. | 
|  | ; Clobber %r6-%r15, %f8-%f15. | 
|  |  | 
|  | ; RUN: llc < %s -verify-machineinstrs -mtriple=s390x-linux-gnu | FileCheck %s | 
|  |  | 
|  | declare i32 @llvm.eh.sjlj.setjmp(ptr) | 
|  | @buf = global [20 x ptr] zeroinitializer, align 8 | 
|  |  | 
|  | define void @foo() { | 
|  | ; CHECK-LABEL: foo: | 
|  | ; CHECK:       # %bb.0: # %entry | 
|  | ; CHECK-NEXT:    stmg %r6, %r15, 48(%r15) | 
|  | ; CHECK-NEXT:    .cfi_offset %r6, -112 | 
|  | ; CHECK-NEXT:    .cfi_offset %r7, -104 | 
|  | ; CHECK-NEXT:    .cfi_offset %r8, -96 | 
|  | ; CHECK-NEXT:    .cfi_offset %r9, -88 | 
|  | ; CHECK-NEXT:    .cfi_offset %r10, -80 | 
|  | ; CHECK-NEXT:    .cfi_offset %r11, -72 | 
|  | ; CHECK-NEXT:    .cfi_offset %r12, -64 | 
|  | ; CHECK-NEXT:    .cfi_offset %r13, -56 | 
|  | ; CHECK-NEXT:    .cfi_offset %r14, -48 | 
|  | ; CHECK-NEXT:    .cfi_offset %r15, -40 | 
|  | ; CHECK-NEXT:    aghi %r15, -64 | 
|  | ; CHECK-NEXT:    .cfi_def_cfa_offset 224 | 
|  | ; CHECK-NEXT:    std %f8, 56(%r15) # 8-byte Spill | 
|  | ; CHECK-NEXT:    std %f9, 48(%r15) # 8-byte Spill | 
|  | ; CHECK-NEXT:    std %f10, 40(%r15) # 8-byte Spill | 
|  | ; CHECK-NEXT:    std %f11, 32(%r15) # 8-byte Spill | 
|  | ; CHECK-NEXT:    std %f12, 24(%r15) # 8-byte Spill | 
|  | ; CHECK-NEXT:    std %f13, 16(%r15) # 8-byte Spill | 
|  | ; CHECK-NEXT:    std %f14, 8(%r15) # 8-byte Spill | 
|  | ; CHECK-NEXT:    std %f15, 0(%r15) # 8-byte Spill | 
|  | ; CHECK-NEXT:    .cfi_offset %f8, -168 | 
|  | ; CHECK-NEXT:    .cfi_offset %f9, -176 | 
|  | ; CHECK-NEXT:    .cfi_offset %f10, -184 | 
|  | ; CHECK-NEXT:    .cfi_offset %f11, -192 | 
|  | ; CHECK-NEXT:    .cfi_offset %f12, -200 | 
|  | ; CHECK-NEXT:    .cfi_offset %f13, -208 | 
|  | ; CHECK-NEXT:    .cfi_offset %f14, -216 | 
|  | ; CHECK-NEXT:    .cfi_offset %f15, -224 | 
|  | ; CHECK-NEXT:    lgrl %r1, buf@GOT | 
|  | ; CHECK-NEXT:    larl %r0, .LBB0_1 | 
|  | ; CHECK-NEXT:    stg %r0, 8(%r1) | 
|  | ; CHECK-NEXT:    stg %r15, 24(%r1) | 
|  | ; CHECK-NEXT:  .LBB0_1: # Block address taken | 
|  | ; CHECK-NEXT:    # %entry | 
|  | ; CHECK-NEXT:  .LBB0_2: # %entry | 
|  | ; CHECK-NEXT:    ld %f8, 56(%r15) # 8-byte Reload | 
|  | ; CHECK-NEXT:    ld %f9, 48(%r15) # 8-byte Reload | 
|  | ; CHECK-NEXT:    ld %f10, 40(%r15) # 8-byte Reload | 
|  | ; CHECK-NEXT:    ld %f11, 32(%r15) # 8-byte Reload | 
|  | ; CHECK-NEXT:    ld %f12, 24(%r15) # 8-byte Reload | 
|  | ; CHECK-NEXT:    ld %f13, 16(%r15) # 8-byte Reload | 
|  | ; CHECK-NEXT:    ld %f14, 8(%r15) # 8-byte Reload | 
|  | ; CHECK-NEXT:    ld %f15, 0(%r15) # 8-byte Reload | 
|  | ; CHECK-NEXT:    lmg %r6, %r15, 112(%r15) | 
|  | ; CHECK-NEXT:    br %r14 | 
|  | entry: | 
|  | %0 = tail call i32 @llvm.eh.sjlj.setjmp(ptr nonnull @buf) | 
|  | ret void | 
|  | } | 
|  |  | 
|  | define void @foo1() "backchain" { | 
|  | ; CHECK-LABEL: foo1: | 
|  | ; CHECK:       # %bb.0: # %entry | 
|  | ; CHECK-NEXT:    stmg %r6, %r15, 48(%r15) | 
|  | ; CHECK-NEXT:    .cfi_offset %r6, -112 | 
|  | ; CHECK-NEXT:    .cfi_offset %r7, -104 | 
|  | ; CHECK-NEXT:    .cfi_offset %r8, -96 | 
|  | ; CHECK-NEXT:    .cfi_offset %r9, -88 | 
|  | ; CHECK-NEXT:    .cfi_offset %r10, -80 | 
|  | ; CHECK-NEXT:    .cfi_offset %r11, -72 | 
|  | ; CHECK-NEXT:    .cfi_offset %r12, -64 | 
|  | ; CHECK-NEXT:    .cfi_offset %r13, -56 | 
|  | ; CHECK-NEXT:    .cfi_offset %r14, -48 | 
|  | ; CHECK-NEXT:    .cfi_offset %r15, -40 | 
|  | ; CHECK-NEXT:    lgr %r1, %r15 | 
|  | ; CHECK-NEXT:    aghi %r15, -64 | 
|  | ; CHECK-NEXT:    .cfi_def_cfa_offset 224 | 
|  | ; CHECK-NEXT:    stg %r1, 0(%r15) | 
|  | ; CHECK-NEXT:    std %f8, 56(%r15) # 8-byte Spill | 
|  | ; CHECK-NEXT:    std %f9, 48(%r15) # 8-byte Spill | 
|  | ; CHECK-NEXT:    std %f10, 40(%r15) # 8-byte Spill | 
|  | ; CHECK-NEXT:    std %f11, 32(%r15) # 8-byte Spill | 
|  | ; CHECK-NEXT:    std %f12, 24(%r15) # 8-byte Spill | 
|  | ; CHECK-NEXT:    std %f13, 16(%r15) # 8-byte Spill | 
|  | ; CHECK-NEXT:    std %f14, 8(%r15) # 8-byte Spill | 
|  | ; CHECK-NEXT:    std %f15, 0(%r15) # 8-byte Spill | 
|  | ; CHECK-NEXT:    .cfi_offset %f8, -168 | 
|  | ; CHECK-NEXT:    .cfi_offset %f9, -176 | 
|  | ; CHECK-NEXT:    .cfi_offset %f10, -184 | 
|  | ; CHECK-NEXT:    .cfi_offset %f11, -192 | 
|  | ; CHECK-NEXT:    .cfi_offset %f12, -200 | 
|  | ; CHECK-NEXT:    .cfi_offset %f13, -208 | 
|  | ; CHECK-NEXT:    .cfi_offset %f14, -216 | 
|  | ; CHECK-NEXT:    .cfi_offset %f15, -224 | 
|  | ; CHECK-NEXT:    lgrl %r1, buf@GOT | 
|  | ; CHECK-NEXT:    larl %r0, .LBB1_1 | 
|  | ; CHECK-NEXT:    stg %r0, 8(%r1) | 
|  | ; CHECK-NEXT:    stg %r15, 24(%r1) | 
|  | ; CHECK-NEXT:    lg %r0, 0(%r15) | 
|  | ; CHECK-NEXT:    stg %r0, 16(%r1) | 
|  | ; CHECK-NEXT:  .LBB1_1: # Block address taken | 
|  | ; CHECK-NEXT:    # %entry | 
|  | ; CHECK-NEXT:  .LBB1_2: # %entry | 
|  | ; CHECK-NEXT:    ld %f8, 56(%r15) # 8-byte Reload | 
|  | ; CHECK-NEXT:    ld %f9, 48(%r15) # 8-byte Reload | 
|  | ; CHECK-NEXT:    ld %f10, 40(%r15) # 8-byte Reload | 
|  | ; CHECK-NEXT:    ld %f11, 32(%r15) # 8-byte Reload | 
|  | ; CHECK-NEXT:    ld %f12, 24(%r15) # 8-byte Reload | 
|  | ; CHECK-NEXT:    ld %f13, 16(%r15) # 8-byte Reload | 
|  | ; CHECK-NEXT:    ld %f14, 8(%r15) # 8-byte Reload | 
|  | ; CHECK-NEXT:    ld %f15, 0(%r15) # 8-byte Reload | 
|  | ; CHECK-NEXT:    lmg %r6, %r15, 112(%r15) | 
|  | ; CHECK-NEXT:    br %r14 | 
|  | entry: | 
|  | %0 = tail call i32 @llvm.eh.sjlj.setjmp(ptr nonnull @buf) | 
|  | ret void | 
|  | } | 
|  |  |