1*4c4c5511SPhilip Reames; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2*4c4c5511SPhilip Reames; RUN: llc < %s -O2 -mtriple=riscv64 | FileCheck %s 3*4c4c5511SPhilip Reames 4*4c4c5511SPhilip Reamesdefine i32 @native_i64(i64 %a) { 5*4c4c5511SPhilip Reames; CHECK-LABEL: native_i64: 6*4c4c5511SPhilip Reames; CHECK: # %bb.0: # %entry 7*4c4c5511SPhilip Reames; CHECK-NEXT: li a1, -1 8*4c4c5511SPhilip Reames; CHECK-NEXT: beq a0, a1, .LBB0_3 9*4c4c5511SPhilip Reames; CHECK-NEXT: # %bb.1: # %entry 10*4c4c5511SPhilip Reames; CHECK-NEXT: li a1, 1 11*4c4c5511SPhilip Reames; CHECK-NEXT: bne a0, a1, .LBB0_4 12*4c4c5511SPhilip Reames; CHECK-NEXT: # %bb.2: # %sw.bb0 13*4c4c5511SPhilip Reames; CHECK-NEXT: li a0, 0 14*4c4c5511SPhilip Reames; CHECK-NEXT: ret 15*4c4c5511SPhilip Reames; CHECK-NEXT: .LBB0_3: # %sw.bb1 16*4c4c5511SPhilip Reames; CHECK-NEXT: li a0, 1 17*4c4c5511SPhilip Reames; CHECK-NEXT: ret 18*4c4c5511SPhilip Reames; CHECK-NEXT: .LBB0_4: # %sw.default 19*4c4c5511SPhilip Reames; CHECK-NEXT: li a0, -1 20*4c4c5511SPhilip Reames; CHECK-NEXT: ret 21*4c4c5511SPhilip Reamesentry: 22*4c4c5511SPhilip Reames switch i64 %a, label %sw.default [ 23*4c4c5511SPhilip Reames i64 1, label %sw.bb0 24*4c4c5511SPhilip Reames i64 -1, label %sw.bb1 25*4c4c5511SPhilip Reames ] 26*4c4c5511SPhilip Reames 27*4c4c5511SPhilip Reamessw.bb0: 28*4c4c5511SPhilip Reames br label %return 29*4c4c5511SPhilip Reames 30*4c4c5511SPhilip Reamessw.bb1: 31*4c4c5511SPhilip Reames br label %return 32*4c4c5511SPhilip Reames 33*4c4c5511SPhilip Reamessw.default: 34*4c4c5511SPhilip Reames br label %return 35*4c4c5511SPhilip Reames 36*4c4c5511SPhilip Reamesreturn: 37*4c4c5511SPhilip Reames %retval = phi i32 [ -1, %sw.default ], [ 0, %sw.bb0 ], [ 1, %sw.bb1 ] 38*4c4c5511SPhilip Reames ret i32 %retval 39*4c4c5511SPhilip Reames} 40*4c4c5511SPhilip Reames 41*4c4c5511SPhilip Reamesdefine i32 @native_i32(i32 %a) { 42*4c4c5511SPhilip Reames; CHECK-LABEL: native_i32: 43*4c4c5511SPhilip Reames; CHECK: # %bb.0: # %entry 44*4c4c5511SPhilip Reames; CHECK-NEXT: sext.w a0, a0 45*4c4c5511SPhilip Reames; CHECK-NEXT: li a1, -1 46*4c4c5511SPhilip Reames; CHECK-NEXT: beq a0, a1, .LBB1_3 47*4c4c5511SPhilip Reames; CHECK-NEXT: # %bb.1: # %entry 48*4c4c5511SPhilip Reames; CHECK-NEXT: li a1, 1 49*4c4c5511SPhilip Reames; CHECK-NEXT: bne a0, a1, .LBB1_4 50*4c4c5511SPhilip Reames; CHECK-NEXT: # %bb.2: # %sw.bb0 51*4c4c5511SPhilip Reames; CHECK-NEXT: li a0, 0 52*4c4c5511SPhilip Reames; CHECK-NEXT: ret 53*4c4c5511SPhilip Reames; CHECK-NEXT: .LBB1_3: # %sw.bb1 54*4c4c5511SPhilip Reames; CHECK-NEXT: li a0, 1 55*4c4c5511SPhilip Reames; CHECK-NEXT: ret 56*4c4c5511SPhilip Reames; CHECK-NEXT: .LBB1_4: # %sw.default 57*4c4c5511SPhilip Reames; CHECK-NEXT: li a0, -1 58*4c4c5511SPhilip Reames; CHECK-NEXT: ret 59*4c4c5511SPhilip Reamesentry: 60*4c4c5511SPhilip Reames switch i32 %a, label %sw.default [ 61*4c4c5511SPhilip Reames i32 1, label %sw.bb0 62*4c4c5511SPhilip Reames i32 -1, label %sw.bb1 63*4c4c5511SPhilip Reames ] 64*4c4c5511SPhilip Reames 65*4c4c5511SPhilip Reamessw.bb0: 66*4c4c5511SPhilip Reames br label %return 67*4c4c5511SPhilip Reames 68*4c4c5511SPhilip Reamessw.bb1: 69*4c4c5511SPhilip Reames br label %return 70*4c4c5511SPhilip Reames 71*4c4c5511SPhilip Reamessw.default: 72*4c4c5511SPhilip Reames br label %return 73*4c4c5511SPhilip Reames 74*4c4c5511SPhilip Reamesreturn: 75*4c4c5511SPhilip Reames %retval = phi i32 [ -1, %sw.default ], [ 0, %sw.bb0 ], [ 1, %sw.bb1 ] 76*4c4c5511SPhilip Reames ret i32 %retval 77*4c4c5511SPhilip Reames} 78*4c4c5511SPhilip Reames 79*4c4c5511SPhilip Reamesdefine i32 @trunc_i32(i64 %a) { 80*4c4c5511SPhilip Reames; CHECK-LABEL: trunc_i32: 81*4c4c5511SPhilip Reames; CHECK: # %bb.0: # %entry 82*4c4c5511SPhilip Reames; CHECK-NEXT: sext.w a0, a0 83*4c4c5511SPhilip Reames; CHECK-NEXT: li a1, -1 84*4c4c5511SPhilip Reames; CHECK-NEXT: beq a0, a1, .LBB2_3 85*4c4c5511SPhilip Reames; CHECK-NEXT: # %bb.1: # %entry 86*4c4c5511SPhilip Reames; CHECK-NEXT: li a1, 1 87*4c4c5511SPhilip Reames; CHECK-NEXT: bne a0, a1, .LBB2_4 88*4c4c5511SPhilip Reames; CHECK-NEXT: # %bb.2: # %sw.bb0 89*4c4c5511SPhilip Reames; CHECK-NEXT: li a0, 0 90*4c4c5511SPhilip Reames; CHECK-NEXT: ret 91*4c4c5511SPhilip Reames; CHECK-NEXT: .LBB2_3: # %sw.bb1 92*4c4c5511SPhilip Reames; CHECK-NEXT: li a0, 1 93*4c4c5511SPhilip Reames; CHECK-NEXT: ret 94*4c4c5511SPhilip Reames; CHECK-NEXT: .LBB2_4: # %sw.default 95*4c4c5511SPhilip Reames; CHECK-NEXT: li a0, -1 96*4c4c5511SPhilip Reames; CHECK-NEXT: ret 97*4c4c5511SPhilip Reamesentry: 98*4c4c5511SPhilip Reames %trunc = trunc i64 %a to i32 99*4c4c5511SPhilip Reames switch i32 %trunc, label %sw.default [ 100*4c4c5511SPhilip Reames i32 1, label %sw.bb0 101*4c4c5511SPhilip Reames i32 -1, label %sw.bb1 102*4c4c5511SPhilip Reames ] 103*4c4c5511SPhilip Reames 104*4c4c5511SPhilip Reamessw.bb0: 105*4c4c5511SPhilip Reames br label %return 106*4c4c5511SPhilip Reames 107*4c4c5511SPhilip Reamessw.bb1: 108*4c4c5511SPhilip Reames br label %return 109*4c4c5511SPhilip Reames 110*4c4c5511SPhilip Reamessw.default: 111*4c4c5511SPhilip Reames br label %return 112*4c4c5511SPhilip Reames 113*4c4c5511SPhilip Reamesreturn: 114*4c4c5511SPhilip Reames %retval = phi i32 [ -1, %sw.default ], [ 0, %sw.bb0 ], [ 1, %sw.bb1 ] 115*4c4c5511SPhilip Reames ret i32 %retval 116*4c4c5511SPhilip Reames} 117*4c4c5511SPhilip Reames 118*4c4c5511SPhilip Reamesdefine i32 @trunc_i17(i64 %a) { 119*4c4c5511SPhilip Reames; CHECK-LABEL: trunc_i17: 120*4c4c5511SPhilip Reames; CHECK: # %bb.0: # %entry 121*4c4c5511SPhilip Reames; CHECK-NEXT: lui a1, 32 122*4c4c5511SPhilip Reames; CHECK-NEXT: addiw a1, a1, -1 123*4c4c5511SPhilip Reames; CHECK-NEXT: and a0, a0, a1 124*4c4c5511SPhilip Reames; CHECK-NEXT: beq a0, a1, .LBB3_3 125*4c4c5511SPhilip Reames; CHECK-NEXT: # %bb.1: # %entry 126*4c4c5511SPhilip Reames; CHECK-NEXT: li a1, 1 127*4c4c5511SPhilip Reames; CHECK-NEXT: bne a0, a1, .LBB3_4 128*4c4c5511SPhilip Reames; CHECK-NEXT: # %bb.2: # %sw.bb0 129*4c4c5511SPhilip Reames; CHECK-NEXT: li a0, 0 130*4c4c5511SPhilip Reames; CHECK-NEXT: ret 131*4c4c5511SPhilip Reames; CHECK-NEXT: .LBB3_3: # %sw.bb1 132*4c4c5511SPhilip Reames; CHECK-NEXT: li a0, 1 133*4c4c5511SPhilip Reames; CHECK-NEXT: ret 134*4c4c5511SPhilip Reames; CHECK-NEXT: .LBB3_4: # %sw.default 135*4c4c5511SPhilip Reames; CHECK-NEXT: li a0, -1 136*4c4c5511SPhilip Reames; CHECK-NEXT: ret 137*4c4c5511SPhilip Reamesentry: 138*4c4c5511SPhilip Reames %trunc = trunc i64 %a to i17 139*4c4c5511SPhilip Reames switch i17 %trunc, label %sw.default [ 140*4c4c5511SPhilip Reames i17 1, label %sw.bb0 141*4c4c5511SPhilip Reames i17 -1, label %sw.bb1 142*4c4c5511SPhilip Reames ] 143*4c4c5511SPhilip Reames 144*4c4c5511SPhilip Reamessw.bb0: 145*4c4c5511SPhilip Reames br label %return 146*4c4c5511SPhilip Reames 147*4c4c5511SPhilip Reamessw.bb1: 148*4c4c5511SPhilip Reames br label %return 149*4c4c5511SPhilip Reames 150*4c4c5511SPhilip Reamessw.default: 151*4c4c5511SPhilip Reames br label %return 152*4c4c5511SPhilip Reames 153*4c4c5511SPhilip Reamesreturn: 154*4c4c5511SPhilip Reames %retval = phi i32 [ -1, %sw.default ], [ 0, %sw.bb0 ], [ 1, %sw.bb1 ] 155*4c4c5511SPhilip Reames ret i32 %retval 156*4c4c5511SPhilip Reames} 157*4c4c5511SPhilip Reames 158*4c4c5511SPhilip Reamesdefine i32 @trunc_i16(i64 %a) { 159*4c4c5511SPhilip Reames; CHECK-LABEL: trunc_i16: 160*4c4c5511SPhilip Reames; CHECK: # %bb.0: # %entry 161*4c4c5511SPhilip Reames; CHECK-NEXT: lui a1, 16 162*4c4c5511SPhilip Reames; CHECK-NEXT: addiw a1, a1, -1 163*4c4c5511SPhilip Reames; CHECK-NEXT: and a0, a0, a1 164*4c4c5511SPhilip Reames; CHECK-NEXT: beq a0, a1, .LBB4_3 165*4c4c5511SPhilip Reames; CHECK-NEXT: # %bb.1: # %entry 166*4c4c5511SPhilip Reames; CHECK-NEXT: li a1, 1 167*4c4c5511SPhilip Reames; CHECK-NEXT: bne a0, a1, .LBB4_4 168*4c4c5511SPhilip Reames; CHECK-NEXT: # %bb.2: # %sw.bb0 169*4c4c5511SPhilip Reames; CHECK-NEXT: li a0, 0 170*4c4c5511SPhilip Reames; CHECK-NEXT: ret 171*4c4c5511SPhilip Reames; CHECK-NEXT: .LBB4_3: # %sw.bb1 172*4c4c5511SPhilip Reames; CHECK-NEXT: li a0, 1 173*4c4c5511SPhilip Reames; CHECK-NEXT: ret 174*4c4c5511SPhilip Reames; CHECK-NEXT: .LBB4_4: # %sw.default 175*4c4c5511SPhilip Reames; CHECK-NEXT: li a0, -1 176*4c4c5511SPhilip Reames; CHECK-NEXT: ret 177*4c4c5511SPhilip Reamesentry: 178*4c4c5511SPhilip Reames %trunc = trunc i64 %a to i16 179*4c4c5511SPhilip Reames switch i16 %trunc, label %sw.default [ 180*4c4c5511SPhilip Reames i16 1, label %sw.bb0 181*4c4c5511SPhilip Reames i16 -1, label %sw.bb1 182*4c4c5511SPhilip Reames ] 183*4c4c5511SPhilip Reames 184*4c4c5511SPhilip Reamessw.bb0: 185*4c4c5511SPhilip Reames br label %return 186*4c4c5511SPhilip Reames 187*4c4c5511SPhilip Reamessw.bb1: 188*4c4c5511SPhilip Reames br label %return 189*4c4c5511SPhilip Reames 190*4c4c5511SPhilip Reamessw.default: 191*4c4c5511SPhilip Reames br label %return 192*4c4c5511SPhilip Reames 193*4c4c5511SPhilip Reamesreturn: 194*4c4c5511SPhilip Reames %retval = phi i32 [ -1, %sw.default ], [ 0, %sw.bb0 ], [ 1, %sw.bb1 ] 195*4c4c5511SPhilip Reames ret i32 %retval 196*4c4c5511SPhilip Reames} 197*4c4c5511SPhilip Reames 198*4c4c5511SPhilip Reames 199*4c4c5511SPhilip Reamesdefine i32 @trunc_i12(i64 %a) { 200*4c4c5511SPhilip Reames; CHECK-LABEL: trunc_i12: 201*4c4c5511SPhilip Reames; CHECK: # %bb.0: # %entry 202*4c4c5511SPhilip Reames; CHECK-NEXT: lui a1, 1 203*4c4c5511SPhilip Reames; CHECK-NEXT: addiw a1, a1, -1 204*4c4c5511SPhilip Reames; CHECK-NEXT: and a0, a0, a1 205*4c4c5511SPhilip Reames; CHECK-NEXT: beq a0, a1, .LBB5_3 206*4c4c5511SPhilip Reames; CHECK-NEXT: # %bb.1: # %entry 207*4c4c5511SPhilip Reames; CHECK-NEXT: li a1, 1 208*4c4c5511SPhilip Reames; CHECK-NEXT: bne a0, a1, .LBB5_4 209*4c4c5511SPhilip Reames; CHECK-NEXT: # %bb.2: # %sw.bb0 210*4c4c5511SPhilip Reames; CHECK-NEXT: li a0, 0 211*4c4c5511SPhilip Reames; CHECK-NEXT: ret 212*4c4c5511SPhilip Reames; CHECK-NEXT: .LBB5_3: # %sw.bb1 213*4c4c5511SPhilip Reames; CHECK-NEXT: li a0, 1 214*4c4c5511SPhilip Reames; CHECK-NEXT: ret 215*4c4c5511SPhilip Reames; CHECK-NEXT: .LBB5_4: # %sw.default 216*4c4c5511SPhilip Reames; CHECK-NEXT: li a0, -1 217*4c4c5511SPhilip Reames; CHECK-NEXT: ret 218*4c4c5511SPhilip Reamesentry: 219*4c4c5511SPhilip Reames %trunc = trunc i64 %a to i12 220*4c4c5511SPhilip Reames switch i12 %trunc, label %sw.default [ 221*4c4c5511SPhilip Reames i12 1, label %sw.bb0 222*4c4c5511SPhilip Reames i12 -1, label %sw.bb1 223*4c4c5511SPhilip Reames ] 224*4c4c5511SPhilip Reames 225*4c4c5511SPhilip Reamessw.bb0: 226*4c4c5511SPhilip Reames br label %return 227*4c4c5511SPhilip Reames 228*4c4c5511SPhilip Reamessw.bb1: 229*4c4c5511SPhilip Reames br label %return 230*4c4c5511SPhilip Reames 231*4c4c5511SPhilip Reamessw.default: 232*4c4c5511SPhilip Reames br label %return 233*4c4c5511SPhilip Reames 234*4c4c5511SPhilip Reamesreturn: 235*4c4c5511SPhilip Reames %retval = phi i32 [ -1, %sw.default ], [ 0, %sw.bb0 ], [ 1, %sw.bb1 ] 236*4c4c5511SPhilip Reames ret i32 %retval 237*4c4c5511SPhilip Reames} 238*4c4c5511SPhilip Reames 239*4c4c5511SPhilip Reamesdefine i32 @trunc_i11(i64 %a) { 240*4c4c5511SPhilip Reames; CHECK-LABEL: trunc_i11: 241*4c4c5511SPhilip Reames; CHECK: # %bb.0: # %entry 242*4c4c5511SPhilip Reames; CHECK-NEXT: andi a0, a0, 2047 243*4c4c5511SPhilip Reames; CHECK-NEXT: li a1, 2047 244*4c4c5511SPhilip Reames; CHECK-NEXT: beq a0, a1, .LBB6_3 245*4c4c5511SPhilip Reames; CHECK-NEXT: # %bb.1: # %entry 246*4c4c5511SPhilip Reames; CHECK-NEXT: li a1, 1 247*4c4c5511SPhilip Reames; CHECK-NEXT: bne a0, a1, .LBB6_4 248*4c4c5511SPhilip Reames; CHECK-NEXT: # %bb.2: # %sw.bb0 249*4c4c5511SPhilip Reames; CHECK-NEXT: li a0, 0 250*4c4c5511SPhilip Reames; CHECK-NEXT: ret 251*4c4c5511SPhilip Reames; CHECK-NEXT: .LBB6_3: # %sw.bb1 252*4c4c5511SPhilip Reames; CHECK-NEXT: li a0, 1 253*4c4c5511SPhilip Reames; CHECK-NEXT: ret 254*4c4c5511SPhilip Reames; CHECK-NEXT: .LBB6_4: # %sw.default 255*4c4c5511SPhilip Reames; CHECK-NEXT: li a0, -1 256*4c4c5511SPhilip Reames; CHECK-NEXT: ret 257*4c4c5511SPhilip Reamesentry: 258*4c4c5511SPhilip Reames %trunc = trunc i64 %a to i11 259*4c4c5511SPhilip Reames switch i11 %trunc, label %sw.default [ 260*4c4c5511SPhilip Reames i11 1, label %sw.bb0 261*4c4c5511SPhilip Reames i11 -1, label %sw.bb1 262*4c4c5511SPhilip Reames ] 263*4c4c5511SPhilip Reames 264*4c4c5511SPhilip Reamessw.bb0: 265*4c4c5511SPhilip Reames br label %return 266*4c4c5511SPhilip Reames 267*4c4c5511SPhilip Reamessw.bb1: 268*4c4c5511SPhilip Reames br label %return 269*4c4c5511SPhilip Reames 270*4c4c5511SPhilip Reamessw.default: 271*4c4c5511SPhilip Reames br label %return 272*4c4c5511SPhilip Reames 273*4c4c5511SPhilip Reamesreturn: 274*4c4c5511SPhilip Reames %retval = phi i32 [ -1, %sw.default ], [ 0, %sw.bb0 ], [ 1, %sw.bb1 ] 275*4c4c5511SPhilip Reames ret i32 %retval 276*4c4c5511SPhilip Reames} 277*4c4c5511SPhilip Reames 278*4c4c5511SPhilip Reames 279*4c4c5511SPhilip Reamesdefine i32 @trunc_i10(i64 %a) { 280*4c4c5511SPhilip Reames; CHECK-LABEL: trunc_i10: 281*4c4c5511SPhilip Reames; CHECK: # %bb.0: # %entry 282*4c4c5511SPhilip Reames; CHECK-NEXT: andi a0, a0, 1023 283*4c4c5511SPhilip Reames; CHECK-NEXT: li a1, 1023 284*4c4c5511SPhilip Reames; CHECK-NEXT: beq a0, a1, .LBB7_3 285*4c4c5511SPhilip Reames; CHECK-NEXT: # %bb.1: # %entry 286*4c4c5511SPhilip Reames; CHECK-NEXT: li a1, 1 287*4c4c5511SPhilip Reames; CHECK-NEXT: bne a0, a1, .LBB7_4 288*4c4c5511SPhilip Reames; CHECK-NEXT: # %bb.2: # %sw.bb0 289*4c4c5511SPhilip Reames; CHECK-NEXT: li a0, 0 290*4c4c5511SPhilip Reames; CHECK-NEXT: ret 291*4c4c5511SPhilip Reames; CHECK-NEXT: .LBB7_3: # %sw.bb1 292*4c4c5511SPhilip Reames; CHECK-NEXT: li a0, 1 293*4c4c5511SPhilip Reames; CHECK-NEXT: ret 294*4c4c5511SPhilip Reames; CHECK-NEXT: .LBB7_4: # %sw.default 295*4c4c5511SPhilip Reames; CHECK-NEXT: li a0, -1 296*4c4c5511SPhilip Reames; CHECK-NEXT: ret 297*4c4c5511SPhilip Reamesentry: 298*4c4c5511SPhilip Reames %trunc = trunc i64 %a to i10 299*4c4c5511SPhilip Reames switch i10 %trunc, label %sw.default [ 300*4c4c5511SPhilip Reames i10 1, label %sw.bb0 301*4c4c5511SPhilip Reames i10 -1, label %sw.bb1 302*4c4c5511SPhilip Reames ] 303*4c4c5511SPhilip Reames 304*4c4c5511SPhilip Reamessw.bb0: 305*4c4c5511SPhilip Reames br label %return 306*4c4c5511SPhilip Reames 307*4c4c5511SPhilip Reamessw.bb1: 308*4c4c5511SPhilip Reames br label %return 309*4c4c5511SPhilip Reames 310*4c4c5511SPhilip Reamessw.default: 311*4c4c5511SPhilip Reames br label %return 312*4c4c5511SPhilip Reames 313*4c4c5511SPhilip Reamesreturn: 314*4c4c5511SPhilip Reames %retval = phi i32 [ -1, %sw.default ], [ 0, %sw.bb0 ], [ 1, %sw.bb1 ] 315*4c4c5511SPhilip Reames ret i32 %retval 316*4c4c5511SPhilip Reames} 317