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 4; sdiv 5define signext i8 @sdiv_i8(i8 signext %a, i8 signext %b) { 6; MIPS32-LABEL: sdiv_i8: 7; MIPS32: # %bb.0: # %entry 8; MIPS32-NEXT: div $zero, $5, $4 9; MIPS32-NEXT: teq $4, $zero, 7 10; MIPS32-NEXT: mflo $1 11; MIPS32-NEXT: sll $1, $1, 24 12; MIPS32-NEXT: sra $2, $1, 24 13; MIPS32-NEXT: jr $ra 14; MIPS32-NEXT: nop 15entry: 16 %div = sdiv i8 %b, %a 17 ret i8 %div 18} 19 20define signext i16 @sdiv_i16(i16 signext %a, i16 signext %b) { 21; MIPS32-LABEL: sdiv_i16: 22; MIPS32: # %bb.0: # %entry 23; MIPS32-NEXT: div $zero, $5, $4 24; MIPS32-NEXT: teq $4, $zero, 7 25; MIPS32-NEXT: mflo $1 26; MIPS32-NEXT: sll $1, $1, 16 27; MIPS32-NEXT: sra $2, $1, 16 28; MIPS32-NEXT: jr $ra 29; MIPS32-NEXT: nop 30entry: 31 %div = sdiv i16 %b, %a 32 ret i16 %div 33} 34 35define signext i32 @sdiv_i32(i32 signext %a, i32 signext %b) { 36; MIPS32-LABEL: sdiv_i32: 37; MIPS32: # %bb.0: # %entry 38; MIPS32-NEXT: div $zero, $5, $4 39; MIPS32-NEXT: teq $4, $zero, 7 40; MIPS32-NEXT: mflo $2 41; MIPS32-NEXT: jr $ra 42; MIPS32-NEXT: nop 43entry: 44 %div = sdiv i32 %b, %a 45 ret i32 %div 46} 47 48define signext i64 @sdiv_i64(i64 signext %a, i64 signext %b) { 49; MIPS32-LABEL: sdiv_i64: 50; MIPS32: # %bb.0: # %entry 51; MIPS32-NEXT: addiu $sp, $sp, -32 52; MIPS32-NEXT: .cfi_def_cfa_offset 32 53; MIPS32-NEXT: sw $ra, 28($sp) # 4-byte Folded Spill 54; MIPS32-NEXT: .cfi_offset 31, -4 55; MIPS32-NEXT: sw $4, 20($sp) # 4-byte Folded Spill 56; MIPS32-NEXT: sw $5, 24($sp) # 4-byte Folded Spill 57; MIPS32-NEXT: move $4, $6 58; MIPS32-NEXT: lw $6, 20($sp) # 4-byte Folded Reload 59; MIPS32-NEXT: move $5, $7 60; MIPS32-NEXT: lw $7, 24($sp) # 4-byte Folded Reload 61; MIPS32-NEXT: jal __divdi3 62; MIPS32-NEXT: nop 63; MIPS32-NEXT: lw $ra, 28($sp) # 4-byte Folded Reload 64; MIPS32-NEXT: addiu $sp, $sp, 32 65; MIPS32-NEXT: jr $ra 66; MIPS32-NEXT: nop 67entry: 68 %div = sdiv i64 %b, %a 69 ret i64 %div 70} 71 72; srem 73define signext i8 @srem_i8(i8 signext %a, i8 signext %b) { 74; MIPS32-LABEL: srem_i8: 75; MIPS32: # %bb.0: # %entry 76; MIPS32-NEXT: div $zero, $5, $4 77; MIPS32-NEXT: teq $4, $zero, 7 78; MIPS32-NEXT: mflo $1 79; MIPS32-NEXT: sll $1, $1, 24 80; MIPS32-NEXT: sra $2, $1, 24 81; MIPS32-NEXT: jr $ra 82; MIPS32-NEXT: nop 83entry: 84 %div = sdiv i8 %b, %a 85 ret i8 %div 86} 87 88define signext i16 @srem_i16(i16 signext %a, i16 signext %b) { 89; MIPS32-LABEL: srem_i16: 90; MIPS32: # %bb.0: # %entry 91; MIPS32-NEXT: div $zero, $5, $4 92; MIPS32-NEXT: teq $4, $zero, 7 93; MIPS32-NEXT: mfhi $1 94; MIPS32-NEXT: sll $1, $1, 16 95; MIPS32-NEXT: sra $2, $1, 16 96; MIPS32-NEXT: jr $ra 97; MIPS32-NEXT: nop 98entry: 99 %rem = srem i16 %b, %a 100 ret i16 %rem 101} 102 103define signext i32 @srem_i32(i32 signext %a, i32 signext %b) { 104; MIPS32-LABEL: srem_i32: 105; MIPS32: # %bb.0: # %entry 106; MIPS32-NEXT: div $zero, $5, $4 107; MIPS32-NEXT: teq $4, $zero, 7 108; MIPS32-NEXT: mfhi $2 109; MIPS32-NEXT: jr $ra 110; MIPS32-NEXT: nop 111entry: 112 %rem = srem i32 %b, %a 113 ret i32 %rem 114} 115 116define signext i64 @srem_i64(i64 signext %a, i64 signext %b) { 117; MIPS32-LABEL: srem_i64: 118; MIPS32: # %bb.0: # %entry 119; MIPS32-NEXT: addiu $sp, $sp, -32 120; MIPS32-NEXT: .cfi_def_cfa_offset 32 121; MIPS32-NEXT: sw $ra, 28($sp) # 4-byte Folded Spill 122; MIPS32-NEXT: .cfi_offset 31, -4 123; MIPS32-NEXT: sw $4, 20($sp) # 4-byte Folded Spill 124; MIPS32-NEXT: sw $5, 24($sp) # 4-byte Folded Spill 125; MIPS32-NEXT: move $4, $6 126; MIPS32-NEXT: lw $6, 20($sp) # 4-byte Folded Reload 127; MIPS32-NEXT: move $5, $7 128; MIPS32-NEXT: lw $7, 24($sp) # 4-byte Folded Reload 129; MIPS32-NEXT: jal __moddi3 130; MIPS32-NEXT: nop 131; MIPS32-NEXT: lw $ra, 28($sp) # 4-byte Folded Reload 132; MIPS32-NEXT: addiu $sp, $sp, 32 133; MIPS32-NEXT: jr $ra 134; MIPS32-NEXT: nop 135entry: 136 %rem = srem i64 %b, %a 137 ret i64 %rem 138} 139 140; udiv 141define signext i8 @udiv_i8(i8 signext %a, i8 signext %b) { 142; MIPS32-LABEL: udiv_i8: 143; MIPS32: # %bb.0: # %entry 144; MIPS32-NEXT: andi $2, $5, 255 145; MIPS32-NEXT: andi $1, $4, 255 146; MIPS32-NEXT: divu $zero, $2, $1 147; MIPS32-NEXT: teq $1, $zero, 7 148; MIPS32-NEXT: mflo $1 149; MIPS32-NEXT: sll $1, $1, 24 150; MIPS32-NEXT: sra $2, $1, 24 151; MIPS32-NEXT: jr $ra 152; MIPS32-NEXT: nop 153entry: 154 %div = udiv i8 %b, %a 155 ret i8 %div 156} 157 158define signext i16 @udiv_i16(i16 signext %a, i16 signext %b) { 159; MIPS32-LABEL: udiv_i16: 160; MIPS32: # %bb.0: # %entry 161; MIPS32-NEXT: andi $2, $5, 65535 162; MIPS32-NEXT: andi $1, $4, 65535 163; MIPS32-NEXT: divu $zero, $2, $1 164; MIPS32-NEXT: teq $1, $zero, 7 165; MIPS32-NEXT: mflo $1 166; MIPS32-NEXT: sll $1, $1, 16 167; MIPS32-NEXT: sra $2, $1, 16 168; MIPS32-NEXT: jr $ra 169; MIPS32-NEXT: nop 170entry: 171 %div = udiv i16 %b, %a 172 ret i16 %div 173} 174 175define signext i32 @udiv_i32(i32 signext %a, i32 signext %b) { 176; MIPS32-LABEL: udiv_i32: 177; MIPS32: # %bb.0: # %entry 178; MIPS32-NEXT: divu $zero, $5, $4 179; MIPS32-NEXT: teq $4, $zero, 7 180; MIPS32-NEXT: mflo $2 181; MIPS32-NEXT: jr $ra 182; MIPS32-NEXT: nop 183entry: 184 %div = udiv i32 %b, %a 185 ret i32 %div 186} 187 188define signext i64 @udiv_i64(i64 signext %a, i64 signext %b) { 189; MIPS32-LABEL: udiv_i64: 190; MIPS32: # %bb.0: # %entry 191; MIPS32-NEXT: addiu $sp, $sp, -32 192; MIPS32-NEXT: .cfi_def_cfa_offset 32 193; MIPS32-NEXT: sw $ra, 28($sp) # 4-byte Folded Spill 194; MIPS32-NEXT: .cfi_offset 31, -4 195; MIPS32-NEXT: sw $4, 20($sp) # 4-byte Folded Spill 196; MIPS32-NEXT: sw $5, 24($sp) # 4-byte Folded Spill 197; MIPS32-NEXT: move $4, $6 198; MIPS32-NEXT: lw $6, 20($sp) # 4-byte Folded Reload 199; MIPS32-NEXT: move $5, $7 200; MIPS32-NEXT: lw $7, 24($sp) # 4-byte Folded Reload 201; MIPS32-NEXT: jal __udivdi3 202; MIPS32-NEXT: nop 203; MIPS32-NEXT: lw $ra, 28($sp) # 4-byte Folded Reload 204; MIPS32-NEXT: addiu $sp, $sp, 32 205; MIPS32-NEXT: jr $ra 206; MIPS32-NEXT: nop 207entry: 208 %div = udiv i64 %b, %a 209 ret i64 %div 210} 211 212; urem 213define signext i8 @urem_i8(i8 signext %a, i8 signext %b) { 214; MIPS32-LABEL: urem_i8: 215; MIPS32: # %bb.0: # %entry 216; MIPS32-NEXT: andi $2, $5, 255 217; MIPS32-NEXT: andi $1, $4, 255 218; MIPS32-NEXT: divu $zero, $2, $1 219; MIPS32-NEXT: teq $1, $zero, 7 220; MIPS32-NEXT: mfhi $1 221; MIPS32-NEXT: sll $1, $1, 24 222; MIPS32-NEXT: sra $2, $1, 24 223; MIPS32-NEXT: jr $ra 224; MIPS32-NEXT: nop 225entry: 226 %rem = urem i8 %b, %a 227 ret i8 %rem 228} 229 230define signext i16 @urem_i16(i16 signext %a, i16 signext %b) { 231; MIPS32-LABEL: urem_i16: 232; MIPS32: # %bb.0: # %entry 233; MIPS32-NEXT: andi $2, $5, 65535 234; MIPS32-NEXT: andi $1, $4, 65535 235; MIPS32-NEXT: divu $zero, $2, $1 236; MIPS32-NEXT: teq $1, $zero, 7 237; MIPS32-NEXT: mfhi $1 238; MIPS32-NEXT: sll $1, $1, 16 239; MIPS32-NEXT: sra $2, $1, 16 240; MIPS32-NEXT: jr $ra 241; MIPS32-NEXT: nop 242entry: 243 %rem = urem i16 %b, %a 244 ret i16 %rem 245} 246 247define signext i32 @urem_i32(i32 signext %a, i32 signext %b) { 248; MIPS32-LABEL: urem_i32: 249; MIPS32: # %bb.0: # %entry 250; MIPS32-NEXT: divu $zero, $5, $4 251; MIPS32-NEXT: teq $4, $zero, 7 252; MIPS32-NEXT: mfhi $2 253; MIPS32-NEXT: jr $ra 254; MIPS32-NEXT: nop 255entry: 256 %rem = urem i32 %b, %a 257 ret i32 %rem 258} 259 260define signext i64 @urem_i64(i64 signext %a, i64 signext %b) { 261; MIPS32-LABEL: urem_i64: 262; MIPS32: # %bb.0: # %entry 263; MIPS32-NEXT: addiu $sp, $sp, -32 264; MIPS32-NEXT: .cfi_def_cfa_offset 32 265; MIPS32-NEXT: sw $ra, 28($sp) # 4-byte Folded Spill 266; MIPS32-NEXT: .cfi_offset 31, -4 267; MIPS32-NEXT: sw $4, 20($sp) # 4-byte Folded Spill 268; MIPS32-NEXT: sw $5, 24($sp) # 4-byte Folded Spill 269; MIPS32-NEXT: move $4, $6 270; MIPS32-NEXT: lw $6, 20($sp) # 4-byte Folded Reload 271; MIPS32-NEXT: move $5, $7 272; MIPS32-NEXT: lw $7, 24($sp) # 4-byte Folded Reload 273; MIPS32-NEXT: jal __umoddi3 274; MIPS32-NEXT: nop 275; MIPS32-NEXT: lw $ra, 28($sp) # 4-byte Folded Reload 276; MIPS32-NEXT: addiu $sp, $sp, 32 277; MIPS32-NEXT: jr $ra 278; MIPS32-NEXT: nop 279entry: 280 %rem = urem i64 %b, %a 281 ret i64 %rem 282} 283