| Vasileios Kalintiris | 2ed214f | 2015-01-26 12:04:40 +0000 | [diff] [blame] | 1 | ; RUN: llc < %s -march=mips -mcpu=mips2 | FileCheck %s \ | 
| Simon Dardis | 250256f | 2017-07-13 11:28:05 +0000 | [diff] [blame] | 2 | ; RUN:    -check-prefixes=NOT-R2-R6,GP32,GP32-NOT-MM,NOT-MM,PRE4 | 
| Vasileios Kalintiris | 2ed214f | 2015-01-26 12:04:40 +0000 | [diff] [blame] | 3 | ; RUN: llc < %s -march=mips -mcpu=mips32 | FileCheck %s \ | 
| Daniel Sanders | 0d97270 | 2016-06-24 12:23:17 +0000 | [diff] [blame] | 4 | ; RUN:    -check-prefixes=NOT-R2-R6,GP32,GP32-NOT-MM,NOT-MM | 
| Vasileios Kalintiris | 2ed214f | 2015-01-26 12:04:40 +0000 | [diff] [blame] | 5 | ; RUN: llc < %s -march=mips -mcpu=mips32r2 | FileCheck %s \ | 
| Daniel Sanders | 0d97270 | 2016-06-24 12:23:17 +0000 | [diff] [blame] | 6 | ; RUN:    -check-prefixes=R2-R6,GP32,GP32-NOT-MM,NOT-MM | 
| Daniel Sanders | 1779314 | 2015-02-18 16:24:50 +0000 | [diff] [blame] | 7 | ; RUN: llc < %s -march=mips -mcpu=mips32r3 | FileCheck %s \ | 
| Daniel Sanders | 0d97270 | 2016-06-24 12:23:17 +0000 | [diff] [blame] | 8 | ; RUN:    -check-prefixes=R2-R6,GP32,GP32-NOT-MM,NOT-MM | 
| Daniel Sanders | 1779314 | 2015-02-18 16:24:50 +0000 | [diff] [blame] | 9 | ; RUN: llc < %s -march=mips -mcpu=mips32r5 | FileCheck %s \ | 
| Daniel Sanders | 0d97270 | 2016-06-24 12:23:17 +0000 | [diff] [blame] | 10 | ; RUN:    -check-prefixes=R2-R6,GP32,GP32-NOT-MM,NOT-MM | 
| Vasileios Kalintiris | 2ed214f | 2015-01-26 12:04:40 +0000 | [diff] [blame] | 11 | ; RUN: llc < %s -march=mips -mcpu=mips32r6 | FileCheck %s \ | 
| Daniel Sanders | 0d97270 | 2016-06-24 12:23:17 +0000 | [diff] [blame] | 12 | ; RUN:    -check-prefixes=R2-R6,GP32,GP32-NOT-MM,NOT-MM | 
| Zoran Jovanovic | ffef3e3 | 2017-04-27 13:10:48 +0000 | [diff] [blame] | 13 | ; RUN: llc < %s -march=mips -mcpu=mips32r3 -mattr=+micromips -verify-machineinstrs | FileCheck %s \ | 
| Simon Dardis | 250256f | 2017-07-13 11:28:05 +0000 | [diff] [blame] | 14 | ; RUN:    -check-prefixes=GP32-MM,GP32,MM32,MMR3 | 
| Zlatko Buljan | de0bbe6 | 2016-04-27 11:31:44 +0000 | [diff] [blame] | 15 | ; RUN: llc < %s -march=mips -mcpu=mips32r6 -mattr=+micromips | FileCheck %s \ | 
| Simon Dardis | 250256f | 2017-07-13 11:28:05 +0000 | [diff] [blame] | 16 | ; RUN:    -check-prefixes=GP32-MM,GP32,MM32,MMR6 | 
| Vasileios Kalintiris | 2ed214f | 2015-01-26 12:04:40 +0000 | [diff] [blame] | 17 | ; RUN: llc < %s -march=mips64 -mcpu=mips3 | FileCheck %s \ | 
| Simon Dardis | 250256f | 2017-07-13 11:28:05 +0000 | [diff] [blame] | 18 | ; RUN:    -check-prefixes=NOT-R2-R6,GP64,NOT-MM,GP64-NOT-R2 | 
| Vasileios Kalintiris | 2ed214f | 2015-01-26 12:04:40 +0000 | [diff] [blame] | 19 | ; RUN: llc < %s -march=mips64 -mcpu=mips4 | FileCheck %s \ | 
| Simon Dardis | 250256f | 2017-07-13 11:28:05 +0000 | [diff] [blame] | 20 | ; RUN:    -check-prefixes=NOT-R2-R6,GP64,NOT-MM,GP64-NOT-R2 | 
| Vasileios Kalintiris | 2ed214f | 2015-01-26 12:04:40 +0000 | [diff] [blame] | 21 | ; RUN: llc < %s -march=mips64 -mcpu=mips64 | FileCheck %s \ | 
| Simon Dardis | 250256f | 2017-07-13 11:28:05 +0000 | [diff] [blame] | 22 | ; RUN:    -check-prefixes=NOT-R2-R6,GP64,NOT-MM,GP64-NOT-R2 | 
| Vasileios Kalintiris | 2ed214f | 2015-01-26 12:04:40 +0000 | [diff] [blame] | 23 | ; RUN: llc < %s -march=mips64 -mcpu=mips64r2 | FileCheck %s \ | 
| Simon Dardis | 250256f | 2017-07-13 11:28:05 +0000 | [diff] [blame] | 24 | ; RUN:    -check-prefixes=R2-R6,GP64,NOT-MM,GP64-R2 | 
| Daniel Sanders | 1779314 | 2015-02-18 16:24:50 +0000 | [diff] [blame] | 25 | ; RUN: llc < %s -march=mips64 -mcpu=mips64r3 | FileCheck %s \ | 
| Simon Dardis | 250256f | 2017-07-13 11:28:05 +0000 | [diff] [blame] | 26 | ; RUN:    -check-prefixes=R2-R6,GP64,NOT-MM,GP64-R2 | 
| Daniel Sanders | 1779314 | 2015-02-18 16:24:50 +0000 | [diff] [blame] | 27 | ; RUN: llc < %s -march=mips64 -mcpu=mips64r5 | FileCheck %s \ | 
| Simon Dardis | 250256f | 2017-07-13 11:28:05 +0000 | [diff] [blame] | 28 | ; RUN:    -check-prefixes=R2-R6,GP64,NOT-MM,GP64-R2 | 
| Vasileios Kalintiris | 2ed214f | 2015-01-26 12:04:40 +0000 | [diff] [blame] | 29 | ; RUN: llc < %s -march=mips64 -mcpu=mips64r6 | FileCheck %s \ | 
| Simon Dardis | 250256f | 2017-07-13 11:28:05 +0000 | [diff] [blame] | 30 | ; RUN:    -check-prefixes=R2-R6,GP64,NOT-MM,GP64-R2 | 
| Vasileios Kalintiris | 2ed214f | 2015-01-26 12:04:40 +0000 | [diff] [blame] | 31 |  | 
|  | 32 | define signext i1 @sub_i1(i1 signext %a, i1 signext %b) { | 
|  | 33 | entry: | 
|  | 34 | ; ALL-LABEL: sub_i1: | 
|  | 35 |  | 
| Zlatko Buljan | de0bbe6 | 2016-04-27 11:31:44 +0000 | [diff] [blame] | 36 | ; NOT-MM:         subu    $[[T0:[0-9]+]], $4, $5 | 
| Sanjay Patel | 3a3aaf6 | 2016-10-19 16:58:59 +0000 | [diff] [blame] | 37 | ; NOT-MM:         andi    $[[T0]], $[[T0]], 1 | 
|  | 38 | ; NOT-MM:         negu    $2, $[[T0]] | 
| Zlatko Buljan | de0bbe6 | 2016-04-27 11:31:44 +0000 | [diff] [blame] | 39 |  | 
|  | 40 | ; MM:             subu16  $[[T0:[0-9]+]], $4, $5 | 
| Sanjay Patel | 3a3aaf6 | 2016-10-19 16:58:59 +0000 | [diff] [blame] | 41 | ; MM:             andi16  $[[T0]], $[[T0]], 1 | 
|  | 42 | ; MM:             li16    $[[T1:[0-9]+]], 0 | 
|  | 43 | ; MM:             subu16  $2, $[[T1]], $[[T0]] | 
| Vasileios Kalintiris | 2ed214f | 2015-01-26 12:04:40 +0000 | [diff] [blame] | 44 |  | 
|  | 45 | %r = sub i1 %a, %b | 
|  | 46 | ret i1 %r | 
|  | 47 | } | 
|  | 48 |  | 
|  | 49 | define signext i8 @sub_i8(i8 signext %a, i8 signext %b) { | 
|  | 50 | entry: | 
|  | 51 | ; ALL-LABEL: sub_i8: | 
|  | 52 |  | 
|  | 53 | ; NOT-R2-R6:      subu    $[[T0:[0-9]+]], $4, $5 | 
|  | 54 | ; NOT-R2-R6:      sll     $[[T0]], $[[T0]], 24 | 
|  | 55 | ; NOT-R2-R6:      sra     $2, $[[T0]], 24 | 
|  | 56 |  | 
|  | 57 | ; R2-R6:          subu    $[[T0:[0-9]+]], $4, $5 | 
|  | 58 | ; R2-R6:          seb     $2, $[[T0:[0-9]+]] | 
|  | 59 |  | 
| Zlatko Buljan | de0bbe6 | 2016-04-27 11:31:44 +0000 | [diff] [blame] | 60 | ; MM:             subu16  $[[T0:[0-9]+]], $4, $5 | 
|  | 61 | ; MM:             seb     $[[T0]], $[[T0]] | 
|  | 62 |  | 
| Vasileios Kalintiris | 2ed214f | 2015-01-26 12:04:40 +0000 | [diff] [blame] | 63 | %r = sub i8 %a, %b | 
|  | 64 | ret i8 %r | 
|  | 65 | } | 
|  | 66 |  | 
|  | 67 | define signext i16 @sub_i16(i16 signext %a, i16 signext %b) { | 
|  | 68 | entry: | 
|  | 69 | ; ALL-LABEL: sub_i16: | 
|  | 70 |  | 
|  | 71 | ; NOT-R2-R6:      subu    $[[T0:[0-9]+]], $4, $5 | 
|  | 72 | ; NOT-R2-R6:      sll     $[[T0]], $[[T0]], 16 | 
|  | 73 | ; NOT-R2-R6:      sra     $2, $[[T0]], 16 | 
|  | 74 |  | 
|  | 75 | ; R2-R6:          subu    $[[T0:[0-9]+]], $4, $5 | 
|  | 76 | ; R2-R6:          seh     $2, $[[T0:[0-9]+]] | 
|  | 77 |  | 
| Zlatko Buljan | de0bbe6 | 2016-04-27 11:31:44 +0000 | [diff] [blame] | 78 | ; MM:             subu16  $[[T0:[0-9]+]], $4, $5 | 
|  | 79 | ; MM:             seh     $[[T0]], $[[T0]] | 
|  | 80 |  | 
| Vasileios Kalintiris | 2ed214f | 2015-01-26 12:04:40 +0000 | [diff] [blame] | 81 | %r = sub i16 %a, %b | 
|  | 82 | ret i16 %r | 
|  | 83 | } | 
|  | 84 |  | 
|  | 85 | define signext i32 @sub_i32(i32 signext %a, i32 signext %b) { | 
|  | 86 | entry: | 
|  | 87 | ; ALL-LABEL: sub_i32: | 
|  | 88 |  | 
| Zlatko Buljan | de0bbe6 | 2016-04-27 11:31:44 +0000 | [diff] [blame] | 89 | ; NOT-MM:         subu    $2, $4, $5 | 
|  | 90 |  | 
|  | 91 | ; MM:             subu16  $2, $4, $5 | 
| Vasileios Kalintiris | 2ed214f | 2015-01-26 12:04:40 +0000 | [diff] [blame] | 92 |  | 
|  | 93 | %r = sub i32 %a, %b | 
|  | 94 | ret i32 %r | 
|  | 95 | } | 
|  | 96 |  | 
|  | 97 | define signext i64 @sub_i64(i64 signext %a, i64 signext %b) { | 
|  | 98 | entry: | 
|  | 99 | ; ALL-LABEL: sub_i64: | 
|  | 100 |  | 
| Simon Dardis | 250256f | 2017-07-13 11:28:05 +0000 | [diff] [blame] | 101 | ; GP32-NOT-MM:    sltu    $[[T0:[0-9]+]], $5, $7 | 
|  | 102 | ; GP32-NOT-MM:    subu    $2, $4, $6 | 
|  | 103 | ; GP32-NOT-MM:    subu    $2, $2, $[[T0]] | 
|  | 104 | ; GP32-NOT-MM:    subu    $3, $5, $7 | 
|  | 105 |  | 
|  | 106 | ; MM32:           sltu    $[[T0:[0-9]+]], $5, $7 | 
|  | 107 | ; MM32:           subu16    $3, $4, $6 | 
|  | 108 | ; MM32:           subu16    $2, $3, $[[T0]] | 
|  | 109 | ; MM32:           subu16    $3, $5, $7 | 
| Vasileios Kalintiris | 2ed214f | 2015-01-26 12:04:40 +0000 | [diff] [blame] | 110 |  | 
|  | 111 | ; GP64:           dsubu   $2, $4, $5 | 
|  | 112 |  | 
|  | 113 | %r = sub i64 %a, %b | 
|  | 114 | ret i64 %r | 
|  | 115 | } | 
| Vasileios Kalintiris | ef96a8e | 2015-01-26 12:33:22 +0000 | [diff] [blame] | 116 |  | 
|  | 117 | define signext i128 @sub_i128(i128 signext %a, i128 signext %b) { | 
|  | 118 | entry: | 
|  | 119 | ; ALL-LABEL: sub_i128: | 
|  | 120 |  | 
| Simon Dardis | 250256f | 2017-07-13 11:28:05 +0000 | [diff] [blame] | 121 | ; PRE4: lw     $[[T0:[0-9]+]], 24($sp) | 
|  | 122 | ; PRE4: lw     $[[T1:[0-9]+]], 28($sp) | 
|  | 123 | ; PRE4: sltu   $[[T2:[0-9]+]], $7, $[[T1]] | 
|  | 124 | ; PRE4: xor    $[[T3:[0-9]+]], $6, $[[T0]] | 
|  | 125 | ; PRE4: sltiu  $[[T4:[0-9]+]], $[[T3]], 1 | 
|  | 126 | ; PRE4: bnez   $[[T4]] | 
|  | 127 | ; PRE4: move   $[[T5:[0-9]+]], $[[T2]] | 
|  | 128 | ; PRE4: sltu   $[[T5]], $6, $[[T0]] | 
| Vasileios Kalintiris | ef96a8e | 2015-01-26 12:33:22 +0000 | [diff] [blame] | 129 |  | 
| Simon Dardis | 250256f | 2017-07-13 11:28:05 +0000 | [diff] [blame] | 130 | ; PRE4: lw     $[[T6:[0-9]+]], 20($sp) | 
|  | 131 | ; PRE4: subu   $[[T7:[0-9]+]], $5, $[[T6]] | 
|  | 132 | ; PRE4: subu   $[[T8:[0-9]+]], $[[T7]], $[[T5]] | 
|  | 133 | ; PRE4: sltu   $[[T9:[0-9]+]], $[[T7]], $[[T5]] | 
|  | 134 | ; PRE4: sltu   $[[T10:[0-9]+]], $5, $[[T6]] | 
|  | 135 | ; PRE4: lw     $[[T11:[0-9]+]], 16($sp) | 
|  | 136 | ; PRE4: subu   $[[T12:[0-9]+]], $4, $[[T11]] | 
|  | 137 | ; PRE4: subu   $[[T13:[0-9]+]], $[[T12]], $[[T10]] | 
|  | 138 | ; PRE4: subu   $[[T14:[0-9]+]], $[[T13]], $[[T9]] | 
|  | 139 | ; PRE4: subu   $[[T15:[0-9]+]], $6, $[[T0]] | 
|  | 140 | ; PRE4: subu   $[[T16:[0-9]+]], $[[T15]], $[[T2]] | 
|  | 141 | ; PRE4: subu   $5, $7, $[[T1]] | 
| Zlatko Buljan | de0bbe6 | 2016-04-27 11:31:44 +0000 | [diff] [blame] | 142 |  | 
| Simon Dardis | 250256f | 2017-07-13 11:28:05 +0000 | [diff] [blame] | 143 | ; MMR3: lw       $[[T1:[0-9]+]], 48($sp) | 
|  | 144 | ; MMR3: sltu     $[[T2:[0-9]+]], $6, $[[T1]] | 
|  | 145 | ; MMR3: xor      $[[T3:[0-9]+]], $6, $[[T1]] | 
|  | 146 | ; MMR3: lw       $[[T4:[0-9]+]], 52($sp) | 
|  | 147 | ; MMR3: sltu     $[[T5:[0-9]+]], $7, $[[T4]] | 
|  | 148 | ; MMR3: movz     $[[T6:[0-9]+]], $[[T5]], $[[T3]] | 
|  | 149 | ; MMR3: lw       $[[T7:[0-8]+]], 44($sp) | 
|  | 150 | ; MMR3: subu16   $[[T8:[0-9]+]], $5, $[[T7]] | 
|  | 151 | ; MMR3: subu16   $[[T9:[0-9]+]], $[[T8]], $[[T6]] | 
|  | 152 | ; MMR3: sltu     $[[T10:[0-9]+]], $[[T8]], $[[T2]] | 
|  | 153 | ; MMR3: sltu     $[[T11:[0-9]+]], $5, $[[T7]] | 
|  | 154 | ; MMR3: lw       $[[T12:[0-9]+]], 40($sp) | 
|  | 155 | ; MMR3: lw       $[[T13:[0-9]+]], 12($sp) | 
|  | 156 | ; MMR3: subu16   $[[T14:[0-9]+]], $[[T13]], $[[T12]] | 
|  | 157 | ; MMR3: subu16   $[[T15:[0-9]+]], $[[T14]], $[[T11]] | 
|  | 158 | ; MMR3: subu16   $[[T16:[0-9]+]], $[[T15]], $[[T10]] | 
|  | 159 | ; MMR3: subu16   $[[T17:[0-9]+]], $6, $[[T1]] | 
|  | 160 | ; MMR3: subu16   $[[T18:[0-9]+]], $[[T17]], $7 | 
|  | 161 | ; MMR3: lw       $[[T19:[0-9]+]], 8($sp) | 
|  | 162 | ; MMR3: lw       $[[T20:[0-9]+]], 0($sp) | 
|  | 163 | ; MMR3: subu16   $5, $[[T19]], $[[T20]] | 
|  | 164 |  | 
|  | 165 | ; MMR6: move     $[[T0:[0-9]+]], $7 | 
| Geoff Berry | fabedba | 2017-10-03 16:59:13 +0000 | [diff] [blame] | 166 | ; MMR6: sw       $[[T0]], 8($sp) | 
| Simon Dardis | 250256f | 2017-07-13 11:28:05 +0000 | [diff] [blame] | 167 | ; MMR6: move     $[[T1:[0-9]+]], $5 | 
|  | 168 | ; MMR6: sw       $4, 12($sp) | 
|  | 169 | ; MMR6: lw       $[[T2:[0-9]+]], 48($sp) | 
|  | 170 | ; MMR6: sltu     $[[T3:[0-9]+]], $6, $[[T2]] | 
|  | 171 | ; MMR6: xor      $[[T4:[0-9]+]], $6, $[[T2]] | 
|  | 172 | ; MMR6: sltiu    $[[T5:[0-9]+]], $[[T4]], 1 | 
|  | 173 | ; MMR6: seleqz   $[[T6:[0-9]+]], $[[T3]], $[[T5]] | 
|  | 174 | ; MMR6: lw       $[[T7:[0-9]+]], 52($sp) | 
|  | 175 | ; MMR6: sltu     $[[T8:[0-9]+]], $[[T0]], $[[T7]] | 
|  | 176 | ; MMR6: selnez   $[[T9:[0-9]+]], $[[T8]], $[[T5]] | 
|  | 177 | ; MMR6: or       $[[T10:[0-9]+]], $[[T9]], $[[T6]] | 
|  | 178 | ; MMR6: lw       $[[T11:[0-9]+]], 44($sp) | 
|  | 179 | ; MMR6: subu16   $[[T12:[0-9]+]], $[[T1]], $[[T11]] | 
|  | 180 | ; MMR6: subu16   $[[T13:[0-9]+]], $[[T12]], $[[T7]] | 
|  | 181 | ; MMR6: sltu     $[[T16:[0-9]+]], $[[T12]], $[[T7]] | 
|  | 182 | ; MMR6: sltu     $[[T17:[0-9]+]], $[[T1]], $[[T11]] | 
|  | 183 | ; MMR6: lw       $[[T18:[0-9]+]], 40($sp) | 
|  | 184 | ; MMR6: lw       $[[T19:[0-9]+]], 12($sp) | 
|  | 185 | ; MMR6: subu16   $[[T20:[0-9]+]], $[[T19]], $[[T18]] | 
|  | 186 | ; MMR6: subu16   $[[T21:[0-9]+]], $[[T20]], $[[T17]] | 
|  | 187 | ; MMR6: subu16   $[[T22:[0-9]+]], $[[T21]], $[[T16]] | 
|  | 188 | ; MMR6: subu16   $[[T23:[0-9]+]], $6, $[[T2]] | 
|  | 189 | ; MMR6: subu16   $4, $[[T23]], $5 | 
|  | 190 | ; MMR6: lw       $[[T24:[0-9]+]], 8($sp) | 
|  | 191 | ; MMR6: lw       $[[T25:[0-9]+]], 0($sp) | 
|  | 192 | ; MMR6: subu16   $5, $[[T24]], $[[T25]] | 
|  | 193 | ; MMR6: lw       $3, 4($sp) | 
|  | 194 |  | 
|  | 195 | ; FIXME: The sltu, dsll, dsrl pattern here occurs when an i32 is zero | 
|  | 196 | ;        extended to 64 bits. Fortunately slt(i)(u) actually gives an i1. | 
|  | 197 | ;        These should be combined away. | 
|  | 198 |  | 
|  | 199 | ; GP64-NOT-R2: dsubu     $1, $4, $6 | 
|  | 200 | ; GP64-NOT-R2: sltu      $[[T0:[0-9]+]], $5, $7 | 
|  | 201 | ; GP64-NOT-R2: dsll      $[[T1:[0-9]+]], $[[T0]], 32 | 
|  | 202 | ; GP64-NOT-R2: dsrl      $[[T2:[0-9]+]], $[[T1]], 32 | 
|  | 203 | ; GP64-NOT-R2: dsubu     $2, $1, $[[T2]] | 
|  | 204 | ; GP64-NOT-R2: dsubu     $3, $5, $7 | 
|  | 205 |  | 
|  | 206 | ; FIXME: Likewise for the sltu, dext here. | 
|  | 207 |  | 
|  | 208 | ; GP64-R2:     dsubu     $1, $4, $6 | 
|  | 209 | ; GP64-R2:     sltu      $[[T0:[0-9]+]], $5, $7 | 
|  | 210 | ; GP64-R2:     dext      $[[T1:[0-9]+]], $[[T0]], 0, 32 | 
|  | 211 | ; GP64-R2:     dsubu     $2, $1, $[[T1]] | 
|  | 212 | ; GP64-R2:     dsubu     $3, $5, $7 | 
|  | 213 |  | 
| Vasileios Kalintiris | ef96a8e | 2015-01-26 12:33:22 +0000 | [diff] [blame] | 214 | %r = sub i128 %a, %b | 
|  | 215 | ret i128 %r | 
|  | 216 | } |