@@ -2866,7 +2866,7 @@ void CLikeSourceEmitter::defaultEmitInstExpr(IRInst* inst, const EmitOpInfo& inO
2866
2866
emitBitfieldExtractImpl (inst);
2867
2867
break ;
2868
2868
}
2869
- case kIROp_BitfieldInsert :
2869
+ case kIROp_BitfieldInsert :
2870
2870
{
2871
2871
emitBitfieldInsertImpl (inst);
2872
2872
break ;
@@ -3843,40 +3843,60 @@ void CLikeSourceEmitter::emitFuncDecorationsImpl(IRFunc* func)
3843
3843
}
3844
3844
}
3845
3845
3846
- bool CLikeSourceEmitter::tryGetIntInfo (IRType* elementType, bool & isSigned, int & bitWidth)
3846
+ bool CLikeSourceEmitter::tryGetIntInfo (IRType* elementType, bool & isSigned, int & bitWidth)
3847
3847
{
3848
3848
Slang::IROp type = elementType->getOp ();
3849
- if (!(type >= kIROp_Int8Type && type <= kIROp_UInt64Type )) return false ;
3849
+ if (!(type >= kIROp_Int8Type && type <= kIROp_UInt64Type ))
3850
+ return false ;
3850
3851
isSigned = (type >= kIROp_Int8Type && type <= kIROp_Int64Type );
3851
3852
3852
3853
Slang::IROp stype = (isSigned) ? type : Slang::IROp (type - 4 );
3853
3854
bitWidth = 8 << (stype - kIROp_Int8Type );
3854
3855
return true ;
3855
3856
}
3856
3857
3857
- void CLikeSourceEmitter::emitVecNOrScalar (IRVectorType* vectorType, std::function<void ()> emitComponentLogic)
3858
+ void CLikeSourceEmitter::emitVecNOrScalar (
3859
+ IRVectorType* vectorType,
3860
+ std::function<void ()> emitComponentLogic)
3858
3861
{
3859
3862
if (vectorType)
3860
3863
{
3861
3864
int N = int (getIntVal (vectorType->getElementCount ()));
3862
- Slang::IRType * elementType = vectorType->getElementType ();
3865
+ Slang::IRType* elementType = vectorType->getElementType ();
3863
3866
3864
3867
// Special handling required for CUDA target
3865
3868
if (isCUDATarget (getTargetReq ()))
3866
3869
{
3867
3870
m_writer->emit (" make_" );
3868
3871
3869
- switch (elementType->getOp ())
3872
+ switch (elementType->getOp ())
3870
3873
{
3871
- case kIROp_Int8Type : m_writer->emit (" char" ); break ;
3872
- case kIROp_Int16Type : m_writer->emit (" short" ); break ;
3873
- case kIROp_IntType : m_writer->emit (" int" ); break ;
3874
- case kIROp_Int64Type : m_writer->emit (" longlong" ); break ;
3875
- case kIROp_UInt8Type : m_writer->emit (" uchar" ); break ;
3876
- case kIROp_UInt16Type : m_writer->emit (" ushort" ); break ;
3877
- case kIROp_UIntType : m_writer->emit (" uint" ); break ;
3878
- case kIROp_UInt64Type : m_writer->emit (" ulonglong" ); break ;
3879
- default : SLANG_ABORT_COMPILATION (" Unhandled type emitting CUDA vector" );
3874
+ case kIROp_Int8Type :
3875
+ m_writer->emit (" char" );
3876
+ break ;
3877
+ case kIROp_Int16Type :
3878
+ m_writer->emit (" short" );
3879
+ break ;
3880
+ case kIROp_IntType :
3881
+ m_writer->emit (" int" );
3882
+ break ;
3883
+ case kIROp_Int64Type :
3884
+ m_writer->emit (" longlong" );
3885
+ break ;
3886
+ case kIROp_UInt8Type :
3887
+ m_writer->emit (" uchar" );
3888
+ break ;
3889
+ case kIROp_UInt16Type :
3890
+ m_writer->emit (" ushort" );
3891
+ break ;
3892
+ case kIROp_UIntType :
3893
+ m_writer->emit (" uint" );
3894
+ break ;
3895
+ case kIROp_UInt64Type :
3896
+ m_writer->emit (" ulonglong" );
3897
+ break ;
3898
+ default :
3899
+ SLANG_ABORT_COMPILATION (" Unhandled type emitting CUDA vector" );
3880
3900
}
3881
3901
3882
3902
m_writer->emitRawText (std::to_string (N).c_str ());
@@ -3892,12 +3912,13 @@ void CLikeSourceEmitter::emitVecNOrScalar(IRVectorType* vectorType, std::functio
3892
3912
}
3893
3913
3894
3914
// In other languages, we can output the Slang vector type directly
3895
- else {
3915
+ else
3916
+ {
3896
3917
emitType (vectorType);
3897
3918
}
3898
3919
3899
3920
m_writer->emit (" (" );
3900
- for (int i = 0 ; i < N; ++i)
3921
+ for (int i = 0 ; i < N; ++i)
3901
3922
{
3902
3923
emitType (elementType);
3903
3924
m_writer->emit (" (" );
@@ -3916,7 +3937,7 @@ void CLikeSourceEmitter::emitVecNOrScalar(IRVectorType* vectorType, std::functio
3916
3937
}
3917
3938
}
3918
3939
3919
- void CLikeSourceEmitter::emitBitfieldExtractImpl (IRInst* inst)
3940
+ void CLikeSourceEmitter::emitBitfieldExtractImpl (IRInst* inst)
3920
3941
{
3921
3942
// If unsigned, bfue := ((val>>off)&((1u<<bts)-1))
3922
3943
// Else signed, bfse := (((val>>off)&((1u<<bts)-1))<<(nbts-bts)>>(nbts-bts));
@@ -3930,26 +3951,38 @@ void CLikeSourceEmitter::emitBitfieldExtractImpl(IRInst* inst)
3930
3951
if (vectorType)
3931
3952
elementType = vectorType->getElementType ();
3932
3953
3933
- bool isSigned;
3954
+ bool isSigned;
3934
3955
int bitWidth;
3935
- if (!tryGetIntInfo (elementType, isSigned, bitWidth))
3956
+ if (!tryGetIntInfo (elementType, isSigned, bitWidth))
3936
3957
{
3937
- SLANG_DIAGNOSE_UNEXPECTED (getSink (), SourceLoc (), " non-integer element type given to bitfieldExtract" );
3958
+ SLANG_DIAGNOSE_UNEXPECTED (
3959
+ getSink (),
3960
+ SourceLoc (),
3961
+ " non-integer element type given to bitfieldExtract" );
3938
3962
return ;
3939
3963
}
3940
3964
3941
3965
String one;
3942
- switch (bitWidth)
3966
+ switch (bitWidth)
3943
3967
{
3944
- case 8 : one = " uint8_t(1)" ; break ;
3945
- case 16 : one = " uint16_t(1)" ; break ;
3946
- case 32 : one = " uint32_t(1)" ; break ;
3947
- case 64 : one = " uint64_t(1)" ; break ;
3948
- default : SLANG_DIAGNOSE_UNEXPECTED (getSink (), SourceLoc (), " unexpected bit width" );
3968
+ case 8 :
3969
+ one = " uint8_t(1)" ;
3970
+ break ;
3971
+ case 16 :
3972
+ one = " uint16_t(1)" ;
3973
+ break ;
3974
+ case 32 :
3975
+ one = " uint32_t(1)" ;
3976
+ break ;
3977
+ case 64 :
3978
+ one = " uint64_t(1)" ;
3979
+ break ;
3980
+ default :
3981
+ SLANG_DIAGNOSE_UNEXPECTED (getSink (), SourceLoc (), " unexpected bit width" );
3949
3982
}
3950
3983
3951
3984
// Emit open paren and type cast for later sign extension
3952
- if (isSigned)
3985
+ if (isSigned)
3953
3986
{
3954
3987
m_writer->emit (" (" );
3955
3988
emitType (inst->getDataType ());
@@ -3960,50 +3993,55 @@ void CLikeSourceEmitter::emitBitfieldExtractImpl(IRInst* inst)
3960
3993
m_writer->emit (" ((" );
3961
3994
emitOperand (val, getInfo (EmitOp::General));
3962
3995
m_writer->emit (" >>" );
3963
- emitVecNOrScalar (vectorType, [&]() {
3964
- emitOperand (off, getInfo (EmitOp::General));
3965
- });
3996
+ emitVecNOrScalar (vectorType, [&]() { emitOperand (off, getInfo (EmitOp::General)); });
3966
3997
m_writer->emit (" )&(" );
3967
- emitVecNOrScalar (vectorType, [&]() {
3968
- m_writer->emit (" ((" + one + " <<" );
3969
- emitOperand (bts, getInfo (EmitOp::General));
3970
- m_writer->emit (" )-" + one + " )" );
3971
- });
3998
+ emitVecNOrScalar (
3999
+ vectorType,
4000
+ [&]()
4001
+ {
4002
+ m_writer->emit (" ((" + one + " <<" );
4003
+ emitOperand (bts, getInfo (EmitOp::General));
4004
+ m_writer->emit (" )-" + one + " )" );
4005
+ });
3972
4006
m_writer->emit (" ))" );
3973
4007
3974
4008
// Emit sign extension logic
3975
4009
// (type(bitfield<<(numBits-bts))>>(numBits-bts))
3976
4010
// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
3977
- if (isSigned)
4011
+ if (isSigned)
3978
4012
{
3979
4013
m_writer->emit (" <<" );
3980
- emitVecNOrScalar (vectorType, [&]()
3981
- {
3982
- m_writer->emit (" (" );
3983
- m_writer->emit (bitWidth);
3984
- m_writer->emit (" -" );
3985
- emitOperand (bts, getInfo (EmitOp::General));
3986
- m_writer->emit (" )" );
3987
- });
4014
+ emitVecNOrScalar (
4015
+ vectorType,
4016
+ [&]()
4017
+ {
4018
+ m_writer->emit (" (" );
4019
+ m_writer->emit (bitWidth);
4020
+ m_writer->emit (" -" );
4021
+ emitOperand (bts, getInfo (EmitOp::General));
4022
+ m_writer->emit (" )" );
4023
+ });
3988
4024
m_writer->emit (" )>>" );
3989
- emitVecNOrScalar (vectorType, [&]()
3990
- {
3991
- m_writer->emit (" (" );
3992
- m_writer->emit (bitWidth);
3993
- m_writer->emit (" -" );
3994
- emitOperand (bts, getInfo (EmitOp::General));
3995
- m_writer->emit (" )" );
3996
- });
4025
+ emitVecNOrScalar (
4026
+ vectorType,
4027
+ [&]()
4028
+ {
4029
+ m_writer->emit (" (" );
4030
+ m_writer->emit (bitWidth);
4031
+ m_writer->emit (" -" );
4032
+ emitOperand (bts, getInfo (EmitOp::General));
4033
+ m_writer->emit (" )" );
4034
+ });
3997
4035
m_writer->emit (" )" );
3998
4036
}
3999
4037
}
4000
4038
4001
- void CLikeSourceEmitter::emitBitfieldInsertImpl (IRInst* inst)
4039
+ void CLikeSourceEmitter::emitBitfieldInsertImpl (IRInst* inst)
4002
4040
{
4003
4041
// uint clearMask = ~(((1u << bits) - 1u) << offset);
4004
4042
// uint clearedBase = base & clearMask;
4005
4043
// uint maskedInsert = (insert & ((1u << bits) - 1u)) << offset;
4006
- // BitfieldInsert := T(uint(clearedBase) | uint(maskedInsert));
4044
+ // BitfieldInsert := T(uint(clearedBase) | uint(maskedInsert));
4007
4045
Slang::IRType* dataType = inst->getDataType ();
4008
4046
Slang::IRInst* bse = inst->getOperand (0 );
4009
4047
Slang::IRInst* ins = inst->getOperand (1 );
@@ -4019,55 +4057,70 @@ void CLikeSourceEmitter::emitBitfieldInsertImpl(IRInst* inst)
4019
4057
int bitWidth;
4020
4058
if (!tryGetIntInfo (elementType, isSigned, bitWidth))
4021
4059
{
4022
- SLANG_DIAGNOSE_UNEXPECTED (getSink (), SourceLoc (), " non-integer element type given to bitfieldInsert" );
4060
+ SLANG_DIAGNOSE_UNEXPECTED (
4061
+ getSink (),
4062
+ SourceLoc (),
4063
+ " non-integer element type given to bitfieldInsert" );
4023
4064
return ;
4024
4065
}
4025
4066
4026
4067
String one;
4027
- switch (bitWidth) {
4028
- case 8 : one = " uint8_t(1)" ; break ;
4029
- case 16 : one = " uint16_t(1)" ; break ;
4030
- case 32 : one = " uint32_t(1)" ; break ;
4031
- case 64 : one = " uint64_t(1)" ; break ;
4032
- default : SLANG_DIAGNOSE_UNEXPECTED (getSink (), SourceLoc (), " unexpected bit width" );
4068
+ switch (bitWidth)
4069
+ {
4070
+ case 8 :
4071
+ one = " uint8_t(1)" ;
4072
+ break ;
4073
+ case 16 :
4074
+ one = " uint16_t(1)" ;
4075
+ break ;
4076
+ case 32 :
4077
+ one = " uint32_t(1)" ;
4078
+ break ;
4079
+ case 64 :
4080
+ one = " uint64_t(1)" ;
4081
+ break ;
4082
+ default :
4083
+ SLANG_DIAGNOSE_UNEXPECTED (getSink (), SourceLoc (), " unexpected bit width" );
4033
4084
}
4034
4085
4035
4086
m_writer->emit (" ((" );
4036
-
4087
+
4037
4088
// emit clearedBase := uint(bse & ~(((1u<<bts)-1u)<<off))
4038
4089
emitOperand (bse, getInfo (EmitOp::General));
4039
4090
m_writer->emit (" &" );
4040
- emitVecNOrScalar (vectorType, [&]()
4041
- {
4042
- m_writer->emit (" ~(((" + one + " <<" );
4043
- emitOperand (bts, getInfo (EmitOp::General));
4044
- m_writer->emit (" )-" + one + " )<<" );
4045
- emitOperand (off, getInfo (EmitOp::General));
4046
- m_writer->emit (" )" );
4047
- });
4048
-
4049
-
4091
+ emitVecNOrScalar (
4092
+ vectorType,
4093
+ [&]()
4094
+ {
4095
+ m_writer->emit (" ~(((" + one + " <<" );
4096
+ emitOperand (bts, getInfo (EmitOp::General));
4097
+ m_writer->emit (" )-" + one + " )<<" );
4098
+ emitOperand (off, getInfo (EmitOp::General));
4099
+ m_writer->emit (" )" );
4100
+ });
4101
+
4050
4102
// bitwise or clearedBase with maskedInsert
4051
4103
m_writer->emit (" )|(" );
4052
4104
4053
4105
// Emit maskedInsert := ((insert & ((1u << bits) - 1u)) << offset);
4054
-
4106
+
4055
4107
// - first emit mask := (insert & ((1u << bits) - 1u))
4056
4108
m_writer->emit (" (" );
4057
4109
emitOperand (ins, getInfo (EmitOp::General));
4058
4110
m_writer->emit (" &" );
4059
- emitVecNOrScalar (vectorType, [&](){
4060
- m_writer->emit (" (" + one + " <<" );
4061
- emitOperand (bts, getInfo (EmitOp::General));
4062
- m_writer->emit (" )-" + one);
4063
- });
4111
+ emitVecNOrScalar (
4112
+ vectorType,
4113
+ [&]()
4114
+ {
4115
+ m_writer->emit (" (" + one + " <<" );
4116
+ emitOperand (bts, getInfo (EmitOp::General));
4117
+ m_writer->emit (" )-" + one);
4118
+ });
4064
4119
m_writer->emit (" )" );
4065
4120
4066
4121
// then emit shift := << offset
4067
4122
m_writer->emit (" <<" );
4068
- emitVecNOrScalar (vectorType, [&](){
4069
- emitOperand (off, getInfo (EmitOp::General));
4070
- });
4123
+ emitVecNOrScalar (vectorType, [&]() { emitOperand (off, getInfo (EmitOp::General)); });
4071
4124
m_writer->emit (" ))" );
4072
4125
}
4073
4126
0 commit comments