xref: /llvm-project/llvm/test/CodeGen/Thumb/uxth.ll (revision e6bf3fa05b3706197143414a56be05ce014ebe01)
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