Home | History | Annotate | Download | only in X86
      1 ; RUN: llc < %s -mcpu=atom -mtriple=i686-linux | FileCheck %s
      2 
      3 define i32 @Test_get_quotient(i32 %a, i32 %b) nounwind {
      4 ; CHECK-LABEL: Test_get_quotient:
      5 ; CHECK: orl %ecx, %edx
      6 ; CHECK-NEXT: testl $-256, %edx
      7 ; CHECK-NEXT: je
      8 ; CHECK: idivl
      9 ; CHECK: ret
     10 ; CHECK: divb
     11 ; CHECK: ret
     12   %result = sdiv i32 %a, %b
     13   ret i32 %result
     14 }
     15 
     16 define i32 @Test_get_remainder(i32 %a, i32 %b) nounwind {
     17 ; CHECK-LABEL: Test_get_remainder:
     18 ; CHECK: orl %ecx, %edx
     19 ; CHECK-NEXT: testl $-256, %edx
     20 ; CHECK-NEXT: je
     21 ; CHECK: idivl
     22 ; CHECK: ret
     23 ; CHECK: divb
     24 ; CHECK: ret
     25   %result = srem i32 %a, %b
     26   ret i32 %result
     27 }
     28 
     29 define i32 @Test_get_quotient_and_remainder(i32 %a, i32 %b) nounwind {
     30 ; CHECK-LABEL: Test_get_quotient_and_remainder:
     31 ; CHECK: orl %ecx, %edx
     32 ; CHECK-NEXT: testl $-256, %edx
     33 ; CHECK-NEXT: je
     34 ; CHECK: idivl
     35 ; CHECK: divb
     36 ; CHECK: addl
     37 ; CHECK: ret
     38 ; CHECK-NOT: idivl
     39 ; CHECK-NOT: divb
     40   %resultdiv = sdiv i32 %a, %b
     41   %resultrem = srem i32 %a, %b
     42   %result = add i32 %resultdiv, %resultrem
     43   ret i32 %result
     44 }
     45 
     46 define i32 @Test_use_div_and_idiv(i32 %a, i32 %b) nounwind {
     47 ; CHECK-LABEL: Test_use_div_and_idiv:
     48 ; CHECK: idivl
     49 ; CHECK: divb
     50 ; CHECK: divl
     51 ; CHECK: divb
     52 ; CHECK: addl
     53 ; CHECK: ret
     54   %resultidiv = sdiv i32 %a, %b
     55   %resultdiv = udiv i32 %a, %b
     56   %result = add i32 %resultidiv, %resultdiv
     57   ret i32 %result
     58 }
     59 
     60 define i32 @Test_use_div_imm_imm() nounwind {
     61 ; CHECK-LABEL: Test_use_div_imm_imm:
     62 ; CHECK: movl $64
     63   %resultdiv = sdiv i32 256, 4
     64   ret i32 %resultdiv
     65 }
     66 
     67 define i32 @Test_use_div_reg_imm(i32 %a) nounwind {
     68 ; CHECK-LABEL: Test_use_div_reg_imm:
     69 ; CHECK-NOT: test
     70 ; CHECK-NOT: idiv
     71 ; CHECK-NOT: divb
     72   %resultdiv = sdiv i32 %a, 33
     73   ret i32 %resultdiv
     74 }
     75 
     76 define i32 @Test_use_rem_reg_imm(i32 %a) nounwind {
     77 ; CHECK-LABEL: Test_use_rem_reg_imm:
     78 ; CHECK-NOT: test
     79 ; CHECK-NOT: idiv
     80 ; CHECK-NOT: divb
     81   %resultrem = srem i32 %a, 33
     82   ret i32 %resultrem
     83 }
     84 
     85 define i32 @Test_use_divrem_reg_imm(i32 %a) nounwind {
     86 ; CHECK-LABEL: Test_use_divrem_reg_imm:
     87 ; CHECK-NOT: test
     88 ; CHECK-NOT: idiv
     89 ; CHECK-NOT: divb
     90   %resultdiv = sdiv i32 %a, 33
     91   %resultrem = srem i32 %a, 33
     92   %result = add i32 %resultdiv, %resultrem
     93   ret i32 %result
     94 }
     95 
     96 define i32 @Test_use_div_imm_reg(i32 %a) nounwind {
     97 ; CHECK-LABEL: Test_use_div_imm_reg:
     98 ; CHECK: test
     99 ; CHECK: idiv
    100 ; CHECK: divb
    101   %resultdiv = sdiv i32 4, %a
    102   ret i32 %resultdiv
    103 }
    104 
    105 define i32 @Test_use_rem_imm_reg(i32 %a) nounwind {
    106 ; CHECK-LABEL: Test_use_rem_imm_reg:
    107 ; CHECK: test
    108 ; CHECK: idiv
    109 ; CHECK: divb
    110   %resultdiv = sdiv i32 4, %a
    111   ret i32 %resultdiv
    112 }
    113