1; RUN: llc -verify-machineinstrs -mtriple=powerpc64-unknown-linux-gnu -O2 \ 2; RUN: -ppc-gpr-icmps=all -ppc-asm-full-reg-names -mcpu=pwr8 < %s | FileCheck %s \ 3; RUN: --implicit-check-not cmpw --implicit-check-not cmpd --implicit-check-not cmpl 4; RUN: llc -verify-machineinstrs -mtriple=powerpc64le-unknown-linux-gnu -O2 \ 5; RUN: -ppc-gpr-icmps=all -ppc-asm-full-reg-names -mcpu=pwr8 < %s | FileCheck %s \ 6; RUN: --implicit-check-not cmpw --implicit-check-not cmpd --implicit-check-not cmpl 7 8@glob = common local_unnamed_addr global i8 0, align 1 9 10; Function Attrs: norecurse nounwind readnone 11define signext i32 @test_ileuc(i8 zeroext %a, i8 zeroext %b) { 12entry: 13 %cmp = icmp ule i8 %a, %b 14 %conv2 = zext i1 %cmp to i32 15 ret i32 %conv2 16; CHECK-LABEL: test_ileuc: 17; CHECK: sub [[REG1:r[0-9]+]], r4, r3 18; CHECK-NEXT: rldicl [[REG2:r[0-9]+]], [[REG1]], 1, 63 19; CHECK-NEXT: xori r3, [[REG2]], 1 20; CHECK: blr 21} 22 23; Function Attrs: norecurse nounwind readnone 24define signext i32 @test_ileuc_sext(i8 zeroext %a, i8 zeroext %b) { 25entry: 26 %cmp = icmp ule i8 %a, %b 27 %sub = sext i1 %cmp to i32 28 ret i32 %sub 29; CHECK-LABEL: @test_ileuc_sext 30; CHECK: sub [[REG1:r[0-9]+]], r4, r3 31; CHECK-NEXT: rldicl [[REG2:r[0-9]+]], [[REG1]], 1, 63 32; CHECK-NEXT: addi [[REG3:r[0-9]+]], [[REG2]], -1 33; CHECK-NEXT: blr 34} 35 36; Function Attrs: norecurse nounwind readnone 37define signext i32 @test_ileuc_z(i8 zeroext %a) { 38entry: 39 %cmp = icmp eq i8 %a, 0 40 %conv1 = zext i1 %cmp to i32 41 ret i32 %conv1 42; CHECK-LABEL: test_ileuc_z: 43; CHECK: cntlzw [[REG1:r[0-9]+]], r3 44; CHECK: srwi r3, [[REG1]], 5 45; CHECK: blr 46} 47 48; Function Attrs: norecurse nounwind readnone 49define signext i32 @test_ileuc_sext_z(i8 zeroext %a) { 50entry: 51 %cmp = icmp ule i8 %a, 0 52 %sub = sext i1 %cmp to i32 53 ret i32 %sub 54; CHECK-LABEL: @test_ileuc_sext_z 55; CHECK: cntlzw [[REG1:r[0-9]+]], r3 56; CHECK-NEXT: srwi [[REG2:r[0-9]+]], [[REG1]], 5 57; CHECK-NEXT: neg r3, [[REG2]] 58; CHECK-NEXT: blr 59} 60 61; Function Attrs: norecurse nounwind 62define void @test_ileuc_store(i8 zeroext %a, i8 zeroext %b) { 63entry: 64 %cmp = icmp ule i8 %a, %b 65 %conv3 = zext i1 %cmp to i8 66 store i8 %conv3, i8* @glob 67 ret void 68; CHECK-LABEL: test_ileuc_store: 69; CHECK: sub [[REG1:r[0-9]+]], r4, r3 70; CHECK: rldicl [[REG2:r[0-9]+]], [[REG1]], 1, 63 71; CHECK: xori {{r[0-9]+}}, [[REG2]], 1 72; CHECK: blr 73} 74 75; Function Attrs: norecurse nounwind 76define void @test_ileuc_sext_store(i8 zeroext %a, i8 zeroext %b) { 77entry: 78 %cmp = icmp ule i8 %a, %b 79 %conv3 = sext i1 %cmp to i8 80 store i8 %conv3, i8* @glob 81 ret void 82; CHECK-LABEL: @test_ileuc_sext_store 83; CHECK: sub [[REG1:r[0-9]+]], r4, r3 84; CHECK: rldicl [[REG2:r[0-9]+]], [[REG1]], 1, 63 85; CHECK: addi [[REG3:r[0-9]+]], [[REG2]], -1 86; CHECK: stb [[REG3]] 87; CHECK: blr 88} 89 90; Function Attrs: norecurse nounwind 91define void @test_ileuc_z_store(i8 zeroext %a) { 92entry: 93 %cmp = icmp eq i8 %a, 0 94 %conv2 = zext i1 %cmp to i8 95 store i8 %conv2, i8* @glob 96 ret void 97; CHECK-LABEL: test_ileuc_z_store: 98; CHECK: cntlzw [[REG1:r[0-9]+]], r3 99; CHECK: srwi {{r[0-9]+}}, [[REG1]], 5 100; CHECK: blr 101} 102 103; Function Attrs: norecurse nounwind 104define void @test_ileuc_sext_z_store(i8 zeroext %a) { 105entry: 106 %cmp = icmp eq i8 %a, 0 107 %conv2 = sext i1 %cmp to i8 108 store i8 %conv2, i8* @glob 109 ret void 110; CHECK-LABEL: @test_ileuc_sext_z_store 111; CHECK: cntlzw [[REG1:r[0-9]+]], r3 112; CHECK: srwi [[REG2:r[0-9]+]], [[REG1]], 5 113; CHECK: neg [[REG3:r[0-9]+]], [[REG2]] 114; CHECK: stb [[REG3]] 115; CHECK: blr 116} 117 118