Home | History | Annotate | Download | only in SystemZ
      1 ; Test 32-bit inequality comparisons that are really between a memory byte
      2 ; and a constant.
      3 ;
      4 ; RUN: llc < %s -mtriple=s390x-linux-gnu | FileCheck %s
      5 
      6 ; Check the low end of the 8-bit unsigned range, with zero extension.
      7 define double @f1(double %a, double %b, i8 *%ptr) {
      8 ; CHECK-LABEL: f1:
      9 ; CHECK: cli 0(%r2), 0
     10 ; CHECK-NEXT: jlh
     11 ; CHECK: br %r14
     12   %val = load i8 *%ptr
     13   %ext = zext i8 %val to i32
     14   %cond = icmp ne i32 %ext, 0
     15   %res = select i1 %cond, double %a, double %b
     16   ret double %res
     17 }
     18 
     19 ; Check the high end of the 8-bit unsigned range, with zero extension.
     20 define double @f2(double %a, double %b, i8 *%ptr) {
     21 ; CHECK-LABEL: f2:
     22 ; CHECK: cli 0(%r2), 255
     23 ; CHECK-NEXT: jlh
     24 ; CHECK: br %r14
     25   %val = load i8 *%ptr
     26   %ext = zext i8 %val to i32
     27   %cond = icmp ne i32 %ext, 255
     28   %res = select i1 %cond, double %a, double %b
     29   ret double %res
     30 }
     31 
     32 ; Check the next value up, with zero extension.  The condition is always false.
     33 define double @f3(double %a, double %b, i8 *%ptr) {
     34 ; CHECK-LABEL: f3:
     35 ; CHECK-NOT: cli
     36 ; CHECK: br %r14
     37   %val = load i8 *%ptr
     38   %ext = zext i8 %val to i32
     39   %cond = icmp ne i32 %ext, 256
     40   %res = select i1 %cond, double %a, double %b
     41   ret double %res
     42 }
     43 
     44 ; Check comparisons with -1, with zero extension.
     45 ; This condition is also always false.
     46 define double @f4(double %a, double %b, i8 *%ptr) {
     47 ; CHECK-LABEL: f4:
     48 ; CHECK-NOT: cli
     49 ; CHECK: br %r14
     50   %val = load i8 *%ptr
     51   %ext = zext i8 %val to i32
     52   %cond = icmp ne i32 %ext, -1
     53   %res = select i1 %cond, double %a, double %b
     54   ret double %res
     55 }
     56 
     57 ; Check comparisons with 0, using sign extension.
     58 define double @f5(double %a, double %b, i8 *%ptr) {
     59 ; CHECK-LABEL: f5:
     60 ; CHECK: cli 0(%r2), 0
     61 ; CHECK-NEXT: jlh
     62 ; CHECK: br %r14
     63   %val = load i8 *%ptr
     64   %ext = sext i8 %val to i32
     65   %cond = icmp ne i32 %ext, 0
     66   %res = select i1 %cond, double %a, double %b
     67   ret double %res
     68 }
     69 
     70 ; Check the high end of the signed 8-bit range, using sign extension.
     71 define double @f6(double %a, double %b, i8 *%ptr) {
     72 ; CHECK-LABEL: f6:
     73 ; CHECK: cli 0(%r2), 127
     74 ; CHECK-NEXT: jlh
     75 ; CHECK: br %r14
     76   %val = load i8 *%ptr
     77   %ext = sext i8 %val to i32
     78   %cond = icmp ne i32 %ext, 127
     79   %res = select i1 %cond, double %a, double %b
     80   ret double %res
     81 }
     82 
     83 ; Check the next value up, using sign extension.
     84 ; The condition is always false.
     85 define double @f7(double %a, double %b, i8 *%ptr) {
     86 ; CHECK-LABEL: f7:
     87 ; CHECK-NOT: cli
     88 ; CHECK: br %r14
     89   %val = load i8 *%ptr
     90   %ext = sext i8 %val to i32
     91   %cond = icmp ne i32 %ext, 128
     92   %res = select i1 %cond, double %a, double %b
     93   ret double %res
     94 }
     95 
     96 ; Check comparisons with -1, using sign extension.
     97 define double @f8(double %a, double %b, i8 *%ptr) {
     98 ; CHECK-LABEL: f8:
     99 ; CHECK: cli 0(%r2), 255
    100 ; CHECK-NEXT: jlh
    101 ; CHECK: br %r14
    102   %val = load i8 *%ptr
    103   %ext = sext i8 %val to i32
    104   %cond = icmp ne i32 %ext, -1
    105   %res = select i1 %cond, double %a, double %b
    106   ret double %res
    107 }
    108 
    109 ; Check the low end of the signed 8-bit range, using sign extension.
    110 define double @f9(double %a, double %b, i8 *%ptr) {
    111 ; CHECK-LABEL: f9:
    112 ; CHECK: cli 0(%r2), 128
    113 ; CHECK-NEXT: jlh
    114 ; CHECK: br %r14
    115   %val = load i8 *%ptr
    116   %ext = sext i8 %val to i32
    117   %cond = icmp ne i32 %ext, -128
    118   %res = select i1 %cond, double %a, double %b
    119   ret double %res
    120 }
    121 
    122 ; Check the next value down, using sign extension.
    123 ; The condition is always false.
    124 define double @f10(double %a, double %b, i8 *%ptr) {
    125 ; CHECK-LABEL: f10:
    126 ; CHECK-NOT: cli
    127 ; CHECK: br %r14
    128   %val = load i8 *%ptr
    129   %ext = sext i8 %val to i32
    130   %cond = icmp ne i32 %ext, -129
    131   %res = select i1 %cond, double %a, double %b
    132   ret double %res
    133 }
    134