94 lines · plain
1; Test 128-bit addition when the distinct-operands facility is available.2;3; RUN: llc < %s -mtriple=s390x-linux-gnu -mcpu=z196 | FileCheck %s4 5; Test the case where both operands are in registers.6define i64 @f1(i64 %a, i64 %b, i64 %c, i64 %d, ptr %ptr) {7; CHECK-LABEL: f1:8; CHECK: algrk %r2, %r4, %r59; CHECK: alcgr10; CHECK: br %r1411 %x1 = insertelement <2 x i64> undef, i64 %b, i32 012 %x2 = insertelement <2 x i64> %x1, i64 %c, i32 113 %x = bitcast <2 x i64> %x2 to i12814 %y2 = insertelement <2 x i64> %x1, i64 %d, i32 115 %y = bitcast <2 x i64> %y2 to i12816 %add = add i128 %x, %y17 %addv = bitcast i128 %add to <2 x i64>18 %high = extractelement <2 x i64> %addv, i32 019 store i64 %high, ptr %ptr20 %low = extractelement <2 x i64> %addv, i32 121 ret i64 %low22}23 24; Test addition of 1.25define void @f2(i64 %a, i64 %b, ptr %ptr) {26; CHECK-LABEL: f2:27; CHECK: alghsik {{%r[0-5]}}, %r3, 128; CHECK: alcgr29; CHECK: br %r1430 %x1 = insertelement <2 x i64> undef, i64 %a, i32 031 %x2 = insertelement <2 x i64> %x1, i64 %b, i32 132 %x = bitcast <2 x i64> %x2 to i12833 %add = add i128 %x, 134 store i128 %add, ptr %ptr35 ret void36}37 38; Test the upper end of the ALGHSIK range.39define void @f3(i64 %a, i64 %b, ptr %ptr) {40; CHECK-LABEL: f3:41; CHECK: alghsik {{%r[0-5]}}, %r3, 3276742; CHECK: alcgr43; CHECK: br %r1444 %x1 = insertelement <2 x i64> undef, i64 %a, i32 045 %x2 = insertelement <2 x i64> %x1, i64 %b, i32 146 %x = bitcast <2 x i64> %x2 to i12847 %add = add i128 %x, 3276748 store i128 %add, ptr %ptr49 ret void50}51 52; Test the next value up, which should use ALGFI instead.53define void @f4(i64 %a, i64 %b, ptr %ptr) {54; CHECK-LABEL: f4:55; CHECK: algfi %r3, 3276856; CHECK: alcgr57; CHECK: br %r1458 %x1 = insertelement <2 x i64> undef, i64 %a, i32 059 %x2 = insertelement <2 x i64> %x1, i64 %b, i32 160 %x = bitcast <2 x i64> %x2 to i12861 %add = add i128 %x, 3276862 store i128 %add, ptr %ptr63 ret void64}65 66; Test the lower end of the ALGHSIK range.67define void @f5(i64 %a, i64 %b, ptr %ptr) {68; CHECK-LABEL: f5:69; CHECK: alghsik {{%r[0-5]}}, %r3, -3276870; CHECK: alcgr71; CHECK: br %r1472 %x1 = insertelement <2 x i64> undef, i64 %a, i32 073 %x2 = insertelement <2 x i64> %x1, i64 %b, i32 174 %x = bitcast <2 x i64> %x2 to i12875 %add = add i128 %x, -3276876 store i128 %add, ptr %ptr77 ret void78}79 80; Test the next value down, which cannot use either ALGHSIK or ALGFI.81define void @f6(i64 %a, i64 %b, ptr %ptr) {82; CHECK-LABEL: f6:83; CHECK-NOT: alghsik84; CHECK-NOT: algfi85; CHECK: alcgr86; CHECK: br %r1487 %x1 = insertelement <2 x i64> undef, i64 %a, i32 088 %x2 = insertelement <2 x i64> %x1, i64 %b, i32 189 %x = bitcast <2 x i64> %x2 to i12890 %add = add i128 %x, -3276991 store i128 %add, ptr %ptr92 ret void93}94