@@ -225,9 +225,6 @@ proc genSetOp(c: var Context; dest: var TokenBuf; n: var Cursor) =
225
225
case size
226
226
of 1 , 2 , 4 , 8 :
227
227
case kind
228
- of CardX :
229
- # XXX needs countBits compilerproc
230
- raiseAssert (" unimplemented" )
231
228
of LtSetX :
232
229
copyIntoKind dest, AndX , info:
233
230
addTypedOp dest, EqX , cType, info:
@@ -283,9 +280,6 @@ proc genSetOp(c: var Context; dest: var TokenBuf; n: var Cursor) =
283
280
raiseAssert (" unreachable" )
284
281
else :
285
282
case kind
286
- of CardX :
287
- # XXX originally implemented as cardSet compilerproc
288
- raiseAssert (" unimplemented" )
289
283
of LtSetX , LeSetX :
290
284
dest.add parLeToken (ExprX , info)
291
285
let resValue = [parLeToken (TrueX , info), parRiToken (info)]
@@ -388,6 +382,45 @@ proc genSetOp(c: var Context; dest: var TokenBuf; n: var Cursor) =
388
382
dest.addParRi ()
389
383
c.tempUseBufStack.shrink (oldBufStackLen)
390
384
385
+ proc genCard (c: var Context ; dest: var TokenBuf ; n: var Cursor ) =
386
+ let info = n.info
387
+ inc n
388
+ let typ = n
389
+ if typ.typeKind != SetT :
390
+ error " expected set type for set op" , n
391
+ var baseType = typ
392
+ inc baseType
393
+ var argsBuf = createTokenBuf (16 )
394
+ swap dest, argsBuf
395
+ skip n # nothing to do with set type
396
+ let aStart = dest.len
397
+ tr (c, dest, n)
398
+ swap dest, argsBuf
399
+ skipParRi n
400
+ let a = cursorAt (argsBuf, aStart) # no temp needed
401
+ var err = false
402
+ let size = asSigned (bitsetSizeInBytes (baseType), err)
403
+ assert not err
404
+ case size
405
+ of 1 , 2 :
406
+ copyIntoKind dest, CallX , info:
407
+ dest.add symToken (pool.syms.getOrIncl (" countBits32.0." & SystemModuleSuffix ), info)
408
+ addUIntTypedOp dest, CastX , 32 , info:
409
+ dest.addSubtree a
410
+ of 4 :
411
+ copyIntoKind dest, CallX , info:
412
+ dest.add symToken (pool.syms.getOrIncl (" countBits32.0." & SystemModuleSuffix ), info)
413
+ dest.addSubtree a
414
+ of 8 :
415
+ copyIntoKind dest, CallX , info:
416
+ dest.add symToken (pool.syms.getOrIncl (" countBits64.0." & SystemModuleSuffix ), info)
417
+ dest.addSubtree a
418
+ else :
419
+ copyIntoKind dest, CallX , info:
420
+ dest.add symToken (pool.syms.getOrIncl (" cardSet.0." & SystemModuleSuffix ), info)
421
+ dest.arrayToPointer (a, info)
422
+ dest.addIntLit (size, info)
423
+
391
424
proc genSingleInclSmall (dest: var TokenBuf ; s, elem: Cursor ; size: int ; info: PackedLineInfo ) =
392
425
let bits = size * 8
393
426
copyIntoKind dest, AsgnS , info:
@@ -673,8 +706,10 @@ proc tr(c: var Context; dest: var TokenBuf; n: var Cursor) =
673
706
trSons (c, dest, n)
674
707
of SetConstrX :
675
708
genSetConstr (c, dest, n)
676
- of PlusSetX , MinusSetX , MulSetX , XorSetX , EqSetX , LeSetX , LtSetX , InSetX , CardX :
709
+ of PlusSetX , MinusSetX , MulSetX , XorSetX , EqSetX , LeSetX , LtSetX , InSetX :
677
710
genSetOp (c, dest, n)
711
+ of CardX :
712
+ genCard (c, dest, n)
678
713
of TypeofX :
679
714
takeTree dest, n
680
715
of DdotX :
0 commit comments