Home | History | Annotate | Download | only in R600
      1 ; RUN: llc -march=amdgcn -mcpu=SI -verify-machineinstrs < %s | FileCheck -check-prefix=SI -check-prefix=FUNC %s
      2 ; RUN: llc -march=r600 -mcpu=cypress -verify-machineinstrs < %s | FileCheck -check-prefix=EG -check-prefix=FUNC %s
      3 
      4 declare float @llvm.fma.f32(float, float, float) nounwind readnone
      5 declare <2 x float> @llvm.fma.v2f32(<2 x float>, <2 x float>, <2 x float>) nounwind readnone
      6 declare <4 x float> @llvm.fma.v4f32(<4 x float>, <4 x float>, <4 x float>) nounwind readnone
      7 
      8 declare i32 @llvm.r600.read.tidig.x() nounwind readnone
      9 
     10 ; FUNC-LABEL: {{^}}fma_f32:
     11 ; SI: v_fma_f32 {{v[0-9]+, v[0-9]+, v[0-9]+, v[0-9]+}}
     12 
     13 ; EG: MEM_RAT_{{.*}} STORE_{{.*}} [[RES:T[0-9]\.[XYZW]]], {{T[0-9]\.[XYZW]}},
     14 ; EG: FMA {{\*? *}}[[RES]]
     15 define void @fma_f32(float addrspace(1)* %out, float addrspace(1)* %in1,
     16                      float addrspace(1)* %in2, float addrspace(1)* %in3) {
     17   %r0 = load float, float addrspace(1)* %in1
     18   %r1 = load float, float addrspace(1)* %in2
     19   %r2 = load float, float addrspace(1)* %in3
     20   %r3 = tail call float @llvm.fma.f32(float %r0, float %r1, float %r2)
     21   store float %r3, float addrspace(1)* %out
     22   ret void
     23 }
     24 
     25 ; FUNC-LABEL: {{^}}fma_v2f32:
     26 ; SI: v_fma_f32
     27 ; SI: v_fma_f32
     28 
     29 ; EG: MEM_RAT_{{.*}} STORE_{{.*}} [[RES:T[0-9]]].[[CHLO:[XYZW]]][[CHHI:[XYZW]]], {{T[0-9]\.[XYZW]}},
     30 ; EG-DAG: FMA {{\*? *}}[[RES]].[[CHLO]]
     31 ; EG-DAG: FMA {{\*? *}}[[RES]].[[CHHI]]
     32 define void @fma_v2f32(<2 x float> addrspace(1)* %out, <2 x float> addrspace(1)* %in1,
     33                        <2 x float> addrspace(1)* %in2, <2 x float> addrspace(1)* %in3) {
     34   %r0 = load <2 x float>, <2 x float> addrspace(1)* %in1
     35   %r1 = load <2 x float>, <2 x float> addrspace(1)* %in2
     36   %r2 = load <2 x float>, <2 x float> addrspace(1)* %in3
     37   %r3 = tail call <2 x float> @llvm.fma.v2f32(<2 x float> %r0, <2 x float> %r1, <2 x float> %r2)
     38   store <2 x float> %r3, <2 x float> addrspace(1)* %out
     39   ret void
     40 }
     41 
     42 ; FUNC-LABEL: {{^}}fma_v4f32:
     43 ; SI: v_fma_f32
     44 ; SI: v_fma_f32
     45 ; SI: v_fma_f32
     46 ; SI: v_fma_f32
     47 
     48 ; EG: MEM_RAT_{{.*}} STORE_{{.*}} [[RES:T[0-9]]].{{[XYZW][XYZW][XYZW][XYZW]}}, {{T[0-9]\.[XYZW]}},
     49 ; EG-DAG: FMA {{\*? *}}[[RES]].X
     50 ; EG-DAG: FMA {{\*? *}}[[RES]].Y
     51 ; EG-DAG: FMA {{\*? *}}[[RES]].Z
     52 ; EG-DAG: FMA {{\*? *}}[[RES]].W
     53 define void @fma_v4f32(<4 x float> addrspace(1)* %out, <4 x float> addrspace(1)* %in1,
     54                        <4 x float> addrspace(1)* %in2, <4 x float> addrspace(1)* %in3) {
     55   %r0 = load <4 x float>, <4 x float> addrspace(1)* %in1
     56   %r1 = load <4 x float>, <4 x float> addrspace(1)* %in2
     57   %r2 = load <4 x float>, <4 x float> addrspace(1)* %in3
     58   %r3 = tail call <4 x float> @llvm.fma.v4f32(<4 x float> %r0, <4 x float> %r1, <4 x float> %r2)
     59   store <4 x float> %r3, <4 x float> addrspace(1)* %out
     60   ret void
     61 }
     62 
     63 ; FUNC-LABEL: @fma_commute_mul_inline_imm_f32
     64 ; SI: v_fma_f32 {{v[0-9]+}}, 2.0, {{v[0-9]+}}, {{v[0-9]+}}
     65 define void @fma_commute_mul_inline_imm_f32(float addrspace(1)* noalias %out, float addrspace(1)* noalias %in.a, float addrspace(1)* noalias %in.b) nounwind {
     66   %tid = tail call i32 @llvm.r600.read.tidig.x() nounwind readnone
     67   %in.a.gep = getelementptr float, float addrspace(1)* %in.a, i32 %tid
     68   %in.b.gep = getelementptr float, float addrspace(1)* %in.b, i32 %tid
     69   %out.gep = getelementptr float, float addrspace(1)* %out, i32 %tid
     70 
     71   %a = load float, float addrspace(1)* %in.a.gep, align 4
     72   %b = load float, float addrspace(1)* %in.b.gep, align 4
     73 
     74   %fma = call float @llvm.fma.f32(float %a, float 2.0, float %b)
     75   store float %fma, float addrspace(1)* %out.gep, align 4
     76   ret void
     77 }
     78 
     79 ; FUNC-LABEL: @fma_commute_mul_s_f32
     80 define void @fma_commute_mul_s_f32(float addrspace(1)* noalias %out, float addrspace(1)* noalias %in.a, float addrspace(1)* noalias %in.b, float %b) nounwind {
     81   %tid = tail call i32 @llvm.r600.read.tidig.x() nounwind readnone
     82   %in.a.gep = getelementptr float, float addrspace(1)* %in.a, i32 %tid
     83   %in.b.gep = getelementptr float, float addrspace(1)* %in.b, i32 %tid
     84   %out.gep = getelementptr float, float addrspace(1)* %out, i32 %tid
     85 
     86   %a = load float, float addrspace(1)* %in.a.gep, align 4
     87   %c = load float, float addrspace(1)* %in.b.gep, align 4
     88 
     89   %fma = call float @llvm.fma.f32(float %a, float %b, float %c)
     90   store float %fma, float addrspace(1)* %out.gep, align 4
     91   ret void
     92 }
     93