Home | History | Annotate | Download | only in SystemZ
      1 ; Test that we can use NI for byte operations that are expressed as i32
      2 ; or i64 operations.
      3 ;
      4 ; RUN: llc < %s -mtriple=s390x-linux-gnu | FileCheck %s
      5 
      6 ; Zero extension to 32 bits, negative constant.
      7 define void @f1(i8 *%ptr) {
      8 ; CHECK-LABEL: f1:
      9 ; CHECK: ni 0(%r2), 254
     10 ; CHECK: br %r14
     11   %val = load i8 , i8 *%ptr
     12   %ext = zext i8 %val to i32
     13   %and = and i32 %ext, -2
     14   %trunc = trunc i32 %and to i8
     15   store i8 %trunc, i8 *%ptr
     16   ret void
     17 }
     18 
     19 ; Zero extension to 64 bits, negative constant.
     20 define void @f2(i8 *%ptr) {
     21 ; CHECK-LABEL: f2:
     22 ; CHECK: ni 0(%r2), 254
     23 ; CHECK: br %r14
     24   %val = load i8 , i8 *%ptr
     25   %ext = zext i8 %val to i64
     26   %and = and i64 %ext, -2
     27   %trunc = trunc i64 %and to i8
     28   store i8 %trunc, i8 *%ptr
     29   ret void
     30 }
     31 
     32 ; Zero extension to 32 bits, positive constant.
     33 define void @f3(i8 *%ptr) {
     34 ; CHECK-LABEL: f3:
     35 ; CHECK: ni 0(%r2), 254
     36 ; CHECK: br %r14
     37   %val = load i8 , i8 *%ptr
     38   %ext = zext i8 %val to i32
     39   %and = and i32 %ext, 254
     40   %trunc = trunc i32 %and to i8
     41   store i8 %trunc, i8 *%ptr
     42   ret void
     43 }
     44 
     45 ; Zero extension to 64 bits, positive constant.
     46 define void @f4(i8 *%ptr) {
     47 ; CHECK-LABEL: f4:
     48 ; CHECK: ni 0(%r2), 254
     49 ; CHECK: br %r14
     50   %val = load i8 , i8 *%ptr
     51   %ext = zext i8 %val to i64
     52   %and = and i64 %ext, 254
     53   %trunc = trunc i64 %and to i8
     54   store i8 %trunc, i8 *%ptr
     55   ret void
     56 }
     57 
     58 ; Sign extension to 32 bits, negative constant.
     59 define void @f5(i8 *%ptr) {
     60 ; CHECK-LABEL: f5:
     61 ; CHECK: ni 0(%r2), 254
     62 ; CHECK: br %r14
     63   %val = load i8 , i8 *%ptr
     64   %ext = sext i8 %val to i32
     65   %and = and i32 %ext, -2
     66   %trunc = trunc i32 %and to i8
     67   store i8 %trunc, i8 *%ptr
     68   ret void
     69 }
     70 
     71 ; Sign extension to 64 bits, negative constant.
     72 define void @f6(i8 *%ptr) {
     73 ; CHECK-LABEL: f6:
     74 ; CHECK: ni 0(%r2), 254
     75 ; CHECK: br %r14
     76   %val = load i8 , i8 *%ptr
     77   %ext = sext i8 %val to i64
     78   %and = and i64 %ext, -2
     79   %trunc = trunc i64 %and to i8
     80   store i8 %trunc, i8 *%ptr
     81   ret void
     82 }
     83 
     84 ; Sign extension to 32 bits, positive constant.
     85 define void @f7(i8 *%ptr) {
     86 ; CHECK-LABEL: f7:
     87 ; CHECK: ni 0(%r2), 254
     88 ; CHECK: br %r14
     89   %val = load i8 , i8 *%ptr
     90   %ext = sext i8 %val to i32
     91   %and = and i32 %ext, 254
     92   %trunc = trunc i32 %and to i8
     93   store i8 %trunc, i8 *%ptr
     94   ret void
     95 }
     96 
     97 ; Sign extension to 64 bits, positive constant.
     98 define void @f8(i8 *%ptr) {
     99 ; CHECK-LABEL: f8:
    100 ; CHECK: ni 0(%r2), 254
    101 ; CHECK: br %r14
    102   %val = load i8 , i8 *%ptr
    103   %ext = sext i8 %val to i64
    104   %and = and i64 %ext, 254
    105   %trunc = trunc i64 %and to i8
    106   store i8 %trunc, i8 *%ptr
    107   ret void
    108 }
    109