Home | History | Annotate | Download | only in SPARC
      1 ; RUN: llc -march=sparc <%s | FileCheck %s -check-prefix=V8
      2 ; RUN: llc -march=sparc -mattr=v9 <%s | FileCheck %s -check-prefix=V9
      3 ; RUN: llc -mtriple=sparc64-unknown-linux <%s | FileCheck %s -check-prefix=SPARC64
      4 
      5 
      6 define i32 @test_addx(i64 %a, i64 %b, i64 %c) nounwind readnone noinline {
      7 entry:
      8 ; V8: addcc
      9 ; V8-NOT: subcc
     10 ; V8: addx
     11 ; V9: addcc
     12 ; V9-NOT: subcc
     13 ; V9: addx
     14 ; V9: mov{{e|ne}} %icc
     15   %0 = add i64 %a, %b
     16   %1 = icmp ugt i64 %0, %c
     17   %2 = zext i1 %1 to i32
     18   ret i32 %2
     19 }
     20 
     21 
     22 define i32 @test_select_int_icc(i32 %a, i32 %b, i32 %c) nounwind readnone noinline {
     23 entry:
     24 ; V8: test_select_int_icc
     25 ; V8: cmp
     26 ; V8: {{be|bne}}
     27 ; V9: test_select_int_icc
     28 ; V9: cmp
     29 ; V9-NOT: {{be|bne}}
     30 ; V9: mov{{e|ne}} %icc
     31   %0 = icmp eq i32 %a, 0
     32   %1 = select i1 %0, i32 %b, i32 %c
     33   ret i32 %1
     34 }
     35 
     36 
     37 define float @test_select_fp_icc(i32 %a, float %f1, float %f2) nounwind readnone noinline {
     38 entry:
     39 ; V8: test_select_fp_icc
     40 ; V8: cmp
     41 ; V8: {{be|bne}}
     42 ; V9: test_select_fp_icc
     43 ; V9: cmp
     44 ; V9-NOT: {{be|bne}}
     45 ; V9: fmovs{{e|ne}} %icc
     46   %0 = icmp eq i32 %a, 0
     47   %1 = select i1 %0, float %f1, float %f2
     48   ret float %1
     49 }
     50 
     51 define double @test_select_dfp_icc(i32 %a, double %f1, double %f2) nounwind readnone noinline {
     52 entry:
     53 ; V8: test_select_dfp_icc
     54 ; V8: cmp
     55 ; V8: {{be|bne}}
     56 ; V9: test_select_dfp_icc
     57 ; V9: cmp
     58 ; V9-NOT: {{be|bne}}
     59 ; V9: fmovd{{e|ne}} %icc
     60   %0 = icmp eq i32 %a, 0
     61   %1 = select i1 %0, double %f1, double %f2
     62   ret double %1
     63 }
     64 
     65 define i32 @test_select_int_fcc(float %f, i32 %a, i32 %b) nounwind readnone noinline {
     66 entry:
     67 ;V8-LABEL: test_select_int_fcc:
     68 ;V8: fcmps
     69 ;V8-NEXT: nop
     70 ;V8: {{fbe|fbne}}
     71 ;V9-LABEL: test_select_int_fcc:
     72 ;V9: fcmps
     73 ;V9-NEXT-NOT: nop
     74 ;V9-NOT: {{fbe|fbne}}
     75 ;V9: mov{{e|ne}} %fcc0
     76   %0 = fcmp une float %f, 0.000000e+00
     77   %a.b = select i1 %0, i32 %a, i32 %b
     78   ret i32 %a.b
     79 }
     80 
     81 
     82 define float @test_select_fp_fcc(float %f, float %f1, float %f2) nounwind readnone noinline {
     83 entry:
     84 ;V8-LABEL: test_select_fp_fcc:
     85 ;V8: fcmps
     86 ;V8: {{fbe|fbne}}
     87 ;V9-LABEL: test_select_fp_fcc:
     88 ;V9: fcmps
     89 ;V9-NOT: {{fbe|fbne}}
     90 ;V9: fmovs{{e|ne}} %fcc0
     91   %0 = fcmp une float %f, 0.000000e+00
     92   %1 = select i1 %0, float %f1, float %f2
     93   ret float %1
     94 }
     95 
     96 define double @test_select_dfp_fcc(double %f, double %f1, double %f2) nounwind readnone noinline {
     97 entry:
     98 ;V8-LABEL: test_select_dfp_fcc:
     99 ;V8: fcmpd
    100 ;V8-NEXT: nop
    101 ;V8: {{fbne|fbe}}
    102 ;V9-LABEL: test_select_dfp_fcc:
    103 ;V9: fcmpd
    104 ;V9-NEXT-NOT: nop
    105 ;V9-NOT: {{fbne|fbe}}
    106 ;V9: fmovd{{e|ne}} %fcc0
    107   %0 = fcmp une double %f, 0.000000e+00
    108   %1 = select i1 %0, double %f1, double %f2
    109   ret double %1
    110 }
    111 
    112 define i32 @test_float_cc(double %a, double %b, i32 %c, i32 %d) {
    113 entry:
    114 ; V8-LABEL: test_float_cc
    115 ; V8:       fcmpd
    116 ; V8:       {{fbl|fbuge}} .LBB
    117 ; V8:       fcmpd
    118 ; V8:       {{fbule|fbg}} .LBB
    119 
    120 ; V9-LABEL: test_float_cc
    121 ; V9:       fcmpd
    122 ; V9:       {{fbl|fbuge}} .LBB
    123 ; V9:       fcmpd
    124 ; V9:       {{fbule|fbg}} .LBB
    125 
    126    %0 = fcmp uge double %a, 0.000000e+00
    127    br i1 %0, label %loop, label %loop.2
    128 
    129 loop:
    130    %1 = icmp eq i32 %c, 10
    131    br i1 %1, label %loop, label %exit.0
    132 
    133 loop.2:
    134    %2 = fcmp ogt double %b, 0.000000e+00
    135    br i1 %2, label %exit.1, label %loop
    136 
    137 exit.0:
    138    ret i32 0
    139 
    140 exit.1:
    141    ret i32 1
    142 }
    143 
    144 ; V8-LABEL: test_adde_sube
    145 ; V8:       addcc
    146 ; V8:       addxcc
    147 ; V8:       addxcc
    148 ; V8:       addxcc
    149 ; V8:       subcc
    150 ; V8:       subxcc
    151 ; V8:       subxcc
    152 ; V8:       subxcc
    153 
    154 
    155 ; V9-LABEL: test_adde_sube
    156 ; V9:       addcc
    157 ; V9:       addxcc
    158 ; V9:       addxcc
    159 ; V9:       addxcc
    160 ; V9:       subcc
    161 ; V9:       subxcc
    162 ; V9:       subxcc
    163 ; V9:       subxcc
    164 
    165 ; SPARC64-LABEL: test_adde_sube
    166 ; SPARC64:       addcc
    167 ; SPARC64:       addxcc
    168 ; SPARC64:       addxcc
    169 ; SPARC64:       addxcc
    170 ; SPARC64:       subcc
    171 ; SPARC64:       subxcc
    172 ; SPARC64:       subxcc
    173 ; SPARC64:       subxcc
    174 
    175 
    176 define void @test_adde_sube(i8* %a, i8* %b, i8* %sum, i8* %diff) {
    177 entry:
    178    %0 = bitcast i8* %a to i128*
    179    %1 = bitcast i8* %b to i128*
    180    %2 = load i128, i128* %0
    181    %3 = load i128, i128* %1
    182    %4 = add i128 %2, %3
    183    %5 = bitcast i8* %sum to i128*
    184    store i128 %4, i128* %5
    185    tail call void asm sideeffect "", "=*m,*m"(i128 *%0, i128* %5) nounwind
    186    %6 = load i128, i128* %0
    187    %7 = sub i128 %2, %6
    188    %8 = bitcast i8* %diff to i128*
    189    store i128 %7, i128* %8
    190    ret void
    191 }
    192