1; RUN: llc < %s -mtriple=avr | FileCheck %s 2; RUN: llc < %s -mtriple=avr -mcpu=attiny10 | FileCheck --check-prefix=TINY %s 3 4declare void @f1(i8) 5declare void @f2(i8) 6define void @cmp8(i8 %a, i8 %b) { 7; CHECK-LABEL: cmp8: 8; CHECK: cp 9; CHECK-NOT: cpc 10 %cmp = icmp eq i8 %a, %b 11 br i1 %cmp, label %if.then, label %if.else 12if.then: 13 tail call void @f1(i8 %a) 14 br label %if.end 15if.else: 16 tail call void @f2(i8 %b) 17 br label %if.end 18if.end: 19 ret void 20} 21 22declare void @f3(i16) 23declare void @f4(i16) 24define void @cmp16(i16 %a, i16 %b) { 25; CHECK-LABEL: cmp16: 26; CHECK: cp 27; CHECK-NEXT: cpc 28 %cmp = icmp eq i16 %a, %b 29 br i1 %cmp, label %if.then, label %if.else 30if.then: 31 tail call void @f3(i16 %a) 32 br label %if.end 33if.else: 34 tail call void @f4(i16 %b) 35 br label %if.end 36if.end: 37 ret void 38} 39 40define void @cmpimm16(i16 %a) { 41; CHECK-LABEL: cmpimm16: 42; CHECK: cpi 43; CHECK-NEXT: cpc 44 %cmp = icmp eq i16 %a, 4567 45 br i1 %cmp, label %if.then, label %if.else 46if.then: 47 tail call void @f3(i16 %a) 48 br label %if.end 49if.else: 50 tail call void @f4(i16 %a) 51 br label %if.end 52if.end: 53 ret void 54} 55 56declare void @f5(i32) 57declare void @f6(i32) 58define void @cmp32(i32 %a, i32 %b) { 59; CHECK-LABEL: cmp32: 60; CHECK: cp 61; CHECK-NEXT: cpc 62; CHECK-NEXT: cpc 63; CHECK-NEXT: cpc 64 %cmp = icmp eq i32 %a, %b 65 br i1 %cmp, label %if.then, label %if.else 66if.then: 67 tail call void @f5(i32 %a) 68 br label %if.end 69if.else: 70 tail call void @f6(i32 %b) 71 br label %if.end 72if.end: 73 ret void 74} 75 76define void @cmpimm32(i32 %a) { 77; CHECK-LABEL: cmpimm32: 78; CHECK: cpi 79; CHECK-NEXT: cpc 80; CHECK-NEXT: cpc 81; CHECK-NEXT: cpc 82 %cmp = icmp eq i32 %a, 6789343 83 br i1 %cmp, label %if.then, label %if.else 84if.then: 85 tail call void @f5(i32 %a) 86 br label %if.end 87if.else: 88 tail call void @f6(i32 %a) 89 br label %if.end 90if.end: 91 ret void 92} 93 94declare void @f7(i64) 95declare void @f8(i64) 96define void @cmp64(i64 %a, i64 %b) { 97; CHECK-LABEL: cmp64: 98; CHECK: cp 99; CHECK-NEXT: cpc 100; CHECK-NEXT: cpc 101; CHECK-NEXT: cpc 102; CHECK-NEXT: cpc 103; CHECK-NEXT: cpc 104; CHECK-NEXT: cpc 105; CHECK-NEXT: cpc 106 %cmp = icmp eq i64 %a, %b 107 br i1 %cmp, label %if.then, label %if.else 108if.then: 109 tail call void @f7(i64 %a) 110 br label %if.end 111if.else: 112 tail call void @f8(i64 %b) 113 br label %if.end 114if.end: 115 ret void 116} 117 118define void @cmpimm64(i64 %a) { 119; CHECK-LABEL: cmpimm64: 120; CHECK: cpi 121; CHECK-NEXT: cpc 122; CHECK-NEXT: cpc 123; CHECK-NEXT: cpc 124; CHECK-NEXT: cpc 125; CHECK-NEXT: cpc 126; CHECK-NEXT: cpc 127; CHECK-NEXT: cpc 128 %cmp = icmp eq i64 %a, 234566452 129 br i1 %cmp, label %if.then, label %if.else 130if.then: 131 tail call void @f7(i64 %a) 132 br label %if.end 133if.else: 134 tail call void @f8(i64 %a) 135 br label %if.end 136if.end: 137 ret void 138} 139 140declare void @f9() 141declare void @f10() 142 143define void @tst8(i8 %a) { 144; CHECK-LABEL: tst8: 145; CHECK: tst r24 146; CHECK-NEXT: brmi 147 %cmp = icmp sgt i8 %a, -1 148 br i1 %cmp, label %if.then, label %if.else 149if.then: 150 tail call void @f9() 151 br label %if.end 152if.else: 153 tail call void @f10() 154 br label %if.end 155if.end: 156 ret void 157} 158 159define void @tst16(i16 %a) { 160; CHECK-LABEL: tst16: 161; CHECK: tst r25 162; CHECK-NEXT: brmi 163 %cmp = icmp sgt i16 %a, -1 164 br i1 %cmp, label %if.then, label %if.else 165if.then: 166 tail call void @f9() 167 br label %if.end 168if.else: 169 tail call void @f10() 170 br label %if.end 171if.end: 172 ret void 173} 174 175define void @tst32(i32 %a) { 176; CHECK-LABEL: tst32: 177; CHECK: tst r25 178; CHECK-NEXT: brmi 179 %cmp = icmp sgt i32 %a, -1 180 br i1 %cmp, label %if.then, label %if.else 181if.then: 182 tail call void @f9() 183 br label %if.end 184if.else: 185 tail call void @f10() 186 br label %if.end 187if.end: 188 ret void 189} 190 191define void @tst64(i64 %a) { 192; CHECK-LABEL: tst64: 193; CHECK: tst r25 194; CHECK-NEXT: brmi 195 %cmp = icmp sgt i64 %a, -1 196 br i1 %cmp, label %if.then, label %if.else 197if.then: 198 tail call void @f9() 199 br label %if.end 200if.else: 201 tail call void @f10() 202 br label %if.end 203if.end: 204 ret void 205} 206 207define i16 @cmp_i16_gt_0(i16 %0) { 208; CHECK-LABEL: cmp_i16_gt_0: 209; CHECK: ; %bb.0: 210; CHECK-NEXT: ldi r18, 1 211; CHECK-NEXT: cp r1, r24 212; CHECK-NEXT: cpc r1, r25 213; CHECK-NEXT: brlt .LBB11_2 214; CHECK-NEXT: ; %bb.1: 215; CHECK-NEXT: mov r18, r1 216; CHECK-NEXT: .LBB11_2: 217; CHECK-NEXT: mov r24, r18 218; CHECK-NEXT: clr r25 219; CHECK-NEXT: ret 220; 221; TINY-LABEL: cmp_i16_gt_0: 222; TINY: ; %bb.0: 223; TINY-NEXT: ldi r20, 1 224; TINY-NEXT: cp r17, r24 225; TINY-NEXT: cpc r17, r25 226; TINY-NEXT: brlt .LBB11_2 227; TINY-NEXT: ; %bb.1: 228; TINY-NEXT: mov r20, r17 229; TINY-NEXT: .LBB11_2: 230; TINY-NEXT: mov r24, r20 231; TINY-NEXT: clr r25 232; TINY-NEXT: ret 233 %2 = icmp sgt i16 %0, 0 234 %3 = zext i1 %2 to i16 235 ret i16 %3 236} 237 238define i16 @cmp_i16_gt_126(i16 %0) { 239; CHECK-LABEL: cmp_i16_gt_126: 240; CHECK: ; %bb.0: 241; CHECK-NEXT: ldi r18, 1 242; CHECK-NEXT: cpi r24, 127 243; CHECK-NEXT: cpc r25, r1 244; CHECK-NEXT: brge .LBB12_2 245; CHECK-NEXT: ; %bb.1: 246; CHECK-NEXT: mov r18, r1 247; CHECK-NEXT: .LBB12_2: 248; CHECK-NEXT: mov r24, r18 249; CHECK-NEXT: clr r25 250; CHECK-NEXT: ret 251; 252; TINY-LABEL: cmp_i16_gt_126: 253; TINY: ; %bb.0: 254; TINY-NEXT: ldi r20, 1 255; TINY-NEXT: cpi r24, 127 256; TINY-NEXT: cpc r25, r17 257; TINY-NEXT: brge .LBB12_2 258; TINY-NEXT: ; %bb.1: 259; TINY-NEXT: mov r20, r17 260; TINY-NEXT: .LBB12_2: 261; TINY-NEXT: mov r24, r20 262; TINY-NEXT: clr r25 263; TINY-NEXT: ret 264 %2 = icmp sgt i16 %0, 126 265 %3 = zext i1 %2 to i16 266 ret i16 %3 267} 268 269define i16 @cmp_i16_gt_1023(i16 %0) { 270; CHECK-LABEL: cmp_i16_gt_1023: 271; CHECK: ; %bb.0: 272; CHECK-NEXT: ldi r19, 4 273; CHECK-NEXT: ldi r18, 1 274; CHECK-NEXT: cp r24, r1 275; CHECK-NEXT: cpc r25, r19 276; CHECK-NEXT: brge .LBB13_2 277; CHECK-NEXT: ; %bb.1: 278; CHECK-NEXT: mov r18, r1 279; CHECK-NEXT: .LBB13_2: 280; CHECK-NEXT: mov r24, r18 281; CHECK-NEXT: clr r25 282; CHECK-NEXT: ret 283; 284; TINY-LABEL: cmp_i16_gt_1023: 285; TINY: ; %bb.0: 286; TINY-NEXT: ldi r21, 4 287; TINY-NEXT: ldi r20, 1 288; TINY-NEXT: cp r24, r17 289; TINY-NEXT: cpc r25, r21 290; TINY-NEXT: brge .LBB13_2 291; TINY-NEXT: ; %bb.1: 292; TINY-NEXT: mov r20, r17 293; TINY-NEXT: .LBB13_2: 294; TINY-NEXT: mov r24, r20 295; TINY-NEXT: clr r25 296; TINY-NEXT: ret 297 %2 = icmp sgt i16 %0, 1023 298 %3 = zext i1 %2 to i16 299 ret i16 %3 300} 301