1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=-bmi | FileCheck %s --check-prefix=ALL --check-prefix=NO_BMI
3; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+bmi | FileCheck %s --check-prefix=ALL --check-prefix=BMI
4
5; Clear high bits via shift, set them with xor (not), then mask them off.
6
7define i32 @shrink_xor_constant1(i32 %x) {
8; ALL-LABEL: shrink_xor_constant1:
9; ALL:       # BB#0:
10; ALL-NEXT:    shrl $31, %edi
11; ALL-NEXT:    xorl $1, %edi
12; ALL-NEXT:    movl %edi, %eax
13; ALL-NEXT:    retq
14;
15  %sh = lshr i32 %x, 31
16  %not = xor i32 %sh, -1
17  %and = and i32 %not, 1
18  ret i32 %and
19}
20
21; Clear low bits via shift, set them with xor (not), then mask them off.
22
23define i8 @shrink_xor_constant2(i8 %x) {
24; ALL-LABEL: shrink_xor_constant2:
25; ALL:       # BB#0:
26; ALL-NEXT:    shlb $5, %dil
27; ALL-NEXT:    xorb $-32, %dil
28; ALL-NEXT:    movl %edi, %eax
29; ALL-NEXT:    retq
30;
31  %sh = shl i8 %x, 5
32  %not = xor i8 %sh, -1
33  %and = and i8 %not, 224 ; 0xE0
34  ret i8 %and
35}
36
37