1 ; Test 128-bit addition when the distinct-operands facility is available. 2 ; 3 ; RUN: llc < %s -mtriple=s390x-linux-gnu -mcpu=z196 | FileCheck %s 4 5 ; Test the case where both operands are in registers. 6 define i64 @f1(i64 %a, i64 %b, i64 %c, i64 %d, i64 *%ptr) { 7 ; CHECK-LABEL: f1: 8 ; CHECK: algrk %r2, %r4, %r5 9 ; CHECK: alcgr 10 ; CHECK: br %r14 11 %x1 = insertelement <2 x i64> undef, i64 %b, i32 0 12 %x2 = insertelement <2 x i64> %x1, i64 %c, i32 1 13 %x = bitcast <2 x i64> %x2 to i128 14 %y2 = insertelement <2 x i64> %x1, i64 %d, i32 1 15 %y = bitcast <2 x i64> %y2 to i128 16 %add = add i128 %x, %y 17 %addv = bitcast i128 %add to <2 x i64> 18 %high = extractelement <2 x i64> %addv, i32 0 19 store i64 %high, i64 *%ptr 20 %low = extractelement <2 x i64> %addv, i32 1 21 ret i64 %low 22 } 23 24 ; Test addition of 1. 25 define void @f2(i64 %a, i64 %b, i128 *%ptr) { 26 ; CHECK-LABEL: f2: 27 ; CHECK: alghsik {{%r[0-5]}}, %r3, 1 28 ; CHECK: alcgr 29 ; CHECK: br %r14 30 %x1 = insertelement <2 x i64> undef, i64 %a, i32 0 31 %x2 = insertelement <2 x i64> %x1, i64 %b, i32 1 32 %x = bitcast <2 x i64> %x2 to i128 33 %add = add i128 %x, 1 34 store i128 %add, i128 *%ptr 35 ret void 36 } 37 38 ; Test the upper end of the ALGHSIK range. 39 define void @f3(i64 %a, i64 %b, i128 *%ptr) { 40 ; CHECK-LABEL: f3: 41 ; CHECK: alghsik {{%r[0-5]}}, %r3, 32767 42 ; CHECK: alcgr 43 ; CHECK: br %r14 44 %x1 = insertelement <2 x i64> undef, i64 %a, i32 0 45 %x2 = insertelement <2 x i64> %x1, i64 %b, i32 1 46 %x = bitcast <2 x i64> %x2 to i128 47 %add = add i128 %x, 32767 48 store i128 %add, i128 *%ptr 49 ret void 50 } 51 52 ; Test the next value up, which should use ALGFI instead. 53 define void @f4(i64 %a, i64 %b, i128 *%ptr) { 54 ; CHECK-LABEL: f4: 55 ; CHECK: algfi %r3, 32768 56 ; CHECK: alcgr 57 ; CHECK: br %r14 58 %x1 = insertelement <2 x i64> undef, i64 %a, i32 0 59 %x2 = insertelement <2 x i64> %x1, i64 %b, i32 1 60 %x = bitcast <2 x i64> %x2 to i128 61 %add = add i128 %x, 32768 62 store i128 %add, i128 *%ptr 63 ret void 64 } 65 66 ; Test the lower end of the ALGHSIK range. 67 define void @f5(i64 %a, i64 %b, i128 *%ptr) { 68 ; CHECK-LABEL: f5: 69 ; CHECK: alghsik {{%r[0-5]}}, %r3, -32768 70 ; CHECK: alcgr 71 ; CHECK: br %r14 72 %x1 = insertelement <2 x i64> undef, i64 %a, i32 0 73 %x2 = insertelement <2 x i64> %x1, i64 %b, i32 1 74 %x = bitcast <2 x i64> %x2 to i128 75 %add = add i128 %x, -32768 76 store i128 %add, i128 *%ptr 77 ret void 78 } 79 80 ; Test the next value down, which cannot use either ALGHSIK or ALGFI. 81 define void @f6(i64 %a, i64 %b, i128 *%ptr) { 82 ; CHECK-LABEL: f6: 83 ; CHECK-NOT: alghsik 84 ; CHECK-NOT: algfi 85 ; CHECK: alcgr 86 ; CHECK: br %r14 87 %x1 = insertelement <2 x i64> undef, i64 %a, i32 0 88 %x2 = insertelement <2 x i64> %x1, i64 %b, i32 1 89 %x = bitcast <2 x i64> %x2 to i128 90 %add = add i128 %x, -32769 91 store i128 %add, i128 *%ptr 92 ret void 93 } 94