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: sllv $2, $4, $1 311; MIPS32-NEXT: jr $ra 312; MIPS32-NEXT: nop 313entry: 314 %shl = shl i16 %a, 2 315 ret i16 %shl 316} 317 318define i8 @ashr_i8(i8 %a) { 319; MIPS32-LABEL: ashr_i8: 320; MIPS32: # %bb.0: # %entry 321; MIPS32-NEXT: ori $2, $zero, 2 322; MIPS32-NEXT: sll $1, $4, 24 323; MIPS32-NEXT: sra $1, $1, 24 324; MIPS32-NEXT: srav $2, $1, $2 325; MIPS32-NEXT: jr $ra 326; MIPS32-NEXT: nop 327entry: 328 %0 = ashr i8 %a, 2 329 ret i8 %0 330} 331 332define i16 @lshr_i16(i16 %a) { 333; MIPS32-LABEL: lshr_i16: 334; MIPS32: # %bb.0: # %entry 335; MIPS32-NEXT: ori $2, $zero, 2 336; MIPS32-NEXT: andi $1, $4, 65535 337; MIPS32-NEXT: srlv $2, $1, $2 338; MIPS32-NEXT: jr $ra 339; MIPS32-NEXT: nop 340entry: 341 %0 = lshr i16 %a, 2 342 ret i16 %0 343} 344 345define i64 @shl_i64(i64 %a, i64 %b) { 346; MIPS32-LABEL: shl_i64: 347; MIPS32: # %bb.0: # %entry 348; MIPS32-NEXT: move $3, $4 349; MIPS32-NEXT: move $9, $6 350; MIPS32-NEXT: ori $1, $zero, 32 351; MIPS32-NEXT: subu $8, $9, $1 352; MIPS32-NEXT: subu $4, $1, $9 353; MIPS32-NEXT: ori $2, $zero, 0 354; MIPS32-NEXT: sltu $6, $9, $1 355; MIPS32-NEXT: sltiu $1, $9, 1 356; MIPS32-NEXT: sllv $7, $3, $9 357; MIPS32-NEXT: srlv $4, $3, $4 358; MIPS32-NEXT: sllv $9, $5, $9 359; MIPS32-NEXT: or $4, $4, $9 360; MIPS32-NEXT: sllv $3, $3, $8 361; MIPS32-NEXT: andi $8, $6, 1 362; MIPS32-NEXT: movn $2, $7, $8 363; MIPS32-NEXT: andi $6, $6, 1 364; MIPS32-NEXT: movn $3, $4, $6 365; MIPS32-NEXT: andi $1, $1, 1 366; MIPS32-NEXT: movn $3, $5, $1 367; MIPS32-NEXT: jr $ra 368; MIPS32-NEXT: nop 369entry: 370 %shl = shl i64 %a, %b 371 ret i64 %shl 372} 373 374define i64 @ashl_i64(i64 %a, i64 %b) { 375; MIPS32-LABEL: ashl_i64: 376; MIPS32: # %bb.0: # %entry 377; MIPS32-NEXT: addiu $sp, $sp, -8 378; MIPS32-NEXT: .cfi_def_cfa_offset 8 379; MIPS32-NEXT: sw $4, 4($sp) # 4-byte Folded Spill 380; MIPS32-NEXT: move $2, $5 381; MIPS32-NEXT: lw $5, 4($sp) # 4-byte Folded Reload 382; MIPS32-NEXT: move $3, $6 383; MIPS32-NEXT: ori $1, $zero, 32 384; MIPS32-NEXT: subu $8, $3, $1 385; MIPS32-NEXT: subu $7, $1, $3 386; MIPS32-NEXT: sltu $4, $3, $1 387; MIPS32-NEXT: sltiu $6, $3, 1 388; MIPS32-NEXT: srav $1, $2, $3 389; MIPS32-NEXT: srlv $3, $5, $3 390; MIPS32-NEXT: sllv $7, $2, $7 391; MIPS32-NEXT: or $7, $3, $7 392; MIPS32-NEXT: sra $3, $2, 31 393; MIPS32-NEXT: srav $2, $2, $8 394; MIPS32-NEXT: andi $8, $4, 1 395; MIPS32-NEXT: movn $2, $7, $8 396; MIPS32-NEXT: andi $6, $6, 1 397; MIPS32-NEXT: movn $2, $5, $6 398; MIPS32-NEXT: andi $4, $4, 1 399; MIPS32-NEXT: movn $3, $1, $4 400; MIPS32-NEXT: addiu $sp, $sp, 8 401; MIPS32-NEXT: jr $ra 402; MIPS32-NEXT: nop 403entry: 404 %shr = ashr i64 %a, %b 405 ret i64 %shr 406} 407 408define i64 @lshr_i64(i64 %a, i64 %b) { 409; MIPS32-LABEL: lshr_i64: 410; MIPS32: # %bb.0: # %entry 411; MIPS32-NEXT: addiu $sp, $sp, -8 412; MIPS32-NEXT: .cfi_def_cfa_offset 8 413; MIPS32-NEXT: sw $4, 4($sp) # 4-byte Folded Spill 414; MIPS32-NEXT: move $2, $5 415; MIPS32-NEXT: lw $5, 4($sp) # 4-byte Folded Reload 416; MIPS32-NEXT: move $7, $6 417; MIPS32-NEXT: ori $1, $zero, 32 418; MIPS32-NEXT: subu $8, $7, $1 419; MIPS32-NEXT: subu $9, $1, $7 420; MIPS32-NEXT: ori $3, $zero, 0 421; MIPS32-NEXT: sltu $4, $7, $1 422; MIPS32-NEXT: sltiu $6, $7, 1 423; MIPS32-NEXT: srlv $1, $2, $7 424; MIPS32-NEXT: srlv $7, $5, $7 425; MIPS32-NEXT: sllv $9, $2, $9 426; MIPS32-NEXT: or $7, $7, $9 427; MIPS32-NEXT: srlv $2, $2, $8 428; MIPS32-NEXT: andi $8, $4, 1 429; MIPS32-NEXT: movn $2, $7, $8 430; MIPS32-NEXT: andi $6, $6, 1 431; MIPS32-NEXT: movn $2, $5, $6 432; MIPS32-NEXT: andi $4, $4, 1 433; MIPS32-NEXT: movn $3, $1, $4 434; MIPS32-NEXT: addiu $sp, $sp, 8 435; MIPS32-NEXT: jr $ra 436; MIPS32-NEXT: nop 437entry: 438 %shr = lshr i64 %a, %b 439 ret i64 %shr 440} 441