@@ -10825,13 +10825,17 @@ SDValue SITargetLowering::LowerINTRINSIC_VOID(SDValue Op,
1082510825 return SDValue(DAG.getMachineNode(AMDGPU::SI_END_CF, DL, MVT::Other,
1082610826 Op->getOperand(2), Chain),
1082710827 0);
10828+ case Intrinsic::amdgcn_s_barrier_init:
1082810829 case Intrinsic::amdgcn_s_barrier_signal_var: {
1082910830 // these two intrinsics have two operands: barrier pointer and member count
1083010831 SDValue Chain = Op->getOperand(0);
1083110832 SmallVector<SDValue, 2> Ops;
1083210833 SDValue BarOp = Op->getOperand(2);
1083310834 SDValue CntOp = Op->getOperand(3);
1083410835 SDValue M0Val;
10836+ unsigned Opc = IntrinsicID == Intrinsic::amdgcn_s_barrier_init
10837+ ? AMDGPU::S_BARRIER_INIT_M0
10838+ : AMDGPU::S_BARRIER_SIGNAL_M0;
1083510839 // extract the BarrierID from bits 4-9 of BarOp
1083610840 SDValue BarID;
1083710841 BarID = DAG.getNode(ISD::SRL, DL, MVT::i32, BarOp,
@@ -10855,8 +10859,40 @@ SDValue SITargetLowering::LowerINTRINSIC_VOID(SDValue Op,
1085510859
1085610860 Ops.push_back(copyToM0(DAG, Chain, DL, M0Val).getValue(0));
1085710861
10858- auto *NewMI = DAG.getMachineNode(AMDGPU::S_BARRIER_SIGNAL_M0, DL,
10859- Op->getVTList(), Ops);
10862+ auto *NewMI = DAG.getMachineNode(Opc, DL, Op->getVTList(), Ops);
10863+ return SDValue(NewMI, 0);
10864+ }
10865+ case Intrinsic::amdgcn_s_barrier_join: {
10866+ // these three intrinsics have one operand: barrier pointer
10867+ SDValue Chain = Op->getOperand(0);
10868+ SmallVector<SDValue, 2> Ops;
10869+ SDValue BarOp = Op->getOperand(2);
10870+ unsigned Opc;
10871+
10872+ if (isa<ConstantSDNode>(BarOp)) {
10873+ uint64_t BarVal = cast<ConstantSDNode>(BarOp)->getZExtValue();
10874+ Opc = AMDGPU::S_BARRIER_JOIN_IMM;
10875+
10876+ // extract the BarrierID from bits 4-9 of the immediate
10877+ unsigned BarID = (BarVal >> 4) & 0x3F;
10878+ SDValue K = DAG.getTargetConstant(BarID, DL, MVT::i32);
10879+ Ops.push_back(K);
10880+ Ops.push_back(Chain);
10881+ } else {
10882+ Opc = AMDGPU::S_BARRIER_JOIN_M0;
10883+
10884+ // extract the BarrierID from bits 4-9 of BarOp, copy to M0[5:0]
10885+ SDValue M0Val;
10886+ M0Val = DAG.getNode(ISD::SRL, DL, MVT::i32, BarOp,
10887+ DAG.getShiftAmountConstant(4, MVT::i32, DL));
10888+ M0Val =
10889+ SDValue(DAG.getMachineNode(AMDGPU::S_AND_B32, DL, MVT::i32, M0Val,
10890+ DAG.getTargetConstant(0x3F, DL, MVT::i32)),
10891+ 0);
10892+ Ops.push_back(copyToM0(DAG, Chain, DL, M0Val).getValue(0));
10893+ }
10894+
10895+ auto *NewMI = DAG.getMachineNode(Opc, DL, Op->getVTList(), Ops);
1086010896 return SDValue(NewMI, 0);
1086110897 }
1086210898 case Intrinsic::amdgcn_s_prefetch_data: {
0 commit comments