1; RUN: llc < %s -march=mips -mcpu=mips2 | FileCheck %s \ 2; RUN: -check-prefixes=ALL,NOT-R2-R6,GP32,PRE4 3; RUN: llc < %s -march=mips -mcpu=mips32 | FileCheck %s \ 4; RUN: -check-prefixes=ALL,NOT-R2-R6,GP32,GP32-CMOV 5; RUN: llc < %s -march=mips -mcpu=mips32r2 | FileCheck %s \ 6; RUN: -check-prefixes=ALL,R2-R6,GP32,GP32-CMOV 7; RUN: llc < %s -march=mips -mcpu=mips32r3 | FileCheck %s \ 8; RUN: -check-prefixes=ALL,R2-R6,GP32,GP32-CMOV 9; RUN: llc < %s -march=mips -mcpu=mips32r5 | FileCheck %s \ 10; RUN: -check-prefixes=ALL,R2-R6,GP32,GP32-CMOV 11; RUN: llc < %s -march=mips -mcpu=mips32r6 | FileCheck %s \ 12; RUN: -check-prefixes=ALL,R2-R6,GP32 13; RUN: llc < %s -march=mips64 -mcpu=mips3 | FileCheck %s \ 14; RUN: -check-prefixes=ALL,NOT-R2-R6,GP64,GP64-NOT-R2-R6 15; RUN: llc < %s -march=mips64 -mcpu=mips4 | FileCheck %s \ 16; RUN: -check-prefixes=ALL,NOT-R2-R6,GP64,GP64-NOT-R2-R6 17; RUN: llc < %s -march=mips64 -mcpu=mips64 | FileCheck %s \ 18; RUN: -check-prefixes=ALL,NOT-R2-R6,GP64,GP64-NOT-R2-R6 19; RUN: llc < %s -march=mips64 -mcpu=mips64r2 | FileCheck %s \ 20; RUN: -check-prefixes=ALL,R2-R6,GP64,GP64-R2-R6 21; RUN: llc < %s -march=mips64 -mcpu=mips64r3 | FileCheck %s \ 22; RUN: -check-prefixes=ALL,R2-R6,GP64,GP64-R2-R6 23; RUN: llc < %s -march=mips64 -mcpu=mips64r5 | FileCheck %s \ 24; RUN: -check-prefixes=ALL,R2-R6,GP64,GP64-R2-R6 25; RUN: llc < %s -march=mips64 -mcpu=mips64r6 | FileCheck %s \ 26; RUN: -check-prefixes=ALL,R2-R6,GP64,GP64-R2-R6 27; RUN: llc < %s -march=mips -mcpu=mips32r3 -mattr=+micromips -O2 -verify-machineinstrs | FileCheck %s \ 28; RUN: -check-prefixes=ALL,MMR3,MM32 29; RUN: llc < %s -march=mips -mcpu=mips32r6 -mattr=+micromips -O2 | FileCheck %s \ 30; RUN: -check-prefixes=ALL,MMR6,MM32 31 32 33; FIXME: This code sequence is inefficient as it should be 'subu $[[T0]], $zero, $[[T0]'. 34; This sequence is even better as it's a single instruction. See D25485 for the rest of 35; the cases where this sequence occurs. 36 37define signext i1 @add_i1(i1 signext %a, i1 signext %b) { 38entry: 39; ALL-LABEL: add_i1: 40 41 ; NOT-R2-R6: addu $[[T0:[0-9]+]], $4, $5 42 ; NOT-R2-R6: andi $[[T0]], $[[T0]], 1 43 ; NOT-R2-R6: negu $2, $[[T0]] 44 45 ; R2-R6: addu $[[T0:[0-9]+]], $4, $5 46 ; R2-R6: andi $[[T0]], $[[T0]], 1 47 ; R2-R6: negu $2, $[[T0]] 48 49 ; MMR6: addu16 $[[T0:[0-9]+]], $4, $5 50 ; MMR6: andi16 $[[T0]], $[[T0]], 1 51 ; MMR6: li16 $[[T1:[0-9]+]], 0 52 ; MMR6: subu16 $[[T0]], $[[T1]], $[[T0]] 53 54 %r = add i1 %a, %b 55 ret i1 %r 56} 57 58define signext i8 @add_i8(i8 signext %a, i8 signext %b) { 59entry: 60; ALL-LABEL: add_i8: 61 62 ; NOT-R2-R6: addu $[[T0:[0-9]+]], $4, $5 63 ; NOT-R2-R6: sll $[[T0]], $[[T0]], 24 64 ; NOT-R2-R6: sra $2, $[[T0]], 24 65 66 ; R2-R6: addu $[[T0:[0-9]+]], $4, $5 67 ; R2-R6: seb $2, $[[T0:[0-9]+]] 68 69 ; MMR6: addu16 $[[T0:[0-9]+]], $4, $5 70 ; MMR6: seb $2, $[[T0]] 71 72 %r = add i8 %a, %b 73 ret i8 %r 74} 75 76define signext i16 @add_i16(i16 signext %a, i16 signext %b) { 77entry: 78; ALL-LABEL: add_i16: 79 80 ; NOT-R2-R6: addu $[[T0:[0-9]+]], $4, $5 81 ; NOT-R2-R6: sll $[[T0]], $[[T0]], 16 82 ; NOT-R2-R6: sra $2, $[[T0]], 16 83 84 ; R2-R6: addu $[[T0:[0-9]+]], $4, $5 85 ; R2-R6: seh $2, $[[T0]] 86 87 ; MMR6: addu16 $[[T0:[0-9]+]], $4, $5 88 ; MMR6: seh $2, $[[T0]] 89 90 %r = add i16 %a, %b 91 ret i16 %r 92} 93 94define signext i32 @add_i32(i32 signext %a, i32 signext %b) { 95entry: 96; ALL-LABEL: add_i32: 97 98 ; NOT-R2-R6: addu $2, $4, $5 99 ; R2-R6: addu $2, $4, $5 100 101 ; MMR6: addu16 $[[T0:[0-9]+]], $4, $5 102 103 %r = add i32 %a, %b 104 ret i32 %r 105} 106 107define signext i64 @add_i64(i64 signext %a, i64 signext %b) { 108entry: 109; ALL-LABEL: add_i64: 110 111 ; GP32-DAG: addu $[[T0:[0-9]+]], $4, $6 112 ; GP32-DAG: addu $3, $5, $7 113 ; GP32: sltu $[[T1:[0-9]+]], $3, $5 114 ; GP32: addu $2, $[[T0]], $[[T1]] 115 116 ; GP64: daddu $2, $4, $5 117 118 ; MM32-DAG: addu16 $3, $5, $7 119 ; MM32-DAG: addu16 $[[T0:[0-9]+]], $4, $6 120 ; MM32: sltu $[[T1:[0-9]+]], $3, $5 121 ; MM32: addu16 $2, $[[T0]], $[[T1]] 122 123 %r = add i64 %a, %b 124 ret i64 %r 125} 126 127define signext i128 @add_i128(i128 signext %a, i128 signext %b) { 128entry: 129; ALL-LABEL: add_i128: 130 131 ; PRE4: move $[[R1:[0-9]+]], $5 132 ; PRE4: move $[[R2:[0-9]+]], $4 133 ; PRE4: lw $[[R3:[0-9]+]], 24($sp) 134 ; PRE4: addu $[[R4:[0-9]+]], $6, $[[R3]] 135 ; PRE4: lw $[[R5:[0-9]+]], 28($sp) 136 ; PRE4: addu $[[R6:[0-9]+]], $7, $[[R5]] 137 ; PRE4: sltu $[[R7:[0-9]+]], $[[R6]], $7 138 ; PRE4: addu $[[R8:[0-9]+]], $[[R4]], $[[R7]] 139 ; PRE4: xor $[[R9:[0-9]+]], $[[R8]], $6 140 ; PRE4: sltiu $[[R10:[0-9]+]], $[[R9]], 1 141 ; PRE4: bnez $[[R10]], $BB5_2 142 ; PRE4: sltu $[[R7]], $[[R8]], $6 143 ; PRE4: lw $[[R12:[0-9]+]], 20($sp) 144 ; PRE4: addu $[[R13:[0-9]+]], $[[R1]], $[[R12]] 145 ; PRE4: lw $[[R14:[0-9]+]], 16($sp) 146 ; PRE4: addu $[[R15:[0-9]+]], $[[R13]], $[[R7]] 147 ; PRE4: addu $[[R16:[0-9]+]], $[[R2]], $[[R14]] 148 ; PRE4: sltu $[[R17:[0-9]+]], $[[R15]], $[[R13]] 149 ; PRE4: sltu $[[R18:[0-9]+]], $[[R13]], $[[R1]] 150 ; PRE4: addu $[[R19:[0-9]+]], $[[R16]], $[[R18]] 151 ; PRE4: addu $2, $[[R19]], $[[R17]] 152 153 ; GP32-CMOV: lw $[[T0:[0-9]+]], 24($sp) 154 ; GP32-CMOV: addu $[[T1:[0-9]+]], $6, $[[T0]] 155 ; GP32-CMOV: lw $[[T2:[0-9]+]], 28($sp) 156 ; GP32-CMOV: addu $[[T3:[0-9]+]], $7, $[[T2]] 157 ; GP32-CMOV: sltu $[[T4:[0-9]+]], $[[T3]], $7 158 ; GP32-CMOV: addu $[[T5:[0-9]+]], $[[T1]], $[[T4]] 159 ; GP32-CMOV: sltu $[[T6:[0-9]+]], $[[T5]], $6 160 ; GP32-CMOV: xor $[[T7:[0-9]+]], $[[T5]], $6 161 ; GP32-CMOV: movz $[[T8:[0-9]+]], $[[T4]], $[[T7]] 162 ; GP32-CMOV: lw $[[T9:[0-9]+]], 20($sp) 163 ; GP32-CMOV: addu $[[T10:[0-9]+]], $5, $[[T4]] 164 ; GP32-CMOV: addu $[[T11:[0-9]+]], $[[T10]], $[[T8]] 165 ; GP32-CMOV: lw $[[T12:[0-9]+]], 16($sp) 166 ; GP32-CMOV: sltu $[[T13:[0-9]+]], $[[T11]], $[[T10]] 167 ; GP32-CMOV: addu $[[T14:[0-9]+]], $4, $[[T12]] 168 ; GP32-CMOV: sltu $[[T15:[0-9]+]], $[[T10]], $5 169 ; GP32-CMOV: addu $[[T16:[0-9]+]], $[[T14]], $[[T15]] 170 ; GP32-CMOV: addu $[[T17:[0-9]+]], $[[T16]], $[[T13]] 171 ; GP32-CMOV: move $4, $[[T5]] 172 ; GP32-CMOV: move $5, $[[T3]] 173 174 ; GP64: daddu $[[T0:[0-9]+]], $4, $6 175 ; GP64: daddu $[[T1:[0-9]+]], $5, $7 176 ; GP64: sltu $[[T2:[0-9]+]], $[[T1]], $5 177 ; GP64-NOT-R2-R6: dsll $[[T3:[0-9]+]], $[[T2]], 32 178 ; GP64-NOT-R2-R6: dsrl $[[T4:[0-9]+]], $[[T3]], 32 179 ; GP64-R2-R6: dext $[[T4:[0-9]+]], $[[T2]], 0, 32 180 181 ; GP64: daddu $2, $[[T0]], $[[T4]] 182 183 ; MMR3: move $[[T1:[0-9]+]], $5 184 ; MMR3-DAG: lw $[[T2:[0-9]+]], 32($sp) 185 ; MMR3: addu16 $[[T3:[0-9]+]], $6, $[[T2]] 186 ; MMR3-DAG: lw $[[T4:[0-9]+]], 36($sp) 187 ; MMR3: addu16 $[[T5:[0-9]+]], $7, $[[T4]] 188 ; MMR3: sltu $[[T6:[0-9]+]], $[[T5]], $7 189 ; MMR3: addu16 $[[T7:[0-9]+]], $[[T3]], $[[T6]] 190 ; MMR3: sltu $[[T8:[0-9]+]], $[[T7]], $6 191 ; MMR3: xor $[[T9:[0-9]+]], $[[T7]], $6 192 ; MMR3: movz $[[T8]], $[[T6]], $[[T9]] 193 ; MMR3: lw $[[T10:[0-9]+]], 28($sp) 194 ; MMR3: addu16 $[[T11:[0-9]+]], $[[T1]], $[[T10]] 195 ; MMR3: addu16 $[[T12:[0-9]+]], $[[T11]], $[[T8]] 196 ; MMR3: lw $[[T13:[0-9]+]], 24($sp) 197 ; MMR3: sltu $[[T14:[0-9]+]], $[[T12]], $[[T11]] 198 ; MMR3: addu16 $[[T15:[0-9]+]], $4, $[[T13]] 199 ; MMR3: sltu $[[T16:[0-9]+]], $[[T11]], $[[T1]] 200 ; MMR3: addu16 $[[T17:[0-9]+]], $[[T15]], $[[T16]] 201 ; MMR3: addu16 $2, $2, $[[T14]] 202 203 ; MMR6: move $[[T1:[0-9]+]], $5 204 ; MMR6: move $[[T2:[0-9]+]], $4 205 ; MMR6: lw $[[T3:[0-9]+]], 32($sp) 206 ; MMR6: addu16 $[[T4:[0-9]+]], $6, $[[T3]] 207 ; MMR6: lw $[[T5:[0-9]+]], 36($sp) 208 ; MMR6: addu16 $[[T6:[0-9]+]], $7, $[[T5]] 209 ; MMR6: sltu $[[T7:[0-9]+]], $[[T6]], $7 210 ; MMR6: addu16 $[[T8:[0-9]+]], $[[T4]], $7 211 ; MMR6: sltu $[[T9:[0-9]+]], $[[T8]], $6 212 ; MMR6: xor $[[T10:[0-9]+]], $[[T4]], $6 213 ; MMR6: sltiu $[[T11:[0-9]+]], $[[T10]], 1 214 ; MMR6: seleqz $[[T12:[0-9]+]], $[[T9]], $[[T11]] 215 ; MMR6: selnez $[[T13:[0-9]+]], $[[T7]], $[[T11]] 216 ; MMR6: lw $[[T14:[0-9]+]], 24($sp) 217 ; MMR6: or $[[T15:[0-9]+]], $[[T13]], $[[T12]] 218 ; MMR6: addu16 $[[T16:[0-9]+]], $[[T2]], $[[T14]] 219 ; MMR6: lw $[[T17:[0-9]+]], 28($sp) 220 ; MMR6: addu16 $[[T18:[0-9]+]], $[[T1]], $[[T17]] 221 ; MMR6: addu16 $[[T19:[0-9]+]], $[[T18]], $[[T15]] 222 ; MMR6: sltu $[[T20:[0-9]+]], $[[T18]], $[[T1]] 223 ; MMR6: sltu $[[T21:[0-9]+]], $[[T17]], $[[T18]] 224 ; MMR6: addu16 $2, $[[T16]], $[[T20]] 225 ; MMR6: addu16 $2, $[[T20]], $[[T21]] 226 227 %r = add i128 %a, %b 228 ret i128 %r 229} 230 231define signext i1 @add_i1_4(i1 signext %a) { 232; ALL-LABEL: add_i1_4: 233 234 ; ALL: move $2, $4 235 236 %r = add i1 4, %a 237 ret i1 %r 238} 239 240define signext i8 @add_i8_4(i8 signext %a) { 241; ALL-LABEL: add_i8_4: 242 243 ; NOT-R2-R6: sll $[[T0:[0-9]+]], $4, 24 244 ; NOT-R2-R6: lui $[[T1:[0-9]+]], 1024 245 ; NOT-R2-R6: addu $[[T0]], $[[T0]], $[[T1]] 246 ; NOT-R2-R6: sra $2, $[[T0]], 24 247 248 ; R2-R6: addiu $[[T0:[0-9]+]], $4, 4 249 ; R2-R6: seb $2, $[[T0]] 250 251 ; MM32: addiur2 $[[T0:[0-9]+]], $4, 4 252 ; MM32: seb $2, $[[T0]] 253 254 %r = add i8 4, %a 255 ret i8 %r 256} 257 258define signext i16 @add_i16_4(i16 signext %a) { 259; ALL-LABEL: add_i16_4: 260 261 ; NOT-R2-R6: sll $[[T0:[0-9]+]], $4, 16 262 ; NOT-R2-R6: lui $[[T1:[0-9]+]], 4 263 ; NOT-R2-R6: addu $[[T0]], $[[T0]], $[[T1]] 264 ; NOT-R2-R6: sra $2, $[[T0]], 16 265 266 ; R2-R6: addiu $[[T0:[0-9]+]], $4, 4 267 ; R2-R6: seh $2, $[[T0]] 268 269 ; MM32: addiur2 $[[T0:[0-9]+]], $4, 4 270 ; MM32: seh $2, $[[T0]] 271 272 %r = add i16 4, %a 273 ret i16 %r 274} 275 276define signext i32 @add_i32_4(i32 signext %a) { 277; ALL-LABEL: add_i32_4: 278 279 ; GP32: addiu $2, $4, 4 280 281 ; GP64: addiu $2, $4, 4 282 283 ; MM32: addiur2 $2, $4, 4 284 285 %r = add i32 4, %a 286 ret i32 %r 287} 288 289define signext i64 @add_i64_4(i64 signext %a) { 290; ALL-LABEL: add_i64_4: 291 292 ; GP32: addiu $3, $5, 4 293 ; GP32: sltu $[[T0:[0-9]+]], $3, $5 294 ; GP32: addu $2, $4, $[[T0]] 295 296 ; MM32: addiur2 $[[T1:[0-9]+]], $5, 4 297 ; MM32: sltu $[[T2:[0-9]+]], $[[T1]], $5 298 ; MM32: addu16 $2, $4, $[[T2]] 299 300 ; GP64: daddiu $2, $4, 4 301 302 303 %r = add i64 4, %a 304 ret i64 %r 305} 306 307define signext i128 @add_i128_4(i128 signext %a) { 308; ALL-LABEL: add_i128_4: 309 310 ; PRE4: move $[[T0:[0-9]+]], $5 311 ; PRE4: addiu $[[T1:[0-9]+]], $7, 4 312 ; PRE4: sltu $[[T2:[0-9]+]], $[[T1]], $7 313 ; PRE4: xori $[[T3:[0-9]+]], $[[T2]], 1 314 ; PRE4: bnez $[[T3]], $BB[[BB0:[0-9_]+]] 315 ; PRE4: addu $[[T4:[0-9]+]], $6, $[[T2]] 316 ; PRE4: sltu $[[T5:[0-9]+]], $[[T4]], $6 317 ; PRE4; $BB[[BB0:[0-9]+]]: 318 ; PRE4: addu $[[T6:[0-9]+]], $[[T0]], $[[T5]] 319 ; PRE4: sltu $[[T7:[0-9]+]], $[[T6]], $[[T0]] 320 ; PRE4: addu $[[T8:[0-9]+]], $4, $[[T7]] 321 ; PRE4: move $4, $[[T4]] 322 323 ; GP32-CMOV: addiu $[[T0:[0-9]+]], $7, 4 324 ; GP32-CMOV: sltu $[[T1:[0-9]+]], $[[T0]], $7 325 ; GP32-CMOV: addu $[[T2:[0-9]+]], $6, $[[T1]] 326 ; GP32-CMOV: sltu $[[T3:[0-9]+]], $[[T2]], $6 327 ; GP32-CMOV: movz $[[T3]], $[[T1]], $[[T1]] 328 ; GP32-CMOV: addu $[[T4:[0-9]+]], $5, $[[T3]] 329 ; GP32-CMOV: sltu $[[T5:[0-9]+]], $[[T4]], $5 330 ; GP32-CMOV: addu $[[T7:[0-9]+]], $4, $[[T5]] 331 ; GP32-CMOV: move $4, $[[T2]] 332 ; GP32-CMOV: move $5, $[[T0]] 333 334 ; GP64: daddiu $[[T0:[0-9]+]], $5, 4 335 ; GP64: sltu $[[T1:[0-9]+]], $[[T0]], $5 336 ; GP64-NOT-R2-R6: dsll $[[T2:[0-9]+]], $[[T1]], 32 337 ; GP64-NOT-R2-R6: dsrl $[[T3:[0-9]+]], $[[T2]], 32 338 ; GP64-R2-R6: dext $[[T3:[0-9]+]], $[[T1]], 0, 32 339 340 ; GP64: daddu $2, $4, $[[T3]] 341 342 ; MMR3: addiur2 $[[T0:[0-9]+]], $7, 4 343 ; MMR3: sltu $[[T1:[0-9]+]], $[[T0]], $7 344 ; MMR3: addu16 $[[T2:[0-9]+]], $6, $[[T1]] 345 ; MMR3: sltu $[[T3:[0-9]+]], $[[T2]], $6 346 ; MMR3: movz $[[T3]], $[[T1]], $[[T1]] 347 ; MMR3: addu16 $[[T6:[0-9]+]], $5, $[[T3]] 348 ; MMR3: sltu $[[T7:[0-9]+]], $[[T6]], $5 349 ; MMR3: addu16 $2, $4, $[[T7]] 350 351 ; MMR6: addiur2 $[[T1:[0-9]+]], $7, 4 352 ; MMR6: sltu $[[T2:[0-9]+]], $[[T1]], $7 353 ; MMR6: xori $[[T3:[0-9]+]], $[[T2]], 1 354 ; MMR6: selnez $[[T4:[0-9]+]], $[[T2]], $[[T3]] 355 ; MMR6: addu16 $[[T5:[0-9]+]], $6, $[[T2]] 356 ; MMR6: sltu $[[T6:[0-9]+]], $[[T5]], $6 357 ; MMR6: seleqz $[[T7:[0-9]+]], $[[T6]], $[[T3]] 358 ; MMR6: or $[[T8:[0-9]+]], $[[T4]], $[[T7]] 359 ; MMR6: addu16 $[[T9:[0-9]+]], $5, $[[T8]] 360 ; MMR6: sltu $[[T10:[0-9]+]], $[[T9]], $5 361 ; MMR6: addu16 $[[T11:[0-9]+]], $4, $[[T10]] 362 ; MMR6: move $4, $7 363 ; MMR6: move $5, $[[T1]] 364 365 %r = add i128 4, %a 366 ret i128 %r 367} 368 369define signext i1 @add_i1_3(i1 signext %a) { 370; ALL-LABEL: add_i1_3: 371 ; GP32: addiu $[[T0:[0-9]+]], $4, 1 372 ; GP32: andi $[[T0]], $[[T0]], 1 373 ; GP32: negu $2, $[[T0]] 374 375 ; GP64: addiu $[[T0:[0-9]+]], $4, 1 376 ; GP64: andi $[[T0]], $[[T0]], 1 377 ; GP64: negu $2, $[[T0]] 378 379 ; MMR6: addiur2 $[[T0:[0-9]+]], $4, 1 380 ; MMR6: andi16 $[[T0]], $[[T0]], 1 381 ; MMR6: li16 $[[T1:[0-9]+]], 0 382 ; MMR6: subu16 $2, $[[T1]], $[[T0]] 383 384 %r = add i1 3, %a 385 ret i1 %r 386} 387 388define signext i8 @add_i8_3(i8 signext %a) { 389; ALL-LABEL: add_i8_3: 390 391 ; NOT-R2-R6: sll $[[T0:[0-9]+]], $4, 24 392 ; NOT-R2-R6: lui $[[T1:[0-9]+]], 768 393 ; NOT-R2-R6: addu $[[T0]], $[[T0]], $[[T1]] 394 ; NOT-R2-R6: sra $2, $[[T0]], 24 395 396 ; R2-R6: addiu $[[T0:[0-9]+]], $4, 3 397 ; R2-R6: seb $2, $[[T0]] 398 399 ; MMR6: addius5 $[[T0:[0-9]+]], 3 400 ; MMR6: seb $2, $[[T0]] 401 402 %r = add i8 3, %a 403 ret i8 %r 404} 405 406define signext i16 @add_i16_3(i16 signext %a) { 407; ALL-LABEL: add_i16_3: 408 409 ; NOT-R2-R6: sll $[[T0:[0-9]+]], $4, 16 410 ; NOT-R2-R6: lui $[[T1:[0-9]+]], 3 411 ; NOT-R2-R6: addu $[[T0]], $[[T0]], $[[T1]] 412 ; NOT-R2-R6: sra $2, $[[T0]], 16 413 414 ; R2-R6: addiu $[[T0:[0-9]+]], $4, 3 415 ; R2-R6: seh $2, $[[T0]] 416 417 ; MMR6: addius5 $[[T0:[0-9]+]], 3 418 ; MMR6: seh $2, $[[T0]] 419 420 %r = add i16 3, %a 421 ret i16 %r 422} 423 424define signext i32 @add_i32_3(i32 signext %a) { 425; ALL-LABEL: add_i32_3: 426 427 ; NOT-R2-R6: addiu $2, $4, 3 428 429 ; R2-R6: addiu $2, $4, 3 430 431 ; MMR6: addius5 $[[T0:[0-9]+]], 3 432 ; MMR6: move $2, $[[T0]] 433 434 %r = add i32 3, %a 435 ret i32 %r 436} 437 438define signext i64 @add_i64_3(i64 signext %a) { 439; ALL-LABEL: add_i64_3: 440 441 ; GP32: addiu $[[T0:[0-9]+]], $5, 3 442 ; GP32: sltu $[[T1:[0-9]+]], $[[T0]], $5 443 ; GP32: addu $2, $4, $[[T1]] 444 445 ; GP64: daddiu $2, $4, 3 446 447 ; MM32: move $[[T1:[0-9]+]], $5 448 ; MM32: addius5 $[[T1]], 3 449 ; MM32: sltu $[[T2:[0-9]+]], $[[T1]], $5 450 ; MM32: addu16 $2, $4, $[[T2]] 451 452 %r = add i64 3, %a 453 ret i64 %r 454} 455 456define signext i128 @add_i128_3(i128 signext %a) { 457; ALL-LABEL: add_i128_3: 458 459 ; PRE4: move $[[T0:[0-9]+]], $5 460 ; PRE4: addiu $[[T1:[0-9]+]], $7, 3 461 ; PRE4: sltu $[[T2:[0-9]+]], $[[T1]], $7 462 ; PRE4: xori $[[T3:[0-9]+]], $[[T2]], 1 463 ; PRE4: bnez $[[T3]], $BB[[BB0:[0-9_]+]] 464 ; PRE4: addu $[[T4:[0-9]+]], $6, $[[T2]] 465 ; PRE4: sltu $[[T5:[0-9]+]], $[[T4]], $6 466 ; PRE4; $BB[[BB0:[0-9]+]]: 467 ; PRE4: addu $[[T6:[0-9]+]], $[[T0]], $[[T5]] 468 ; PRE4: sltu $[[T7:[0-9]+]], $[[T6]], $[[T0]] 469 ; PRE4: addu $[[T8:[0-9]+]], $4, $[[T7]] 470 ; PRE4: move $4, $[[T4]] 471 472 ; GP32-CMOV: addiu $[[T0:[0-9]+]], $7, 3 473 ; GP32-CMOV: sltu $[[T1:[0-9]+]], $[[T0]], $7 474 ; GP32-CMOV: addu $[[T2:[0-9]+]], $6, $[[T1]] 475 ; GP32-CMOV: sltu $[[T3:[0-9]+]], $[[T2]], $6 476 ; GP32-CMOV: movz $[[T3]], $[[T1]], $[[T1]] 477 ; GP32-CMOV: addu $[[T4:[0-9]+]], $5, $[[T3]] 478 ; GP32-CMOV: sltu $[[T5:[0-9]+]], $[[T4]], $5 479 ; GP32-CMOV: addu $[[T7:[0-9]+]], $4, $[[T5]] 480 ; GP32-CMOV: move $4, $[[T2]] 481 ; GP32-CMOV: move $5, $[[T0]] 482 483 ; GP64: daddiu $[[T0:[0-9]+]], $5, 3 484 ; GP64: sltu $[[T1:[0-9]+]], $[[T0]], $5 485 486 ; GP64-NOT-R2-R6: dsll $[[T2:[0-9]+]], $[[T1]], 32 487 ; GP64-NOT-R2-R6: dsrl $[[T3:[0-9]+]], $[[T2]], 32 488 ; GP64-R2-R6: dext $[[T3:[0-9]+]], $[[T1]], 0, 32 489 490 ; GP64: daddu $2, $4, $[[T3]] 491 492 ; MMR3: move $[[T1:[0-9]+]], $7 493 ; MMR3: addius5 $[[T1]], 3 494 ; MMR3: sltu $[[T2:[0-9]+]], $[[T1]], $7 495 ; MMR3: addu16 $[[T3:[0-9]+]], $6, $[[T2]] 496 ; MMR3: sltu $[[T4:[0-9]+]], $[[T3]], $6 497 ; MMR3: movz $[[T4]], $[[T2]], $[[T2]] 498 ; MMR3: addu16 $[[T5:[0-9]+]], $5, $[[T4]] 499 ; MMR3: sltu $[[T6:[0-9]+]], $[[T5]], $5 500 ; MMR3: addu16 $2, $4, $[[T6]] 501 502 ; MMR6: move $[[T1:[0-9]+]], $7 503 ; MMR6: addius5 $[[T1]], 3 504 ; MMR6: sltu $[[T2:[0-9]+]], $[[T1]], $7 505 ; MMR6: xori $[[T3:[0-9]+]], $[[T2]], 1 506 ; MMR6: selnez $[[T4:[0-9]+]], $[[T2]], $[[T3]] 507 ; MMR6: addu16 $[[T5:[0-9]+]], $6, $[[T2]] 508 ; MMR6: sltu $[[T6:[0-9]+]], $[[T5]], $6 509 ; MMR6: seleqz $[[T7:[0-9]+]], $[[T6]], $[[T3]] 510 ; MMR6: or $[[T8:[0-9]+]], $[[T4]], $[[T7]] 511 ; MMR6: addu16 $[[T9:[0-9]+]], $5, $[[T8]] 512 ; MMR6: sltu $[[T10:[0-9]+]], $[[T9]], $5 513 ; MMR6: addu16 $[[T11:[0-9]+]], $4, $[[T10]] 514 ; MMR6: move $4, $[[T5]] 515 ; MMR6: move $5, $[[T1]] 516 517 %r = add i128 3, %a 518 ret i128 %r 519} 520