@@ -561,6 +561,74 @@ namespace IGC
561
561
}
562
562
}
563
563
564
+ void CEncoder::TypedAtomic (
565
+ AtomicOp atomic_op,
566
+ CVariable* dst,
567
+ const ResourceDescriptor& resource,
568
+ CVariable* pU,
569
+ CVariable* pV,
570
+ CVariable* pR,
571
+ CVariable* src0,
572
+ CVariable* src1,
573
+ CVariable* lod,
574
+ bool is16Bit)
575
+ {
576
+ VISAAtomicOps subOp = convertAtomicOpEnumToVisa (atomic_op);
577
+ VISA_PredOpnd* pred = GetFlagOperand (m_encoderState.m_flag );
578
+ VISA_EMask_Ctrl emask = ConvertMaskToVisaType (m_encoderState.m_mask , m_encoderState.m_noMask );
579
+ VISA_Exec_Size executionSize = visaExecSize (m_encoderState.m_simdSize );
580
+
581
+ VISA_StateOpndHandle* pSurfStateOpndHandle = GetVISASurfaceOpnd (resource);
582
+
583
+ if (pU && pU->GetType () != ISA_TYPE_UD)
584
+ pU = m_program->BitCast (pU, ISA_TYPE_UD);
585
+ if (pV && pV->GetType () != ISA_TYPE_UD)
586
+ pV = m_program->BitCast (pV, ISA_TYPE_UD);
587
+ if (pR && pR->GetType () != ISA_TYPE_UD)
588
+ pR = m_program->BitCast (pR, ISA_TYPE_UD);
589
+
590
+ VISA_RawOpnd* pUOpnd = GetRawSource (pU);
591
+ VISA_RawOpnd* pVOpnd = GetRawSource (pV);
592
+ VISA_RawOpnd* pROpnd = GetRawSource (pR);
593
+
594
+ VISA_Type type = ISA_TYPE_UD;
595
+ if (atomic_op == EATOMIC_IMAX || atomic_op == EATOMIC_IMIN)
596
+ type = ISA_TYPE_D;
597
+
598
+ if (dst && dst->GetType () != type)
599
+ dst = m_program->BitCast (dst, type);
600
+ if (src0 && src0->GetType () != type)
601
+ src0 = m_program->BitCast (src0, type);
602
+ if (src1 && src1->GetType () != type)
603
+ src1 = m_program->BitCast (src1, type);
604
+
605
+ VISA_RawOpnd* pDst = GetRawDestination (dst);
606
+ VISA_RawOpnd* pSrc0 = GetRawSource (src0);
607
+ VISA_RawOpnd* pSrc1 = GetRawSource (src1);
608
+
609
+ // See DwordAtomicRaw for explanation why we need this
610
+ if (atomic_op == EATOMIC_CMPXCHG) {
611
+ std::swap (pSrc0, pSrc1);
612
+ }
613
+
614
+ VISA_RawOpnd* pLOD = GetRawSource (lod);
615
+
616
+ V (vKernel->AppendVISA3dTypedAtomic (
617
+ subOp,
618
+ is16Bit,
619
+ pred,
620
+ emask,
621
+ executionSize,
622
+ pSurfStateOpndHandle,
623
+ pUOpnd,
624
+ pVOpnd,
625
+ pROpnd,
626
+ pLOD,
627
+ pSrc0,
628
+ pSrc1,
629
+ pDst));
630
+ }
631
+
564
632
void CEncoder::Cmp (e_predicate p, CVariable* dst, CVariable* src0, CVariable* src1)
565
633
{
566
634
VISA_Cond_Mod subOp = ConvertCondModToVisaType (p);
0 commit comments