1*abbb894fSQingShan Zhang; RUN: llc -verify-machineinstrs -mtriple=powerpc64-unknown-unknown \ 2*abbb894fSQingShan Zhang; RUN: -ppc-asm-full-reg-names -mcpu=pwr9 < %s | FileCheck %s 3*abbb894fSQingShan Zhang; RUN: llc -verify-machineinstrs -mtriple=powerpc64le-unknown-unknown \ 4*abbb894fSQingShan Zhang; RUN: -ppc-asm-full-reg-names -mcpu=pwr9 < %s | FileCheck %s 5*abbb894fSQingShan Zhang 6*abbb894fSQingShan Zhangdefine i64 @addze1(i64 %X, i64 %Z) { 7*abbb894fSQingShan Zhang; CHECK-LABEL: addze1: 8*abbb894fSQingShan Zhang; CHECK: # %bb.0: 9*abbb894fSQingShan Zhang; CHECK-NEXT: addic [[REG1:r[0-9]+]], [[REG1]], -1 10*abbb894fSQingShan Zhang; CHECK-NEXT: addze [[REG2:r[0-9]+]], [[REG2]] 11*abbb894fSQingShan Zhang; CHECK-NEXT: blr 12*abbb894fSQingShan Zhang %cmp = icmp ne i64 %Z, 0 13*abbb894fSQingShan Zhang %conv1 = zext i1 %cmp to i64 14*abbb894fSQingShan Zhang %add = add nsw i64 %conv1, %X 15*abbb894fSQingShan Zhang ret i64 %add 16*abbb894fSQingShan Zhang} 17*abbb894fSQingShan Zhang 18*abbb894fSQingShan Zhangdefine i64 @addze2(i64 %X, i64 %Z) { 19*abbb894fSQingShan Zhang; CHECK-LABEL: addze2: 20*abbb894fSQingShan Zhang; CHECK: # %bb.0: 21*abbb894fSQingShan Zhang; CHECK-NEXT: subfic [[REG1:r[0-9]+]], [[REG1]], 0 22*abbb894fSQingShan Zhang; CHECK-NEXT: addze [[REG2:r[0-9]+]], [[REG2]] 23*abbb894fSQingShan Zhang; CHECK-NEXT: blr 24*abbb894fSQingShan Zhang %cmp = icmp eq i64 %Z, 0 25*abbb894fSQingShan Zhang %conv1 = zext i1 %cmp to i64 26*abbb894fSQingShan Zhang %add = add nsw i64 %conv1, %X 27*abbb894fSQingShan Zhang ret i64 %add 28*abbb894fSQingShan Zhang} 29*abbb894fSQingShan Zhang 30*abbb894fSQingShan Zhangdefine i64 @addze3(i64 %X, i64 %Z) { 31*abbb894fSQingShan Zhang; CHECK-LABEL: addze3: 32*abbb894fSQingShan Zhang; CHECK: # %bb.0: 33*abbb894fSQingShan Zhang; CHECK-NEXT: addi [[REG1:r[0-9]+]], [[REG1]], -32768 34*abbb894fSQingShan Zhang; CHECK-NEXT: addic [[REG1]], [[REG1]], -1 35*abbb894fSQingShan Zhang; CHECK-NEXT: addze [[REG2:r[0-9]+]], [[REG2]] 36*abbb894fSQingShan Zhang; CHECK-NEXT: blr 37*abbb894fSQingShan Zhang %cmp = icmp ne i64 %Z, 32768 38*abbb894fSQingShan Zhang %conv1 = zext i1 %cmp to i64 39*abbb894fSQingShan Zhang %add = add nsw i64 %conv1, %X 40*abbb894fSQingShan Zhang ret i64 %add 41*abbb894fSQingShan Zhang} 42*abbb894fSQingShan Zhang 43*abbb894fSQingShan Zhangdefine i64 @addze4(i64 %X, i64 %Z) { 44*abbb894fSQingShan Zhang; CHECK-LABEL: addze4: 45*abbb894fSQingShan Zhang; CHECK: # %bb.0: 46*abbb894fSQingShan Zhang; CHECK-NEXT: addi [[REG1:r[0-9]+]], [[REG1]], -32768 47*abbb894fSQingShan Zhang; CHECK-NEXT: subfic [[REG1]], [[REG1]], 0 48*abbb894fSQingShan Zhang; CHECK-NEXT: addze [[REG2:r[0-9]+]], [[REG2]] 49*abbb894fSQingShan Zhang; CHECK-NEXT: blr 50*abbb894fSQingShan Zhang %cmp = icmp eq i64 %Z, 32768 51*abbb894fSQingShan Zhang %conv1 = zext i1 %cmp to i64 52*abbb894fSQingShan Zhang %add = add nsw i64 %conv1, %X 53*abbb894fSQingShan Zhang ret i64 %add 54*abbb894fSQingShan Zhang} 55*abbb894fSQingShan Zhang 56*abbb894fSQingShan Zhangdefine i64 @addze5(i64 %X, i64 %Z) { 57*abbb894fSQingShan Zhang; CHECK-LABEL: addze5: 58*abbb894fSQingShan Zhang; CHECK: # %bb.0: 59*abbb894fSQingShan Zhang; CHECK-NEXT: addi [[REG1:r[0-9]+]], [[REG1]], 32767 60*abbb894fSQingShan Zhang; CHECK-NEXT: addic [[REG1]], [[REG1]], -1 61*abbb894fSQingShan Zhang; CHECK-NEXT: addze [[REG2:r[0-9]+]], [[REG2]] 62*abbb894fSQingShan Zhang; CHECK-NEXT: blr 63*abbb894fSQingShan Zhang %cmp = icmp ne i64 %Z, -32767 64*abbb894fSQingShan Zhang %conv1 = zext i1 %cmp to i64 65*abbb894fSQingShan Zhang %add = add nsw i64 %conv1, %X 66*abbb894fSQingShan Zhang ret i64 %add 67*abbb894fSQingShan Zhang} 68*abbb894fSQingShan Zhang 69*abbb894fSQingShan Zhangdefine i64 @addze6(i64 %X, i64 %Z) { 70*abbb894fSQingShan Zhang; CHECK-LABEL: addze6: 71*abbb894fSQingShan Zhang; CHECK: # %bb.0: 72*abbb894fSQingShan Zhang; CHECK-NEXT: addi [[REG1:r[0-9]+]], [[REG1]], 32767 73*abbb894fSQingShan Zhang; CHECK-NEXT: subfic [[REG1]], [[REG1]], 0 74*abbb894fSQingShan Zhang; CHECK-NEXT: addze [[REG2:r[0-9]+]], [[REG2]] 75*abbb894fSQingShan Zhang; CHECK-NEXT: blr 76*abbb894fSQingShan Zhang %cmp = icmp eq i64 %Z, -32767 77*abbb894fSQingShan Zhang %conv1 = zext i1 %cmp to i64 78*abbb894fSQingShan Zhang %add = add nsw i64 %conv1, %X 79*abbb894fSQingShan Zhang ret i64 %add 80*abbb894fSQingShan Zhang} 81*abbb894fSQingShan Zhang 82*abbb894fSQingShan Zhang; element is out of range 83*abbb894fSQingShan Zhangdefine i64 @test1(i64 %X, i64 %Z) { 84*abbb894fSQingShan Zhang; CHECK-LABEL: test1: 85*abbb894fSQingShan Zhang; CHECK: # %bb.0: 86*abbb894fSQingShan Zhang; CHECK-NEXT: li [[REG1:r[0-9]+]], -32768 87*abbb894fSQingShan Zhang; CHECK-NEXT: xor [[REG2:r[0-9]+]], [[REG2]], [[REG1]] 88*abbb894fSQingShan Zhang; CHECK-NEXT: addic [[REG1]], [[REG2]], -1 89*abbb894fSQingShan Zhang; CHECK-NEXT: subfe [[REG2]], [[REG1]], [[REG2]] 90*abbb894fSQingShan Zhang; CHECK-NEXT: add [[REG3:r[0-9]+]], [[REG2]], [[REG3]] 91*abbb894fSQingShan Zhang; CHECK-NEXT: blr 92*abbb894fSQingShan Zhang %cmp = icmp ne i64 %Z, -32768 93*abbb894fSQingShan Zhang %conv1 = zext i1 %cmp to i64 94*abbb894fSQingShan Zhang %add = add nsw i64 %conv1, %X 95*abbb894fSQingShan Zhang ret i64 %add 96*abbb894fSQingShan Zhang} 97*abbb894fSQingShan Zhang 98*abbb894fSQingShan Zhangdefine i64 @test2(i64 %X, i64 %Z) { 99*abbb894fSQingShan Zhang; CHECK-LABEL: test2: 100*abbb894fSQingShan Zhang; CHECK: # %bb.0: 101*abbb894fSQingShan Zhang; CHECK-NEXT: li [[REG1:r[0-9]+]], -32768 102*abbb894fSQingShan Zhang; CHECK-NEXT: xor [[REG2:r[0-9]+]], [[REG2]], [[REG1]] 103*abbb894fSQingShan Zhang; CHECK-NEXT: cntlzd [[REG2]], [[REG2]] 104*abbb894fSQingShan Zhang; CHECK-NEXT: rldicl [[REG2]], [[REG2]], 58, 63 105*abbb894fSQingShan Zhang; CHECK-NEXT: add [[REG3:r[0-9]+]], [[REG2]], [[REG3]] 106*abbb894fSQingShan Zhang; CHECK-NEXT: blr 107*abbb894fSQingShan Zhang %cmp = icmp eq i64 %Z, -32768 108*abbb894fSQingShan Zhang %conv1 = zext i1 %cmp to i64 109*abbb894fSQingShan Zhang %add = add nsw i64 %conv1, %X 110*abbb894fSQingShan Zhang ret i64 %add 111*abbb894fSQingShan Zhang} 112*abbb894fSQingShan Zhang 113*abbb894fSQingShan Zhangdefine i64 @test3(i64 %X, i64 %Z) { 114*abbb894fSQingShan Zhang; CHECK-LABEL: test3: 115*abbb894fSQingShan Zhang; CHECK: # %bb.0: 116*abbb894fSQingShan Zhang; CHECK-NEXT: li [[REG1:r[0-9]+]], 0 117*abbb894fSQingShan Zhang; CHECK-NEXT: ori [[REG1]], [[REG1]], 32769 118*abbb894fSQingShan Zhang; CHECK-NEXT: xor [[REG2:r[0-9]+]], [[REG2]], [[REG1]] 119*abbb894fSQingShan Zhang; CHECK-NEXT: addic [[REG1]], [[REG2]], -1 120*abbb894fSQingShan Zhang; CHECK-NEXT: subfe [[REG2]], [[REG1]], [[REG2]] 121*abbb894fSQingShan Zhang; CHECK-NEXT: add [[REG3:r[0-9]+]], [[REG2]], [[REG3]] 122*abbb894fSQingShan Zhang; CHECK-NEXT: blr 123*abbb894fSQingShan Zhang %cmp = icmp ne i64 %Z, 32769 124*abbb894fSQingShan Zhang %conv1 = zext i1 %cmp to i64 125*abbb894fSQingShan Zhang %add = add nsw i64 %conv1, %X 126*abbb894fSQingShan Zhang ret i64 %add 127*abbb894fSQingShan Zhang} 128*abbb894fSQingShan Zhang 129*abbb894fSQingShan Zhangdefine i64 @test4(i64 %X, i64 %Z) { 130*abbb894fSQingShan Zhang; CHECK-LABEL: test4: 131*abbb894fSQingShan Zhang; CHECK: # %bb.0: 132*abbb894fSQingShan Zhang; CHECK-NEXT: li [[REG1:r[0-9]+]], 0 133*abbb894fSQingShan Zhang; CHECK-NEXT: ori [[REG1]], [[REG1]], 32769 134*abbb894fSQingShan Zhang; CHECK-NEXT: xor [[REG2:r[0-9]+]], [[REG2]], [[REG1]] 135*abbb894fSQingShan Zhang; CHECK-NEXT: cntlzd [[REG2]], [[REG2]] 136*abbb894fSQingShan Zhang; CHECK-NEXT: rldicl [[REG2]], [[REG2]], 58, 63 137*abbb894fSQingShan Zhang; CHECK-NEXT: add [[REG3:r[0-9]+]], [[REG2]], [[REG3]] 138*abbb894fSQingShan Zhang; CHECK-NEXT: blr 139*abbb894fSQingShan Zhang %cmp = icmp eq i64 %Z, 32769 140*abbb894fSQingShan Zhang %conv1 = zext i1 %cmp to i64 141*abbb894fSQingShan Zhang %add = add nsw i64 %conv1, %X 142*abbb894fSQingShan Zhang ret i64 %add 143*abbb894fSQingShan Zhang} 144*abbb894fSQingShan Zhang 145*abbb894fSQingShan Zhang; comparison of two registers 146*abbb894fSQingShan Zhangdefine i64 @test5(i64 %X, i64 %Y, i64 %Z) { 147*abbb894fSQingShan Zhang; CHECK-LABEL: test5: 148*abbb894fSQingShan Zhang; CHECK: # %bb.0: 149*abbb894fSQingShan Zhang; CHECK-NEXT: xor [[REG2:r[0-9]+]], [[REG2]], [[REG1:r[0-9]+]] 150*abbb894fSQingShan Zhang; CHECK-NEXT: addic [[REG1]], [[REG2]], -1 151*abbb894fSQingShan Zhang; CHECK-NEXT: subfe [[REG2]], [[REG1]], [[REG2]] 152*abbb894fSQingShan Zhang; CHECK-NEXT: add [[REG3:r[0-9]+]], [[REG2]], [[REG3]] 153*abbb894fSQingShan Zhang; CHECK-NEXT: blr 154*abbb894fSQingShan Zhang %cmp = icmp ne i64 %Y, %Z 155*abbb894fSQingShan Zhang %conv1 = zext i1 %cmp to i64 156*abbb894fSQingShan Zhang %add = add nsw i64 %conv1, %X 157*abbb894fSQingShan Zhang ret i64 %add 158*abbb894fSQingShan Zhang} 159*abbb894fSQingShan Zhang 160*abbb894fSQingShan Zhangdefine i64 @test6(i64 %X, i64 %Y, i64 %Z) { 161*abbb894fSQingShan Zhang; CHECK-LABEL: test6: 162*abbb894fSQingShan Zhang; CHECK: # %bb.0: 163*abbb894fSQingShan Zhang; CHECK-NEXT: xor [[REG2:r[0-9]+]], [[REG2]], [[REG1:r[0-9]+]] 164*abbb894fSQingShan Zhang; CHECK-NEXT: cntlzd [[REG2]], [[REG2]] 165*abbb894fSQingShan Zhang; CHECK-NEXT: rldicl [[REG2]], [[REG2]], 58, 63 166*abbb894fSQingShan Zhang; CHECK-NEXT: add [[REG3:r[0-9]+]], [[REG2]], [[REG3]] 167*abbb894fSQingShan Zhang; CHECK-NEXT: blr 168*abbb894fSQingShan Zhang %cmp = icmp eq i64 %Y, %Z 169*abbb894fSQingShan Zhang %conv1 = zext i1 %cmp to i64 170*abbb894fSQingShan Zhang %add = add nsw i64 %conv1, %X 171*abbb894fSQingShan Zhang ret i64 %add 172*abbb894fSQingShan Zhang} 173