1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133
|
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
; RUN: llc < %s -mtriple=aarch64-unknown-unknown | FileCheck %s --check-prefixes=CHECK,CHECK-SD
; RUN: llc < %s -mtriple=aarch64-unknown-unknown -global-isel | FileCheck %s --check-prefixes=CHECK,CHECK-GI
define i64 @sub1_disguised_constant(i64 %x) {
; CHECK-SD-LABEL: sub1_disguised_constant:
; CHECK-SD: // %bb.0:
; CHECK-SD-NEXT: sub w8, w0, #1
; CHECK-SD-NEXT: and w8, w0, w8
; CHECK-SD-NEXT: and x0, x8, #0xffff
; CHECK-SD-NEXT: ret
;
; CHECK-GI-LABEL: sub1_disguised_constant:
; CHECK-GI: // %bb.0:
; CHECK-GI-NEXT: mov w8, #65535 // =0xffff
; CHECK-GI-NEXT: and x9, x0, #0xffff
; CHECK-GI-NEXT: add x8, x0, x8
; CHECK-GI-NEXT: and x0, x9, x8
; CHECK-GI-NEXT: ret
%a1 = and i64 %x, 65535
%a2 = add i64 %x, 65535
%r = and i64 %a1, %a2
ret i64 %r
}
define i8 @masked_sub_i8(i8 %x) {
; CHECK-SD-LABEL: masked_sub_i8:
; CHECK-SD: // %bb.0:
; CHECK-SD-NEXT: mov w8, #5 // =0x5
; CHECK-SD-NEXT: and w8, w0, w8
; CHECK-SD-NEXT: eor w0, w8, #0x7
; CHECK-SD-NEXT: ret
;
; CHECK-GI-LABEL: masked_sub_i8:
; CHECK-GI: // %bb.0:
; CHECK-GI-NEXT: mov w8, #5 // =0x5
; CHECK-GI-NEXT: mov w9, #7 // =0x7
; CHECK-GI-NEXT: and w8, w0, w8
; CHECK-GI-NEXT: sub w0, w9, w8
; CHECK-GI-NEXT: ret
%a = and i8 %x, 5
%m = sub i8 7, %a
ret i8 %m
}
; Borrow from the MSB is ok.
define i8 @masked_sub_high_bit_mask_i8(i8 %x) {
; CHECK-SD-LABEL: masked_sub_high_bit_mask_i8:
; CHECK-SD: // %bb.0:
; CHECK-SD-NEXT: mov w8, #-96 // =0xffffffa0
; CHECK-SD-NEXT: and w8, w0, w8
; CHECK-SD-NEXT: eor w0, w8, #0x3c
; CHECK-SD-NEXT: ret
;
; CHECK-GI-LABEL: masked_sub_high_bit_mask_i8:
; CHECK-GI: // %bb.0:
; CHECK-GI-NEXT: mov w8, #-96 // =0xffffffa0
; CHECK-GI-NEXT: mov w9, #60 // =0x3c
; CHECK-GI-NEXT: and w8, w0, w8
; CHECK-GI-NEXT: sub w0, w9, w8
; CHECK-GI-NEXT: ret
%maskx = and i8 %x, 160 ; 0b10100000
%s = sub i8 60, %maskx ; 0b00111100
ret i8 %s
}
define i8 @not_masked_sub_i8(i8 %x) {
; CHECK-LABEL: not_masked_sub_i8:
; CHECK: // %bb.0:
; CHECK-NEXT: mov w8, #7 // =0x7
; CHECK-NEXT: and w9, w0, #0x8
; CHECK-NEXT: sub w0, w8, w9
; CHECK-NEXT: ret
%a = and i8 %x, 8
%m = sub i8 7, %a
ret i8 %m
}
define i32 @masked_sub_i32(i32 %x) {
; CHECK-SD-LABEL: masked_sub_i32:
; CHECK-SD: // %bb.0:
; CHECK-SD-NEXT: mov w8, #9 // =0x9
; CHECK-SD-NEXT: and w8, w0, w8
; CHECK-SD-NEXT: eor w0, w8, #0x1f
; CHECK-SD-NEXT: ret
;
; CHECK-GI-LABEL: masked_sub_i32:
; CHECK-GI: // %bb.0:
; CHECK-GI-NEXT: mov w8, #9 // =0x9
; CHECK-GI-NEXT: mov w9, #31 // =0x1f
; CHECK-GI-NEXT: and w8, w0, w8
; CHECK-GI-NEXT: sub w0, w9, w8
; CHECK-GI-NEXT: ret
%a = and i32 %x, 9
%m = sub i32 31, %a
ret i32 %m
}
define <4 x i32> @masked_sub_v4i32(<4 x i32> %x) {
; CHECK-SD-LABEL: masked_sub_v4i32:
; CHECK-SD: // %bb.0:
; CHECK-SD-NEXT: movi v1.4s, #42
; CHECK-SD-NEXT: movi v2.4s, #1, msl #8
; CHECK-SD-NEXT: and v0.16b, v0.16b, v1.16b
; CHECK-SD-NEXT: eor v0.16b, v0.16b, v2.16b
; CHECK-SD-NEXT: ret
;
; CHECK-GI-LABEL: masked_sub_v4i32:
; CHECK-GI: // %bb.0:
; CHECK-GI-NEXT: movi v1.4s, #42
; CHECK-GI-NEXT: movi v2.4s, #1, msl #8
; CHECK-GI-NEXT: and v0.16b, v0.16b, v1.16b
; CHECK-GI-NEXT: sub v0.4s, v2.4s, v0.4s
; CHECK-GI-NEXT: ret
%a = and <4 x i32> %x, <i32 42, i32 42, i32 42, i32 42>
%m = sub <4 x i32> <i32 511, i32 511, i32 511, i32 511>, %a
ret <4 x i32> %m
}
define i32 @pr137254(i32 %0) {
; CHECK-LABEL: pr137254:
; CHECK: // %bb.0:
; CHECK-NEXT: mov w8, #-2147483648 // =0x80000000
; CHECK-NEXT: add w8, w0, w8
; CHECK-NEXT: cmp w8, #0
; CHECK-NEXT: cset w0, gt
; CHECK-NEXT: ret
%2 = sub nsw i32 %0, -2147483648
%3 = icmp sgt i32 %2, 0
%4 = select i1 %3, i32 1, i32 0
ret i32 %4
}
|