@@ -465,3 +465,127 @@ __mmask64 test_kmov_q(__mmask64 A) {
465465
466466 return __builtin_ia32_kmovq (A );
467467}
468+
469+ unsigned char test_kortestc_mask32_u8 (__mmask32 __A , __mmask32 __B ) {
470+ // CIR-LABEL: _kortestc_mask32_u8
471+ // CIR: [[ALL_ONES:%.*]] = cir.const #cir.int<4294967295> : !u32i
472+ // CIR: [[LHS:%.*]] = cir.cast bitcast {{.*}} : !u32i -> !cir.vector<32 x !cir.int<u, 1>>
473+ // CIR: [[RHS:%.*]] = cir.cast bitcast {{.*}} : !u32i -> !cir.vector<32 x !cir.int<u, 1>>
474+ // CIR: [[OR:%.*]] = cir.binop(or, [[LHS]], [[RHS]]) : !cir.vector<32 x !cir.int<u, 1>>
475+ // CIR: [[OR_INT:%.*]] = cir.cast bitcast [[OR]] : !cir.vector<32 x !cir.int<u, 1>> -> !u32i
476+ // CIR: [[CMP:%.*]] = cir.cmp(eq, [[OR_INT]], [[ALL_ONES]]) : !u32i, !cir.bool
477+ // CIR: [[B2I:%.*]] = cir.cast bool_to_int [[CMP]] : !cir.bool -> !s32i
478+ // CIR: cir.cast integral [[B2I]] : !s32i -> !u8i
479+
480+ // LLVM-LABEL: _kortestc_mask32_u8
481+ // LLVM: [[LHS:%.*]] = bitcast i32 %{{.*}} to <32 x i1>
482+ // LLVM: [[RHS:%.*]] = bitcast i32 %{{.*}} to <32 x i1>
483+ // LLVM: [[OR:%.*]] = or <32 x i1> [[LHS]], [[RHS]]
484+ // LLVM: [[CAST:%.*]] = bitcast <32 x i1> [[OR]] to i32
485+ // LLVM: [[CMP:%.*]] = icmp eq i32 [[CAST]], -1
486+ // LLVM: [[ZEXT:%.*]] = zext i1 [[CMP]] to i32
487+ // LLVM: trunc i32 [[ZEXT]] to i8
488+
489+ // OGCG-LABEL: _kortestc_mask32_u8
490+ // OGCG: bitcast i32 %{{.*}} to <32 x i1>
491+ // OGCG: bitcast i32 %{{.*}} to <32 x i1>
492+ // OGCG: or <32 x i1> {{.*}}, {{.*}}
493+ // OGCG: bitcast <32 x i1> {{.*}} to i32
494+ // OGCG: icmp eq i32 {{.*}}, -1
495+ // OGCG: zext i1 {{.*}} to i32
496+ // OGCG: trunc i32 {{.*}} to i8
497+ return _kortestc_mask32_u8 (__A , __B );
498+ }
499+
500+ unsigned char test_kortestc_mask64_u8 (__mmask64 __A , __mmask64 __B ) {
501+ // CIR-LABEL: _kortestc_mask64_u8
502+ // CIR: [[ALL_ONES:%.*]] = cir.const #cir.int<18446744073709551615> : !u64i
503+ // CIR: [[LHS:%.*]] = cir.cast bitcast {{.*}} : !u64i -> !cir.vector<64 x !cir.int<u, 1>>
504+ // CIR: [[RHS:%.*]] = cir.cast bitcast {{.*}} : !u64i -> !cir.vector<64 x !cir.int<u, 1>>
505+ // CIR: [[OR:%.*]] = cir.binop(or, [[LHS]], [[RHS]]) : !cir.vector<64 x !cir.int<u, 1>>
506+ // CIR: [[OR_INT:%.*]] = cir.cast bitcast [[OR]] : !cir.vector<64 x !cir.int<u, 1>> -> !u64i
507+ // CIR: [[CMP:%.*]] = cir.cmp(eq, [[OR_INT]], [[ALL_ONES]]) : !u64i, !cir.bool
508+ // CIR: [[B2I:%.*]] = cir.cast bool_to_int [[CMP]] : !cir.bool -> !s32i
509+ // CIR: cir.cast integral [[B2I]] : !s32i -> !u8i
510+
511+ // LLVM-LABEL: _kortestc_mask64_u8
512+ // LLVM: [[LHS:%.*]] = bitcast i64 %{{.*}} to <64 x i1>
513+ // LLVM: [[RHS:%.*]] = bitcast i64 %{{.*}} to <64 x i1>
514+ // LLVM: [[OR:%.*]] = or <64 x i1> [[LHS]], [[RHS]]
515+ // LLVM: [[CAST:%.*]] = bitcast <64 x i1> [[OR]] to i64
516+ // LLVM: [[CMP:%.*]] = icmp eq i64 [[CAST]], -1
517+ // LLVM: [[ZEXT:%.*]] = zext i1 [[CMP]] to i32
518+ // LLVM: trunc i32 [[ZEXT]] to i8
519+
520+ // OGCG-LABEL: _kortestc_mask64_u8
521+ // OGCG: bitcast i64 %{{.*}} to <64 x i1>
522+ // OGCG: bitcast i64 %{{.*}} to <64 x i1>
523+ // OGCG: or <64 x i1> {{.*}}, {{.*}}
524+ // OGCG: bitcast <64 x i1> {{.*}} to i64
525+ // OGCG: icmp eq i64 {{.*}}, -1
526+ // OGCG: zext i1 {{.*}} to i32
527+ // OGCG: trunc i32 {{.*}} to i8
528+ return _kortestc_mask64_u8 (__A , __B );
529+ }
530+
531+ unsigned char test_kortestz_mask32_u8 (__mmask32 __A , __mmask32 __B ) {
532+ // CIR-LABEL: _kortestz_mask32_u8
533+ // CIR: [[ZERO:%.*]] = cir.const #cir.int<0> : !u32i
534+ // CIR: [[LHS:%.*]] = cir.cast bitcast {{.*}} : !u32i -> !cir.vector<32 x !cir.int<u, 1>>
535+ // CIR: [[RHS:%.*]] = cir.cast bitcast {{.*}} : !u32i -> !cir.vector<32 x !cir.int<u, 1>>
536+ // CIR: [[OR:%.*]] = cir.binop(or, [[LHS]], [[RHS]]) : !cir.vector<32 x !cir.int<u, 1>>
537+ // CIR: [[OR_INT:%.*]] = cir.cast bitcast [[OR]] : !cir.vector<32 x !cir.int<u, 1>> -> !u32i
538+ // CIR: [[CMP:%.*]] = cir.cmp(eq, [[OR_INT]], [[ZERO]]) : !u32i, !cir.bool
539+ // CIR: [[B2I:%.*]] = cir.cast bool_to_int [[CMP]] : !cir.bool -> !s32i
540+ // CIR: cir.cast integral [[B2I]] : !s32i -> !u8i
541+
542+ // LLVM-LABEL: _kortestz_mask32_u8
543+ // LLVM: [[LHS:%.*]] = bitcast i32 %{{.*}} to <32 x i1>
544+ // LLVM: [[RHS:%.*]] = bitcast i32 %{{.*}} to <32 x i1>
545+ // LLVM: [[OR:%.*]] = or <32 x i1> [[LHS]], [[RHS]]
546+ // LLVM: [[CAST:%.*]] = bitcast <32 x i1> [[OR]] to i32
547+ // LLVM: [[CMP:%.*]] = icmp eq i32 [[CAST]], 0
548+ // LLVM: [[ZEXT:%.*]] = zext i1 [[CMP]] to i32
549+ // LLVM: trunc i32 [[ZEXT]] to i8
550+
551+ // OGCG-LABEL: _kortestz_mask32_u8
552+ // OGCG: bitcast i32 %{{.*}} to <32 x i1>
553+ // OGCG: bitcast i32 %{{.*}} to <32 x i1>
554+ // OGCG: or <32 x i1> {{.*}}, {{.*}}
555+ // OGCG: bitcast <32 x i1> {{.*}} to i32
556+ // OGCG: icmp eq i32 {{.*}}, 0
557+ // OGCG: zext i1 {{.*}} to i32
558+ // OGCG: trunc i32 {{.*}} to i8
559+ return _kortestz_mask32_u8 (__A , __B );
560+ }
561+
562+ unsigned char test_kortestz_mask64_u8 (__mmask64 __A , __mmask64 __B ) {
563+ // CIR-LABEL: _kortestz_mask64_u8
564+ // CIR: [[ZERO:%.*]] = cir.const #cir.int<0> : !u64i
565+ // CIR: [[LHS:%.*]] = cir.cast bitcast {{.*}} : !u64i -> !cir.vector<64 x !cir.int<u, 1>>
566+ // CIR: [[RHS:%.*]] = cir.cast bitcast {{.*}} : !u64i -> !cir.vector<64 x !cir.int<u, 1>>
567+ // CIR: [[OR:%.*]] = cir.binop(or, [[LHS]], [[RHS]]) : !cir.vector<64 x !cir.int<u, 1>>
568+ // CIR: [[OR_INT:%.*]] = cir.cast bitcast [[OR]] : !cir.vector<64 x !cir.int<u, 1>> -> !u64i
569+ // CIR: [[CMP:%.*]] = cir.cmp(eq, [[OR_INT]], [[ZERO]]) : !u64i, !cir.bool
570+ // CIR: [[B2I:%.*]] = cir.cast bool_to_int [[CMP]] : !cir.bool -> !s32i
571+ // CIR: cir.cast integral [[B2I]] : !s32i -> !u8i
572+
573+ // LLVM-LABEL: _kortestz_mask64_u8
574+ // LLVM: [[LHS:%.*]] = bitcast i64 %{{.*}} to <64 x i1>
575+ // LLVM: [[RHS:%.*]] = bitcast i64 %{{.*}} to <64 x i1>
576+ // LLVM: [[OR:%.*]] = or <64 x i1> [[LHS]], [[RHS]]
577+ // LLVM: [[CAST:%.*]] = bitcast <64 x i1> [[OR]] to i64
578+ // LLVM: [[CMP:%.*]] = icmp eq i64 [[CAST]], 0
579+ // LLVM: [[ZEXT:%.*]] = zext i1 [[CMP]] to i32
580+ // LLVM: trunc i32 [[ZEXT]] to i8
581+
582+ // OGCG-LABEL: _kortestz_mask64_u8
583+ // OGCG: bitcast i64 %{{.*}} to <64 x i1>
584+ // OGCG: bitcast i64 %{{.*}} to <64 x i1>
585+ // OGCG: or <64 x i1> {{.*}}, {{.*}}
586+ // OGCG: bitcast <64 x i1> {{.*}} to i64
587+ // OGCG: icmp eq i64 {{.*}}, 0
588+ // OGCG: zext i1 {{.*}} to i32
589+ // OGCG: trunc i32 {{.*}} to i8
590+ return _kortestz_mask64_u8 (__A , __B );
591+ }
0 commit comments