1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2; RUN: llc -mtriple=thumbv6m-eabi -asm-verbose=false %s -o - | FileCheck %s --check-prefix=V6M 3 4define i32 @uxth(i32 %x) { 5; V6M-LABEL: uxth: 6; V6M: uxth r0, r0 7; V6M-NEXT: bx lr 8 %xn = and i32 %x, 65535 9 ret i32 %xn 10} 11 12define i32 @uxtb(i32 %x) { 13; V6M-LABEL: uxtb: 14; V6M: uxtb r0, r0 15; V6M-NEXT: bx lr 16 %xn = and i32 %x, 255 17 ret i32 %xn 18} 19 20define i32 @uxth_2(i32 %x, i32 %y) { 21; V6M-LABEL: uxth_2: 22; V6M: uxth r1, r1 23; V6M-NEXT: uxth r0, r0 24; V6M-NEXT: muls r0, r1, r0 25; V6M-NEXT: bx lr 26 %xn = and i32 %x, 65535 27 %yn = and i32 %y, 65535 28 %r = mul nuw i32 %xn, %yn 29 ret i32 %r 30} 31 32define i32 @uxtb_2(i32 %x, i32 %y) { 33; V6M-LABEL: uxtb_2: 34; V6M: uxtb r1, r1 35; V6M-NEXT: uxtb r0, r0 36; V6M-NEXT: muls r0, r1, r0 37; V6M-NEXT: bx lr 38 %xn = and i32 %x, 255 39 %yn = and i32 %y, 255 40 %r = mul nuw nsw i32 %xn, %yn 41 ret i32 %r 42} 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, #1 50; V6M-NEXT: bne .LBB4_1 51; V6M-NEXT: bx lr 52entry: 53 br label %for.body 54 55for.body: 56 %i = phi i32 [ 0, %entry ], [ %inc, %for.body ] 57 %arrayidx = getelementptr inbounds i32, ptr %a, i32 %i 58 %x = load i32, ptr %arrayidx 59 %xn = and i32 %x, 65535 60 store i32 %xn, ptr %arrayidx 61 %inc = add nuw nsw i32 %i, 1 62 %exitcond = icmp eq i32 %inc, %n 63 br i1 %exitcond, label %for.cond.cleanup, label %for.body 64 65for.cond.cleanup: 66 ret void 67} 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, #0 74; V6M-NEXT: .LBB5_1: 75; V6M-NEXT: uxth r3, r2 76; V6M-NEXT: ldrh r4, [r0] 77; V6M-NEXT: muls r4, r3, r4 78; V6M-NEXT: stm r0!, {r4} 79; V6M-NEXT: adds r2, r2, #1 80; V6M-NEXT: cmp r1, r2 81; V6M-NEXT: bne .LBB5_1 82; V6M-NEXT: pop {r4, pc} 83entry: 84 br label %for.body 85 86for.body: 87 %i = phi i32 [ 0, %entry ], [ %inc, %for.body ] 88 %arrayidx = getelementptr inbounds i32, ptr %a, i32 %i 89 %x = load i32, ptr %arrayidx 90 %xn = and i32 %x, 65535 91 %in = and i32 %i, 65535 92 %s = mul i32 %xn, %in 93 store i32 %s, ptr %arrayidx 94 %inc = add nuw nsw i32 %i, 1 95 %exitcond = icmp eq i32 %inc, %n 96 br i1 %exitcond, label %for.cond.cleanup, label %for.body 97 98for.cond.cleanup: 99 ret void 100} 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, #1 108; V6M-NEXT: bne .LBB6_1 109; V6M-NEXT: bx lr 110entry: 111 br label %for.body 112 113for.body: 114 %i = phi i32 [ 0, %entry ], [ %inc, %for.body ] 115 %arrayidx = getelementptr inbounds i32, ptr %a, i32 %i 116 %x = load i32, ptr %arrayidx 117 %xn = and i32 %x, 255 118 store i32 %xn, ptr %arrayidx 119 %inc = add nuw nsw i32 %i, 1 120 %exitcond = icmp eq i32 %inc, %n 121 br i1 %exitcond, label %for.cond.cleanup, label %for.body 122 123for.cond.cleanup: 124 ret void 125} 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, #0 132; V6M-NEXT: .LBB7_1: 133; V6M-NEXT: uxtb r3, r2 134; V6M-NEXT: ldrb r4, [r0] 135; V6M-NEXT: muls r4, r3, r4 136; V6M-NEXT: stm r0!, {r4} 137; V6M-NEXT: adds r2, r2, #1 138; V6M-NEXT: cmp r1, r2 139; V6M-NEXT: bne .LBB7_1 140; V6M-NEXT: pop {r4, pc} 141entry: 142 br label %for.body 143 144for.body: 145 %i = phi i32 [ 0, %entry ], [ %inc, %for.body ] 146 %arrayidx = getelementptr inbounds i32, ptr %a, i32 %i 147 %x = load i32, ptr %arrayidx 148 %xn = and i32 %x, 255 149 %in = and i32 %i, 255 150 %s = mul i32 %xn, %in 151 store i32 %s, ptr %arrayidx 152 %inc = add nuw nsw i32 %i, 1 153 %exitcond = icmp eq i32 %inc, %n 154 br i1 %exitcond, label %for.cond.cleanup, label %for.body 155 156for.cond.cleanup: 157 ret void 158} 159 160