1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151
|
; Test 128-bit floating-point loads.
;
; RUN: llc < %s -mtriple=s390x-linux-gnu -verify-machineinstrs | FileCheck %s
; Check loads with no offset.
define double @f1(i64 %src) {
; CHECK-LABEL: f1:
; CHECK: ld %f0, 0(%r2)
; CHECK: ld %f2, 8(%r2)
; CHECK: br %r14
%ptr = inttoptr i64 %src to ptr
%val = load fp128, ptr %ptr
%trunc = fptrunc fp128 %val to double
ret double %trunc
}
; Check the highest aligned offset that allows LD for both halves.
define double @f2(i64 %src) {
; CHECK-LABEL: f2:
; CHECK: ld %f0, 4080(%r2)
; CHECK: ld %f2, 4088(%r2)
; CHECK: br %r14
%add = add i64 %src, 4080
%ptr = inttoptr i64 %add to ptr
%val = load fp128, ptr %ptr
%trunc = fptrunc fp128 %val to double
ret double %trunc
}
; Check the next doubleword up, which requires a mixture of LD and LDY.
define double @f3(i64 %src) {
; CHECK-LABEL: f3:
; CHECK: ld %f0, 4088(%r2)
; CHECK: ldy %f2, 4096(%r2)
; CHECK: br %r14
%add = add i64 %src, 4088
%ptr = inttoptr i64 %add to ptr
%val = load fp128, ptr %ptr
%trunc = fptrunc fp128 %val to double
ret double %trunc
}
; Check the next doubleword after that, which requires LDY for both halves.
define double @f4(i64 %src) {
; CHECK-LABEL: f4:
; CHECK: ldy %f0, 4096(%r2)
; CHECK: ldy %f2, 4104(%r2)
; CHECK: br %r14
%add = add i64 %src, 4096
%ptr = inttoptr i64 %add to ptr
%val = load fp128, ptr %ptr
%trunc = fptrunc fp128 %val to double
ret double %trunc
}
; Check the highest aligned offset that allows LDY for both halves.
define double @f5(i64 %src) {
; CHECK-LABEL: f5:
; CHECK: ldy %f0, 524272(%r2)
; CHECK: ldy %f2, 524280(%r2)
; CHECK: br %r14
%add = add i64 %src, 524272
%ptr = inttoptr i64 %add to ptr
%val = load fp128, ptr %ptr
%trunc = fptrunc fp128 %val to double
ret double %trunc
}
; Check the next doubleword up, which requires separate address logic.
; Other sequences besides this one would be OK.
define double @f6(i64 %src) {
; CHECK-LABEL: f6:
; CHECK: lay %r1, 524280(%r2)
; CHECK: ld %f0, 0(%r1)
; CHECK: ld %f2, 8(%r1)
; CHECK: br %r14
%add = add i64 %src, 524280
%ptr = inttoptr i64 %add to ptr
%val = load fp128, ptr %ptr
%trunc = fptrunc fp128 %val to double
ret double %trunc
}
; Check the highest aligned negative offset, which needs a combination of
; LDY and LD.
define double @f7(i64 %src) {
; CHECK-LABEL: f7:
; CHECK: ldy %f0, -8(%r2)
; CHECK: ld %f2, 0(%r2)
; CHECK: br %r14
%add = add i64 %src, -8
%ptr = inttoptr i64 %add to ptr
%val = load fp128, ptr %ptr
%trunc = fptrunc fp128 %val to double
ret double %trunc
}
; Check the next doubleword down, which requires LDY for both halves.
define double @f8(i64 %src) {
; CHECK-LABEL: f8:
; CHECK: ldy %f0, -16(%r2)
; CHECK: ldy %f2, -8(%r2)
; CHECK: br %r14
%add = add i64 %src, -16
%ptr = inttoptr i64 %add to ptr
%val = load fp128, ptr %ptr
%trunc = fptrunc fp128 %val to double
ret double %trunc
}
; Check the lowest offset that allows LDY for both halves.
define double @f9(i64 %src) {
; CHECK-LABEL: f9:
; CHECK: ldy %f0, -524288(%r2)
; CHECK: ldy %f2, -524280(%r2)
; CHECK: br %r14
%add = add i64 %src, -524288
%ptr = inttoptr i64 %add to ptr
%val = load fp128, ptr %ptr
%trunc = fptrunc fp128 %val to double
ret double %trunc
}
; Check the next doubleword down, which requires separate address logic.
; Other sequences besides this one would be OK.
define double @f10(i64 %src) {
; CHECK-LABEL: f10:
; CHECK: agfi %r2, -524296
; CHECK: ld %f0, 0(%r2)
; CHECK: ld %f2, 8(%r2)
; CHECK: br %r14
%add = add i64 %src, -524296
%ptr = inttoptr i64 %add to ptr
%val = load fp128, ptr %ptr
%trunc = fptrunc fp128 %val to double
ret double %trunc
}
; Check that indices are allowed.
define double @f11(i64 %src, i64 %index) {
; CHECK-LABEL: f11:
; CHECK: ld %f0, 4088({{%r2,%r3|%r3,%r2}})
; CHECK: ldy %f2, 4096({{%r2,%r3|%r3,%r2}})
; CHECK: br %r14
%add1 = add i64 %src, %index
%add2 = add i64 %add1, 4088
%ptr = inttoptr i64 %add2 to ptr
%val = load fp128, ptr %ptr
%trunc = fptrunc fp128 %val to double
ret double %trunc
}
|