mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-23 19:23:23 +01:00
59de807f62
This is the groundwork required to implement strictfp. For now, this should be NFC for regular instructoins (many instructions just gain an extra use of a reserved register). Regalloc won't rematerialize instructions with reads of physical registers, but we were suffering from that anyway with the exec reads. Should add it for all the related FP uses (possibly with some extras). I did not add it to either the gpr index mode instructions (or every single VALU instruction) since it's a ridiculous feature already modeled as an arbitrary side effect. Also work towards marking instructions with FP exceptions. This doesn't actually set the bit yet since this would start to change codegen. It seems nofpexcept is currently not implied from the regular IR FP operations. Add it to some MIR tests where I think it might matter.
211 lines
5.8 KiB
YAML
211 lines
5.8 KiB
YAML
# RUN: llc -march=amdgcn -mcpu=gfx900 %s -run-pass twoaddressinstruction -verify-machineinstrs -o - | FileCheck -check-prefix=GCN %s
|
|
|
|
# GCN-LABEL: name: test_madmk_reg_imm_f32
|
|
# GCN: V_MADMK_F32 killed %0.sub0, 1078523331, killed %1, implicit $mode, implicit $exec
|
|
---
|
|
name: test_madmk_reg_imm_f32
|
|
registers:
|
|
- { id: 0, class: vreg_64 }
|
|
- { id: 1, class: vgpr_32 }
|
|
- { id: 2, class: vgpr_32 }
|
|
- { id: 3, class: vgpr_32 }
|
|
body: |
|
|
bb.0:
|
|
|
|
%0 = IMPLICIT_DEF
|
|
%1 = COPY %0.sub1
|
|
%2 = V_MOV_B32_e32 1078523331, implicit $exec
|
|
%3 = V_MAC_F32_e32 killed %0.sub0, %2, killed %1, implicit $mode, implicit $exec
|
|
|
|
...
|
|
|
|
# GCN-LABEL: name: test_madmk_imm_reg_f32
|
|
# GCN: V_MADMK_F32 killed %0.sub0, 1078523331, killed %1, implicit $mode, implicit $exec
|
|
---
|
|
name: test_madmk_imm_reg_f32
|
|
registers:
|
|
- { id: 0, class: vreg_64 }
|
|
- { id: 1, class: vgpr_32 }
|
|
- { id: 2, class: vgpr_32 }
|
|
- { id: 3, class: vgpr_32 }
|
|
body: |
|
|
bb.0:
|
|
|
|
%0 = IMPLICIT_DEF
|
|
%1 = COPY %0.sub1
|
|
%2 = V_MOV_B32_e32 1078523331, implicit $exec
|
|
%3 = V_MAC_F32_e32 %2, killed %0.sub0, killed %1, implicit $mode, implicit $exec
|
|
|
|
...
|
|
|
|
# GCN-LABEL: name: test_madak_f32
|
|
# GCN: V_MADAK_F32 killed %0.sub0, %0.sub1, 1078523331, implicit $mode, implicit $exec
|
|
---
|
|
name: test_madak_f32
|
|
registers:
|
|
- { id: 0, class: vreg_64 }
|
|
- { id: 1, class: vgpr_32 }
|
|
- { id: 2, class: vgpr_32 }
|
|
body: |
|
|
bb.0:
|
|
|
|
%0 = IMPLICIT_DEF
|
|
%1 = V_MOV_B32_e32 1078523331, implicit $exec
|
|
%2 = V_MAC_F32_e32 killed %0.sub0, %0.sub1, %1, implicit $mode, implicit $exec
|
|
|
|
...
|
|
|
|
# GCN-LABEL: name: test_madmk_reg_imm_f16
|
|
# GCN: V_MADMK_F16 killed %0.sub0, 1078523331, killed %1, implicit $mode, implicit $exec
|
|
---
|
|
name: test_madmk_reg_imm_f16
|
|
registers:
|
|
- { id: 0, class: vreg_64 }
|
|
- { id: 1, class: vgpr_32 }
|
|
- { id: 2, class: vgpr_32 }
|
|
- { id: 3, class: vgpr_32 }
|
|
body: |
|
|
bb.0:
|
|
|
|
%0 = IMPLICIT_DEF
|
|
%1 = COPY %0.sub1
|
|
%2 = V_MOV_B32_e32 1078523331, implicit $exec
|
|
%3 = V_MAC_F16_e32 killed %0.sub0, %2, killed %1, implicit $mode, implicit $exec
|
|
|
|
...
|
|
|
|
# GCN-LABEL: name: test_madmk_imm_reg_f16
|
|
# GCN: V_MADMK_F16 killed %0.sub0, 1078523331, killed %1, implicit $mode, implicit $exec
|
|
---
|
|
name: test_madmk_imm_reg_f16
|
|
registers:
|
|
- { id: 0, class: vreg_64 }
|
|
- { id: 1, class: vgpr_32 }
|
|
- { id: 2, class: vgpr_32 }
|
|
- { id: 3, class: vgpr_32 }
|
|
body: |
|
|
bb.0:
|
|
|
|
%0 = IMPLICIT_DEF
|
|
%1 = COPY %0.sub1
|
|
%2 = V_MOV_B32_e32 1078523331, implicit $exec
|
|
%3 = V_MAC_F16_e32 %2, killed %0.sub0, killed %1, implicit $mode, implicit $exec
|
|
|
|
...
|
|
|
|
# GCN-LABEL: name: test_madak_f16
|
|
# GCN: V_MADAK_F16 killed %0.sub0, %0.sub1, 1078523331, implicit $mode, implicit $exec
|
|
---
|
|
name: test_madak_f16
|
|
registers:
|
|
- { id: 0, class: vreg_64 }
|
|
- { id: 1, class: vgpr_32 }
|
|
- { id: 2, class: vgpr_32 }
|
|
body: |
|
|
bb.0:
|
|
|
|
%0 = IMPLICIT_DEF
|
|
%1 = V_MOV_B32_e32 1078523331, implicit $exec
|
|
%2 = V_MAC_F16_e32 killed %0.sub0, %0.sub1, %1, implicit $mode, implicit $exec
|
|
...
|
|
|
|
# Make sure constant bus restriction isn't violated if src0 is an SGPR.
|
|
|
|
# GCN-LABEL: name: test_madak_sgpr_src0_f32
|
|
# GCN: %1:vgpr_32 = V_MOV_B32_e32 1078523331, implicit $exec
|
|
# GCN: %2:vgpr_32 = V_MAD_F32 0, killed %0, 0, %1, 0, %3:vgpr_32, 0, 0, implicit $mode, implicit $exec
|
|
|
|
---
|
|
name: test_madak_sgpr_src0_f32
|
|
registers:
|
|
- { id: 0, class: sreg_32_xm0 }
|
|
- { id: 1, class: vgpr_32}
|
|
- { id: 2, class: vgpr_32 }
|
|
- { id: 3, class: vgpr_32 }
|
|
body: |
|
|
bb.0:
|
|
|
|
%0 = IMPLICIT_DEF
|
|
%1 = V_MOV_B32_e32 1078523331, implicit $exec
|
|
%2 = V_MAC_F32_e32 killed %0, %1, %3, implicit $mode, implicit $exec
|
|
|
|
...
|
|
|
|
# This can still fold if this is an inline immediate.
|
|
|
|
# GCN-LABEL: name: test_madak_inlineimm_src0_f32
|
|
# GCN: %1:vgpr_32 = V_MADMK_F32 1073741824, 1078523331, %2:vgpr_32, implicit $mode, implicit $exec
|
|
|
|
---
|
|
name: test_madak_inlineimm_src0_f32
|
|
registers:
|
|
- { id: 0, class: vgpr_32}
|
|
- { id: 1, class: vgpr_32 }
|
|
- { id: 2, class: vgpr_32 }
|
|
body: |
|
|
bb.0:
|
|
|
|
%0 = V_MOV_B32_e32 1078523331, implicit $exec
|
|
%1 = V_MAC_F32_e32 1073741824, %0, %2, implicit $mode, implicit $exec
|
|
|
|
...
|
|
# Non-inline immediate uses constant bus already.
|
|
|
|
# GCN-LABEL: name: test_madak_otherimm_src0_f32
|
|
# GCN: %1:vgpr_32 = V_MAC_F32_e32 1120403456, %0, %1, implicit $mode, implicit $exec
|
|
|
|
---
|
|
name: test_madak_otherimm_src0_f32
|
|
registers:
|
|
- { id: 0, class: vgpr_32}
|
|
- { id: 1, class: vgpr_32 }
|
|
- { id: 2, class: vgpr_32 }
|
|
body: |
|
|
bb.0:
|
|
|
|
%0 = V_MOV_B32_e32 1078523331, implicit $exec
|
|
%1 = V_MAC_F32_e32 1120403456, %0, %2, implicit $mode, implicit $exec
|
|
|
|
...
|
|
# Non-inline immediate uses constant bus already.
|
|
|
|
# GCN-LABEL: name: test_madak_other_constantlike_src0_f32
|
|
# GCN: %1:vgpr_32 = V_MAC_F32_e32 %stack.0, %0, %1, implicit $mode, implicit $exec
|
|
---
|
|
name: test_madak_other_constantlike_src0_f32
|
|
registers:
|
|
- { id: 0, class: vgpr_32}
|
|
- { id: 1, class: vgpr_32 }
|
|
- { id: 2, class: vgpr_32 }
|
|
stack:
|
|
- { id: 0, name: "", type: default, offset: 0, size: 128, alignment: 8,
|
|
callee-saved-register: '', local-offset: 0, debug-info-variable: '',
|
|
debug-info-expression: '', debug-info-location: '' }
|
|
body: |
|
|
bb.0:
|
|
|
|
%0 = V_MOV_B32_e32 1078523331, implicit $exec
|
|
%1 = V_MAC_F32_e32 %stack.0, %0, %2, implicit $mode, implicit $exec
|
|
|
|
...
|
|
|
|
# GCN-LABEL: name: test_madak_inline_literal_f16
|
|
# GCN: %2:vgpr_32 = V_MADAK_F16 16384, killed %0, 49664, implicit $mode, implicit $exec
|
|
|
|
---
|
|
name: test_madak_inline_literal_f16
|
|
liveins:
|
|
- { reg: '$vgpr0', virtual-reg: '%3' }
|
|
body: |
|
|
bb.0:
|
|
liveins: $vgpr0
|
|
|
|
%3:vgpr_32 = COPY killed $vgpr0
|
|
|
|
%26:vgpr_32 = V_MOV_B32_e32 49664, implicit $exec
|
|
%28:vgpr_32 = V_MAC_F16_e32 16384, killed %3, %26, implicit $mode, implicit $exec
|
|
S_ENDPGM 0
|
|
|
|
...
|
|
|