1*9880d681SAndroid Build Coastguard Worker; RUN: llc -mtriple=thumb-eabi -mcpu=arm1156t2-s -mattr=+thumb2 %s -o - | FileCheck %s 2*9880d681SAndroid Build Coastguard Worker 3*9880d681SAndroid Build Coastguard Workerdefine i64 @f1(i64 %a, i64 %b) { 4*9880d681SAndroid Build Coastguard Worker; CHECK: f1 5*9880d681SAndroid Build Coastguard Worker; CHECK: subs r0, r0, r2 6*9880d681SAndroid Build Coastguard Worker %tmp = sub i64 %a, %b 7*9880d681SAndroid Build Coastguard Worker ret i64 %tmp 8*9880d681SAndroid Build Coastguard Worker} 9*9880d681SAndroid Build Coastguard Worker 10*9880d681SAndroid Build Coastguard Worker; 734439407618 = 0x000000ab00000002 11*9880d681SAndroid Build Coastguard Workerdefine i64 @f2(i64 %a) { 12*9880d681SAndroid Build Coastguard Worker; CHECK: f2 13*9880d681SAndroid Build Coastguard Worker; CHECK: subs r0, #2 14*9880d681SAndroid Build Coastguard Worker; CHECK: sbc r1, r1, #171 15*9880d681SAndroid Build Coastguard Worker %tmp = sub i64 %a, 734439407618 16*9880d681SAndroid Build Coastguard Worker ret i64 %tmp 17*9880d681SAndroid Build Coastguard Worker} 18*9880d681SAndroid Build Coastguard Worker 19*9880d681SAndroid Build Coastguard Worker; 5066626890203138 = 0x0012001200000002 20*9880d681SAndroid Build Coastguard Workerdefine i64 @f3(i64 %a) { 21*9880d681SAndroid Build Coastguard Worker; CHECK: f3 22*9880d681SAndroid Build Coastguard Worker; CHECK: subs r0, #2 23*9880d681SAndroid Build Coastguard Worker; CHECK: sbc r1, r1, #1179666 24*9880d681SAndroid Build Coastguard Worker %tmp = sub i64 %a, 5066626890203138 25*9880d681SAndroid Build Coastguard Worker ret i64 %tmp 26*9880d681SAndroid Build Coastguard Worker} 27*9880d681SAndroid Build Coastguard Worker 28*9880d681SAndroid Build Coastguard Worker; 3747052064576897026 = 0x3400340000000002 29*9880d681SAndroid Build Coastguard Workerdefine i64 @f4(i64 %a) { 30*9880d681SAndroid Build Coastguard Worker; CHECK: f4 31*9880d681SAndroid Build Coastguard Worker; CHECK: subs r0, #2 32*9880d681SAndroid Build Coastguard Worker; CHECK: sbc r1, r1, #872428544 33*9880d681SAndroid Build Coastguard Worker %tmp = sub i64 %a, 3747052064576897026 34*9880d681SAndroid Build Coastguard Worker ret i64 %tmp 35*9880d681SAndroid Build Coastguard Worker} 36*9880d681SAndroid Build Coastguard Worker 37*9880d681SAndroid Build Coastguard Worker; 6221254862626095106 = 0x5656565600000002 38*9880d681SAndroid Build Coastguard Workerdefine i64 @f5(i64 %a) { 39*9880d681SAndroid Build Coastguard Worker; CHECK: f5 40*9880d681SAndroid Build Coastguard Worker; CHECK: subs r0, #2 41*9880d681SAndroid Build Coastguard Worker; CHECK: adc r1, r1, #-1448498775 42*9880d681SAndroid Build Coastguard Worker %tmp = sub i64 %a, 6221254862626095106 43*9880d681SAndroid Build Coastguard Worker ret i64 %tmp 44*9880d681SAndroid Build Coastguard Worker} 45*9880d681SAndroid Build Coastguard Worker 46*9880d681SAndroid Build Coastguard Worker; 287104476244869122 = 0x03fc000000000002 47*9880d681SAndroid Build Coastguard Workerdefine i64 @f6(i64 %a) { 48*9880d681SAndroid Build Coastguard Worker; CHECK: f6 49*9880d681SAndroid Build Coastguard Worker; CHECK: subs r0, #2 50*9880d681SAndroid Build Coastguard Worker; CHECK: sbc r1, r1, #66846720 51*9880d681SAndroid Build Coastguard Worker %tmp = sub i64 %a, 287104476244869122 52*9880d681SAndroid Build Coastguard Worker ret i64 %tmp 53*9880d681SAndroid Build Coastguard Worker} 54*9880d681SAndroid Build Coastguard Worker 55*9880d681SAndroid Build Coastguard Worker; Example from numerics code that manually computes wider-than-64 values. 56*9880d681SAndroid Build Coastguard Worker; 57*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: livecarry: 58*9880d681SAndroid Build Coastguard Worker; CHECK: adds 59*9880d681SAndroid Build Coastguard Worker; CHECK: adc 60*9880d681SAndroid Build Coastguard Workerdefine i64 @livecarry(i64 %carry, i32 %digit) nounwind { 61*9880d681SAndroid Build Coastguard Worker %ch = lshr i64 %carry, 32 62*9880d681SAndroid Build Coastguard Worker %cl = and i64 %carry, 4294967295 63*9880d681SAndroid Build Coastguard Worker %truncdigit = zext i32 %digit to i64 64*9880d681SAndroid Build Coastguard Worker %prod = add i64 %cl, %truncdigit 65*9880d681SAndroid Build Coastguard Worker %ph = lshr i64 %prod, 32 66*9880d681SAndroid Build Coastguard Worker %carryresult = add i64 %ch, %ph 67*9880d681SAndroid Build Coastguard Worker ret i64 %carryresult 68*9880d681SAndroid Build Coastguard Worker} 69