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: subs.w.sx %s0, %s0, %s1 7; CHECK-NEXT: sll %s0, %s0, 56 8; CHECK-NEXT: sra.l %s0, %s0, 56 9; CHECK-NEXT: b.l.t (, %s10) 10 %3 = sub i8 %0, %1 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: subs.w.sx %s0, %s0, %s1 18; CHECK-NEXT: sll %s0, %s0, 48 19; CHECK-NEXT: sra.l %s0, %s0, 48 20; CHECK-NEXT: b.l.t (, %s10) 21 %3 = sub i16 %0, %1 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: subs.w.sx %s0, %s0, %s1 29; CHECK-NEXT: adds.w.sx %s0, %s0, (0)1 30; CHECK-NEXT: b.l.t (, %s10) 31 %3 = sub nsw i32 %0, %1 32 ret i32 %3 33} 34 35define i64 @func64s(i64 %0, i64 %1) { 36; CHECK-LABEL: func64s: 37; CHECK: # %bb.0: 38; CHECK-NEXT: subs.l %s0, %s0, %s1 39; CHECK-NEXT: b.l.t (, %s10) 40 %3 = sub nsw i64 %0, %1 41 ret i64 %3 42} 43 44define i128 @func128s(i128 %0, i128 %1) { 45; CHECK-LABEL: func128s: 46; CHECK: # %bb.0: 47; CHECK-NEXT: subs.l %s1, %s1, %s3 48; CHECK-NEXT: cmpu.l %s3, %s0, %s2 49; CHECK-NEXT: or %s4, 0, (0)1 50; CHECK-NEXT: cmov.l.lt %s4, (63)0, %s3 51; CHECK-NEXT: adds.w.zx %s3, %s4, (0)1 52; CHECK-NEXT: subs.l %s1, %s1, %s3 53; CHECK-NEXT: subs.l %s0, %s0, %s2 54; CHECK-NEXT: b.l.t (, %s10) 55 %3 = sub nsw i128 %0, %1 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: subs.w.sx %s0, %s0, %s1 63; CHECK-NEXT: and %s0, %s0, (56)0 64; CHECK-NEXT: b.l.t (, %s10) 65 %3 = sub i8 %0, %1 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: subs.w.sx %s0, %s0, %s1 73; CHECK-NEXT: and %s0, %s0, (48)0 74; CHECK-NEXT: b.l.t (, %s10) 75 %3 = sub i16 %0, %1 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: subs.w.sx %s0, %s0, %s1 83; CHECK-NEXT: adds.w.zx %s0, %s0, (0)1 84; CHECK-NEXT: b.l.t (, %s10) 85 %3 = sub i32 %0, %1 86 ret i32 %3 87} 88 89define i64 @func64z(i64 %0, i64 %1) { 90; CHECK-LABEL: func64z: 91; CHECK: # %bb.0: 92; CHECK-NEXT: subs.l %s0, %s0, %s1 93; CHECK-NEXT: b.l.t (, %s10) 94 %3 = sub i64 %0, %1 95 ret i64 %3 96} 97 98define i128 @func128z(i128 %0, i128 %1) { 99; CHECK-LABEL: func128z: 100; CHECK: # %bb.0: 101; CHECK-NEXT: subs.l %s1, %s1, %s3 102; CHECK-NEXT: cmpu.l %s3, %s0, %s2 103; CHECK-NEXT: or %s4, 0, (0)1 104; CHECK-NEXT: cmov.l.lt %s4, (63)0, %s3 105; CHECK-NEXT: adds.w.zx %s3, %s4, (0)1 106; CHECK-NEXT: subs.l %s1, %s1, %s3 107; CHECK-NEXT: subs.l %s0, %s0, %s2 108; CHECK-NEXT: b.l.t (, %s10) 109 %3 = sub i128 %0, %1 110 ret i128 %3 111} 112 113define signext i8 @funci8s(i8 signext %a) { 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 %ret = add i8 %a, -5 121 ret i8 %ret 122} 123 124define signext i16 @funci16s(i16 signext %a) { 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 %ret = add i16 %a, -5 132 ret i16 %ret 133} 134 135define signext i32 @funci32s(i32 signext %a) { 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 %ret = add i32 %a, -5 142 ret i32 %ret 143} 144 145define i64 @funci64s(i64 %a) { 146; CHECK-LABEL: funci64s: 147; CHECK: # %bb.0: 148; CHECK-NEXT: lea %s0, -5(, %s0) 149; CHECK-NEXT: b.l.t (, %s10) 150 %ret = add nsw i64 %a, -5 151 ret i64 %ret 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: lea %s1, -1(%s0, %s1) 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 %a) { 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 %ret = add i8 %a, -5 176 ret i8 %ret 177} 178 179define zeroext i16 @funci16z(i16 zeroext %a) { 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 %ret = add i16 %a, -5 186 ret i16 %ret 187} 188 189define zeroext i32 @funci32z(i32 zeroext %a) { 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 %ret = add i32 %a, -5 196 ret i32 %ret 197} 198 199define i64 @funci64z(i64 %a) { 200; CHECK-LABEL: funci64z: 201; CHECK: # %bb.0: 202; CHECK-NEXT: lea %s0, -5(, %s0) 203; CHECK-NEXT: b.l.t (, %s10) 204 %ret = add i64 %a, -5 205 ret i64 %ret 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: lea %s1, -1(%s0, %s1) 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 %a) { 224; CHECK-LABEL: funci64_2: 225; CHECK: # %bb.0: 226; CHECK-NEXT: lea %s0, -2147483648(, %s0) 227; CHECK-NEXT: b.l.t (, %s10) 228 %ret = add nsw i64 %a, -2147483648 229 ret i64 %ret 230} 231 232define i128 @funci128_2(i128 %0) { 233; CHECK-LABEL: funci128_2: 234; CHECK: # %bb.0: 235; CHECK-NEXT: lea %s2, -2147483648(, %s0) 236; CHECK-NEXT: cmpu.l %s0, %s2, %s0 237; CHECK-NEXT: or %s3, 0, (0)1 238; CHECK-NEXT: cmov.l.lt %s3, (63)0, %s0 239; CHECK-NEXT: adds.w.zx %s0, %s3, (0)1 240; CHECK-NEXT: lea %s1, -1(%s0, %s1) 241; CHECK-NEXT: or %s0, 0, %s2 242; CHECK-NEXT: b.l.t (, %s10) 243 %2 = add nsw i128 %0, -2147483648 244 ret i128 %2 245} 246