1*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -march=mips -mcpu=mips2 | FileCheck %s \ 2*9880d681SAndroid Build Coastguard Worker; RUN: -check-prefixes=NOT-R2-R6,GP32,GP32-NOT-MM,NOT-MM 3*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -march=mips -mcpu=mips32 | FileCheck %s \ 4*9880d681SAndroid Build Coastguard Worker; RUN: -check-prefixes=NOT-R2-R6,GP32,GP32-NOT-MM,NOT-MM 5*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -march=mips -mcpu=mips32r2 | FileCheck %s \ 6*9880d681SAndroid Build Coastguard Worker; RUN: -check-prefixes=R2-R6,GP32,GP32-NOT-MM,NOT-MM 7*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -march=mips -mcpu=mips32r3 | FileCheck %s \ 8*9880d681SAndroid Build Coastguard Worker; RUN: -check-prefixes=R2-R6,GP32,GP32-NOT-MM,NOT-MM 9*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -march=mips -mcpu=mips32r5 | FileCheck %s \ 10*9880d681SAndroid Build Coastguard Worker; RUN: -check-prefixes=R2-R6,GP32,GP32-NOT-MM,NOT-MM 11*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -march=mips -mcpu=mips32r6 | FileCheck %s \ 12*9880d681SAndroid Build Coastguard Worker; RUN: -check-prefixes=R2-R6,GP32,GP32-NOT-MM,NOT-MM 13*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -march=mips -mcpu=mips32r3 -mattr=+micromips | FileCheck %s \ 14*9880d681SAndroid Build Coastguard Worker; RUN: -check-prefixes=GP32-MM,GP32,MM 15*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -march=mips -mcpu=mips32r6 -mattr=+micromips | FileCheck %s \ 16*9880d681SAndroid Build Coastguard Worker; RUN: -check-prefixes=GP32-MM,GP32,MM 17*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -march=mips64 -mcpu=mips3 | FileCheck %s \ 18*9880d681SAndroid Build Coastguard Worker; RUN: -check-prefixes=NOT-R2-R6,GP64,NOT-MM 19*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -march=mips64 -mcpu=mips4 | FileCheck %s \ 20*9880d681SAndroid Build Coastguard Worker; RUN: -check-prefixes=NOT-R2-R6,GP64,NOT-MM 21*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -march=mips64 -mcpu=mips64 | FileCheck %s \ 22*9880d681SAndroid Build Coastguard Worker; RUN: -check-prefixes=NOT-R2-R6,GP64,NOT-MM 23*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -march=mips64 -mcpu=mips64r2 | FileCheck %s \ 24*9880d681SAndroid Build Coastguard Worker; RUN: -check-prefixes=R2-R6,GP64,NOT-MM 25*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -march=mips64 -mcpu=mips64r3 | FileCheck %s \ 26*9880d681SAndroid Build Coastguard Worker; RUN: -check-prefixes=R2-R6,GP64,NOT-MM 27*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -march=mips64 -mcpu=mips64r5 | FileCheck %s \ 28*9880d681SAndroid Build Coastguard Worker; RUN: -check-prefixes=R2-R6,GP64,NOT-MM 29*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -march=mips64 -mcpu=mips64r6 | FileCheck %s \ 30*9880d681SAndroid Build Coastguard Worker; RUN: -check-prefixes=R2-R6,GP64,NOT-MM 31*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -march=mips64 -mcpu=mips64r6 -mattr=+micromips | FileCheck %s \ 32*9880d681SAndroid Build Coastguard Worker; RUN: -check-prefixes=GP64,MM 33*9880d681SAndroid Build Coastguard Worker 34*9880d681SAndroid Build Coastguard Workerdefine signext i1 @sub_i1(i1 signext %a, i1 signext %b) { 35*9880d681SAndroid Build Coastguard Workerentry: 36*9880d681SAndroid Build Coastguard Worker; ALL-LABEL: sub_i1: 37*9880d681SAndroid Build Coastguard Worker 38*9880d681SAndroid Build Coastguard Worker ; NOT-MM: subu $[[T0:[0-9]+]], $4, $5 39*9880d681SAndroid Build Coastguard Worker ; NOT-MM: sll $[[T0]], $[[T0]], 31 40*9880d681SAndroid Build Coastguard Worker ; NOT-MM: sra $2, $[[T0]], 31 41*9880d681SAndroid Build Coastguard Worker 42*9880d681SAndroid Build Coastguard Worker ; MM: subu16 $[[T0:[0-9]+]], $4, $5 43*9880d681SAndroid Build Coastguard Worker ; MM: sll $[[T1:[0-9]+]], $[[T0]], 31 44*9880d681SAndroid Build Coastguard Worker ; MM: sra $[[T0]], $[[T1]], 31 45*9880d681SAndroid Build Coastguard Worker 46*9880d681SAndroid Build Coastguard Worker %r = sub i1 %a, %b 47*9880d681SAndroid Build Coastguard Worker ret i1 %r 48*9880d681SAndroid Build Coastguard Worker} 49*9880d681SAndroid Build Coastguard Worker 50*9880d681SAndroid Build Coastguard Workerdefine signext i8 @sub_i8(i8 signext %a, i8 signext %b) { 51*9880d681SAndroid Build Coastguard Workerentry: 52*9880d681SAndroid Build Coastguard Worker; ALL-LABEL: sub_i8: 53*9880d681SAndroid Build Coastguard Worker 54*9880d681SAndroid Build Coastguard Worker ; NOT-R2-R6: subu $[[T0:[0-9]+]], $4, $5 55*9880d681SAndroid Build Coastguard Worker ; NOT-R2-R6: sll $[[T0]], $[[T0]], 24 56*9880d681SAndroid Build Coastguard Worker ; NOT-R2-R6: sra $2, $[[T0]], 24 57*9880d681SAndroid Build Coastguard Worker 58*9880d681SAndroid Build Coastguard Worker ; R2-R6: subu $[[T0:[0-9]+]], $4, $5 59*9880d681SAndroid Build Coastguard Worker ; R2-R6: seb $2, $[[T0:[0-9]+]] 60*9880d681SAndroid Build Coastguard Worker 61*9880d681SAndroid Build Coastguard Worker ; MM: subu16 $[[T0:[0-9]+]], $4, $5 62*9880d681SAndroid Build Coastguard Worker ; MM: seb $[[T0]], $[[T0]] 63*9880d681SAndroid Build Coastguard Worker 64*9880d681SAndroid Build Coastguard Worker %r = sub i8 %a, %b 65*9880d681SAndroid Build Coastguard Worker ret i8 %r 66*9880d681SAndroid Build Coastguard Worker} 67*9880d681SAndroid Build Coastguard Worker 68*9880d681SAndroid Build Coastguard Workerdefine signext i16 @sub_i16(i16 signext %a, i16 signext %b) { 69*9880d681SAndroid Build Coastguard Workerentry: 70*9880d681SAndroid Build Coastguard Worker; ALL-LABEL: sub_i16: 71*9880d681SAndroid Build Coastguard Worker 72*9880d681SAndroid Build Coastguard Worker ; NOT-R2-R6: subu $[[T0:[0-9]+]], $4, $5 73*9880d681SAndroid Build Coastguard Worker ; NOT-R2-R6: sll $[[T0]], $[[T0]], 16 74*9880d681SAndroid Build Coastguard Worker ; NOT-R2-R6: sra $2, $[[T0]], 16 75*9880d681SAndroid Build Coastguard Worker 76*9880d681SAndroid Build Coastguard Worker ; R2-R6: subu $[[T0:[0-9]+]], $4, $5 77*9880d681SAndroid Build Coastguard Worker ; R2-R6: seh $2, $[[T0:[0-9]+]] 78*9880d681SAndroid Build Coastguard Worker 79*9880d681SAndroid Build Coastguard Worker ; MM: subu16 $[[T0:[0-9]+]], $4, $5 80*9880d681SAndroid Build Coastguard Worker ; MM: seh $[[T0]], $[[T0]] 81*9880d681SAndroid Build Coastguard Worker 82*9880d681SAndroid Build Coastguard Worker %r = sub i16 %a, %b 83*9880d681SAndroid Build Coastguard Worker ret i16 %r 84*9880d681SAndroid Build Coastguard Worker} 85*9880d681SAndroid Build Coastguard Worker 86*9880d681SAndroid Build Coastguard Workerdefine signext i32 @sub_i32(i32 signext %a, i32 signext %b) { 87*9880d681SAndroid Build Coastguard Workerentry: 88*9880d681SAndroid Build Coastguard Worker; ALL-LABEL: sub_i32: 89*9880d681SAndroid Build Coastguard Worker 90*9880d681SAndroid Build Coastguard Worker ; NOT-MM: subu $2, $4, $5 91*9880d681SAndroid Build Coastguard Worker 92*9880d681SAndroid Build Coastguard Worker ; MM: subu16 $2, $4, $5 93*9880d681SAndroid Build Coastguard Worker 94*9880d681SAndroid Build Coastguard Worker %r = sub i32 %a, %b 95*9880d681SAndroid Build Coastguard Worker ret i32 %r 96*9880d681SAndroid Build Coastguard Worker} 97*9880d681SAndroid Build Coastguard Worker 98*9880d681SAndroid Build Coastguard Workerdefine signext i64 @sub_i64(i64 signext %a, i64 signext %b) { 99*9880d681SAndroid Build Coastguard Workerentry: 100*9880d681SAndroid Build Coastguard Worker; ALL-LABEL: sub_i64: 101*9880d681SAndroid Build Coastguard Worker 102*9880d681SAndroid Build Coastguard Worker ; GP32: subu $3, $5, $7 103*9880d681SAndroid Build Coastguard Worker ; GP32: sltu $[[T0:[0-9]+]], $5, $7 104*9880d681SAndroid Build Coastguard Worker ; GP32: addu $[[T1:[0-9]+]], $[[T0]], $6 105*9880d681SAndroid Build Coastguard Worker ; GP32: subu $2, $4, $[[T1]] 106*9880d681SAndroid Build Coastguard Worker 107*9880d681SAndroid Build Coastguard Worker ; GP64: dsubu $2, $4, $5 108*9880d681SAndroid Build Coastguard Worker 109*9880d681SAndroid Build Coastguard Worker %r = sub i64 %a, %b 110*9880d681SAndroid Build Coastguard Worker ret i64 %r 111*9880d681SAndroid Build Coastguard Worker} 112*9880d681SAndroid Build Coastguard Worker 113*9880d681SAndroid Build Coastguard Workerdefine signext i128 @sub_i128(i128 signext %a, i128 signext %b) { 114*9880d681SAndroid Build Coastguard Workerentry: 115*9880d681SAndroid Build Coastguard Worker; ALL-LABEL: sub_i128: 116*9880d681SAndroid Build Coastguard Worker 117*9880d681SAndroid Build Coastguard Worker ; GP32-NOT-MM: lw $[[T0:[0-9]+]], 20($sp) 118*9880d681SAndroid Build Coastguard Worker ; GP32-NOT-MM: sltu $[[T1:[0-9]+]], $5, $[[T0]] 119*9880d681SAndroid Build Coastguard Worker ; GP32-NOT-MM: lw $[[T2:[0-9]+]], 16($sp) 120*9880d681SAndroid Build Coastguard Worker ; GP32-NOT-MM: addu $[[T3:[0-9]+]], $[[T1]], $[[T2]] 121*9880d681SAndroid Build Coastguard Worker ; GP32-NOT-MM: lw $[[T4:[0-9]+]], 24($sp) 122*9880d681SAndroid Build Coastguard Worker ; GP32-NOT-MM: lw $[[T5:[0-9]+]], 28($sp) 123*9880d681SAndroid Build Coastguard Worker ; GP32-NOT-MM: subu $[[T6:[0-9]+]], $7, $[[T5]] 124*9880d681SAndroid Build Coastguard Worker ; GP32-NOT-MM: subu $2, $4, $[[T3]] 125*9880d681SAndroid Build Coastguard Worker ; GP32-NOT-MM: sltu $[[T8:[0-9]+]], $6, $[[T4]] 126*9880d681SAndroid Build Coastguard Worker ; GP32-NOT-MM: addu $[[T9:[0-9]+]], $[[T8]], $[[T0]] 127*9880d681SAndroid Build Coastguard Worker ; GP32-NOT-MM: subu $3, $5, $[[T9]] 128*9880d681SAndroid Build Coastguard Worker ; GP32-NOT-MM: sltu $[[T10:[0-9]+]], $7, $[[T5]] 129*9880d681SAndroid Build Coastguard Worker ; GP32-NOT-MM: addu $[[T11:[0-9]+]], $[[T10]], $[[T4]] 130*9880d681SAndroid Build Coastguard Worker ; GP32-NOT-MM: subu $4, $6, $[[T11]] 131*9880d681SAndroid Build Coastguard Worker ; GP32-NOT-MM: move $5, $[[T6]] 132*9880d681SAndroid Build Coastguard Worker 133*9880d681SAndroid Build Coastguard Worker ; GP32-MM: lw $[[T0:[0-9]+]], 20($sp) 134*9880d681SAndroid Build Coastguard Worker ; GP32-MM: sltu $[[T1:[0-9]+]], $[[T2:[0-9]+]], $[[T0]] 135*9880d681SAndroid Build Coastguard Worker ; GP32-MM: lw $[[T3:[0-9]+]], 16($sp) 136*9880d681SAndroid Build Coastguard Worker ; GP32-MM: addu $[[T3]], $[[T1]], $[[T3]] 137*9880d681SAndroid Build Coastguard Worker ; GP32-MM: lw $[[T4:[0-9]+]], 28($sp) 138*9880d681SAndroid Build Coastguard Worker ; GP32-MM: subu $[[T1]], $7, $[[T4]] 139*9880d681SAndroid Build Coastguard Worker ; GP32-MM: subu $[[T3]], $[[T5:[0-9]+]], $[[T3]] 140*9880d681SAndroid Build Coastguard Worker ; GP32-MM: lw $[[T5]], 24($sp) 141*9880d681SAndroid Build Coastguard Worker ; GP32-MM: sltu $[[T6:[0-9]+]], $6, $[[T5]] 142*9880d681SAndroid Build Coastguard Worker ; GP32-MM: addu $[[T0]], $[[T6]], $[[T0]] 143*9880d681SAndroid Build Coastguard Worker ; GP32-MM: subu $[[T0]], $5, $[[T0]] 144*9880d681SAndroid Build Coastguard Worker ; GP32-MM: sltu $[[T2]], $7, $[[T4]] 145*9880d681SAndroid Build Coastguard Worker ; GP32-MM: addu $[[T5]], $[[T2]], $[[T5]] 146*9880d681SAndroid Build Coastguard Worker ; GP32-MM: subu $[[T5]], $6, $[[T5]] 147*9880d681SAndroid Build Coastguard Worker ; GP32-MM: move $[[T2]], $[[T1]] 148*9880d681SAndroid Build Coastguard Worker 149*9880d681SAndroid Build Coastguard Worker ; GP64: dsubu $3, $5, $7 150*9880d681SAndroid Build Coastguard Worker ; GP64: sltu $[[T0:[0-9]+]], $5, $7 151*9880d681SAndroid Build Coastguard Worker ; GP64: daddu $[[T1:[0-9]+]], $[[T0]], $6 152*9880d681SAndroid Build Coastguard Worker ; GP64: dsubu $2, $4, $[[T1]] 153*9880d681SAndroid Build Coastguard Worker 154*9880d681SAndroid Build Coastguard Worker %r = sub i128 %a, %b 155*9880d681SAndroid Build Coastguard Worker ret i128 %r 156*9880d681SAndroid Build Coastguard Worker} 157