1 ; Test 128-bit addition in which the second operand is constant. 2 ; 3 ; RUN: llc < %s -mtriple=s390x-linux-gnu -mcpu=z10 | FileCheck %s 4 5 ; Check additions of 1. The XOR ensures that we don't instead load the 6 ; constant into a register and use memory addition. 7 define void @f1(i128 *%aptr) { 8 ; CHECK-LABEL: f1: 9 ; CHECK: algfi {{%r[0-5]}}, 1 10 ; CHECK: alcg 11 ; CHECK: br %r14 12 %a = load i128 , i128 *%aptr 13 %xor = xor i128 %a, 128 14 %add = add i128 %xor, 1 15 store i128 %add, i128 *%aptr 16 ret void 17 } 18 19 ; Check the high end of the ALGFI range. 20 define void @f2(i128 *%aptr) { 21 ; CHECK-LABEL: f2: 22 ; CHECK: algfi {{%r[0-5]}}, 4294967295 23 ; CHECK: alcg 24 ; CHECK: br %r14 25 %a = load i128 , i128 *%aptr 26 %xor = xor i128 %a, 128 27 %add = add i128 %xor, 4294967295 28 store i128 %add, i128 *%aptr 29 ret void 30 } 31 32 ; Check the next value up, which must use register addition. 33 define void @f3(i128 *%aptr) { 34 ; CHECK-LABEL: f3: 35 ; CHECK: algr 36 ; CHECK: alcg 37 ; CHECK: br %r14 38 %a = load i128 , i128 *%aptr 39 %xor = xor i128 %a, 128 40 %add = add i128 %xor, 4294967296 41 store i128 %add, i128 *%aptr 42 ret void 43 } 44 45 ; Check addition of -1, which must also use register addition. 46 define void @f4(i128 *%aptr) { 47 ; CHECK-LABEL: f4: 48 ; CHECK: algr 49 ; CHECK: alcg 50 ; CHECK: br %r14 51 %a = load i128 , i128 *%aptr 52 %xor = xor i128 %a, 128 53 %add = add i128 %xor, -1 54 store i128 %add, i128 *%aptr 55 ret void 56 } 57