@@ -455,6 +455,66 @@ void CLikeSourceEmitter::emitRTTIObject(IRRTTIObject* rttiObject)
455
455
// This is only used in targets that support dynamic dispatching.
456
456
}
457
457
458
+ void CLikeSourceEmitter::defaultEmitInstStmt (IRInst* inst)
459
+ {
460
+ switch (inst->getOp ())
461
+ {
462
+ case kIROp_AtomicCounterIncrement :
463
+ {
464
+ auto oldValName = getName (inst);
465
+ m_writer->emit (" int " );
466
+ m_writer->emit (oldValName);
467
+ m_writer->emit (" ;\n " );
468
+ m_writer->emit (" InterlockedAdd(" );
469
+ emitOperand (inst->getOperand (0 ), getInfo (EmitOp::General));
470
+ m_writer->emit (" , 1, " );
471
+ m_writer->emit (oldValName);
472
+ m_writer->emit (" );\n " );
473
+ }
474
+ break ;
475
+ case kIROp_AtomicCounterDecrement :
476
+ {
477
+ auto oldValName = getName (inst);
478
+ m_writer->emit (" int " );
479
+ m_writer->emit (oldValName);
480
+ m_writer->emit (" ;\n " );
481
+ m_writer->emit (" InterlockedAdd(" );
482
+ emitOperand (inst->getOperand (0 ), getInfo (EmitOp::General));
483
+ m_writer->emit (" , -1, " );
484
+ m_writer->emit (oldValName);
485
+ m_writer->emit (" );\n " );
486
+ }
487
+ break ;
488
+ case kIROp_StructuredBufferGetDimensions :
489
+ {
490
+ auto count = _generateUniqueName (UnownedStringSlice (" _elementCount" ));
491
+ auto stride = _generateUniqueName (UnownedStringSlice (" _stride" ));
492
+
493
+ m_writer->emit (" uint " );
494
+ m_writer->emit (count);
495
+ m_writer->emit (" ;\n " );
496
+ m_writer->emit (" uint " );
497
+ m_writer->emit (stride);
498
+ m_writer->emit (" ;\n " );
499
+ emitOperand (inst->getOperand (0 ), leftSide (getInfo (EmitOp::General), getInfo (EmitOp::Postfix)));
500
+ m_writer->emit (" .GetDimensions(" );
501
+ m_writer->emit (count);
502
+ m_writer->emit (" , " );
503
+ m_writer->emit (stride);
504
+ m_writer->emit (" );\n " );
505
+ emitInstResultDecl (inst);
506
+ m_writer->emit (" uint2(" );
507
+ m_writer->emit (count);
508
+ m_writer->emit (" , " );
509
+ m_writer->emit (stride);
510
+ m_writer->emit (" );\n " );
511
+ }
512
+ break ;
513
+ default :
514
+ diagnoseUnhandledInst (inst);
515
+ }
516
+ }
517
+
458
518
459
519
void CLikeSourceEmitter::emitTypeImpl (IRType* type, const StringSliceLoc* nameAndLoc)
460
520
{
@@ -1874,6 +1934,16 @@ void CLikeSourceEmitter::emitInstExpr(IRInst* inst, const EmitOpInfo& inOuterPre
1874
1934
defaultEmitInstExpr (inst, inOuterPrec);
1875
1935
}
1876
1936
1937
+ void CLikeSourceEmitter::emitInstStmt (IRInst* inst)
1938
+ {
1939
+ // Try target specific impl first
1940
+ if (tryEmitInstStmtImpl (inst))
1941
+ {
1942
+ return ;
1943
+ }
1944
+ defaultEmitInstStmt (inst);
1945
+ }
1946
+
1877
1947
void CLikeSourceEmitter::diagnoseUnhandledInst (IRInst* inst)
1878
1948
{
1879
1949
getSink ()->diagnose (inst, Diagnostics::unimplemented, " unexpected IR opcode during code emit" );
@@ -2193,6 +2263,23 @@ void CLikeSourceEmitter::defaultEmitInstExpr(IRInst* inst, const EmitOpInfo& inO
2193
2263
}
2194
2264
break ;
2195
2265
2266
+ case kIROp_StructuredBufferAppend :
2267
+ {
2268
+ auto outer = getInfo (EmitOp::General);
2269
+ emitOperand (inst->getOperand (0 ), leftSide (outer, getInfo (EmitOp::Postfix)));
2270
+ m_writer->emit (" .Append(" );
2271
+ emitOperand (inst->getOperand (1 ), getInfo (EmitOp::General));
2272
+ m_writer->emit (" )" );
2273
+ }
2274
+ break ;
2275
+ case kIROp_StructuredBufferConsume :
2276
+ {
2277
+ auto outer = getInfo (EmitOp::General);
2278
+ emitOperand (inst->getOperand (0 ), leftSide (outer, getInfo (EmitOp::Postfix)));
2279
+ m_writer->emit (" .Consume()" );
2280
+ }
2281
+ break ;
2282
+
2196
2283
case kIROp_Call :
2197
2284
{
2198
2285
emitCallExpr ((IRCall*)inst, outerPrec);
@@ -2562,7 +2649,10 @@ void CLikeSourceEmitter::_emitInst(IRInst* inst)
2562
2649
2563
2650
// Insts that needs to be emitted as code blocks.
2564
2651
case kIROp_CudaKernelLaunch :
2565
- emitInstStmtImpl (inst);
2652
+ case kIROp_AtomicCounterIncrement :
2653
+ case kIROp_AtomicCounterDecrement :
2654
+ case kIROp_StructuredBufferGetDimensions :
2655
+ emitInstStmt (inst);
2566
2656
break ;
2567
2657
2568
2658
case kIROp_LiveRangeStart :
0 commit comments