1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2; RUN: llc -O0 -mtriple=mipsel-linux-gnu -global-isel -verify-machineinstrs %s -o -| FileCheck %s -check-prefixes=MIPS32 3define i32 @add_i32(i32 %x, i32 %y) { 4; MIPS32-LABEL: add_i32: 5; MIPS32: # %bb.0: # %entry 6; MIPS32-NEXT: addu $2, $4, $5 7; MIPS32-NEXT: jr $ra 8; MIPS32-NEXT: nop 9entry: 10 %z = add i32 %x, %y 11 ret i32 %z 12} 13 14define signext i8 @add_i8_sext(i8 signext %a, i8 signext %b) { 15; MIPS32-LABEL: add_i8_sext: 16; MIPS32: # %bb.0: # %entry 17; MIPS32-NEXT: addu $1, $5, $4 18; MIPS32-NEXT: sll $1, $1, 24 19; MIPS32-NEXT: sra $2, $1, 24 20; MIPS32-NEXT: jr $ra 21; MIPS32-NEXT: nop 22entry: 23 %add = add i8 %b, %a 24 ret i8 %add 25} 26 27define zeroext i8 @add_i8_zext(i8 zeroext %a, i8 zeroext %b) { 28; MIPS32-LABEL: add_i8_zext: 29; MIPS32: # %bb.0: # %entry 30; MIPS32-NEXT: addu $1, $5, $4 31; MIPS32-NEXT: andi $2, $1, 255 32; MIPS32-NEXT: jr $ra 33; MIPS32-NEXT: nop 34entry: 35 %add = add i8 %b, %a 36 ret i8 %add 37} 38 39define i8 @add_i8_aext(i8 %a, i8 %b) { 40; MIPS32-LABEL: add_i8_aext: 41; MIPS32: # %bb.0: # %entry 42; MIPS32-NEXT: addu $2, $5, $4 43; MIPS32-NEXT: jr $ra 44; MIPS32-NEXT: nop 45entry: 46 %add = add i8 %b, %a 47 ret i8 %add 48} 49 50define signext i16 @add_i16_sext(i16 signext %a, i16 signext %b) { 51; MIPS32-LABEL: add_i16_sext: 52; MIPS32: # %bb.0: # %entry 53; MIPS32-NEXT: addu $1, $5, $4 54; MIPS32-NEXT: sll $1, $1, 16 55; MIPS32-NEXT: sra $2, $1, 16 56; MIPS32-NEXT: jr $ra 57; MIPS32-NEXT: nop 58entry: 59 %add = add i16 %b, %a 60 ret i16 %add 61} 62 63define zeroext i16 @add_i16_zext(i16 zeroext %a, i16 zeroext %b) { 64; MIPS32-LABEL: add_i16_zext: 65; MIPS32: # %bb.0: # %entry 66; MIPS32-NEXT: addu $1, $5, $4 67; MIPS32-NEXT: andi $2, $1, 65535 68; MIPS32-NEXT: jr $ra 69; MIPS32-NEXT: nop 70entry: 71 %add = add i16 %b, %a 72 ret i16 %add 73} 74 75define i16 @add_i16_aext(i16 %a, i16 %b) { 76; MIPS32-LABEL: add_i16_aext: 77; MIPS32: # %bb.0: # %entry 78; MIPS32-NEXT: addu $2, $5, $4 79; MIPS32-NEXT: jr $ra 80; MIPS32-NEXT: nop 81entry: 82 %add = add i16 %b, %a 83 ret i16 %add 84} 85 86define i64 @add_i64(i64 %a, i64 %b) { 87; MIPS32-LABEL: add_i64: 88; MIPS32: # %bb.0: # %entry 89; MIPS32-NEXT: addu $2, $6, $4 90; MIPS32-NEXT: sltu $3, $2, $4 91; MIPS32-NEXT: addu $1, $7, $5 92; MIPS32-NEXT: addu $3, $1, $3 93; MIPS32-NEXT: jr $ra 94; MIPS32-NEXT: nop 95entry: 96 %add = add i64 %b, %a 97 ret i64 %add 98} 99 100define i128 @add_i128(i128 %a, i128 %b) { 101; MIPS32-LABEL: add_i128: 102; MIPS32: # %bb.0: # %entry 103; MIPS32-NEXT: move $8, $4 104; MIPS32-NEXT: move $3, $5 105; MIPS32-NEXT: addiu $1, $sp, 16 106; MIPS32-NEXT: lw $2, 0($1) 107; MIPS32-NEXT: addiu $1, $sp, 20 108; MIPS32-NEXT: lw $4, 0($1) 109; MIPS32-NEXT: addiu $1, $sp, 24 110; MIPS32-NEXT: lw $5, 0($1) 111; MIPS32-NEXT: addiu $1, $sp, 28 112; MIPS32-NEXT: lw $1, 0($1) 113; MIPS32-NEXT: addu $2, $2, $8 114; MIPS32-NEXT: sltu $9, $2, $8 115; MIPS32-NEXT: addu $3, $4, $3 116; MIPS32-NEXT: sltu $4, $3, $4 117; MIPS32-NEXT: addu $3, $3, $9 118; MIPS32-NEXT: sltiu $8, $3, 1 119; MIPS32-NEXT: and $8, $8, $9 120; MIPS32-NEXT: or $8, $4, $8 121; MIPS32-NEXT: addu $4, $5, $6 122; MIPS32-NEXT: sltu $5, $4, $5 123; MIPS32-NEXT: andi $6, $8, 1 124; MIPS32-NEXT: addu $4, $4, $6 125; MIPS32-NEXT: sltiu $6, $4, 1 126; MIPS32-NEXT: and $6, $6, $8 127; MIPS32-NEXT: or $5, $5, $6 128; MIPS32-NEXT: addu $1, $1, $7 129; MIPS32-NEXT: andi $5, $5, 1 130; MIPS32-NEXT: addu $5, $1, $5 131; MIPS32-NEXT: jr $ra 132; MIPS32-NEXT: nop 133entry: 134 %add = add i128 %b, %a 135 ret i128 %add 136} 137 138define i32 @add_imm(i32 %a) { 139; MIPS32-LABEL: add_imm: 140; MIPS32: # %bb.0: # %entry 141; MIPS32-NEXT: addiu $2, $4, 3 142; MIPS32-NEXT: jr $ra 143; MIPS32-NEXT: nop 144entry: 145 %add = add i32 %a, 3 146 ret i32 %add 147} 148 149define i32 @add_negative_imm(i32 %a) { 150; MIPS32-LABEL: add_negative_imm: 151; MIPS32: # %bb.0: # %entry 152; MIPS32-NEXT: addiu $2, $4, -3 153; MIPS32-NEXT: jr $ra 154; MIPS32-NEXT: nop 155entry: 156 %add = add i32 %a, -3 157 ret i32 %add 158} 159 160define i32 @add_not_imm32SExt16(i32 %a) { 161; MIPS32-LABEL: add_not_imm32SExt16: 162; MIPS32: # %bb.0: # %entry 163; MIPS32-NEXT: ori $1, $zero, 65535 164; MIPS32-NEXT: addu $2, $4, $1 165; MIPS32-NEXT: jr $ra 166; MIPS32-NEXT: nop 167entry: 168 %add = add i32 %a, 65535 169 ret i32 %add 170} 171 172declare { i32, i1 } @llvm.uadd.with.overflow.i32(i32, i32) 173define void @uadd_with_overflow(i32 %lhs, i32 %rhs, ptr %padd, ptr %pcarry_flag) { 174; MIPS32-LABEL: uadd_with_overflow: 175; MIPS32: # %bb.0: 176; MIPS32-NEXT: addu $1, $4, $5 177; MIPS32-NEXT: sltu $2, $1, $5 178; MIPS32-NEXT: andi $2, $2, 1 179; MIPS32-NEXT: sb $2, 0($7) 180; MIPS32-NEXT: sw $1, 0($6) 181; MIPS32-NEXT: jr $ra 182; MIPS32-NEXT: nop 183 %res = call { i32, i1 } @llvm.uadd.with.overflow.i32(i32 %lhs, i32 %rhs) 184 %carry_flag = extractvalue { i32, i1 } %res, 1 185 %add = extractvalue { i32, i1 } %res, 0 186 store i1 %carry_flag, ptr %pcarry_flag 187 store i32 %add, ptr %padd 188 ret void 189} 190