| ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py |
| |
| ; Test f128 to i128 bitcasts. |
| ; |
| ; RUN: llc < %s -mtriple=s390x-linux-gnu -mcpu=z10 \ |
| ; RUN: | FileCheck -check-prefix=Z10 %s |
| ; |
| ; RUN: llc < %s -mtriple=s390x-linux-gnu -mcpu=z14 \ |
| ; RUN: | FileCheck -check-prefix=Z14 %s |
| |
| define i64 @extract_float_hi(ptr %0, ptr %1) { |
| ; Z10-LABEL: extract_float_hi: |
| ; Z10: # %bb.0: # %entry |
| ; Z10-NEXT: ld %f0, 0(%r2) |
| ; Z10-NEXT: ld %f2, 8(%r2) |
| ; Z10-NEXT: ld %f1, 0(%r3) |
| ; Z10-NEXT: ld %f3, 8(%r3) |
| ; Z10-NEXT: axbr %f1, %f0 |
| ; Z10-NEXT: lgdr %r2, %f1 |
| ; Z10-NEXT: br %r14 |
| ; |
| ; Z14-LABEL: extract_float_hi: |
| ; Z14: # %bb.0: # %entry |
| ; Z14-NEXT: vl %v0, 0(%r2), 3 |
| ; Z14-NEXT: vl %v1, 0(%r3), 3 |
| ; Z14-NEXT: wfaxb %v0, %v0, %v1 |
| ; Z14-NEXT: vlgvg %r2, %v0, 0 |
| ; Z14-NEXT: br %r14 |
| entry: |
| %x = load fp128, ptr %0 |
| %y = load fp128, ptr %1 |
| %add = fadd fp128 %x, %y |
| %2 = bitcast fp128 %add to i128 |
| %u.sroa.0.0.extract.shift = lshr i128 %2, 64 |
| %u.sroa.0.0.extract.trunc = trunc i128 %u.sroa.0.0.extract.shift to i64 |
| ret i64 %u.sroa.0.0.extract.trunc |
| } |
| |
| define i64 @extract_float_lo(ptr %0, ptr %1) { |
| ; Z10-LABEL: extract_float_lo: |
| ; Z10: # %bb.0: # %entry |
| ; Z10-NEXT: ld %f0, 0(%r2) |
| ; Z10-NEXT: ld %f2, 8(%r2) |
| ; Z10-NEXT: ld %f1, 0(%r3) |
| ; Z10-NEXT: ld %f3, 8(%r3) |
| ; Z10-NEXT: axbr %f1, %f0 |
| ; Z10-NEXT: lgdr %r2, %f3 |
| ; Z10-NEXT: br %r14 |
| ; |
| ; Z14-LABEL: extract_float_lo: |
| ; Z14: # %bb.0: # %entry |
| ; Z14-NEXT: vl %v0, 0(%r2), 3 |
| ; Z14-NEXT: vl %v1, 0(%r3), 3 |
| ; Z14-NEXT: wfaxb %v0, %v0, %v1 |
| ; Z14-NEXT: vlgvg %r2, %v0, 1 |
| ; Z14-NEXT: br %r14 |
| entry: |
| %x = load fp128, ptr %0 |
| %y = load fp128, ptr %1 |
| %add = fadd fp128 %x, %y |
| %2 = bitcast fp128 %add to i128 |
| %u.sroa.0.0.extract.trunc = trunc i128 %2 to i64 |
| ret i64 %u.sroa.0.0.extract.trunc |
| } |
| |
| define i128 @bitcast_128(ptr %0, ptr %1) { |
| ; Z10-LABEL: bitcast_128: |
| ; Z10: # %bb.0: # %entry |
| ; Z10-NEXT: ld %f0, 0(%r3) |
| ; Z10-NEXT: ld %f2, 8(%r3) |
| ; Z10-NEXT: ld %f1, 0(%r4) |
| ; Z10-NEXT: ld %f3, 8(%r4) |
| ; Z10-NEXT: axbr %f1, %f0 |
| ; Z10-NEXT: lgdr %r0, %f3 |
| ; Z10-NEXT: lgdr %r1, %f1 |
| ; Z10-NEXT: oill %r1, 1 |
| ; Z10-NEXT: oill %r0, 3 |
| ; Z10-NEXT: stg %r0, 8(%r2) |
| ; Z10-NEXT: stg %r1, 0(%r2) |
| ; Z10-NEXT: br %r14 |
| ; |
| ; Z14-LABEL: bitcast_128: |
| ; Z14: # %bb.0: # %entry |
| ; Z14-NEXT: vl %v0, 0(%r3), 3 |
| ; Z14-NEXT: vl %v1, 0(%r4), 3 |
| ; Z14-NEXT: wfaxb %v0, %v0, %v1 |
| ; Z14-NEXT: larl %r1, .LCPI2_0 |
| ; Z14-NEXT: vl %v1, 0(%r1), 3 |
| ; Z14-NEXT: vo %v0, %v0, %v1 |
| ; Z14-NEXT: vst %v0, 0(%r2), 3 |
| ; Z14-NEXT: br %r14 |
| entry: |
| %x = load fp128, ptr %0 |
| %y = load fp128, ptr %1 |
| %add = fadd fp128 %x, %y |
| %i = bitcast fp128 %add to i128 |
| %hibit = shl i128 1, 64 |
| %i2 = or i128 %i, %hibit |
| %i3 = or i128 %i2, 3 |
| ret i128 %i3 |
| } |