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 3 4define i1 @and_i1(i1 %a, i1 %b) { 5; MIPS32-LABEL: and_i1: 6; MIPS32: # %bb.0: # %entry 7; MIPS32-NEXT: and $2, $5, $4 8; MIPS32-NEXT: jr $ra 9; MIPS32-NEXT: nop 10entry: 11 %and = and i1 %b, %a 12 ret i1 %and 13} 14 15define i8 @and_i8(i8 %a, i8 %b) { 16; MIPS32-LABEL: and_i8: 17; MIPS32: # %bb.0: # %entry 18; MIPS32-NEXT: and $2, $5, $4 19; MIPS32-NEXT: jr $ra 20; MIPS32-NEXT: nop 21entry: 22 %and = and i8 %b, %a 23 ret i8 %and 24} 25 26define i16 @and_i16(i16 %a, i16 %b) { 27; MIPS32-LABEL: and_i16: 28; MIPS32: # %bb.0: # %entry 29; MIPS32-NEXT: and $2, $5, $4 30; MIPS32-NEXT: jr $ra 31; MIPS32-NEXT: nop 32entry: 33 %and = and i16 %b, %a 34 ret i16 %and 35} 36 37define i32 @and_i32(i32 %a, i32 %b) { 38; MIPS32-LABEL: and_i32: 39; MIPS32: # %bb.0: # %entry 40; MIPS32-NEXT: and $2, $5, $4 41; MIPS32-NEXT: jr $ra 42; MIPS32-NEXT: nop 43entry: 44 %and = and i32 %b, %a 45 ret i32 %and 46} 47 48define i64 @and_i64(i64 %a, i64 %b) { 49; MIPS32-LABEL: and_i64: 50; MIPS32: # %bb.0: # %entry 51; MIPS32-NEXT: and $2, $6, $4 52; MIPS32-NEXT: and $3, $7, $5 53; MIPS32-NEXT: jr $ra 54; MIPS32-NEXT: nop 55entry: 56 %and = and i64 %b, %a 57 ret i64 %and 58} 59 60define i32 @and_imm(i32 %a) { 61; MIPS32-LABEL: and_imm: 62; MIPS32: # %bb.0: # %entry 63; MIPS32-NEXT: andi $2, $4, 255 64; MIPS32-NEXT: jr $ra 65; MIPS32-NEXT: nop 66entry: 67 %and = and i32 %a, 255 68 ret i32 %and 69} 70 71define i32 @and_not_imm32ZExt16(i32 %a) { 72; MIPS32-LABEL: and_not_imm32ZExt16: 73; MIPS32: # %bb.0: # %entry 74; MIPS32-NEXT: addiu $1, $zero, 65280 75; MIPS32-NEXT: and $2, $4, $1 76; MIPS32-NEXT: jr $ra 77; MIPS32-NEXT: nop 78entry: 79 %and = and i32 %a, -256 80 ret i32 %and 81} 82 83define i1 @or_i1(i1 %a, i1 %b) { 84; MIPS32-LABEL: or_i1: 85; MIPS32: # %bb.0: # %entry 86; MIPS32-NEXT: or $2, $5, $4 87; MIPS32-NEXT: jr $ra 88; MIPS32-NEXT: nop 89entry: 90 %or = or i1 %b, %a 91 ret i1 %or 92} 93 94define i8 @or_i8(i8 %a, i8 %b) { 95; MIPS32-LABEL: or_i8: 96; MIPS32: # %bb.0: # %entry 97; MIPS32-NEXT: or $2, $5, $4 98; MIPS32-NEXT: jr $ra 99; MIPS32-NEXT: nop 100entry: 101 %or = or i8 %b, %a 102 ret i8 %or 103} 104 105define i16 @or_i16(i16 %a, i16 %b) { 106; MIPS32-LABEL: or_i16: 107; MIPS32: # %bb.0: # %entry 108; MIPS32-NEXT: or $2, $5, $4 109; MIPS32-NEXT: jr $ra 110; MIPS32-NEXT: nop 111entry: 112 %or = or i16 %b, %a 113 ret i16 %or 114} 115 116define i32 @or_i32(i32 %a, i32 %b) { 117; MIPS32-LABEL: or_i32: 118; MIPS32: # %bb.0: # %entry 119; MIPS32-NEXT: or $2, $5, $4 120; MIPS32-NEXT: jr $ra 121; MIPS32-NEXT: nop 122entry: 123 %or = or i32 %b, %a 124 ret i32 %or 125} 126 127define i64 @or_i64(i64 %a, i64 %b) { 128; MIPS32-LABEL: or_i64: 129; MIPS32: # %bb.0: # %entry 130; MIPS32-NEXT: or $2, $6, $4 131; MIPS32-NEXT: or $3, $7, $5 132; MIPS32-NEXT: jr $ra 133; MIPS32-NEXT: nop 134entry: 135 %or = or i64 %b, %a 136 ret i64 %or 137} 138 139define i32 @or_imm(i32 %a) { 140; MIPS32-LABEL: or_imm: 141; MIPS32: # %bb.0: # %entry 142; MIPS32-NEXT: ori $2, $4, 65535 143; MIPS32-NEXT: jr $ra 144; MIPS32-NEXT: nop 145entry: 146 %or = or i32 %a, 65535 147 ret i32 %or 148} 149 150define i32 @or_not_imm32ZExt16(i32 %a) { 151; MIPS32-LABEL: or_not_imm32ZExt16: 152; MIPS32: # %bb.0: # %entry 153; MIPS32-NEXT: lui $1, 1 154; MIPS32-NEXT: or $2, $4, $1 155; MIPS32-NEXT: jr $ra 156; MIPS32-NEXT: nop 157entry: 158 %or = or i32 %a, 65536 159 ret i32 %or 160} 161 162define i1 @xor_i1(i1 %a, i1 %b) { 163; MIPS32-LABEL: xor_i1: 164; MIPS32: # %bb.0: # %entry 165; MIPS32-NEXT: xor $2, $5, $4 166; MIPS32-NEXT: jr $ra 167; MIPS32-NEXT: nop 168entry: 169 %xor = xor i1 %b, %a 170 ret i1 %xor 171} 172 173define i8 @xor_i8(i8 %a, i8 %b) { 174; MIPS32-LABEL: xor_i8: 175; MIPS32: # %bb.0: # %entry 176; MIPS32-NEXT: xor $2, $5, $4 177; MIPS32-NEXT: jr $ra 178; MIPS32-NEXT: nop 179entry: 180 %xor = xor i8 %b, %a 181 ret i8 %xor 182} 183 184define i16 @xor_i16(i16 %a, i16 %b) { 185; MIPS32-LABEL: xor_i16: 186; MIPS32: # %bb.0: # %entry 187; MIPS32-NEXT: xor $2, $5, $4 188; MIPS32-NEXT: jr $ra 189; MIPS32-NEXT: nop 190entry: 191 %xor = xor i16 %b, %a 192 ret i16 %xor 193} 194 195define i32 @xor_i32(i32 %a, i32 %b) { 196; MIPS32-LABEL: xor_i32: 197; MIPS32: # %bb.0: # %entry 198; MIPS32-NEXT: xor $2, $5, $4 199; MIPS32-NEXT: jr $ra 200; MIPS32-NEXT: nop 201entry: 202 %xor = xor i32 %b, %a 203 ret i32 %xor 204} 205 206define i64 @xor_i64(i64 %a, i64 %b) { 207; MIPS32-LABEL: xor_i64: 208; MIPS32: # %bb.0: # %entry 209; MIPS32-NEXT: xor $2, $6, $4 210; MIPS32-NEXT: xor $3, $7, $5 211; MIPS32-NEXT: jr $ra 212; MIPS32-NEXT: nop 213entry: 214 %xor = xor i64 %b, %a 215 ret i64 %xor 216} 217 218define i32 @xor_imm(i32 %a) { 219; MIPS32-LABEL: xor_imm: 220; MIPS32: # %bb.0: # %entry 221; MIPS32-NEXT: xori $2, $4, 1 222; MIPS32-NEXT: jr $ra 223; MIPS32-NEXT: nop 224entry: 225 %xor = xor i32 %a, 1 226 ret i32 %xor 227} 228 229define i32 @xor_not_imm32ZExt16(i32 %a) { 230; MIPS32-LABEL: xor_not_imm32ZExt16: 231; MIPS32: # %bb.0: # %entry 232; MIPS32-NEXT: not $2, $4 233; MIPS32-NEXT: jr $ra 234; MIPS32-NEXT: nop 235entry: 236 %xor = xor i32 %a, -1 237 ret i32 %xor 238} 239 240define i32 @shl(i32 %a) { 241; MIPS32-LABEL: shl: 242; MIPS32: # %bb.0: # %entry 243; MIPS32-NEXT: sll $2, $4, 1 244; MIPS32-NEXT: jr $ra 245; MIPS32-NEXT: nop 246entry: 247 %shl = shl i32 %a, 1 248 ret i32 %shl 249} 250 251define i32 @ashr(i32 %a) { 252; MIPS32-LABEL: ashr: 253; MIPS32: # %bb.0: # %entry 254; MIPS32-NEXT: sra $2, $4, 1 255; MIPS32-NEXT: jr $ra 256; MIPS32-NEXT: nop 257entry: 258 %shr = ashr i32 %a, 1 259 ret i32 %shr 260} 261 262define i32 @lshr(i32 %a) { 263; MIPS32-LABEL: lshr: 264; MIPS32: # %bb.0: # %entry 265; MIPS32-NEXT: srl $2, $4, 1 266; MIPS32-NEXT: jr $ra 267; MIPS32-NEXT: nop 268entry: 269 %shr = lshr i32 %a, 1 270 ret i32 %shr 271} 272 273define i32 @shlv(i32 %a, i32 %b) { 274; MIPS32-LABEL: shlv: 275; MIPS32: # %bb.0: # %entry 276; MIPS32-NEXT: sllv $2, $4, $5 277; MIPS32-NEXT: jr $ra 278; MIPS32-NEXT: nop 279entry: 280 %shl = shl i32 %a, %b 281 ret i32 %shl 282} 283 284define i32 @ashrv(i32 %a, i32 %b) { 285; MIPS32-LABEL: ashrv: 286; MIPS32: # %bb.0: # %entry 287; MIPS32-NEXT: srav $2, $4, $5 288; MIPS32-NEXT: jr $ra 289; MIPS32-NEXT: nop 290entry: 291 %shr = ashr i32 %a, %b 292 ret i32 %shr 293} 294 295define i32 @lshrv(i32 %a, i32 %b) { 296; MIPS32-LABEL: lshrv: 297; MIPS32: # %bb.0: # %entry 298; MIPS32-NEXT: srlv $2, $4, $5 299; MIPS32-NEXT: jr $ra 300; MIPS32-NEXT: nop 301entry: 302 %shr = lshr i32 %a, %b 303 ret i32 %shr 304} 305 306define i16 @shl_i16(i16 %a) { 307; MIPS32-LABEL: shl_i16: 308; MIPS32: # %bb.0: # %entry 309; MIPS32-NEXT: ori $1, $zero, 2 310; MIPS32-NEXT: andi $1, $1, 65535 311; MIPS32-NEXT: sllv $2, $4, $1 312; MIPS32-NEXT: jr $ra 313; MIPS32-NEXT: nop 314entry: 315 %shl = shl i16 %a, 2 316 ret i16 %shl 317} 318 319define i8 @ashr_i8(i8 %a) { 320; MIPS32-LABEL: ashr_i8: 321; MIPS32: # %bb.0: # %entry 322; MIPS32-NEXT: ori $1, $zero, 2 323; MIPS32-NEXT: andi $2, $1, 255 324; MIPS32-NEXT: sll $1, $4, 24 325; MIPS32-NEXT: sra $1, $1, 24 326; MIPS32-NEXT: srav $2, $1, $2 327; MIPS32-NEXT: jr $ra 328; MIPS32-NEXT: nop 329entry: 330 %0 = ashr i8 %a, 2 331 ret i8 %0 332} 333 334define i16 @lshr_i16(i16 %a) { 335; MIPS32-LABEL: lshr_i16: 336; MIPS32: # %bb.0: # %entry 337; MIPS32-NEXT: ori $1, $zero, 2 338; MIPS32-NEXT: andi $2, $1, 65535 339; MIPS32-NEXT: andi $1, $4, 65535 340; MIPS32-NEXT: srlv $2, $1, $2 341; MIPS32-NEXT: jr $ra 342; MIPS32-NEXT: nop 343entry: 344 %0 = lshr i16 %a, 2 345 ret i16 %0 346} 347 348define i64 @shl_i64(i64 %a, i64 %b) { 349; MIPS32-LABEL: shl_i64: 350; MIPS32: # %bb.0: # %entry 351; MIPS32-NEXT: move $3, $4 352; MIPS32-NEXT: move $9, $6 353; MIPS32-NEXT: ori $1, $zero, 32 354; MIPS32-NEXT: subu $8, $9, $1 355; MIPS32-NEXT: subu $4, $1, $9 356; MIPS32-NEXT: ori $2, $zero, 0 357; MIPS32-NEXT: sltu $6, $9, $1 358; MIPS32-NEXT: sltiu $1, $9, 1 359; MIPS32-NEXT: sllv $7, $3, $9 360; MIPS32-NEXT: srlv $4, $3, $4 361; MIPS32-NEXT: sllv $9, $5, $9 362; MIPS32-NEXT: or $4, $4, $9 363; MIPS32-NEXT: sllv $3, $3, $8 364; MIPS32-NEXT: andi $8, $6, 1 365; MIPS32-NEXT: movn $2, $7, $8 366; MIPS32-NEXT: andi $6, $6, 1 367; MIPS32-NEXT: movn $3, $4, $6 368; MIPS32-NEXT: andi $1, $1, 1 369; MIPS32-NEXT: movn $3, $5, $1 370; MIPS32-NEXT: jr $ra 371; MIPS32-NEXT: nop 372entry: 373 %shl = shl i64 %a, %b 374 ret i64 %shl 375} 376 377define i64 @ashl_i64(i64 %a, i64 %b) { 378; MIPS32-LABEL: ashl_i64: 379; MIPS32: # %bb.0: # %entry 380; MIPS32-NEXT: addiu $sp, $sp, -8 381; MIPS32-NEXT: .cfi_def_cfa_offset 8 382; MIPS32-NEXT: sw $4, 4($sp) # 4-byte Folded Spill 383; MIPS32-NEXT: move $2, $5 384; MIPS32-NEXT: lw $5, 4($sp) # 4-byte Folded Reload 385; MIPS32-NEXT: move $3, $6 386; MIPS32-NEXT: ori $1, $zero, 32 387; MIPS32-NEXT: subu $8, $3, $1 388; MIPS32-NEXT: subu $7, $1, $3 389; MIPS32-NEXT: sltu $4, $3, $1 390; MIPS32-NEXT: sltiu $6, $3, 1 391; MIPS32-NEXT: srav $1, $2, $3 392; MIPS32-NEXT: srlv $3, $5, $3 393; MIPS32-NEXT: sllv $7, $2, $7 394; MIPS32-NEXT: or $7, $3, $7 395; MIPS32-NEXT: sra $3, $2, 31 396; MIPS32-NEXT: srav $2, $2, $8 397; MIPS32-NEXT: andi $8, $4, 1 398; MIPS32-NEXT: movn $2, $7, $8 399; MIPS32-NEXT: andi $6, $6, 1 400; MIPS32-NEXT: movn $2, $5, $6 401; MIPS32-NEXT: andi $4, $4, 1 402; MIPS32-NEXT: movn $3, $1, $4 403; MIPS32-NEXT: addiu $sp, $sp, 8 404; MIPS32-NEXT: jr $ra 405; MIPS32-NEXT: nop 406entry: 407 %shr = ashr i64 %a, %b 408 ret i64 %shr 409} 410 411define i64 @lshr_i64(i64 %a, i64 %b) { 412; MIPS32-LABEL: lshr_i64: 413; MIPS32: # %bb.0: # %entry 414; MIPS32-NEXT: addiu $sp, $sp, -8 415; MIPS32-NEXT: .cfi_def_cfa_offset 8 416; MIPS32-NEXT: sw $4, 4($sp) # 4-byte Folded Spill 417; MIPS32-NEXT: move $2, $5 418; MIPS32-NEXT: lw $5, 4($sp) # 4-byte Folded Reload 419; MIPS32-NEXT: move $7, $6 420; MIPS32-NEXT: ori $1, $zero, 32 421; MIPS32-NEXT: subu $8, $7, $1 422; MIPS32-NEXT: subu $9, $1, $7 423; MIPS32-NEXT: ori $3, $zero, 0 424; MIPS32-NEXT: sltu $4, $7, $1 425; MIPS32-NEXT: sltiu $6, $7, 1 426; MIPS32-NEXT: srlv $1, $2, $7 427; MIPS32-NEXT: srlv $7, $5, $7 428; MIPS32-NEXT: sllv $9, $2, $9 429; MIPS32-NEXT: or $7, $7, $9 430; MIPS32-NEXT: srlv $2, $2, $8 431; MIPS32-NEXT: andi $8, $4, 1 432; MIPS32-NEXT: movn $2, $7, $8 433; MIPS32-NEXT: andi $6, $6, 1 434; MIPS32-NEXT: movn $2, $5, $6 435; MIPS32-NEXT: andi $4, $4, 1 436; MIPS32-NEXT: movn $3, $1, $4 437; MIPS32-NEXT: addiu $sp, $sp, 8 438; MIPS32-NEXT: jr $ra 439; MIPS32-NEXT: nop 440entry: 441 %shr = lshr i64 %a, %b 442 ret i64 %shr 443} 444