1; RUN: llc < %s -mtriple=ve-unknown-unknown | FileCheck %s 2 3define signext i8 @func8s(i8 signext %0, i8 signext %1) { 4; CHECK-LABEL: func8s: 5; CHECK: # %bb.0: 6; CHECK-NEXT: adds.w.sx %s0, %s1, %s0 7; CHECK-NEXT: sll %s0, %s0, 56 8; CHECK-NEXT: sra.l %s0, %s0, 56 9; CHECK-NEXT: b.l.t (, %s10) 10 %3 = add i8 %1, %0 11 ret i8 %3 12} 13 14define signext i16 @func16s(i16 signext %0, i16 signext %1) { 15; CHECK-LABEL: func16s: 16; CHECK: # %bb.0: 17; CHECK-NEXT: adds.w.sx %s0, %s1, %s0 18; CHECK-NEXT: sll %s0, %s0, 48 19; CHECK-NEXT: sra.l %s0, %s0, 48 20; CHECK-NEXT: b.l.t (, %s10) 21 %3 = add i16 %1, %0 22 ret i16 %3 23} 24 25define signext i32 @func32s(i32 signext %0, i32 signext %1) { 26; CHECK-LABEL: func32s: 27; CHECK: # %bb.0: 28; CHECK-NEXT: adds.w.sx %s0, %s1, %s0 29; CHECK-NEXT: adds.w.sx %s0, %s0, (0)1 30; CHECK-NEXT: b.l.t (, %s10) 31 %3 = add nsw i32 %1, %0 32 ret i32 %3 33} 34 35define i64 @func64s(i64 %0, i64 %1) { 36; CHECK-LABEL: func64s: 37; CHECK: # %bb.0: 38; CHECK-NEXT: adds.l %s0, %s1, %s0 39; CHECK-NEXT: b.l.t (, %s10) 40 %3 = add nsw i64 %1, %0 41 ret i64 %3 42} 43 44define i128 @func128s(i128 %0, i128 %1) { 45; CHECK-LABEL: func128s: 46; CHECK: # %bb.0: 47; CHECK-NEXT: adds.l %s1, %s3, %s1 48; CHECK-NEXT: adds.l %s0, %s2, %s0 49; CHECK-NEXT: cmpu.l %s2, %s0, %s2 50; CHECK-NEXT: or %s3, 0, (0)1 51; CHECK-NEXT: cmov.l.lt %s3, (63)0, %s2 52; CHECK-NEXT: adds.w.zx %s2, %s3, (0)1 53; CHECK-NEXT: adds.l %s1, %s1, %s2 54; CHECK-NEXT: b.l.t (, %s10) 55 %3 = add nsw i128 %1, %0 56 ret i128 %3 57} 58 59define zeroext i8 @func8z(i8 zeroext %0, i8 zeroext %1) { 60; CHECK-LABEL: func8z: 61; CHECK: # %bb.0: 62; CHECK-NEXT: adds.w.sx %s0, %s1, %s0 63; CHECK-NEXT: and %s0, %s0, (56)0 64; CHECK-NEXT: b.l.t (, %s10) 65 %3 = add i8 %1, %0 66 ret i8 %3 67} 68 69define zeroext i16 @func16z(i16 zeroext %0, i16 zeroext %1) { 70; CHECK-LABEL: func16z: 71; CHECK: # %bb.0: 72; CHECK-NEXT: adds.w.sx %s0, %s1, %s0 73; CHECK-NEXT: and %s0, %s0, (48)0 74; CHECK-NEXT: b.l.t (, %s10) 75 %3 = add i16 %1, %0 76 ret i16 %3 77} 78 79define zeroext i32 @func32z(i32 zeroext %0, i32 zeroext %1) { 80; CHECK-LABEL: func32z: 81; CHECK: # %bb.0: 82; CHECK-NEXT: adds.w.sx %s0, %s1, %s0 83; CHECK-NEXT: adds.w.zx %s0, %s0, (0)1 84; CHECK-NEXT: b.l.t (, %s10) 85 %3 = add i32 %1, %0 86 ret i32 %3 87} 88 89define i64 @func64z(i64 %0, i64 %1) { 90; CHECK-LABEL: func64z: 91; CHECK: # %bb.0: 92; CHECK-NEXT: adds.l %s0, %s1, %s0 93; CHECK-NEXT: b.l.t (, %s10) 94 %3 = add i64 %1, %0 95 ret i64 %3 96} 97 98define i128 @func128z(i128 %0, i128 %1) { 99; CHECK-LABEL: func128z: 100; CHECK: # %bb.0: 101; CHECK-NEXT: adds.l %s1, %s3, %s1 102; CHECK-NEXT: adds.l %s0, %s2, %s0 103; CHECK-NEXT: cmpu.l %s2, %s0, %s2 104; CHECK-NEXT: or %s3, 0, (0)1 105; CHECK-NEXT: cmov.l.lt %s3, (63)0, %s2 106; CHECK-NEXT: adds.w.zx %s2, %s3, (0)1 107; CHECK-NEXT: adds.l %s1, %s1, %s2 108; CHECK-NEXT: b.l.t (, %s10) 109 %3 = add i128 %1, %0 110 ret i128 %3 111} 112 113define signext i8 @funci8s(i8 signext %0) { 114; CHECK-LABEL: funci8s: 115; CHECK: # %bb.0: 116; CHECK-NEXT: adds.w.sx %s0, 5, %s0 117; CHECK-NEXT: sll %s0, %s0, 56 118; CHECK-NEXT: sra.l %s0, %s0, 56 119; CHECK-NEXT: b.l.t (, %s10) 120 %2 = add i8 %0, 5 121 ret i8 %2 122} 123 124define signext i16 @funci16s(i16 signext %0) { 125; CHECK-LABEL: funci16s: 126; CHECK: # %bb.0: 127; CHECK-NEXT: adds.w.sx %s0, 5, %s0 128; CHECK-NEXT: sll %s0, %s0, 48 129; CHECK-NEXT: sra.l %s0, %s0, 48 130; CHECK-NEXT: b.l.t (, %s10) 131 %2 = add i16 %0, 5 132 ret i16 %2 133} 134 135define signext i32 @funci32s(i32 signext %0) { 136; CHECK-LABEL: funci32s: 137; CHECK: # %bb.0: 138; CHECK-NEXT: adds.w.sx %s0, 5, %s0 139; CHECK-NEXT: adds.w.sx %s0, %s0, (0)1 140; CHECK-NEXT: b.l.t (, %s10) 141 %2 = add nsw i32 %0, 5 142 ret i32 %2 143} 144 145define i64 @funci64s(i64 %0) { 146; CHECK-LABEL: funci64s: 147; CHECK: # %bb.0: 148; CHECK-NEXT: lea %s0, 5(, %s0) 149; CHECK-NEXT: b.l.t (, %s10) 150 %2 = add nsw i64 %0, 5 151 ret i64 %2 152} 153 154define i128 @funci128s(i128 %0) { 155; CHECK-LABEL: funci128s: 156; CHECK: # %bb.0: 157; CHECK-NEXT: lea %s2, 5(, %s0) 158; CHECK-NEXT: cmpu.l %s0, %s2, %s0 159; CHECK-NEXT: or %s3, 0, (0)1 160; CHECK-NEXT: cmov.l.lt %s3, (63)0, %s0 161; CHECK-NEXT: adds.w.zx %s0, %s3, (0)1 162; CHECK-NEXT: adds.l %s1, %s1, %s0 163; CHECK-NEXT: or %s0, 0, %s2 164; CHECK-NEXT: b.l.t (, %s10) 165 %2 = add nsw i128 %0, 5 166 ret i128 %2 167} 168 169define zeroext i8 @funci8z(i8 zeroext %0) { 170; CHECK-LABEL: funci8z: 171; CHECK: # %bb.0: 172; CHECK-NEXT: adds.w.sx %s0, 5, %s0 173; CHECK-NEXT: and %s0, %s0, (56)0 174; CHECK-NEXT: b.l.t (, %s10) 175 %2 = add i8 %0, 5 176 ret i8 %2 177} 178 179define zeroext i16 @funci16z(i16 zeroext %0) { 180; CHECK-LABEL: funci16z: 181; CHECK: # %bb.0: 182; CHECK-NEXT: adds.w.sx %s0, 5, %s0 183; CHECK-NEXT: and %s0, %s0, (48)0 184; CHECK-NEXT: b.l.t (, %s10) 185 %2 = add i16 %0, 5 186 ret i16 %2 187} 188 189define zeroext i32 @funci32z(i32 zeroext %0) { 190; CHECK-LABEL: funci32z: 191; CHECK: # %bb.0: 192; CHECK-NEXT: adds.w.sx %s0, 5, %s0 193; CHECK-NEXT: adds.w.zx %s0, %s0, (0)1 194; CHECK-NEXT: b.l.t (, %s10) 195 %2 = add i32 %0, 5 196 ret i32 %2 197} 198 199define i64 @funci64z(i64 %0) { 200; CHECK-LABEL: funci64z: 201; CHECK: # %bb.0: 202; CHECK-NEXT: lea %s0, 5(, %s0) 203; CHECK-NEXT: b.l.t (, %s10) 204 %2 = add i64 %0, 5 205 ret i64 %2 206} 207 208define i128 @funci128z(i128 %0) { 209; CHECK-LABEL: funci128z: 210; CHECK: # %bb.0: 211; CHECK-NEXT: lea %s2, 5(, %s0) 212; CHECK-NEXT: cmpu.l %s0, %s2, %s0 213; CHECK-NEXT: or %s3, 0, (0)1 214; CHECK-NEXT: cmov.l.lt %s3, (63)0, %s0 215; CHECK-NEXT: adds.w.zx %s0, %s3, (0)1 216; CHECK-NEXT: adds.l %s1, %s1, %s0 217; CHECK-NEXT: or %s0, 0, %s2 218; CHECK-NEXT: b.l.t (, %s10) 219 %2 = add i128 %0, 5 220 ret i128 %2 221} 222 223define i64 @funci64_2(i64 %0) { 224; CHECK-LABEL: funci64_2: 225; CHECK: # %bb.0: 226; CHECK-NEXT: lea %s1, -2147483648 227; CHECK-NEXT: and %s1, %s1, (32)0 228; CHECK-NEXT: adds.l %s0, %s0, %s1 229; CHECK-NEXT: b.l.t (, %s10) 230 %2 = add nsw i64 %0, 2147483648 231 ret i64 %2 232} 233 234define i128 @funci128_2(i128 %0) { 235; CHECK-LABEL: funci128_2: 236; CHECK: # %bb.0: 237; CHECK-NEXT: lea %s2, -2147483648 238; CHECK-NEXT: and %s2, %s2, (32)0 239; CHECK-NEXT: adds.l %s2, %s0, %s2 240; CHECK-NEXT: cmpu.l %s0, %s2, %s0 241; CHECK-NEXT: or %s3, 0, (0)1 242; CHECK-NEXT: cmov.l.lt %s3, (63)0, %s0 243; CHECK-NEXT: adds.w.zx %s0, %s3, (0)1 244; CHECK-NEXT: adds.l %s1, %s1, %s0 245; CHECK-NEXT: or %s0, 0, %s2 246; CHECK-NEXT: b.l.t (, %s10) 247 %2 = add nsw i128 %0, 2147483648 248 ret i128 %2 249} 250