@@ -336,6 +336,52 @@ func.func @iadd_poison(%arg0: i32) -> i32 {
336
336
337
337
// -----
338
338
339
+ //===----------------------------------------------------------------------===//
340
+ // spirv.IAddCarry
341
+ //===----------------------------------------------------------------------===//
342
+
343
+ // CHECK-LABEL: @iaddcarry_x_0
344
+ func.func @iaddcarry_x_0 (%arg0 : i32 ) -> !spirv.struct <(i32 , i32 )> {
345
+ %c0 = spirv.Constant 0 : i32
346
+
347
+ // CHECK: spirv.CompositeConstruct
348
+ %0 = spirv.IAddCarry %arg0 , %c0 : !spirv.struct <(i32 , i32 )>
349
+ return %0 : !spirv.struct <(i32 , i32 )>
350
+ }
351
+
352
+ // CHECK-LABEL: @const_fold_scalar_iaddcarry
353
+ func.func @const_fold_scalar_iaddcarry () -> (!spirv.struct <(i32 , i32 )>, !spirv.struct <(i32 , i32 )>) {
354
+ %c5 = spirv.Constant 5 : i32
355
+ %cn5 = spirv.Constant -5 : i32
356
+ %cn8 = spirv.Constant -8 : i32
357
+
358
+ // CHECK-DAG: spirv.Constant 0
359
+ // CHECK-DAG: spirv.Constant -3
360
+ // CHECK-DAG: spirv.CompositeConstruct
361
+ // CHECK-DAG: spirv.Constant 1
362
+ // CHECK-DAG: spirv.Constant -13
363
+ // CHECK-DAG: spirv.CompositeConstruct
364
+ %0 = spirv.IAddCarry %c5 , %cn8 : !spirv.struct <(i32 , i32 )>
365
+ %1 = spirv.IAddCarry %cn5 , %cn8 : !spirv.struct <(i32 , i32 )>
366
+
367
+ return %0 , %1 : !spirv.struct <(i32 , i32 )>, !spirv.struct <(i32 , i32 )>
368
+ }
369
+
370
+ // CHECK-LABEL: @const_fold_vector_iaddcarry
371
+ func.func @const_fold_vector_iaddcarry () -> !spirv.struct <(vector <3 xi32 >, vector <3 xi32 >)> {
372
+ %v0 = spirv.Constant dense <[5 , -3 , -1 ]> : vector <3 xi32 >
373
+ %v1 = spirv.Constant dense <[-8 , -8 , 1 ]> : vector <3 xi32 >
374
+
375
+ // CHECK-DAG: spirv.Constant dense<[0, 1, 1]>
376
+ // CHECK-DAG: spirv.Constant dense<[-3, -11, 0]>
377
+ // CHECK-DAG: spirv.CompositeConstruct
378
+ %0 = spirv.IAddCarry %v0 , %v1 : !spirv.struct <(vector <3 xi32 >, vector <3 xi32 >)>
379
+ return %0 : !spirv.struct <(vector <3 xi32 >, vector <3 xi32 >)>
380
+
381
+ }
382
+
383
+ // -----
384
+
339
385
//===----------------------------------------------------------------------===//
340
386
// spirv.IMul
341
387
//===----------------------------------------------------------------------===//
@@ -400,6 +446,108 @@ func.func @const_fold_vector_imul() -> vector<3xi32> {
400
446
401
447
// -----
402
448
449
+ //===----------------------------------------------------------------------===//
450
+ // spirv.SMulExtended
451
+ //===----------------------------------------------------------------------===//
452
+
453
+ // CHECK-LABEL: @smulextended_x_0
454
+ func.func @smulextended_x_0 (%arg0 : i32 ) -> !spirv.struct <(i32 , i32 )> {
455
+ %c0 = spirv.Constant 0 : i32
456
+
457
+ // CHECK: spirv.CompositeConstruct
458
+ %0 = spirv.SMulExtended %arg0 , %c0 : !spirv.struct <(i32 , i32 )>
459
+ return %0 : !spirv.struct <(i32 , i32 )>
460
+ }
461
+
462
+ // CHECK-LABEL: @const_fold_scalar_smulextended
463
+ func.func @const_fold_scalar_smulextended () -> (!spirv.struct <(i32 , i32 )>, !spirv.struct <(i32 , i32 )>) {
464
+ %c5 = spirv.Constant 5 : i32
465
+ %cn5 = spirv.Constant -5 : i32
466
+ %cn8 = spirv.Constant -8 : i32
467
+
468
+ // CHECK-DAG: spirv.Constant -40
469
+ // CHECK-DAG: spirv.Constant -1
470
+ // CHECK-DAG: spirv.CompositeConstruct
471
+ // CHECK-DAG: spirv.Constant 40
472
+ // CHECK-DAG: spirv.Constant 0
473
+ // CHECK-DAG: spirv.CompositeConstruct
474
+ %0 = spirv.SMulExtended %c5 , %cn8 : !spirv.struct <(i32 , i32 )>
475
+ %1 = spirv.SMulExtended %cn5 , %cn8 : !spirv.struct <(i32 , i32 )>
476
+
477
+ return %0 , %1 : !spirv.struct <(i32 , i32 )>, !spirv.struct <(i32 , i32 )>
478
+ }
479
+
480
+ // CHECK-LABEL: @const_fold_vector_smulextended
481
+ func.func @const_fold_vector_smulextended () -> !spirv.struct <(vector <3 xi32 >, vector <3 xi32 >)> {
482
+ %v0 = spirv.Constant dense <[2147483647 , -5 , -1 ]> : vector <3 xi32 >
483
+ %v1 = spirv.Constant dense <[5 , -8 , 1 ]> : vector <3 xi32 >
484
+
485
+ // CHECK: spirv.Constant dense<[2147483643, 40, -1]>
486
+ // CHECK-NEXT: spirv.Constant dense<[2, 0, -1]>
487
+ // CHECK-NEXT: spirv.CompositeConstruct
488
+ %0 = spirv.SMulExtended %v0 , %v1 : !spirv.struct <(vector <3 xi32 >, vector <3 xi32 >)>
489
+ return %0 : !spirv.struct <(vector <3 xi32 >, vector <3 xi32 >)>
490
+
491
+ }
492
+
493
+ // -----
494
+
495
+ //===----------------------------------------------------------------------===//
496
+ // spirv.UMulExtended
497
+ //===----------------------------------------------------------------------===//
498
+
499
+ // CHECK-LABEL: @umulextended_x_0
500
+ func.func @umulextended_x_0 (%arg0 : i32 ) -> !spirv.struct <(i32 , i32 )> {
501
+ %c0 = spirv.Constant 0 : i32
502
+
503
+ // CHECK: spirv.CompositeConstruct
504
+ %0 = spirv.UMulExtended %arg0 , %c0 : !spirv.struct <(i32 , i32 )>
505
+ return %0 : !spirv.struct <(i32 , i32 )>
506
+ }
507
+
508
+ // CHECK-LABEL: @umulextended_x_1
509
+ func.func @umulextended_x_1 (%arg0 : i32 ) -> !spirv.struct <(i32 , i32 )> {
510
+ %c0 = spirv.Constant 1 : i32
511
+
512
+ // CHECK: spirv.CompositeConstruct
513
+ %0 = spirv.UMulExtended %arg0 , %c0 : !spirv.struct <(i32 , i32 )>
514
+ return %0 : !spirv.struct <(i32 , i32 )>
515
+ }
516
+
517
+ // CHECK-LABEL: @const_fold_scalar_umulextended
518
+ func.func @const_fold_scalar_umulextended () -> (!spirv.struct <(i32 , i32 )>, !spirv.struct <(i32 , i32 )>) {
519
+ %c5 = spirv.Constant 5 : i32
520
+ %cn5 = spirv.Constant -5 : i32
521
+ %cn8 = spirv.Constant -8 : i32
522
+
523
+ // CHECK-DAG: spirv.Constant 40
524
+ // CHECK-DAG: spirv.Constant -13
525
+ // CHECK-DAG: spirv.CompositeConstruct
526
+ // CHECK-DAG: spirv.Constant -40
527
+ // CHECK-DAG: spirv.Constant 4
528
+ // CHECK-DAG: spirv.CompositeConstruct
529
+ %0 = spirv.UMulExtended %c5 , %cn8 : !spirv.struct <(i32 , i32 )>
530
+ %1 = spirv.UMulExtended %cn5 , %cn8 : !spirv.struct <(i32 , i32 )>
531
+
532
+ return %0 , %1 : !spirv.struct <(i32 , i32 )>, !spirv.struct <(i32 , i32 )>
533
+ }
534
+
535
+ // CHECK-LABEL: @const_fold_vector_umulextended
536
+ func.func @const_fold_vector_umulextended () -> !spirv.struct <(vector <3 xi32 >, vector <3 xi32 >)> {
537
+ %v0 = spirv.Constant dense <[2147483647 , -5 , -1 ]> : vector <3 xi32 >
538
+ %v1 = spirv.Constant dense <[5 , -8 , 1 ]> : vector <3 xi32 >
539
+
540
+ // CHECK: spirv.Constant dense<[2147483643, 40, -1]>
541
+ // CHECK-NEXT: spirv.Constant dense<[2, -13, 0]>
542
+ // CHECK-NEXT: spirv.CompositeConstruct
543
+ %0 = spirv.UMulExtended %v0 , %v1 : !spirv.struct <(vector <3 xi32 >, vector <3 xi32 >)>
544
+ return %0 : !spirv.struct <(vector <3 xi32 >, vector <3 xi32 >)>
545
+
546
+ }
547
+
548
+ // -----
549
+
550
+
403
551
//===----------------------------------------------------------------------===//
404
552
// spirv.ISub
405
553
//===----------------------------------------------------------------------===//
0 commit comments