1; RUN: llc < %s -mtriple=ve-unknown-unknown | FileCheck %s 2 3define signext i8 @func1(i8 signext %0, i8 signext %1) { 4; CHECK-LABEL: func1: 5; CHECK: .LBB{{[0-9]+}}_2: 6; CHECK-NEXT: subs.w.sx %s0, %s0, %s1 7; CHECK-NEXT: sla.w.sx %s0, %s0, 24 8; CHECK-NEXT: sra.w.sx %s0, %s0, 24 9; CHECK-NEXT: or %s11, 0, %s9 10 %3 = sub i8 %0, %1 11 ret i8 %3 12} 13 14define signext i16 @func2(i16 signext %0, i16 signext %1) { 15; CHECK-LABEL: func2: 16; CHECK: .LBB{{[0-9]+}}_2: 17; CHECK-NEXT: subs.w.sx %s0, %s0, %s1 18; CHECK-NEXT: sla.w.sx %s0, %s0, 16 19; CHECK-NEXT: sra.w.sx %s0, %s0, 16 20; CHECK-NEXT: or %s11, 0, %s9 21 %3 = sub i16 %0, %1 22 ret i16 %3 23} 24 25define i32 @func3(i32 %0, i32 %1) { 26; CHECK-LABEL: func3: 27; CHECK: .LBB{{[0-9]+}}_2: 28; CHECK-NEXT: subs.w.sx %s0, %s0, %s1 29; CHECK-NEXT: or %s11, 0, %s9 30 %3 = sub nsw i32 %0, %1 31 ret i32 %3 32} 33 34define i64 @func4(i64 %0, i64 %1) { 35; CHECK-LABEL: func4: 36; CHECK: .LBB{{[0-9]+}}_2: 37; CHECK-NEXT: subs.l %s0, %s0, %s1 38; CHECK-NEXT: or %s11, 0, %s9 39 %3 = sub nsw i64 %0, %1 40 ret i64 %3 41} 42 43define zeroext i8 @func6(i8 zeroext %0, i8 zeroext %1) { 44; CHECK-LABEL: func6: 45; CHECK: .LBB{{[0-9]+}}_2: 46; CHECK-NEXT: subs.w.sx %s0, %s0, %s1 47; CHECK-NEXT: and %s0, %s0, (56)0 48; CHECK-NEXT: or %s11, 0, %s9 49 %3 = sub i8 %0, %1 50 ret i8 %3 51} 52 53define zeroext i16 @func7(i16 zeroext %0, i16 zeroext %1) { 54; CHECK-LABEL: func7: 55; CHECK: .LBB{{[0-9]+}}_2: 56; CHECK-NEXT: subs.w.sx %s0, %s0, %s1 57; CHECK-NEXT: and %s0, %s0, (48)0 58; CHECK-NEXT: or %s11, 0, %s9 59 %3 = sub i16 %0, %1 60 ret i16 %3 61} 62 63define i32 @func8(i32 %0, i32 %1) { 64; CHECK-LABEL: func8: 65; CHECK: .LBB{{[0-9]+}}_2: 66; CHECK-NEXT: subs.w.sx %s0, %s0, %s1 67; CHECK-NEXT: or %s11, 0, %s9 68 %3 = sub i32 %0, %1 69 ret i32 %3 70} 71 72define i64 @func9(i64 %0, i64 %1) { 73; CHECK-LABEL: func9: 74; CHECK: .LBB{{[0-9]+}}_2: 75; CHECK-NEXT: subs.l %s0, %s0, %s1 76; CHECK-NEXT: or %s11, 0, %s9 77 %3 = sub i64 %0, %1 78 ret i64 %3 79} 80 81define signext i8 @func13(i8 signext %0, i8 signext %1) { 82; CHECK-LABEL: func13: 83; CHECK: .LBB{{[0-9]+}}_2: 84; CHECK-NEXT: adds.w.sx %s0, -5, %s0 85; CHECK-NEXT: sla.w.sx %s0, %s0, 24 86; CHECK-NEXT: sra.w.sx %s0, %s0, 24 87; CHECK-NEXT: or %s11, 0, %s9 88 %3 = add i8 %0, -5 89 ret i8 %3 90} 91 92define signext i16 @func14(i16 signext %0, i16 signext %1) { 93; CHECK-LABEL: func14: 94; CHECK: .LBB{{[0-9]+}}_2: 95; CHECK-NEXT: adds.w.sx %s0, -5, %s0 96; CHECK-NEXT: sla.w.sx %s0, %s0, 16 97; CHECK-NEXT: sra.w.sx %s0, %s0, 16 98; CHECK-NEXT: or %s11, 0, %s9 99 %3 = add i16 %0, -5 100 ret i16 %3 101} 102 103define i32 @func15(i32 %0, i32 %1) { 104; CHECK-LABEL: func15: 105; CHECK: .LBB{{[0-9]+}}_2: 106; CHECK-NEXT: adds.w.sx %s0, -5, %s0 107; CHECK-NEXT: or %s11, 0, %s9 108 %3 = add nsw i32 %0, -5 109 ret i32 %3 110} 111 112define i64 @func16(i64 %0, i64 %1) { 113; CHECK-LABEL: func16: 114; CHECK: .LBB{{[0-9]+}}_2: 115; CHECK-NEXT: lea %s0, -5(, %s0) 116; CHECK-NEXT: or %s11, 0, %s9 117 %3 = add nsw i64 %0, -5 118 ret i64 %3 119} 120 121define zeroext i8 @func18(i8 zeroext %0, i8 zeroext %1) { 122; CHECK-LABEL: func18: 123; CHECK: .LBB{{[0-9]+}}_2: 124; CHECK-NEXT: adds.w.sx %s0, -5, %s0 125; CHECK-NEXT: and %s0, %s0, (56)0 126; CHECK-NEXT: or %s11, 0, %s9 127 %3 = add i8 %0, -5 128 ret i8 %3 129} 130 131define zeroext i16 @func19(i16 zeroext %0, i16 zeroext %1) { 132; CHECK-LABEL: func19: 133; CHECK: .LBB{{[0-9]+}}_2: 134; CHECK-NEXT: adds.w.sx %s0, -5, %s0 135; CHECK-NEXT: and %s0, %s0, (48)0 136; CHECK-NEXT: or %s11, 0, %s9 137 %3 = add i16 %0, -5 138 ret i16 %3 139} 140 141define i32 @func20(i32 %0, i32 %1) { 142; CHECK-LABEL: func20: 143; CHECK: .LBB{{[0-9]+}}_2: 144; CHECK-NEXT: adds.w.sx %s0, -5, %s0 145; CHECK-NEXT: or %s11, 0, %s9 146 %3 = add i32 %0, -5 147 ret i32 %3 148} 149 150define i64 @func21(i64 %0, i64 %1) { 151; CHECK-LABEL: func21: 152; CHECK: .LBB{{[0-9]+}}_2: 153; CHECK-NEXT: lea %s0, -5(, %s0) 154; CHECK-NEXT: or %s11, 0, %s9 155 %3 = add i64 %0, -5 156 ret i64 %3 157} 158 159define i64 @func26(i64 %0, i64 %1) { 160; CHECK-LABEL: func26: 161; CHECK: .LBB{{[0-9]+}}_2: 162; CHECK-NEXT: lea %s0, -2147483648(, %s0) 163; CHECK-NEXT: or %s11, 0, %s9 164 %3 = add nsw i64 %0, -2147483648 165 ret i64 %3 166} 167 168