diff options
Diffstat (limited to 'llvm/lib/Target/AMDGPU/SIInstructions.td')
| -rw-r--r-- | llvm/lib/Target/AMDGPU/SIInstructions.td | 47 | 
1 files changed, 45 insertions, 2 deletions
diff --git a/llvm/lib/Target/AMDGPU/SIInstructions.td b/llvm/lib/Target/AMDGPU/SIInstructions.td index 4831ede3d54..05fdd3065aa 100644 --- a/llvm/lib/Target/AMDGPU/SIInstructions.td +++ b/llvm/lib/Target/AMDGPU/SIInstructions.td @@ -513,6 +513,7 @@ defm SI_SPILL_S128 : SI_SPILL_SGPR <SReg_128>;  defm SI_SPILL_S160 : SI_SPILL_SGPR <SReg_160>;  defm SI_SPILL_S256 : SI_SPILL_SGPR <SReg_256>;  defm SI_SPILL_S512 : SI_SPILL_SGPR <SReg_512>; +defm SI_SPILL_S1024 : SI_SPILL_SGPR <SReg_1024>;  multiclass SI_SPILL_VGPR <RegisterClass vgpr_class> {    let UseNamedOperandTable = 1, VGPRSpill = 1, @@ -524,7 +525,9 @@ multiclass SI_SPILL_VGPR <RegisterClass vgpr_class> {        let mayStore = 1;        let mayLoad = 0;        // (2 * 4) + (8 * num_subregs) bytes maximum -      let Size = !add(!shl(!srl(vgpr_class.Size, 5), 3), 8); +      int MaxSize = !add(!shl(!srl(vgpr_class.Size, 5), 3), 8); +      // Size field is unsigned char and cannot fit more. +      let Size = !if(!le(MaxSize, 256), MaxSize, 252);      }      def _RESTORE : VPseudoInstSI < @@ -535,7 +538,9 @@ multiclass SI_SPILL_VGPR <RegisterClass vgpr_class> {        let mayLoad = 1;        // (2 * 4) + (8 * num_subregs) bytes maximum -      let Size = !add(!shl(!srl(vgpr_class.Size, 5), 3), 8); +      int MaxSize = !add(!shl(!srl(vgpr_class.Size, 5), 3), 8); +      // Size field is unsigned char and cannot fit more. +      let Size = !if(!le(MaxSize, 256), MaxSize, 252);      }    } // End UseNamedOperandTable = 1, VGPRSpill = 1, SchedRW = [WriteVMEM]  } @@ -547,6 +552,44 @@ defm SI_SPILL_V128 : SI_SPILL_VGPR <VReg_128>;  defm SI_SPILL_V160 : SI_SPILL_VGPR <VReg_160>;  defm SI_SPILL_V256 : SI_SPILL_VGPR <VReg_256>;  defm SI_SPILL_V512 : SI_SPILL_VGPR <VReg_512>; +defm SI_SPILL_V1024 : SI_SPILL_VGPR <VReg_1024>; + +multiclass SI_SPILL_AGPR <RegisterClass vgpr_class> { +  let UseNamedOperandTable = 1, VGPRSpill = 1, +      Constraints = "@earlyclobber $tmp", +      SchedRW = [WriteVMEM] in { +    def _SAVE : VPseudoInstSI < +      (outs VGPR_32:$tmp), +      (ins vgpr_class:$vdata, i32imm:$vaddr, SReg_128:$srsrc, +           SReg_32:$soffset, i32imm:$offset)> { +      let mayStore = 1; +      let mayLoad = 0; +      // (2 * 4) + (16 * num_subregs) bytes maximum +      int MaxSize = !add(!shl(!srl(vgpr_class.Size, 5), 4), 8); +      // Size field is unsigned char and cannot fit more. +      let Size = !if(!le(MaxSize, 256), MaxSize, 252); +    } + +    def _RESTORE : VPseudoInstSI < +      (outs vgpr_class:$vdata, VGPR_32:$tmp), +      (ins i32imm:$vaddr, SReg_128:$srsrc, SReg_32:$soffset, +           i32imm:$offset)> { +      let mayStore = 0; +      let mayLoad = 1; + +      // (2 * 4) + (16 * num_subregs) bytes maximum +      int MaxSize = !add(!shl(!srl(vgpr_class.Size, 5), 4), 8); +      // Size field is unsigned char and cannot fit more. +      let Size = !if(!le(MaxSize, 256), MaxSize, 252); +    } +  } // End UseNamedOperandTable = 1, VGPRSpill = 1, SchedRW = [WriteVMEM] +} + +defm SI_SPILL_A32  : SI_SPILL_AGPR <AGPR_32>; +defm SI_SPILL_A64  : SI_SPILL_AGPR <AReg_64>; +defm SI_SPILL_A128 : SI_SPILL_AGPR <AReg_128>; +defm SI_SPILL_A512 : SI_SPILL_AGPR <AReg_512>; +defm SI_SPILL_A1024 : SI_SPILL_AGPR <AReg_1024>;  def SI_PC_ADD_REL_OFFSET : SPseudoInstSI <    (outs SReg_64:$dst),  | 

