|
| 1 | +; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 6 |
1 | 2 | ; RUN: llc -mtriple=armv6t2-eabi %s -o - | FileCheck %s |
2 | 3 |
|
3 | 4 | define i64 @f1(i64 %a, i64 %b) { |
4 | 5 | ; CHECK-LABEL: f1: |
5 | | -; CHECK: subs r |
6 | | -; CHECK: sbc r |
| 6 | +; CHECK: @ %bb.0: @ %entry |
| 7 | +; CHECK-NEXT: subs r0, r0, r2 |
| 8 | +; CHECK-NEXT: sbc r1, r1, r3 |
| 9 | +; CHECK-NEXT: bx lr |
7 | 10 | entry: |
8 | | - %tmp = sub i64 %a, %b |
9 | | - ret i64 %tmp |
| 11 | + %tmp = sub i64 %a, %b |
| 12 | + ret i64 %tmp |
10 | 13 | } |
11 | 14 |
|
12 | 15 | define i64 @f2(i64 %a, i64 %b) { |
13 | 16 | ; CHECK-LABEL: f2: |
14 | | -; CHECK: lsl r |
15 | | -; CHECK: orr r |
16 | | -; CHECK: rsbs r |
17 | | -; CHECK: sbc r |
| 17 | +; CHECK: @ %bb.0: @ %entry |
| 18 | +; CHECK-NEXT: lsl r1, r1, #1 |
| 19 | +; CHECK-NEXT: orr r1, r1, r0, lsr #31 |
| 20 | +; CHECK-NEXT: rsbs r0, r2, r0, lsl #1 |
| 21 | +; CHECK-NEXT: sbc r1, r1, r3 |
| 22 | +; CHECK-NEXT: bx lr |
18 | 23 | entry: |
19 | | - %tmp1 = shl i64 %a, 1 |
20 | | - %tmp2 = sub i64 %tmp1, %b |
21 | | - ret i64 %tmp2 |
| 24 | + %tmp1 = shl i64 %a, 1 |
| 25 | + %tmp2 = sub i64 %tmp1, %b |
| 26 | + ret i64 %tmp2 |
22 | 27 | } |
23 | 28 |
|
24 | 29 | ; add with live carry |
25 | 30 | define i64 @f3(i32 %al, i32 %bl) { |
26 | 31 | ; CHECK-LABEL: f3: |
27 | | -; CHECK: adds r |
28 | | -; CHECK: adc r |
| 32 | +; CHECK: @ %bb.0: @ %entry |
| 33 | +; CHECK-NEXT: adds r0, r0, r1 |
| 34 | +; CHECK-NEXT: mov r2, #0 |
| 35 | +; CHECK-NEXT: adcs r0, r1, #0 |
| 36 | +; CHECK-NEXT: adc r1, r2, #0 |
| 37 | +; CHECK-NEXT: bx lr |
29 | 38 | entry: |
30 | | - ; unsigned wide add |
31 | | - %aw = zext i32 %al to i64 |
32 | | - %bw = zext i32 %bl to i64 |
33 | | - %cw = add i64 %aw, %bw |
34 | | - ; ch == carry bit |
35 | | - %ch = lshr i64 %cw, 32 |
36 | | - %dw = add i64 %ch, %bw |
37 | | - ret i64 %dw |
| 39 | + ; unsigned wide add |
| 40 | + %aw = zext i32 %al to i64 |
| 41 | + %bw = zext i32 %bl to i64 |
| 42 | + %cw = add i64 %aw, %bw |
| 43 | + ; ch == carry bit |
| 44 | + %ch = lshr i64 %cw, 32 |
| 45 | + %dw = add i64 %ch, %bw |
| 46 | + ret i64 %dw |
38 | 47 | } |
39 | 48 |
|
40 | 49 | ; rdar://10073745 |
41 | 50 | define i64 @f4(i64 %x) nounwind readnone { |
42 | | -entry: |
43 | 51 | ; CHECK-LABEL: f4: |
44 | | -; CHECK: rsbs r |
45 | | -; CHECK: rsc r |
| 52 | +; CHECK: @ %bb.0: @ %entry |
| 53 | +; CHECK-NEXT: rsbs r0, r0, #0 |
| 54 | +; CHECK-NEXT: rsc r1, r1, #0 |
| 55 | +; CHECK-NEXT: bx lr |
| 56 | +entry: |
46 | 57 | %0 = sub nsw i64 0, %x |
47 | 58 | ret i64 %0 |
48 | 59 | } |
49 | 60 |
|
50 | 61 | ; rdar://12559385 |
51 | 62 | define i64 @f5(i32 %vi) { |
52 | | -entry: |
53 | 63 | ; CHECK-LABEL: f5: |
54 | | -; CHECK: movw [[REG:r[0-9]+]], #36102 |
55 | | -; CHECK: sbc r{{[0-9]+}}, r{{[0-9]+}}, [[REG]] |
56 | | - %v0 = zext i32 %vi to i64 |
57 | | - %v1 = xor i64 %v0, -155057456198619 |
58 | | - %v4 = add i64 %v1, 155057456198619 |
59 | | - %v5 = add i64 %v4, %v1 |
60 | | - ret i64 %v5 |
| 64 | +; CHECK: @ %bb.0: @ %entry |
| 65 | +; CHECK-NEXT: movw r1, #19493 |
| 66 | +; CHECK-NEXT: movw r2, #29433 |
| 67 | +; CHECK-NEXT: movt r1, #57191 |
| 68 | +; CHECK-NEXT: eor r0, r0, r1 |
| 69 | +; CHECK-NEXT: movw r3, #46043 |
| 70 | +; CHECK-NEXT: movt r2, #65535 |
| 71 | +; CHECK-NEXT: adds r0, r0, r0 |
| 72 | +; CHECK-NEXT: movw r1, #36102 |
| 73 | +; CHECK-NEXT: sbc r2, r2, r1 |
| 74 | +; CHECK-NEXT: movt r3, #8344 |
| 75 | +; CHECK-NEXT: adds r0, r0, r3 |
| 76 | +; CHECK-NEXT: adc r1, r2, r1 |
| 77 | +; CHECK-NEXT: bx lr |
| 78 | +entry: |
| 79 | + %v0 = zext i32 %vi to i64 |
| 80 | + %v1 = xor i64 %v0, -155057456198619 |
| 81 | + %v4 = add i64 %v1, 155057456198619 |
| 82 | + %v5 = add i64 %v4, %v1 |
| 83 | + ret i64 %v5 |
61 | 84 | } |
0 commit comments