Home | History | Annotate | Download | only in AMDGPU
      1 ; RUN: llc -march=amdgcn -verify-machineinstrs < %s | FileCheck -check-prefix=SI %s
      2 ; RUN: llc -march=amdgcn -mcpu=tonga -verify-machineinstrs < %s | FileCheck -check-prefix=SI %s
      3 
      4 declare float @llvm.fabs.f32(float) #1
      5 declare double @llvm.fabs.f64(double) #1
      6 
      7 ; SI-LABEL: {{^}}test_isinf_pattern:
      8 ; SI: v_mov_b32_e32 [[MASK:v[0-9]+]], 0x204{{$}}
      9 ; SI: v_cmp_class_f32_e32 vcc, s{{[0-9]+}}, [[MASK]]
     10 ; SI-NOT: v_cmp
     11 ; SI: s_endpgm
     12 define amdgpu_kernel void @test_isinf_pattern(i32 addrspace(1)* nocapture %out, float %x) #0 {
     13   %fabs = tail call float @llvm.fabs.f32(float %x) #1
     14   %cmp = fcmp oeq float %fabs, 0x7FF0000000000000
     15   %ext = zext i1 %cmp to i32
     16   store i32 %ext, i32 addrspace(1)* %out, align 4
     17   ret void
     18 }
     19 
     20 ; SI-LABEL: {{^}}test_not_isinf_pattern_0:
     21 ; SI-NOT: v_cmp_class
     22 ; SI: s_endpgm
     23 define amdgpu_kernel void @test_not_isinf_pattern_0(i32 addrspace(1)* nocapture %out, float %x) #0 {
     24   %fabs = tail call float @llvm.fabs.f32(float %x) #1
     25   %cmp = fcmp ueq float %fabs, 0x7FF0000000000000
     26   %ext = zext i1 %cmp to i32
     27   store i32 %ext, i32 addrspace(1)* %out, align 4
     28   ret void
     29 }
     30 
     31 ; SI-LABEL: {{^}}test_not_isinf_pattern_1:
     32 ; SI-NOT: v_cmp_class
     33 ; SI: s_endpgm
     34 define amdgpu_kernel void @test_not_isinf_pattern_1(i32 addrspace(1)* nocapture %out, float %x) #0 {
     35   %fabs = tail call float @llvm.fabs.f32(float %x) #1
     36   %cmp = fcmp oeq float %fabs, 0xFFF0000000000000
     37   %ext = zext i1 %cmp to i32
     38   store i32 %ext, i32 addrspace(1)* %out, align 4
     39   ret void
     40 }
     41 
     42 ; SI-LABEL: {{^}}test_isfinite_pattern_0:
     43 ; SI-NOT: v_cmp
     44 ; SI: v_mov_b32_e32 [[MASK:v[0-9]+]], 0x1f8{{$}}
     45 ; SI: v_cmp_class_f32_e32 vcc, s{{[0-9]+}}, [[MASK]]
     46 ; SI-NOT: v_cmp
     47 ; SI: s_endpgm
     48 define amdgpu_kernel void @test_isfinite_pattern_0(i32 addrspace(1)* nocapture %out, float %x) #0 {
     49   %ord = fcmp ord float %x, 0.000000e+00
     50   %x.fabs = tail call float @llvm.fabs.f32(float %x) #1
     51   %ninf = fcmp une float %x.fabs, 0x7FF0000000000000
     52   %and = and i1 %ord, %ninf
     53   %ext = zext i1 %and to i32
     54   store i32 %ext, i32 addrspace(1)* %out, align 4
     55   ret void
     56 }
     57 
     58 ; Use negative infinity
     59 ; SI-LABEL: {{^}}test_isfinite_not_pattern_0:
     60 ; SI-NOT: v_cmp_class_f32
     61 ; SI: s_endpgm
     62 define amdgpu_kernel void @test_isfinite_not_pattern_0(i32 addrspace(1)* nocapture %out, float %x) #0 {
     63   %ord = fcmp ord float %x, 0.000000e+00
     64   %x.fabs = tail call float @llvm.fabs.f32(float %x) #1
     65   %ninf = fcmp une float %x.fabs, 0xFFF0000000000000
     66   %and = and i1 %ord, %ninf
     67   %ext = zext i1 %and to i32
     68   store i32 %ext, i32 addrspace(1)* %out, align 4
     69   ret void
     70 }
     71 
     72 ; No fabs
     73 ; SI-LABEL: {{^}}test_isfinite_not_pattern_1:
     74 ; SI-NOT: v_cmp_class_f32
     75 ; SI: s_endpgm
     76 define amdgpu_kernel void @test_isfinite_not_pattern_1(i32 addrspace(1)* nocapture %out, float %x) #0 {
     77   %ord = fcmp ord float %x, 0.000000e+00
     78   %ninf = fcmp une float %x, 0x7FF0000000000000
     79   %and = and i1 %ord, %ninf
     80   %ext = zext i1 %and to i32
     81   store i32 %ext, i32 addrspace(1)* %out, align 4
     82   ret void
     83 }
     84 
     85 ; fabs of different value
     86 ; SI-LABEL: {{^}}test_isfinite_not_pattern_2:
     87 ; SI-NOT: v_cmp_class_f32
     88 ; SI: s_endpgm
     89 define amdgpu_kernel void @test_isfinite_not_pattern_2(i32 addrspace(1)* nocapture %out, float %x, float %y) #0 {
     90   %ord = fcmp ord float %x, 0.000000e+00
     91   %x.fabs = tail call float @llvm.fabs.f32(float %y) #1
     92   %ninf = fcmp une float %x.fabs, 0x7FF0000000000000
     93   %and = and i1 %ord, %ninf
     94   %ext = zext i1 %and to i32
     95   store i32 %ext, i32 addrspace(1)* %out, align 4
     96   ret void
     97 }
     98 
     99 ; Wrong ordered compare type
    100 ; SI-LABEL: {{^}}test_isfinite_not_pattern_3:
    101 ; SI-NOT: v_cmp_class_f32
    102 ; SI: s_endpgm
    103 define amdgpu_kernel void @test_isfinite_not_pattern_3(i32 addrspace(1)* nocapture %out, float %x) #0 {
    104   %ord = fcmp uno float %x, 0.000000e+00
    105   %x.fabs = tail call float @llvm.fabs.f32(float %x) #1
    106   %ninf = fcmp une float %x.fabs, 0x7FF0000000000000
    107   %and = and i1 %ord, %ninf
    108   %ext = zext i1 %and to i32
    109   store i32 %ext, i32 addrspace(1)* %out, align 4
    110   ret void
    111 }
    112 
    113 ; Wrong unordered compare
    114 ; SI-LABEL: {{^}}test_isfinite_not_pattern_4:
    115 ; SI-NOT: v_cmp_class_f32
    116 ; SI: s_endpgm
    117 define amdgpu_kernel void @test_isfinite_not_pattern_4(i32 addrspace(1)* nocapture %out, float %x) #0 {
    118   %ord = fcmp ord float %x, 0.000000e+00
    119   %x.fabs = tail call float @llvm.fabs.f32(float %x) #1
    120   %ninf = fcmp one float %x.fabs, 0x7FF0000000000000
    121   %and = and i1 %ord, %ninf
    122   %ext = zext i1 %and to i32
    123   store i32 %ext, i32 addrspace(1)* %out, align 4
    124   ret void
    125 }
    126 
    127 attributes #0 = { nounwind }
    128 attributes #1 = { nounwind readnone }
    129