1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 4 2; Test long double atomic exchange. 3; 4; RUN: llc < %s -mtriple=s390x-linux-gnu | FileCheck -check-prefixes=CHECK,HARDFP %s 5; RUN: llc < %s -mtriple=s390x-linux-gnu -mattr=+soft-float | FileCheck -check-prefixes=CHECK,SOFTFP %s 6 7define void @f1(ptr align 16 %ret, ptr align 16 %src, ptr align 16 %b) { 8; CHECK-LABEL: f1: 9; CHECK: # %bb.0: 10; CHECK-NEXT: stmg %r12, %r15, 96(%r15) 11; CHECK-NEXT: .cfi_offset %r12, -64 12; CHECK-NEXT: .cfi_offset %r13, -56 13; CHECK-NEXT: .cfi_offset %r15, -40 14; CHECK-NEXT: lg %r1, 8(%r4) 15; CHECK-NEXT: lg %r0, 0(%r4) 16; CHECK-NEXT: lg %r4, 8(%r3) 17; CHECK-NEXT: lg %r5, 0(%r3) 18; CHECK-NEXT: .LBB0_1: # %atomicrmw.start 19; CHECK-NEXT: # =>This Inner Loop Header: Depth=1 20; CHECK-NEXT: lgr %r12, %r5 21; CHECK-NEXT: lgr %r13, %r4 22; CHECK-NEXT: cdsg %r12, %r0, 0(%r3) 23; CHECK-NEXT: lgr %r4, %r13 24; CHECK-NEXT: lgr %r5, %r12 25; CHECK-NEXT: jl .LBB0_1 26; CHECK-NEXT: # %bb.2: # %atomicrmw.end 27; CHECK-NEXT: stg %r5, 0(%r2) 28; CHECK-NEXT: stg %r4, 8(%r2) 29; CHECK-NEXT: lmg %r12, %r15, 96(%r15) 30; CHECK-NEXT: br %r14 31 %val = load fp128, ptr %b, align 16 32 %res = atomicrmw xchg ptr %src, fp128 %val seq_cst 33 store fp128 %res, ptr %ret, align 16 34 ret void 35} 36 37define void @f1_fpuse(ptr align 16 %ret, ptr align 16 %src, ptr align 16 %b) { 38; HARDFP-LABEL: f1_fpuse: 39; HARDFP: # %bb.0: 40; HARDFP-NEXT: stmg %r12, %r15, 96(%r15) 41; HARDFP-NEXT: .cfi_offset %r12, -64 42; HARDFP-NEXT: .cfi_offset %r13, -56 43; HARDFP-NEXT: .cfi_offset %r15, -40 44; HARDFP-NEXT: aghi %r15, -176 45; HARDFP-NEXT: .cfi_def_cfa_offset 336 46; HARDFP-NEXT: ld %f0, 0(%r4) 47; HARDFP-NEXT: ld %f2, 8(%r4) 48; HARDFP-NEXT: lg %r0, 8(%r3) 49; HARDFP-NEXT: lg %r1, 0(%r3) 50; HARDFP-NEXT: axbr %f0, %f0 51; HARDFP-NEXT: lgdr %r5, %f2 52; HARDFP-NEXT: lgdr %r4, %f0 53; HARDFP-NEXT: .LBB1_1: # %atomicrmw.start 54; HARDFP-NEXT: # =>This Inner Loop Header: Depth=1 55; HARDFP-NEXT: lgr %r12, %r1 56; HARDFP-NEXT: lgr %r13, %r0 57; HARDFP-NEXT: cdsg %r12, %r4, 0(%r3) 58; HARDFP-NEXT: lgr %r0, %r13 59; HARDFP-NEXT: lgr %r1, %r12 60; HARDFP-NEXT: jl .LBB1_1 61; HARDFP-NEXT: # %bb.2: # %atomicrmw.end 62; HARDFP-NEXT: stg %r1, 160(%r15) 63; HARDFP-NEXT: stg %r0, 168(%r15) 64; HARDFP-NEXT: ld %f0, 160(%r15) 65; HARDFP-NEXT: ld %f2, 168(%r15) 66; HARDFP-NEXT: axbr %f0, %f0 67; HARDFP-NEXT: std %f0, 0(%r2) 68; HARDFP-NEXT: std %f2, 8(%r2) 69; HARDFP-NEXT: lmg %r12, %r15, 272(%r15) 70; HARDFP-NEXT: br %r14 71; 72; SOFTFP-LABEL: f1_fpuse: 73; SOFTFP: # %bb.0: 74; SOFTFP-NEXT: stmg %r12, %r15, 96(%r15) 75; SOFTFP-NEXT: .cfi_offset %r12, -64 76; SOFTFP-NEXT: .cfi_offset %r13, -56 77; SOFTFP-NEXT: .cfi_offset %r14, -48 78; SOFTFP-NEXT: .cfi_offset %r15, -40 79; SOFTFP-NEXT: aghi %r15, -256 80; SOFTFP-NEXT: .cfi_def_cfa_offset 416 81; SOFTFP-NEXT: lg %r0, 8(%r4) 82; SOFTFP-NEXT: lg %r1, 0(%r4) 83; SOFTFP-NEXT: lgr %r12, %r3 84; SOFTFP-NEXT: lgr %r13, %r2 85; SOFTFP-NEXT: stg %r0, 216(%r15) 86; SOFTFP-NEXT: stg %r1, 208(%r15) 87; SOFTFP-NEXT: stg %r0, 232(%r15) 88; SOFTFP-NEXT: la %r2, 240(%r15) 89; SOFTFP-NEXT: la %r3, 224(%r15) 90; SOFTFP-NEXT: la %r4, 208(%r15) 91; SOFTFP-NEXT: stg %r1, 224(%r15) 92; SOFTFP-NEXT: brasl %r14, __addtf3@PLT 93; SOFTFP-NEXT: lg %r3, 248(%r15) 94; SOFTFP-NEXT: lg %r2, 240(%r15) 95; SOFTFP-NEXT: lg %r0, 8(%r12) 96; SOFTFP-NEXT: lg %r1, 0(%r12) 97; SOFTFP-NEXT: .LBB1_1: # %atomicrmw.start 98; SOFTFP-NEXT: # =>This Inner Loop Header: Depth=1 99; SOFTFP-NEXT: lgr %r4, %r1 100; SOFTFP-NEXT: lgr %r5, %r0 101; SOFTFP-NEXT: cdsg %r4, %r2, 0(%r12) 102; SOFTFP-NEXT: lgr %r0, %r5 103; SOFTFP-NEXT: lgr %r1, %r4 104; SOFTFP-NEXT: jl .LBB1_1 105; SOFTFP-NEXT: # %bb.2: # %atomicrmw.end 106; SOFTFP-NEXT: stg %r1, 160(%r15) 107; SOFTFP-NEXT: stg %r1, 176(%r15) 108; SOFTFP-NEXT: stg %r0, 168(%r15) 109; SOFTFP-NEXT: la %r2, 192(%r15) 110; SOFTFP-NEXT: la %r3, 176(%r15) 111; SOFTFP-NEXT: la %r4, 160(%r15) 112; SOFTFP-NEXT: stg %r0, 184(%r15) 113; SOFTFP-NEXT: brasl %r14, __addtf3@PLT 114; SOFTFP-NEXT: lg %r0, 200(%r15) 115; SOFTFP-NEXT: lg %r1, 192(%r15) 116; SOFTFP-NEXT: stg %r0, 8(%r13) 117; SOFTFP-NEXT: stg %r1, 0(%r13) 118; SOFTFP-NEXT: lmg %r12, %r15, 352(%r15) 119; SOFTFP-NEXT: br %r14 120 %val = load fp128, ptr %b, align 16 121 %add.src = fadd fp128 %val, %val 122 %res = atomicrmw xchg ptr %src, fp128 %add.src seq_cst 123 %res.x2 = fadd fp128 %res, %res 124 store fp128 %res.x2, ptr %ret, align 16 125 ret void 126} 127