Home | History | Annotate | Download | only in SystemZ
      1 ; Test the Test Data Class instruction, selected manually via the intrinsic.
      2 ;
      3 ; RUN: llc < %s -mtriple=s390x-linux-gnu | FileCheck %s
      4 
      5 declare i32 @llvm.s390.tdc.f32(float, i64)
      6 declare i32 @llvm.s390.tdc.f64(double, i64)
      7 declare i32 @llvm.s390.tdc.f128(fp128, i64)
      8 
      9 ; Check using as i32 - f32
     10 define i32 @f1(float %x) {
     11 ; CHECK-LABEL: f1
     12 ; CHECK: tceb %f0, 123
     13 ; CHECK: ipm %r2
     14 ; CHECK: srl %r2, 28
     15   %res = call i32 @llvm.s390.tdc.f32(float %x, i64 123)
     16   ret i32 %res
     17 }
     18 
     19 ; Check using as i32 - f64
     20 define i32 @f2(double %x) {
     21 ; CHECK-LABEL: f2
     22 ; CHECK: tcdb %f0, 123
     23 ; CHECK: ipm %r2
     24 ; CHECK: srl %r2, 28
     25   %res = call i32 @llvm.s390.tdc.f64(double %x, i64 123)
     26   ret i32 %res
     27 }
     28 
     29 ; Check using as i32 - f128
     30 define i32 @f3(fp128 %x) {
     31 ; CHECK-LABEL: f3
     32 ; CHECK: ld %f0, 0(%r2)
     33 ; CHECK: ld %f2, 8(%r2)
     34 ; CHECK: tcxb %f0, 123
     35 ; CHECK: ipm %r2
     36 ; CHECK: srl %r2, 28
     37   %res = call i32 @llvm.s390.tdc.f128(fp128 %x, i64 123)
     38   ret i32 %res
     39 }
     40 
     41 declare void @g()
     42 
     43 ; Check branch
     44 define void @f4(float %x) {
     45 ; CHECK-LABEL: f4
     46 ; CHECK: tceb %f0, 123
     47 ; CHECK: jgl g
     48 ; CHECK: br %r14
     49   %res = call i32 @llvm.s390.tdc.f32(float %x, i64 123)
     50   %cond = icmp ne i32 %res, 0
     51   br i1 %cond, label %call, label %exit
     52 
     53 call:
     54   tail call void @g()
     55   br label %exit
     56 
     57 exit:
     58   ret void
     59 }
     60 
     61 ; Check branch negated
     62 define void @f5(float %x) {
     63 ; CHECK-LABEL: f5
     64 ; CHECK: tceb %f0, 123
     65 ; CHECK: jge g
     66 ; CHECK: br %r14
     67   %res = call i32 @llvm.s390.tdc.f32(float %x, i64 123)
     68   %cond = icmp eq i32 %res, 0
     69   br i1 %cond, label %call, label %exit
     70 
     71 call:
     72   tail call void @g()
     73   br label %exit
     74 
     75 exit:
     76   ret void
     77 }
     78 
     79 ; Check non-const mask
     80 define void @f6(float %x, i64 %y) {
     81 ; CHECK-LABEL: f6
     82 ; CHECK: tceb %f0, 0(%r2)
     83 ; CHECK: jge g
     84 ; CHECK: br %r14
     85   %res = call i32 @llvm.s390.tdc.f32(float %x, i64 %y)
     86   %cond = icmp eq i32 %res, 0
     87   br i1 %cond, label %call, label %exit
     88 
     89 call:
     90   tail call void @g()
     91   br label %exit
     92 
     93 exit:
     94   ret void
     95 }
     96