@@ -556,3 +556,69 @@ void test_logical_not() {
556
556
// OGCG: %[[D_NOT:.*]] = xor i1 %[[D_BOOL]], true
557
557
// OGCG: %[[D_CAST:.*]] = zext i1 %[[D_NOT]] to i8
558
558
// OGCG: store i8 %[[D_CAST]], ptr %[[B_ADDR]], align 1
559
+
560
+ void f16NestedUPlus () {
561
+ _Float16 a;
562
+ _Float16 b = +(+a);
563
+ }
564
+
565
+ // CHECK: cir.func{{.*}} @_Z14f16NestedUPlusv()
566
+ // CHECK: %[[A_ADDR:.*]] = cir.alloca !cir.f16, !cir.ptr<!cir.f16>, ["a"]
567
+ // CHECK: %[[B_ADDR:.*]] = cir.alloca !cir.f16, !cir.ptr<!cir.f16>, ["b", init]
568
+ // CHECK: %[[TMP_A:.*]] = cir.load{{.*}} %[[A_ADDR]] : !cir.ptr<!cir.f16>, !cir.f16
569
+ // CHECK: %[[A_F32:.*]] = cir.cast(floating, %[[TMP_A]] : !cir.f16), !cir.float
570
+ // CHECK: %[[A_PLUS:.*]] = cir.unary(plus, %[[A_F32]]) : !cir.float, !cir.float
571
+ // CHECK: %[[RESULT_F32:.*]] = cir.unary(plus, %[[A_PLUS]]) : !cir.float, !cir.float
572
+ // CHECK: %[[RESULT:.*]] = cir.cast(floating, %[[RESULT_F32]] : !cir.float), !cir.f16
573
+ // CHECK: cir.store{{.*}} %[[RESULT]], %[[B_ADDR]] : !cir.f16, !cir.ptr<!cir.f16>
574
+
575
+ // LLVM: define{{.*}} void @_Z14f16NestedUPlusv()
576
+ // LLVM: %[[A_ADDR:.*]] = alloca half, i64 1, align 2
577
+ // LLVM: %[[B_ADDR:.*]] = alloca half, i64 1, align 2
578
+ // LLVM: %[[TMP_A:.*]] = load half, ptr %[[A_ADDR]], align 2
579
+ // LLVM: %[[RESULT_F32:.*]] = fpext half %[[TMP_A]] to float
580
+ // LLVM: %[[RESULT:.*]] = fptrunc float %[[RESULT_F32]] to half
581
+ // LLVM: store half %[[RESULT]], ptr %[[B_ADDR]], align 2
582
+
583
+ // OGCG: define{{.*}} void @_Z14f16NestedUPlusv()
584
+ // OGCG: %[[A_ADDR:.*]] = alloca half, align 2
585
+ // OGCG: %[[B_ADDR:.*]] = alloca half, align 2
586
+ // OGCG: %[[TMP_A:.*]] = load half, ptr %[[A_ADDR]], align 2
587
+ // OGCG: %[[RESULT_F32:.*]] = fpext half %[[TMP_A]] to float
588
+ // OGCG: %[[RESULT:.*]] = fptrunc float %[[RESULT_F32]] to half
589
+ // OGCG: store half %[[RESULT]], ptr %[[B_ADDR]], align 2
590
+
591
+ void f16NestedUMinus () {
592
+ _Float16 a;
593
+ _Float16 b = -(-a);
594
+ }
595
+
596
+ // CHECK: cir.func{{.*}} @_Z15f16NestedUMinusv()
597
+ // CHECK: %[[A_ADDR:.*]] = cir.alloca !cir.f16, !cir.ptr<!cir.f16>, ["a"]
598
+ // CHECK: %[[B_ADDR:.*]] = cir.alloca !cir.f16, !cir.ptr<!cir.f16>, ["b", init]
599
+ // CHECK: %[[TMP_A:.*]] = cir.load{{.*}} %[[A_ADDR]] : !cir.ptr<!cir.f16>, !cir.f16
600
+ // CHECK: %[[A_F32:.*]] = cir.cast(floating, %[[TMP_A]] : !cir.f16), !cir.float
601
+ // CHECK: %[[A_MINUS:.*]] = cir.unary(minus, %[[A_F32]]) : !cir.float, !cir.float
602
+ // CHECK: %[[RESULT_F32:.*]] = cir.unary(minus, %[[A_MINUS]]) : !cir.float, !cir.float
603
+ // CHECK: %[[RESULT:.*]] = cir.cast(floating, %[[RESULT_F32]] : !cir.float), !cir.f16
604
+ // CHECK: cir.store{{.*}} %[[RESULT]], %[[B_ADDR]] : !cir.f16, !cir.ptr<!cir.f16>
605
+
606
+ // LLVM: define{{.*}} void @_Z15f16NestedUMinusv()
607
+ // LLVM: %[[A_ADDR:.*]] = alloca half, i64 1, align 2
608
+ // LLVM: %[[B_ADDR:.*]] = alloca half, i64 1, align 2
609
+ // LLVM: %[[TMP_A:.*]] = load half, ptr %[[A_ADDR]], align 2
610
+ // LLVM: %[[A_F32:.*]] = fpext half %[[TMP_A]] to float
611
+ // LLVM: %[[A_MINUS:.*]] = fneg float %[[A_F32]]
612
+ // LLVM: %[[RESULT_F32:.*]] = fneg float %[[A_MINUS]]
613
+ // LLVM: %[[RESULT:.*]] = fptrunc float %[[RESULT_F32]] to half
614
+ // LLVM: store half %[[RESULT]], ptr %[[B_ADDR]], align 2
615
+
616
+ // OGCG: define{{.*}} void @_Z15f16NestedUMinusv()
617
+ // OGCG: %[[A_ADDR:.*]] = alloca half, align 2
618
+ // OGCG: %[[B_ADDR:.*]] = alloca half, align 2
619
+ // OGCG: %[[TMP_A:.*]] = load half, ptr %[[A_ADDR]], align 2
620
+ // OGCG: %[[A_F32:.*]] = fpext half %[[TMP_A]] to float
621
+ // OGCG: %[[A_MINUS:.*]] = fneg float %[[A_F32]]
622
+ // OGCG: %[[RESULT_F32:.*]] = fneg float %[[A_MINUS]]
623
+ // OGCG: %[[RESULT:.*]] = fptrunc float %[[RESULT_F32]] to half
624
+ // OGCG: store half %[[RESULT]], ptr %[[B_ADDR]], align 2
0 commit comments