Home | History | Annotate | Download | only in Mips
      1 ; RUN: llc -march=mips     -mcpu=mips32                 < %s | FileCheck %s -check-prefix=ALL -check-prefix=32-CMOV
      2 ; RUN: llc -march=mips     -mcpu=mips32 -regalloc=basic < %s | FileCheck %s -check-prefix=ALL -check-prefix=32-CMOV
      3 ; RUN: llc -march=mips     -mcpu=mips32r2               < %s | FileCheck %s -check-prefix=ALL -check-prefix=32-CMOV
      4 ; RUN: llc -march=mips     -mcpu=mips32r6               < %s | FileCheck %s -check-prefix=ALL -check-prefix=32-CMP
      5 ; RUN: llc -march=mips64el -mcpu=mips4                  < %s | FileCheck %s -check-prefix=ALL -check-prefix=64-CMOV
      6 ; RUN: llc -march=mips64el -mcpu=mips64                 < %s | FileCheck %s -check-prefix=ALL -check-prefix=64-CMOV
      7 ; RUN: llc -march=mips64el -mcpu=mips64r6               < %s | FileCheck %s -check-prefix=ALL -check-prefix=64-CMP
      8 
      9 @i1 = global [3 x i32] [i32 1, i32 2, i32 3], align 4
     10 @i3 = common global i32* null, align 4
     11 
     12 ; ALL-LABEL: cmov1:
     13 
     14 ; 32-CMOV-DAG:  lw $[[R0:[0-9]+]], %got(i3)
     15 ; 32-CMOV-DAG:  addiu $[[R1:[0-9]+]], ${{[0-9]+}}, %got(i1)
     16 ; 32-CMOV-DAG:  movn $[[R0]], $[[R1]], $4
     17 ; 32-CMOV-DAG:  lw $2, 0($[[R0]])
     18 
     19 ; 32-CMP-DAG:   lw $[[R0:[0-9]+]], %got(i3)
     20 ; 32-CMP-DAG:   addiu $[[R1:[0-9]+]], ${{[0-9]+}}, %got(i1)
     21 ; 32-CMP-DAG:   selnez $[[T0:[0-9]+]], $[[R1]], $4
     22 ; 32-CMP-DAG:   seleqz $[[T1:[0-9]+]], $[[R0]], $4
     23 ; 32-CMP-DAG:   or $[[T2:[0-9]+]], $[[T0]], $[[T1]]
     24 ; 32-CMP-DAG:   lw $2, 0($[[T2]])
     25 
     26 ; 64-CMOV-DAG:  ldr $[[R0:[0-9]+]]
     27 ; 64-CMOV-DAG:  ld $[[R1:[0-9]+]], %got_disp(i1)
     28 ; 64-CMOV-DAG:  movn $[[R0]], $[[R1]], $4
     29 
     30 ; 64-CMP-DAG:   ld $[[R0:[0-9]+]], %got_disp(i3)(
     31 ; 64-CMP-DAG:   daddiu $[[R1:[0-9]+]], ${{[0-9]+}}, %got_disp(i1)
     32 ; FIXME: This sll works around an implementation detail in the code generator
     33 ;        (setcc's result is i32 so bits 32-63 are undefined). It's not really
     34 ;        needed.
     35 ; 64-CMP-DAG:   sll $[[CC:[0-9]+]], $4, 0
     36 ; 64-CMP-DAG:   selnez $[[T0:[0-9]+]], $[[R1]], $[[CC]]
     37 ; 64-CMP-DAG:   seleqz $[[T1:[0-9]+]], $[[R0]], $[[CC]]
     38 ; 64-CMP-DAG:   or $[[T2:[0-9]+]], $[[T0]], $[[T1]]
     39 ; 64-CMP-DAG:   ld $2, 0($[[T2]])
     40 
     41 define i32* @cmov1(i32 %s) nounwind readonly {
     42 entry:
     43   %tobool = icmp ne i32 %s, 0
     44   %tmp1 = load i32** @i3, align 4
     45   %cond = select i1 %tobool, i32* getelementptr inbounds ([3 x i32]* @i1, i32 0, i32 0), i32* %tmp1
     46   ret i32* %cond
     47 }
     48 
     49 @c = global i32 1, align 4
     50 @d = global i32 0, align 4
     51 
     52 ; ALL-LABEL: cmov2:
     53 
     54 ; 32-CMOV-DAG:  addiu $[[R1:[0-9]+]], ${{[0-9]+}}, %got(d)
     55 ; 32-CMOV-DAG:  addiu $[[R0:[0-9]+]], ${{[0-9]+}}, %got(c)
     56 ; 32-CMOV-DAG:  movn  $[[R1]], $[[R0]], $4
     57 ; 32-CMOV-DAG:  lw $2, 0($[[R0]])
     58 
     59 ; 32-CMP-DAG:   addiu $[[R1:[0-9]+]], ${{[0-9]+}}, %got(d)
     60 ; 32-CMP-DAG:   addiu $[[R0:[0-9]+]], ${{[0-9]+}}, %got(c)
     61 ; 32-CMP-DAG:   selnez $[[T0:[0-9]+]], $[[R0]], $4
     62 ; 32-CMP-DAG:   seleqz $[[T1:[0-9]+]], $[[R1]], $4
     63 ; 32-CMP-DAG:   or $[[T2:[0-9]+]], $[[T0]], $[[T1]]
     64 ; 32-CMP-DAG:   lw $2, 0($[[T2]])
     65 
     66 ; 64-CMOV:      daddiu $[[R1:[0-9]+]], ${{[0-9]+}}, %got_disp(d)
     67 ; 64-CMOV:      daddiu $[[R0:[0-9]+]], ${{[0-9]+}}, %got_disp(c)
     68 ; 64-CMOV:      movn  $[[R1]], $[[R0]], $4
     69 
     70 ; 64-CMP-DAG:   daddiu $[[R1:[0-9]+]], ${{[0-9]+}}, %got_disp(d)
     71 ; 64-CMP-DAG:   daddiu $[[R0:[0-9]+]], ${{[0-9]+}}, %got_disp(c)
     72 ; FIXME: This sll works around an implementation detail in the code generator
     73 ;        (setcc's result is i32 so bits 32-63 are undefined). It's not really
     74 ;        needed.
     75 ; 64-CMP-DAG:   sll $[[CC:[0-9]+]], $4, 0
     76 ; 64-CMP-DAG:   selnez $[[T0:[0-9]+]], $[[R0]], $[[CC]]
     77 ; 64-CMP-DAG:   seleqz $[[T1:[0-9]+]], $[[R1]], $[[CC]]
     78 ; 64-CMP-DAG:   or $[[T2:[0-9]+]], $[[T0]], $[[T1]]
     79 ; 64-CMP-DAG:   lw $2, 0($[[T2]])
     80 
     81 define i32 @cmov2(i32 %s) nounwind readonly {
     82 entry:
     83   %tobool = icmp ne i32 %s, 0
     84   %tmp1 = load i32* @c, align 4
     85   %tmp2 = load i32* @d, align 4
     86   %cond = select i1 %tobool, i32 %tmp1, i32 %tmp2
     87   ret i32 %cond
     88 }
     89 
     90 ; ALL-LABEL: cmov3:
     91 
     92 ; We won't check the result register since we can't know if the move is first
     93 ; or last. We do know it will be either one of two registers so we can at least
     94 ; check that.
     95 
     96 ; 32-CMOV:      xori $[[R0:[0-9]+]], $4, 234
     97 ; 32-CMOV:      movz ${{[26]}}, $5, $[[R0]]
     98 
     99 ; 32-CMP-DAG:   xori $[[CC:[0-9]+]], $4, 234
    100 ; 32-CMP-DAG:   seleqz $[[T0:[0-9]+]], $5, $[[CC]]
    101 ; 32-CMP-DAG:   selnez $[[T1:[0-9]+]], $6, $[[CC]]
    102 ; 32-CMP-DAG:   or $2, $[[T0]], $[[T1]]
    103 
    104 ; 64-CMOV:      xori $[[R0:[0-9]+]], $4, 234
    105 ; 64-CMOV:      movz ${{[26]}}, $5, $[[R0]]
    106 
    107 ; 64-CMP-DAG:   xori $[[CC:[0-9]+]], $4, 234
    108 ; 64-CMP-DAG:   seleqz $[[T0:[0-9]+]], $5, $[[CC]]
    109 ; 64-CMP-DAG:   selnez $[[T1:[0-9]+]], $6, $[[CC]]
    110 ; 64-CMP-DAG:   or $2, $[[T0]], $[[T1]]
    111 
    112 define i32 @cmov3(i32 %a, i32 %b, i32 %c) nounwind readnone {
    113 entry:
    114   %cmp = icmp eq i32 %a, 234
    115   %cond = select i1 %cmp, i32 %b, i32 %c
    116   ret i32 %cond
    117 }
    118 
    119 ; ALL-LABEL: cmov4:
    120 
    121 ; We won't check the result register since we can't know if the move is first
    122 ; or last. We do know it will be one of two registers so we can at least check
    123 ; that.
    124 
    125 ; 32-CMOV-DAG: xori $[[R0:[0-9]+]], $4, 234
    126 ; 32-CMOV-DAG: lw $[[R1:2]], 16($sp)
    127 ; 32-CMOV-DAG: lw $[[R2:3]], 20($sp)
    128 ; 32-CMOV-DAG: movz $[[R1]], $6, $[[R0]]
    129 ; 32-CMOV-DAG: movz $[[R2]], $7, $[[R0]]
    130 
    131 ; 32-CMP-DAG:  xori $[[R0:[0-9]+]], $4, 234
    132 ; 32-CMP-DAG:  lw $[[R1:[0-9]+]], 16($sp)
    133 ; 32-CMP-DAG:  lw $[[R2:[0-9]+]], 20($sp)
    134 ; 32-CMP-DAG:  seleqz $[[T0:[0-9]+]], $6, $[[R0]]
    135 ; 32-CMP-DAG:  seleqz $[[T1:[0-9]+]], $7, $[[R0]]
    136 ; 32-CMP-DAG:  selnez $[[T2:[0-9]+]], $[[R1]], $[[R0]]
    137 ; 32-CMP-DAG:  selnez $[[T3:[0-9]+]], $[[R2]], $[[R0]]
    138 ; 32-CMP-DAG:  or $2, $[[T0]], $[[T2]]
    139 ; 32-CMP-DAG:  or $3, $[[T1]], $[[T3]]
    140 
    141 ; 64-CMOV: xori $[[R0:[0-9]+]], $4, 234
    142 ; 64-CMOV: movz ${{[26]}}, $5, $[[R0]]
    143 
    144 ; 64-CMP-DAG:  xori $[[R0:[0-9]+]], $4, 234
    145 ; 64-CMP-DAG:  seleqz $[[T0:[0-9]+]], $5, $[[R0]]
    146 ; 64-CMP-DAG:  selnez $[[T1:[0-9]+]], $6, $[[R0]]
    147 ; 64-CMP-DAG:  or $2, $[[T0]], $[[T1]]
    148 
    149 define i64 @cmov4(i32 %a, i64 %b, i64 %c) nounwind readnone {
    150 entry:
    151   %cmp = icmp eq i32 %a, 234
    152   %cond = select i1 %cmp, i64 %b, i64 %c
    153   ret i64 %cond
    154 }
    155 
    156 ; slti and conditional move.
    157 ;
    158 ; Check that, pattern
    159 ;  (select (setgt a, N), t, f)
    160 ; turns into
    161 ;  (movz t, (setlt a, N + 1), f)
    162 ; if N + 1 fits in 16-bit.
    163 
    164 ; ALL-LABEL: slti0:
    165 
    166 ; 32-CMOV-DAG: addiu $[[I3:[0-9]+]], $zero, 3
    167 ; 32-CMOV-DAG: addiu $[[I5:2]], $zero, 5
    168 ; 32-CMOV-DAG: slti $[[R0:[0-9]+]], $4, 32767
    169 ; 32-CMOV-DAG: movz $[[I5]], $[[I3]], $[[R0]]
    170 
    171 ; 32-CMP-DAG:  addiu $[[I3:[0-9]+]], $zero, 3
    172 ; 32-CMP-DAG:  addiu $[[I5:[0-9]+]], $zero, 5
    173 ; 32-CMP-DAG:  slti $[[R0:[0-9]+]], $4, 32767
    174 ; FIXME: We can do better than this by using selccz to choose between +0 and +2
    175 ; 32-CMP-DAG:  seleqz $[[T0:[0-9]+]], $[[I3]], $[[R0]]
    176 ; 32-CMP-DAG:  selnez $[[T1:[0-9]+]], $[[I5]], $[[R0]]
    177 ; 32-CMP-DAG:  or $2, $[[T0]], $[[T1]]
    178 
    179 ; 64-CMOV-DAG: addiu $[[I3:[0-9]+]], $zero, 3
    180 ; 64-CMOV-DAG: addiu $[[I5:2]], $zero, 5
    181 ; 64-CMOV-DAG: slti $[[R0:[0-9]+]], $4, 32767
    182 ; 64-CMOV-DAG: movz $[[I5]], $[[I3]], $[[R0]]
    183 
    184 ; 64-CMP-DAG:  addiu $[[I3:[0-9]+]], $zero, 3
    185 ; 64-CMP-DAG:  addiu $[[I5:[0-9]+]], $zero, 5
    186 ; 64-CMP-DAG:  slti $[[R0:[0-9]+]], $4, 32767
    187 ; FIXME: We can do better than this by using selccz to choose between +0 and +2
    188 ; 64-CMP-DAG:  seleqz $[[T0:[0-9]+]], $[[I3]], $[[R0]]
    189 ; 64-CMP-DAG:  selnez $[[T1:[0-9]+]], $[[I5]], $[[R0]]
    190 ; 64-CMP-DAG:  or $2, $[[T0]], $[[T1]]
    191 
    192 define i32 @slti0(i32 %a) {
    193 entry:
    194   %cmp = icmp sgt i32 %a, 32766
    195   %cond = select i1 %cmp, i32 3, i32 5
    196   ret i32 %cond
    197 }
    198 
    199 ; ALL-LABEL: slti1:
    200 
    201 ; 32-CMOV-DAG: addiu $[[I7:[0-9]+]], $zero, 7
    202 ; 32-CMOV-DAG: addiu $[[I5:2]], $zero, 5
    203 ; 32-CMOV-DAG: addiu $[[R1:[0-9]+]], $zero, 32767
    204 ; 32-CMOV-DAG: slt $[[R0:[0-9]+]], $[[R1]], $4
    205 ; 32-CMOV-DAG: movn $[[I5]], $[[I7]], $[[R0]]
    206 
    207 ; 32-CMP-DAG:  addiu $[[I7:[0-9]+]], $zero, 7
    208 ; 32-CMP-DAG:  addiu $[[I5:[0-9]+]], $zero, 5
    209 ; 32-CMP-DAG:  addiu $[[I32767:[0-9]+]], $zero, 32767
    210 ; 32-CMP-DAG:  slt $[[R0:[0-9]+]], $[[I32767]], $4
    211 ; FIXME: We can do better than this by using selccz to choose between -0 and -2
    212 ; 32-CMP-DAG:  selnez $[[T0:[0-9]+]], $[[I7]], $[[R0]]
    213 ; 32-CMP-DAG:  seleqz $[[T1:[0-9]+]], $[[I5]], $[[R0]]
    214 ; 32-CMP-DAG:  or $2, $[[T0]], $[[T1]]
    215 
    216 ; 64-CMOV-DAG: addiu $[[I7:[0-9]+]], $zero, 7
    217 ; 64-CMOV-DAG: addiu $[[I5:2]], $zero, 5
    218 ; 64-CMOV-DAG: addiu $[[R1:[0-9]+]], $zero, 32767
    219 ; 64-CMOV-DAG: slt $[[R0:[0-9]+]], $[[R1]], $4
    220 ; 64-CMOV-DAG: movn $[[I5]], $[[I7]], $[[R0]]
    221 
    222 ; 64-CMP-DAG:  addiu $[[I7:[0-9]+]], $zero, 7
    223 ; 64-CMP-DAG:  addiu $[[I5:2]], $zero, 5
    224 ; 64-CMP-DAG:  addiu $[[R1:[0-9]+]], $zero, 32767
    225 ; 64-CMP-DAG:  slt $[[R0:[0-9]+]], $[[R1]], $4
    226 ; FIXME: We can do better than this by using selccz to choose between -0 and -2
    227 ; 64-CMP-DAG:  selnez $[[T0:[0-9]+]], $[[I7]], $[[R0]]
    228 ; 64-CMP-DAG:  seleqz $[[T1:[0-9]+]], $[[I5]], $[[R0]]
    229 ; 64-CMP-DAG:  or $2, $[[T0]], $[[T1]]
    230 
    231 define i32 @slti1(i32 %a) {
    232 entry:
    233   %cmp = icmp sgt i32 %a, 32767
    234   %cond = select i1 %cmp, i32 7, i32 5
    235   ret i32 %cond
    236 }
    237 
    238 ; ALL-LABEL: slti2:
    239 
    240 ; 32-CMOV-DAG: addiu $[[I3:[0-9]+]], $zero, 3
    241 ; 32-CMOV-DAG: addiu $[[I5:2]], $zero, 5
    242 ; 32-CMOV-DAG: slti $[[R0:[0-9]+]], $4, -32768
    243 ; 32-CMOV-DAG: movz $[[I5]], $[[I3]], $[[R0]]
    244 
    245 ; 32-CMP-DAG:  addiu $[[I3:[0-9]+]], $zero, 3
    246 ; 32-CMP-DAG:  addiu $[[I5:[0-9]+]], $zero, 5
    247 ; 32-CMP-DAG:  slti $[[R0:[0-9]+]], $4, -32768
    248 ; FIXME: We can do better than this by using selccz to choose between +0 and +2
    249 ; 32-CMP-DAG:  seleqz $[[T0:[0-9]+]], $[[I3]], $[[R0]]
    250 ; 32-CMP-DAG:  selnez $[[T1:[0-9]+]], $[[I5]], $[[R0]]
    251 ; 32-CMP-DAG:  or $2, $[[T0]], $[[T1]]
    252 
    253 ; 64-CMOV-DAG: addiu $[[I3:[0-9]+]], $zero, 3
    254 ; 64-CMOV-DAG: addiu $[[I5:2]], $zero, 5
    255 ; 64-CMOV-DAG: slti $[[R0:[0-9]+]], $4, -32768
    256 ; 64-CMOV-DAG: movz $[[I5]], $[[I3]], $[[R0]]
    257 
    258 ; 64-CMP-DAG:  addiu $[[I3:[0-9]+]], $zero, 3
    259 ; 64-CMP-DAG:  addiu $[[I5:[0-9]+]], $zero, 5
    260 ; 64-CMP-DAG:  slti $[[R0:[0-9]+]], $4, -32768
    261 ; FIXME: We can do better than this by using selccz to choose between +0 and +2
    262 ; 64-CMP-DAG:  seleqz $[[T0:[0-9]+]], $[[I3]], $[[R0]]
    263 ; 64-CMP-DAG:  selnez $[[T1:[0-9]+]], $[[I5]], $[[R0]]
    264 ; 64-CMP-DAG:  or $2, $[[T0]], $[[T1]]
    265 
    266 define i32 @slti2(i32 %a) {
    267 entry:
    268   %cmp = icmp sgt i32 %a, -32769
    269   %cond = select i1 %cmp, i32 3, i32 5
    270   ret i32 %cond
    271 }
    272 
    273 ; ALL-LABEL: slti3:
    274 
    275 ; 32-CMOV-DAG: addiu $[[I3:[0-9]+]], $zero, 3
    276 ; 32-CMOV-DAG: addiu $[[I5:2]], $zero, 5
    277 ; 32-CMOV-DAG: lui $[[R1:[0-9]+]], 65535
    278 ; 32-CMOV-DAG: ori $[[R1]], $[[R1]], 32766
    279 ; 32-CMOV-DAG: slt $[[R0:[0-9]+]], $[[R1]], $4
    280 ; 32-CMOV-DAG: movn $[[I5]], $[[I3]], $[[R0]]
    281 
    282 ; 32-CMP-DAG:  addiu $[[I3:[0-9]+]], $zero, 3
    283 ; 32-CMP-DAG:  addiu $[[I5:[0-9]+]], $zero, 5
    284 ; 32-CMP-DAG:  lui $[[IMM:[0-9]+]], 65535
    285 ; 32-CMP-DAG:  ori $[[IMM]], $[[IMM]], 32766
    286 ; 32-CMP-DAG:  slt $[[R0:[0-9]+]], $[[I32767]], $4
    287 ; FIXME: We can do better than this by using selccz to choose between -0 and -2
    288 ; 32-CMP-DAG:  selnez $[[T0:[0-9]+]], $[[I3]], $[[R0]]
    289 ; 32-CMP-DAG:  seleqz $[[T1:[0-9]+]], $[[I5]], $[[R0]]
    290 ; 32-CMP-DAG:  or $2, $[[T0]], $[[T1]]
    291 
    292 ; 64-CMOV-DAG: addiu $[[I3:[0-9]+]], $zero, 3
    293 ; 64-CMOV-DAG: addiu $[[I5:2]], $zero, 5
    294 ; 64-CMOV-DAG: lui $[[R1:[0-9]+]], 65535
    295 ; 64-CMOV-DAG: ori $[[R1]], $[[R1]], 32766
    296 ; 64-CMOV-DAG: slt $[[R0:[0-9]+]], $[[R1]], $4
    297 ; 64-CMOV-DAG: movn $[[I5]], $[[I3]], $[[R0]]
    298 
    299 ; 64-CMP-DAG:  addiu $[[I3:[0-9]+]], $zero, 3
    300 ; 64-CMP-DAG:  addiu $[[I5:2]], $zero, 5
    301 ; 64-CMP-DAG:  lui $[[IMM:[0-9]+]], 65535
    302 ; 64-CMP-DAG:  ori $[[IMM]], $[[IMM]], 32766
    303 ; 64-CMP-DAG:  slt $[[R0:[0-9]+]], $[[IMM]], $4
    304 ; FIXME: We can do better than this by using selccz to choose between -0 and -2
    305 ; 64-CMP-DAG:  selnez $[[T0:[0-9]+]], $[[I3]], $[[R0]]
    306 ; 64-CMP-DAG:  seleqz $[[T1:[0-9]+]], $[[I5]], $[[R0]]
    307 ; 64-CMP-DAG:  or $2, $[[T0]], $[[T1]]
    308 
    309 define i32 @slti3(i32 %a) {
    310 entry:
    311   %cmp = icmp sgt i32 %a, -32770
    312   %cond = select i1 %cmp, i32 3, i32 5
    313   ret i32 %cond
    314 }
    315 
    316 ; 64-bit patterns.
    317 
    318 ; ALL-LABEL: slti64_0:
    319 
    320 ; 32-CMOV-DAG:  slt $[[CC:[0-9]+]], $zero, $4
    321 ; 32-CMOV-DAG:  addiu $[[I32766:[0-9]+]], $zero, 32766
    322 ; 32-CMOV-DAG:  sltu $[[R1:[0-9]+]], $[[I32766]], $5
    323 ; 32-CMOV-DAG:  movz $[[CC:[0-9]+]], $[[R1]], $4
    324 ; 32-CMOV-DAG:  addiu $[[I5:[0-9]+]], $zero, 5
    325 ; 32-CMOV-DAG:  addiu $[[I4:3]], $zero, 4
    326 ; 32-CMOV-DAG:  movn $[[I4]], $[[I5]], $[[CC]]
    327 ; 32-CMOV-DAG:  addiu $2, $zero, 0
    328 
    329 ; 32-CMP-DAG:   slt $[[CC0:[0-9]+]], $zero, $4
    330 ; 32-CMP-DAG:   addiu $[[I32766:[0-9]+]], $zero, 32766
    331 ; 32-CMP-DAG:   sltu $[[CC1:[0-9]+]], $[[I32766]], $5
    332 ; 32-CMP-DAG:   selnez $[[CC2:[0-9]+]], $[[CC0]], $4
    333 ; 32-CMP-DAG:   seleqz $[[CC3:[0-9]+]], $[[CC1]], $4
    334 ; 32-CMP:       or $[[CC:[0-9]+]], $[[CC3]], $[[CC2]]
    335 ; 32-CMP-DAG:   addiu $[[I5:[0-9]+]], $zero, 5
    336 ; 32-CMP-DAG:   addiu $[[I4:[0-9]+]], $zero, 4
    337 ; 32-CMP-DAG:   seleqz $[[T0:[0-9]+]], $[[I4]], $[[CC]]
    338 ; 32-CMP-DAG:   selnez $[[T1:[0-9]+]], $[[I5]], $[[CC]]
    339 ; 32-CMP-DAG:   or $3, $[[T1]], $[[T0]]
    340 ; 32-CMP-DAG:   addiu $2, $zero, 0
    341 
    342 ; 64-CMOV-DAG:  addiu $[[I5:[0-9]+]], $zero, 5
    343 ; 64-CMOV-DAG:  addiu $[[I4:2]], $zero, 4
    344 ; 64-CMOV-DAG:  slti $[[R0:[0-9]+]], $4, 32767
    345 ; 64-CMOV-DAG:  movz $[[I4]], $[[I5]], $[[R0]]
    346 
    347 ; 64-CMP-DAG:  addiu $[[I5:[0-9]+]], $zero, 5
    348 ; 64-CMP-DAG:  addiu $[[I4:[0-9]+]], $zero, 4
    349 ; 64-CMP-DAG:  slti $[[R0:[0-9]+]], $4, 32767
    350 ; FIXME: We can do better than this by adding/subtracting the result of slti
    351 ;        to/from one of the constants.
    352 ; 64-CMP-DAG:  seleqz $[[T0:[0-9]+]], $[[I5]], $[[R0]]
    353 ; 64-CMP-DAG:  selnez $[[T1:[0-9]+]], $[[I4]], $[[R0]]
    354 ; 64-CMP-DAG:  or $2, $[[T0]], $[[T1]]
    355 
    356 define i64 @slti64_0(i64 %a) {
    357 entry:
    358   %cmp = icmp sgt i64 %a, 32766
    359   %conv = select i1 %cmp, i64 5, i64 4
    360   ret i64 %conv
    361 }
    362 
    363 ; ALL-LABEL: slti64_1:
    364 
    365 ; 32-CMOV-DAG:  slt $[[CC:[0-9]+]], $zero, $4
    366 ; 32-CMOV-DAG:  addiu $[[I32766:[0-9]+]], $zero, 32767
    367 ; 32-CMOV-DAG:  sltu $[[R1:[0-9]+]], $[[I32766]], $5
    368 ; 32-CMOV-DAG:  movz $[[CC:[0-9]+]], $[[R1]], $4
    369 ; 32-CMOV-DAG:  addiu $[[I5:[0-9]+]], $zero, 5
    370 ; 32-CMOV-DAG:  addiu $[[I4:3]], $zero, 4
    371 ; 32-CMOV-DAG:  movn $[[I4]], $[[I5]], $[[CC]]
    372 ; 32-CMOV-DAG:  addiu $2, $zero, 0
    373 
    374 ; 32-CMP-DAG:   slt $[[CC0:[0-9]+]], $zero, $4
    375 ; 32-CMP-DAG:   addiu $[[I32766:[0-9]+]], $zero, 32767
    376 ; 32-CMP-DAG:   sltu $[[CC1:[0-9]+]], $[[I32766]], $5
    377 ; 32-CMP-DAG:   selnez $[[CC2:[0-9]+]], $[[CC0]], $4
    378 ; 32-CMP-DAG:   seleqz $[[CC3:[0-9]+]], $[[CC1]], $4
    379 ; 32-CMP:       or $[[CC:[0-9]+]], $[[CC3]], $[[CC2]]
    380 ; 32-CMP-DAG:   addiu $[[I5:[0-9]+]], $zero, 5
    381 ; 32-CMP-DAG:   addiu $[[I4:[0-9]+]], $zero, 4
    382 ; 32-CMP-DAG:   seleqz $[[T0:[0-9]+]], $[[I4]], $[[CC]]
    383 ; 32-CMP-DAG:   selnez $[[T1:[0-9]+]], $[[I5]], $[[CC]]
    384 ; 32-CMP-DAG:   or $3, $[[T1]], $[[T0]]
    385 ; 32-CMP-DAG:   addiu $2, $zero, 0
    386 
    387 ; 64-CMOV-DAG: daddiu $[[I5:[0-9]+]], $zero, 5
    388 ; 64-CMOV-DAG: daddiu $[[I4:2]], $zero, 4
    389 ; 64-CMOV-DAG: daddiu $[[R1:[0-9]+]], $zero, 32767
    390 ; 64-CMOV-DAG: slt $[[R0:[0-9]+]], $[[R1]], $4
    391 ; 64-CMOV-DAG: movn $[[I4]], $[[I5]], $[[R0]]
    392 
    393 ; 64-CMP-DAG:  daddiu $[[I5:[0-9]+]], $zero, 5
    394 ; 64-CMP-DAG:  daddiu $[[I4:2]], $zero, 4
    395 ; 64-CMP-DAG:  daddiu $[[R1:[0-9]+]], $zero, 32767
    396 ; 64-CMP-DAG:  slt $[[R0:[0-9]+]], $[[R1]], $4
    397 ; FIXME: We can do better than this by using selccz to choose between -0 and -2
    398 ; 64-CMP-DAG:  selnez $[[T0:[0-9]+]], $[[I5]], $[[R0]]
    399 ; 64-CMP-DAG:  seleqz $[[T1:[0-9]+]], $[[I4]], $[[R0]]
    400 ; 64-CMP-DAG:  or $2, $[[T0]], $[[T1]]
    401 
    402 define i64 @slti64_1(i64 %a) {
    403 entry:
    404   %cmp = icmp sgt i64 %a, 32767
    405   %conv = select i1 %cmp, i64 5, i64 4
    406   ret i64 %conv
    407 }
    408 
    409 ; ALL-LABEL: slti64_2:
    410 
    411 ; FIXME: The 32-bit versions of this test are too complicated to reasonably
    412 ;        match at the moment. They do show some missing optimizations though
    413 ;        such as:
    414 ;           (movz $a, $b, (neg $c)) -> (movn $a, $b, $c)
    415 
    416 ; 64-CMOV-DAG:  addiu $[[I3:[0-9]+]], $zero, 3
    417 ; 64-CMOV-DAG:  addiu $[[I4:2]], $zero, 4
    418 ; 64-CMOV-DAG:  slti $[[R0:[0-9]+]], $4, -32768
    419 ; 64-CMOV-DAG:  movz $[[I4]], $[[I3]], $[[R0]]
    420 
    421 ; 64-CMP-DAG:  addiu $[[I3:[0-9]+]], $zero, 3
    422 ; 64-CMP-DAG:  addiu $[[I4:[0-9]+]], $zero, 4
    423 ; 64-CMP-DAG:  slti $[[R0:[0-9]+]], $4, -32768
    424 ; FIXME: We can do better than this by adding/subtracting the result of slti
    425 ;        to/from one of the constants.
    426 ; 64-CMP-DAG:  seleqz $[[T0:[0-9]+]], $[[I3]], $[[R0]]
    427 ; 64-CMP-DAG:  selnez $[[T1:[0-9]+]], $[[I4]], $[[R0]]
    428 ; 64-CMP-DAG:  or $2, $[[T0]], $[[T1]]
    429 
    430 define i64 @slti64_2(i64 %a) {
    431 entry:
    432   %cmp = icmp sgt i64 %a, -32769
    433   %conv = select i1 %cmp, i64 3, i64 4
    434   ret i64 %conv
    435 }
    436 
    437 ; ALL-LABEL: slti64_3:
    438 
    439 ; FIXME: The 32-bit versions of this test are too complicated to reasonably
    440 ;        match at the moment. They do show some missing optimizations though
    441 ;        such as:
    442 ;           (movz $a, $b, (neg $c)) -> (movn $a, $b, $c)
    443 
    444 ; 64-CMOV-DAG: daddiu $[[I5:[0-9]+]], $zero, 5
    445 ; 64-CMOV-DAG: daddiu $[[I4:2]], $zero, 4
    446 ; 64-CMOV-DAG: daddiu $[[R1:[0-9]+]], ${{[0-9]+}}, 32766
    447 ; 64-CMOV-DAG: slt $[[R0:[0-9]+]], $[[R1]], $4
    448 ; 64-CMOV-DAG: movn $[[I4]], $[[I5]], $[[R0]]
    449 
    450 ; 64-CMP-DAG:  daddiu $[[I5:[0-9]+]], $zero, 5
    451 ; 64-CMP-DAG:  daddiu $[[I4:2]], $zero, 4
    452 ; 64-CMP-DAG:  daddiu $[[R1:[0-9]+]], ${{[0-9]+}}, 32766
    453 ; 64-CMP-DAG:  slt $[[R0:[0-9]+]], $[[R1]], $4
    454 ; FIXME: We can do better than this by using selccz to choose between -0 and -2
    455 ; 64-CMP-DAG:  selnez $[[T0:[0-9]+]], $[[I5]], $[[R0]]
    456 ; 64-CMP-DAG:  seleqz $[[T1:[0-9]+]], $[[I4]], $[[R0]]
    457 ; 64-CMP-DAG:  or $2, $[[T0]], $[[T1]]
    458 
    459 define i64 @slti64_3(i64 %a) {
    460 entry:
    461   %cmp = icmp sgt i64 %a, -32770
    462   %conv = select i1 %cmp, i64 5, i64 4
    463   ret i64 %conv
    464 }
    465 
    466 ; sltiu instructions.
    467 
    468 ; ALL-LABEL: sltiu0:
    469 
    470 ; 32-CMOV-DAG: addiu $[[I3:[0-9]+]], $zero, 3
    471 ; 32-CMOV-DAG: addiu $[[I5:2]], $zero, 5
    472 ; 32-CMOV-DAG: sltiu $[[R0:[0-9]+]], $4, 32767
    473 ; 32-CMOV-DAG: movz $[[I5]], $[[I3]], $[[R0]]
    474 
    475 ; 32-CMP-DAG:  addiu $[[I3:[0-9]+]], $zero, 3
    476 ; 32-CMP-DAG:  addiu $[[I5:[0-9]+]], $zero, 5
    477 ; 32-CMP-DAG:  sltiu $[[R0:[0-9]+]], $4, 32767
    478 ; FIXME: We can do better than this by using selccz to choose between +0 and +2
    479 ; 32-CMP-DAG:  seleqz $[[T0:[0-9]+]], $[[I3]], $[[R0]]
    480 ; 32-CMP-DAG:  selnez $[[T1:[0-9]+]], $[[I5]], $[[R0]]
    481 ; 32-CMP-DAG:  or $2, $[[T0]], $[[T1]]
    482 
    483 ; 64-CMOV-DAG: addiu $[[I3:[0-9]+]], $zero, 3
    484 ; 64-CMOV-DAG: addiu $[[I5:2]], $zero, 5
    485 ; 64-CMOV-DAG: sltiu $[[R0:[0-9]+]], $4, 32767
    486 ; 64-CMOV-DAG: movz $[[I5]], $[[I3]], $[[R0]]
    487 
    488 ; 64-CMP-DAG:  addiu $[[I3:[0-9]+]], $zero, 3
    489 ; 64-CMP-DAG:  addiu $[[I5:[0-9]+]], $zero, 5
    490 ; 64-CMP-DAG:  sltiu $[[R0:[0-9]+]], $4, 32767
    491 ; FIXME: We can do better than this by using selccz to choose between +0 and +2
    492 ; 64-CMP-DAG:  seleqz $[[T0:[0-9]+]], $[[I3]], $[[R0]]
    493 ; 64-CMP-DAG:  selnez $[[T1:[0-9]+]], $[[I5]], $[[R0]]
    494 ; 64-CMP-DAG:  or $2, $[[T0]], $[[T1]]
    495 
    496 define i32 @sltiu0(i32 %a) {
    497 entry:
    498   %cmp = icmp ugt i32 %a, 32766
    499   %cond = select i1 %cmp, i32 3, i32 5
    500   ret i32 %cond
    501 }
    502 
    503 ; ALL-LABEL: sltiu1:
    504 
    505 ; 32-CMOV-DAG: addiu $[[I7:[0-9]+]], $zero, 7
    506 ; 32-CMOV-DAG: addiu $[[I5:2]], $zero, 5
    507 ; 32-CMOV-DAG: addiu $[[R1:[0-9]+]], $zero, 32767
    508 ; 32-CMOV-DAG: sltu $[[R0:[0-9]+]], $[[R1]], $4
    509 ; 32-CMOV-DAG: movn $[[I5]], $[[I7]], $[[R0]]
    510 
    511 ; 32-CMP-DAG:  addiu $[[I7:[0-9]+]], $zero, 7
    512 ; 32-CMP-DAG:  addiu $[[I5:[0-9]+]], $zero, 5
    513 ; 32-CMP-DAG:  addiu $[[I32767:[0-9]+]], $zero, 32767
    514 ; 32-CMP-DAG:  sltu $[[R0:[0-9]+]], $[[I32767]], $4
    515 ; FIXME: We can do better than this by using selccz to choose between -0 and -2
    516 ; 32-CMP-DAG:  selnez $[[T0:[0-9]+]], $[[I7]], $[[R0]]
    517 ; 32-CMP-DAG:  seleqz $[[T1:[0-9]+]], $[[I5]], $[[R0]]
    518 ; 32-CMP-DAG:  or $2, $[[T0]], $[[T1]]
    519 
    520 ; 64-CMOV-DAG: addiu $[[I7:[0-9]+]], $zero, 7
    521 ; 64-CMOV-DAG: addiu $[[I5:2]], $zero, 5
    522 ; 64-CMOV-DAG: addiu $[[R1:[0-9]+]], $zero, 32767
    523 ; 64-CMOV-DAG: sltu $[[R0:[0-9]+]], $[[R1]], $4
    524 ; 64-CMOV-DAG: movn $[[I5]], $[[I7]], $[[R0]]
    525 
    526 ; 64-CMP-DAG:  addiu $[[I7:[0-9]+]], $zero, 7
    527 ; 64-CMP-DAG:  addiu $[[I5:2]], $zero, 5
    528 ; 64-CMP-DAG:  addiu $[[R1:[0-9]+]], $zero, 32767
    529 ; 64-CMP-DAG:  sltu $[[R0:[0-9]+]], $[[R1]], $4
    530 ; FIXME: We can do better than this by using selccz to choose between -0 and -2
    531 ; 64-CMP-DAG:  selnez $[[T0:[0-9]+]], $[[I7]], $[[R0]]
    532 ; 64-CMP-DAG:  seleqz $[[T1:[0-9]+]], $[[I5]], $[[R0]]
    533 ; 64-CMP-DAG:  or $2, $[[T0]], $[[T1]]
    534 
    535 define i32 @sltiu1(i32 %a) {
    536 entry:
    537   %cmp = icmp ugt i32 %a, 32767
    538   %cond = select i1 %cmp, i32 7, i32 5
    539   ret i32 %cond
    540 }
    541 
    542 ; ALL-LABEL: sltiu2:
    543 
    544 ; 32-CMOV-DAG: addiu $[[I3:[0-9]+]], $zero, 3
    545 ; 32-CMOV-DAG: addiu $[[I5:2]], $zero, 5
    546 ; 32-CMOV-DAG: sltiu $[[R0:[0-9]+]], $4, -32768
    547 ; 32-CMOV-DAG: movz $[[I5]], $[[I3]], $[[R0]]
    548 
    549 ; 32-CMP-DAG:  addiu $[[I3:[0-9]+]], $zero, 3
    550 ; 32-CMP-DAG:  addiu $[[I5:[0-9]+]], $zero, 5
    551 ; 32-CMP-DAG:  sltiu $[[R0:[0-9]+]], $4, -32768
    552 ; FIXME: We can do better than this by using selccz to choose between +0 and +2
    553 ; 32-CMP-DAG:  seleqz $[[T0:[0-9]+]], $[[I3]], $[[R0]]
    554 ; 32-CMP-DAG:  selnez $[[T1:[0-9]+]], $[[I5]], $[[R0]]
    555 ; 32-CMP-DAG:  or $2, $[[T0]], $[[T1]]
    556 
    557 ; 64-CMOV-DAG: addiu $[[I3:[0-9]+]], $zero, 3
    558 ; 64-CMOV-DAG: addiu $[[I5:2]], $zero, 5
    559 ; 64-CMOV-DAG: sltiu $[[R0:[0-9]+]], $4, -32768
    560 ; 64-CMOV-DAG: movz $[[I5]], $[[I3]], $[[R0]]
    561 
    562 ; 64-CMP-DAG:  addiu $[[I3:[0-9]+]], $zero, 3
    563 ; 64-CMP-DAG:  addiu $[[I5:[0-9]+]], $zero, 5
    564 ; 64-CMP-DAG:  sltiu $[[R0:[0-9]+]], $4, -32768
    565 ; FIXME: We can do better than this by using selccz to choose between +0 and +2
    566 ; 64-CMP-DAG:  seleqz $[[T0:[0-9]+]], $[[I3]], $[[R0]]
    567 ; 64-CMP-DAG:  selnez $[[T1:[0-9]+]], $[[I5]], $[[R0]]
    568 ; 64-CMP-DAG:  or $2, $[[T0]], $[[T1]]
    569 
    570 define i32 @sltiu2(i32 %a) {
    571 entry:
    572   %cmp = icmp ugt i32 %a, -32769
    573   %cond = select i1 %cmp, i32 3, i32 5
    574   ret i32 %cond
    575 }
    576 
    577 ; ALL-LABEL: sltiu3:
    578 
    579 ; 32-CMOV-DAG: addiu $[[I3:[0-9]+]], $zero, 3
    580 ; 32-CMOV-DAG: addiu $[[I5:2]], $zero, 5
    581 ; 32-CMOV-DAG: lui $[[R1:[0-9]+]], 65535
    582 ; 32-CMOV-DAG: ori $[[R1]], $[[R1]], 32766
    583 ; 32-CMOV-DAG: sltu $[[R0:[0-9]+]], $[[R1]], $4
    584 ; 32-CMOV-DAG: movn $[[I5]], $[[I3]], $[[R0]]
    585 
    586 ; 32-CMP-DAG:  addiu $[[I3:[0-9]+]], $zero, 3
    587 ; 32-CMP-DAG:  addiu $[[I5:[0-9]+]], $zero, 5
    588 ; 32-CMP-DAG:  lui $[[IMM:[0-9]+]], 65535
    589 ; 32-CMP-DAG:  ori $[[IMM]], $[[IMM]], 32766
    590 ; 32-CMP-DAG:  sltu $[[R0:[0-9]+]], $[[I32767]], $4
    591 ; FIXME: We can do better than this by using selccz to choose between -0 and -2
    592 ; 32-CMP-DAG:  selnez $[[T0:[0-9]+]], $[[I3]], $[[R0]]
    593 ; 32-CMP-DAG:  seleqz $[[T1:[0-9]+]], $[[I5]], $[[R0]]
    594 ; 32-CMP-DAG:  or $2, $[[T0]], $[[T1]]
    595 
    596 ; 64-CMOV-DAG: addiu $[[I3:[0-9]+]], $zero, 3
    597 ; 64-CMOV-DAG: addiu $[[I5:2]], $zero, 5
    598 ; 64-CMOV-DAG: lui $[[R1:[0-9]+]], 65535
    599 ; 64-CMOV-DAG: ori $[[R1]], $[[R1]], 32766
    600 ; 64-CMOV-DAG: sltu $[[R0:[0-9]+]], $[[R1]], $4
    601 ; 64-CMOV-DAG: movn $[[I5]], $[[I3]], $[[R0]]
    602 
    603 ; 64-CMP-DAG:  addiu $[[I3:[0-9]+]], $zero, 3
    604 ; 64-CMP-DAG:  addiu $[[I5:2]], $zero, 5
    605 ; 64-CMP-DAG:  lui $[[IMM:[0-9]+]], 65535
    606 ; 64-CMP-DAG:  ori $[[IMM]], $[[IMM]], 32766
    607 ; 64-CMP-DAG:  sltu $[[R0:[0-9]+]], $[[IMM]], $4
    608 ; FIXME: We can do better than this by using selccz to choose between -0 and -2
    609 ; 64-CMP-DAG:  selnez $[[T0:[0-9]+]], $[[I3]], $[[R0]]
    610 ; 64-CMP-DAG:  seleqz $[[T1:[0-9]+]], $[[I5]], $[[R0]]
    611 ; 64-CMP-DAG:  or $2, $[[T0]], $[[T1]]
    612 
    613 define i32 @sltiu3(i32 %a) {
    614 entry:
    615   %cmp = icmp ugt i32 %a, -32770
    616   %cond = select i1 %cmp, i32 3, i32 5
    617   ret i32 %cond
    618 }
    619 
    620 ; Check if
    621 ;  (select (setxx a, N), x, x-1) or
    622 ;  (select (setxx a, N), x-1, x)
    623 ; doesn't generate conditional moves
    624 ; for constant operands whose difference is |1|
    625 
    626 define i32 @slti4(i32 %a) nounwind readnone {
    627   %1 = icmp slt i32 %a, 7
    628   %2 = select i1 %1, i32 4, i32 3
    629   ret i32 %2
    630 }
    631 
    632 ; ALL-LABEL: slti4:
    633 
    634 ; 32-CMOV-DAG: slti [[R1:\$[0-9]+]], $4, 7
    635 ; 32-CMOV-DAG: addiu $2, [[R1]], 3
    636 ; 32-CMOV-NOT: movn
    637 
    638 ; 32-CMP-DAG:  slti [[R1:\$[0-9]+]], $4, 7
    639 ; 32-CMP-DAG:  addiu $2, [[R1]], 3
    640 ; 32-CMP-NOT:  seleqz
    641 ; 32-CMP-NOT:  selnez
    642 
    643 ; 64-CMOV-DAG: slti [[R1:\$[0-9]+]], $4, 7
    644 ; 64-CMOV-DAG: addiu $2, [[R1]], 3
    645 ; 64-CMOV-NOT: movn
    646 
    647 ; 64-CMP-DAG:  slti [[R1:\$[0-9]+]], $4, 7
    648 ; 64-CMP-DAG:  addiu $2, [[R1]], 3
    649 ; 64-CMP-NOT:  seleqz
    650 ; 64-CMP-NOT:  selnez
    651 
    652 define i32 @slti5(i32 %a) nounwind readnone {
    653   %1 = icmp slt i32 %a, 7
    654   %2 = select i1 %1, i32 -3, i32 -4
    655   ret i32 %2
    656 }
    657 
    658 ; ALL-LABEL: slti5:
    659 
    660 ; 32-CMOV-DAG: slti [[R1:\$[0-9]+]], $4, 7
    661 ; 32-CMOV-DAG: addiu [[R3:\$[0-9]+]], [[R2:\$[a-z0-9]+]], -4
    662 ; 32-CMOV-NOT: movn
    663 
    664 ; 32-CMP-DAG:  slti [[R1:\$[0-9]+]], $4, 7
    665 ; 32-CMP-DAG:  addiu [[R3:\$[0-9]+]], [[R2:\$[a-z0-9]+]], -4
    666 ; 32-CMP-NOT:  seleqz
    667 ; 32-CMP-NOT:  selnez
    668 
    669 ; 64-CMOV-DAG: slti [[R1:\$[0-9]+]], $4, 7
    670 ; 64-CMOV-DAG: addiu [[R3:\$[0-9]+]], [[R2:\$[a-z0-9]+]], -4
    671 ; 64-CMOV-NOT: movn
    672 
    673 ; 64-CMP-DAG:  slti [[R1:\$[0-9]+]], $4, 7
    674 ; 64-CMP-DAG:  addiu [[R3:\$[0-9]+]], [[R2:\$[a-z0-9]+]], -4
    675 ; 64-CMP-NOT:  seleqz
    676 ; 64-CMP-NOT:  selnez
    677 
    678 define i32 @slti6(i32 %a) nounwind readnone {
    679   %1 = icmp slt i32 %a, 7
    680   %2 = select i1 %1, i32 3, i32 4
    681   ret i32 %2
    682 }
    683 
    684 ; ALL-LABEL: slti6:
    685 
    686 ; 32-CMOV-DAG: slti [[R1:\$[0-9]+]], $4, 7
    687 ; 32-CMOV-DAG: xori [[R1]], [[R1]], 1
    688 ; 32-CMOV-DAG: addiu [[R2:\$[0-9]+]], [[R1]], 3
    689 ; 32-CMOV-NOT: movn
    690 
    691 ; 32-CMP-DAG:  slti [[R1:\$[0-9]+]], $4, 7
    692 ; 32-CMP-DAG:  xori [[R1]], [[R1]], 1
    693 ; 32-CMP-DAG:  addiu [[R2:\$[0-9]+]], [[R1]], 3
    694 ; 32-CMP-NOT:  seleqz
    695 ; 32-CMP-NOT:  selnez
    696 
    697 ; 64-CMOV-DAG: slti [[R1:\$[0-9]+]], $4, 7
    698 ; 64-CMOV-DAG: xori [[R1]], [[R1]], 1
    699 ; 64-CMOV-DAG: addiu [[R2:\$[0-9]+]], [[R1]], 3
    700 ; 64-CMOV-NOT: movn
    701 
    702 ; 64-CMP-DAG:  slti [[R1:\$[0-9]+]], $4, 7
    703 ; 64-CMP-DAG:  xori [[R1]], [[R1]], 1
    704 ; 64-CMP-DAG:  addiu [[R2:\$[0-9]+]], [[R1]], 3
    705 ; 64-CMP-NOT:  seleqz
    706 ; 64-CMP-NOT:  selnez
    707