160 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc -mtriple=thumbv6m-eabi -asm-verbose=false %s -o - | FileCheck %s --check-prefix=V6M3 4define i32 @uxth(i32 %x) {5; V6M-LABEL: uxth:6; V6M: uxth r0, r07; V6M-NEXT: bx lr8 %xn = and i32 %x, 655359 ret i32 %xn10}11 12define i32 @uxtb(i32 %x) {13; V6M-LABEL: uxtb:14; V6M: uxtb r0, r015; V6M-NEXT: bx lr16 %xn = and i32 %x, 25517 ret i32 %xn18}19 20define i32 @uxth_2(i32 %x, i32 %y) {21; V6M-LABEL: uxth_2:22; V6M: uxth r1, r123; V6M-NEXT: uxth r0, r024; V6M-NEXT: muls r0, r1, r025; V6M-NEXT: bx lr26 %xn = and i32 %x, 6553527 %yn = and i32 %y, 6553528 %r = mul nuw i32 %xn, %yn29 ret i32 %r30}31 32define i32 @uxtb_2(i32 %x, i32 %y) {33; V6M-LABEL: uxtb_2:34; V6M: uxtb r1, r135; V6M-NEXT: uxtb r0, r036; V6M-NEXT: muls r0, r1, r037; V6M-NEXT: bx lr38 %xn = and i32 %x, 25539 %yn = and i32 %y, 25540 %r = mul nuw nsw i32 %xn, %yn41 ret i32 %r42}43 44define void @uxth_loop(ptr %a, i32 %n) {45; V6M-LABEL: uxth_loop:46; V6M: .LBB4_1:47; V6M-NEXT: ldrh r2, [r0]48; V6M-NEXT: stm r0!, {r2}49; V6M-NEXT: subs r1, r1, #150; V6M-NEXT: bne .LBB4_151; V6M-NEXT: bx lr52entry:53 br label %for.body54 55for.body:56 %i = phi i32 [ 0, %entry ], [ %inc, %for.body ]57 %arrayidx = getelementptr inbounds i32, ptr %a, i32 %i58 %x = load i32, ptr %arrayidx59 %xn = and i32 %x, 6553560 store i32 %xn, ptr %arrayidx61 %inc = add nuw nsw i32 %i, 162 %exitcond = icmp eq i32 %inc, %n63 br i1 %exitcond, label %for.cond.cleanup, label %for.body64 65for.cond.cleanup:66 ret void67}68 69define void @uxth_loop_2(ptr %a, i32 %n) {70; V6M-LABEL: uxth_loop_2:71; V6M: .save {r4, lr}72; V6M-NEXT: push {r4, lr}73; V6M-NEXT: movs r2, #074; V6M-NEXT: .LBB5_1:75; V6M-NEXT: uxth r3, r276; V6M-NEXT: ldrh r4, [r0]77; V6M-NEXT: muls r4, r3, r478; V6M-NEXT: stm r0!, {r4}79; V6M-NEXT: adds r2, r2, #180; V6M-NEXT: cmp r1, r281; V6M-NEXT: bne .LBB5_182; V6M-NEXT: pop {r4, pc}83entry:84 br label %for.body85 86for.body:87 %i = phi i32 [ 0, %entry ], [ %inc, %for.body ]88 %arrayidx = getelementptr inbounds i32, ptr %a, i32 %i89 %x = load i32, ptr %arrayidx90 %xn = and i32 %x, 6553591 %in = and i32 %i, 6553592 %s = mul i32 %xn, %in93 store i32 %s, ptr %arrayidx94 %inc = add nuw nsw i32 %i, 195 %exitcond = icmp eq i32 %inc, %n96 br i1 %exitcond, label %for.cond.cleanup, label %for.body97 98for.cond.cleanup:99 ret void100}101 102define void @uxtb_loop(ptr %a, i32 %n) {103; V6M-LABEL: uxtb_loop:104; V6M: .LBB6_1:105; V6M-NEXT: ldrb r2, [r0]106; V6M-NEXT: stm r0!, {r2}107; V6M-NEXT: subs r1, r1, #1108; V6M-NEXT: bne .LBB6_1109; V6M-NEXT: bx lr110entry:111 br label %for.body112 113for.body:114 %i = phi i32 [ 0, %entry ], [ %inc, %for.body ]115 %arrayidx = getelementptr inbounds i32, ptr %a, i32 %i116 %x = load i32, ptr %arrayidx117 %xn = and i32 %x, 255118 store i32 %xn, ptr %arrayidx119 %inc = add nuw nsw i32 %i, 1120 %exitcond = icmp eq i32 %inc, %n121 br i1 %exitcond, label %for.cond.cleanup, label %for.body122 123for.cond.cleanup:124 ret void125}126 127define void @uxtb_loop_2(ptr %a, i32 %n) {128; V6M-LABEL: uxtb_loop_2:129; V6M: .save {r4, lr}130; V6M-NEXT: push {r4, lr}131; V6M-NEXT: movs r2, #0132; V6M-NEXT: .LBB7_1:133; V6M-NEXT: uxtb r3, r2134; V6M-NEXT: ldrb r4, [r0]135; V6M-NEXT: muls r4, r3, r4136; V6M-NEXT: stm r0!, {r4}137; V6M-NEXT: adds r2, r2, #1138; V6M-NEXT: cmp r1, r2139; V6M-NEXT: bne .LBB7_1140; V6M-NEXT: pop {r4, pc}141entry:142 br label %for.body143 144for.body:145 %i = phi i32 [ 0, %entry ], [ %inc, %for.body ]146 %arrayidx = getelementptr inbounds i32, ptr %a, i32 %i147 %x = load i32, ptr %arrayidx148 %xn = and i32 %x, 255149 %in = and i32 %i, 255150 %s = mul i32 %xn, %in151 store i32 %s, ptr %arrayidx152 %inc = add nuw nsw i32 %i, 1153 %exitcond = icmp eq i32 %inc, %n154 br i1 %exitcond, label %for.cond.cleanup, label %for.body155 156for.cond.cleanup:157 ret void158}159 160