1*9880d681SAndroid Build Coastguard Worker; RUN: llc -mtriple armv7a-none-eabi -mattr=-neon < %s -verify-machineinstrs -o - | FileCheck %s 2*9880d681SAndroid Build Coastguard Worker 3*9880d681SAndroid Build Coastguard Worker; Thumb1 (thumbv6m) is tested in tests/Thumb 4*9880d681SAndroid Build Coastguard Worker 5*9880d681SAndroid Build Coastguard Worker@a = external global i32* 6*9880d681SAndroid Build Coastguard Worker@b = external global i32* 7*9880d681SAndroid Build Coastguard Worker 8*9880d681SAndroid Build Coastguard Worker; Function Attrs: nounwind 9*9880d681SAndroid Build Coastguard Workerdefine void @foo24() #0 { 10*9880d681SAndroid Build Coastguard Workerentry: 11*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: foo24: 12*9880d681SAndroid Build Coastguard Worker; We use '[rl0-9]*' to allow 'r0'..'r12', 'lr' 13*9880d681SAndroid Build Coastguard Worker; CHECK: movt [[LB:[rl0-9]+]], :upper16:b 14*9880d681SAndroid Build Coastguard Worker; CHECK: movt [[SB:[rl0-9]+]], :upper16:a 15*9880d681SAndroid Build Coastguard Worker; CHECK: add [[NLB:[rl0-9]+]], [[LB]], #4 16*9880d681SAndroid Build Coastguard Worker; CHECK: add [[NSB:[rl0-9]+]], [[SB]], #4 17*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ldm [[NLB]], {[[R1:[rl0-9]+]], [[R2:[rl0-9]+]], [[R3:[rl0-9]+]], [[R4:[rl0-9]+]], [[R5:[rl0-9]+]], [[R6:[rl0-9]+]]} 18*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: stm [[NSB]], {[[R1]], [[R2]], [[R3]], [[R4]], [[R5]], [[R6]]} 19*9880d681SAndroid Build Coastguard Worker %0 = load i32*, i32** @a, align 4 20*9880d681SAndroid Build Coastguard Worker %arrayidx = getelementptr inbounds i32, i32* %0, i32 1 21*9880d681SAndroid Build Coastguard Worker %1 = bitcast i32* %arrayidx to i8* 22*9880d681SAndroid Build Coastguard Worker %2 = load i32*, i32** @b, align 4 23*9880d681SAndroid Build Coastguard Worker %arrayidx1 = getelementptr inbounds i32, i32* %2, i32 1 24*9880d681SAndroid Build Coastguard Worker %3 = bitcast i32* %arrayidx1 to i8* 25*9880d681SAndroid Build Coastguard Worker tail call void @llvm.memcpy.p0i8.p0i8.i32(i8* %1, i8* %3, i32 24, i32 4, i1 false) 26*9880d681SAndroid Build Coastguard Worker ret void 27*9880d681SAndroid Build Coastguard Worker} 28*9880d681SAndroid Build Coastguard Worker 29*9880d681SAndroid Build Coastguard Workerdefine void @foo28() #0 { 30*9880d681SAndroid Build Coastguard Workerentry: 31*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: foo28: 32*9880d681SAndroid Build Coastguard Worker; CHECK: movt [[LB:[rl0-9]+]], :upper16:b 33*9880d681SAndroid Build Coastguard Worker; CHECK: movt [[SB:[rl0-9]+]], :upper16:a 34*9880d681SAndroid Build Coastguard Worker; CHECK: add [[NLB:[rl0-9]+]], [[LB]], #4 35*9880d681SAndroid Build Coastguard Worker; CHECK: add [[NSB:[rl0-9]+]], [[SB]], #4 36*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ldm [[NLB]]!, {[[R1:[rl0-9]+]], [[R2:[rl0-9]+]], [[R3:[rl0-9]+]]} 37*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: stm [[NSB]]!, {[[R1]], [[R2]], [[R3]]} 38*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ldm [[NLB]], {[[R1:[rl0-9]+]], [[R2:[rl0-9]+]], [[R3:[rl0-9]+]], [[R4:[rl0-9]+]]} 39*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: stm [[NSB]], {[[R1]], [[R2]], [[R3]], [[R4]]} 40*9880d681SAndroid Build Coastguard Worker %0 = load i32*, i32** @a, align 4 41*9880d681SAndroid Build Coastguard Worker %arrayidx = getelementptr inbounds i32, i32* %0, i32 1 42*9880d681SAndroid Build Coastguard Worker %1 = bitcast i32* %arrayidx to i8* 43*9880d681SAndroid Build Coastguard Worker %2 = load i32*, i32** @b, align 4 44*9880d681SAndroid Build Coastguard Worker %arrayidx1 = getelementptr inbounds i32, i32* %2, i32 1 45*9880d681SAndroid Build Coastguard Worker %3 = bitcast i32* %arrayidx1 to i8* 46*9880d681SAndroid Build Coastguard Worker tail call void @llvm.memcpy.p0i8.p0i8.i32(i8* %1, i8* %3, i32 28, i32 4, i1 false) 47*9880d681SAndroid Build Coastguard Worker ret void 48*9880d681SAndroid Build Coastguard Worker} 49*9880d681SAndroid Build Coastguard Worker 50*9880d681SAndroid Build Coastguard Workerdefine void @foo32() #0 { 51*9880d681SAndroid Build Coastguard Workerentry: 52*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: foo32: 53*9880d681SAndroid Build Coastguard Worker; CHECK: movt [[LB:[rl0-9]+]], :upper16:b 54*9880d681SAndroid Build Coastguard Worker; CHECK: movt [[SB:[rl0-9]+]], :upper16:a 55*9880d681SAndroid Build Coastguard Worker; CHECK: add [[NLB:[rl0-9]+]], [[LB]], #4 56*9880d681SAndroid Build Coastguard Worker; CHECK: add [[NSB:[rl0-9]+]], [[SB]], #4 57*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ldm [[NLB]]!, {[[R1:[rl0-9]+]], [[R2:[rl0-9]+]], [[R3:[rl0-9]+]], [[R4:[rl0-9]+]]} 58*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: stm [[NSB]]!, {[[R1]], [[R2]], [[R3]], [[R4]]} 59*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ldm [[NLB]], {[[R1:[rl0-9]+]], [[R2:[rl0-9]+]], [[R3:[rl0-9]+]], [[R4:[rl0-9]+]]} 60*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: stm [[NSB]], {[[R1]], [[R2]], [[R3]], [[R4]]} 61*9880d681SAndroid Build Coastguard Worker %0 = load i32*, i32** @a, align 4 62*9880d681SAndroid Build Coastguard Worker %arrayidx = getelementptr inbounds i32, i32* %0, i32 1 63*9880d681SAndroid Build Coastguard Worker %1 = bitcast i32* %arrayidx to i8* 64*9880d681SAndroid Build Coastguard Worker %2 = load i32*, i32** @b, align 4 65*9880d681SAndroid Build Coastguard Worker %arrayidx1 = getelementptr inbounds i32, i32* %2, i32 1 66*9880d681SAndroid Build Coastguard Worker %3 = bitcast i32* %arrayidx1 to i8* 67*9880d681SAndroid Build Coastguard Worker tail call void @llvm.memcpy.p0i8.p0i8.i32(i8* %1, i8* %3, i32 32, i32 4, i1 false) 68*9880d681SAndroid Build Coastguard Worker ret void 69*9880d681SAndroid Build Coastguard Worker} 70*9880d681SAndroid Build Coastguard Worker 71*9880d681SAndroid Build Coastguard Workerdefine void @foo36() #0 { 72*9880d681SAndroid Build Coastguard Workerentry: 73*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: foo36: 74*9880d681SAndroid Build Coastguard Worker; CHECK: movt [[LB:[rl0-9]+]], :upper16:b 75*9880d681SAndroid Build Coastguard Worker; CHECK: movt [[SB:[rl0-9]+]], :upper16:a 76*9880d681SAndroid Build Coastguard Worker; CHECK: add [[NLB:[rl0-9]+]], [[LB]], #4 77*9880d681SAndroid Build Coastguard Worker; CHECK: add [[NSB:[rl0-9]+]], [[SB]], #4 78*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ldm [[NLB]]!, {[[R1:[rl0-9]+]], [[R2:[rl0-9]+]], [[R3:[rl0-9]+]], [[R4:[rl0-9]+]]} 79*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: stm [[NSB]]!, {[[R1]], [[R2]], [[R3]], [[R4]]} 80*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ldm [[NLB]], {[[R1:[rl0-9]+]], [[R2:[rl0-9]+]], [[R3:[rl0-9]+]], [[R4:[rl0-9]+]], [[R5:[rl0-9]+]]} 81*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: stm [[NSB]], {[[R1]], [[R2]], [[R3]], [[R4]], [[R5]]} 82*9880d681SAndroid Build Coastguard Worker %0 = load i32*, i32** @a, align 4 83*9880d681SAndroid Build Coastguard Worker %arrayidx = getelementptr inbounds i32, i32* %0, i32 1 84*9880d681SAndroid Build Coastguard Worker %1 = bitcast i32* %arrayidx to i8* 85*9880d681SAndroid Build Coastguard Worker %2 = load i32*, i32** @b, align 4 86*9880d681SAndroid Build Coastguard Worker %arrayidx1 = getelementptr inbounds i32, i32* %2, i32 1 87*9880d681SAndroid Build Coastguard Worker %3 = bitcast i32* %arrayidx1 to i8* 88*9880d681SAndroid Build Coastguard Worker tail call void @llvm.memcpy.p0i8.p0i8.i32(i8* %1, i8* %3, i32 36, i32 4, i1 false) 89*9880d681SAndroid Build Coastguard Worker ret void 90*9880d681SAndroid Build Coastguard Worker} 91*9880d681SAndroid Build Coastguard Worker 92*9880d681SAndroid Build Coastguard Worker; Function Attrs: nounwind 93*9880d681SAndroid Build Coastguard Workerdeclare void @llvm.memcpy.p0i8.p0i8.i32(i8* nocapture, i8* nocapture readonly, i32, i32, i1) #1 94