1 # RUN: llc -O0 -run-pass=legalizer -global-isel %s -o - | FileCheck %s
4 target datalayout = "e-m:o-i64:64-i128:128-n32:64-S128"
5 target triple = "aarch64--"
6 define void @test_scalar_add_big() {
10 define void @test_scalar_add_small() {
14 define void @test_vector_add() {
21 name: test_scalar_add_big
34 liveins: %x0, %x1, %x2, %x3
35 ; CHECK-LABEL: name: test_scalar_add_big
36 ; CHECK-NOT: G_MERGE_VALUES
37 ; CHECK-NOT: G_UNMERGE_VALUES
38 ; CHECK-DAG: [[CARRY0_32:%.*]](s32) = G_CONSTANT i32 0
39 ; CHECK-DAG: [[CARRY0:%[0-9]+]](s1) = G_TRUNC [[CARRY0_32]]
40 ; CHECK: [[RES_LO:%.*]](s64), [[CARRY:%.*]](s1) = G_UADDE %0, %2, [[CARRY0]]
41 ; CHECK: [[RES_HI:%.*]](s64), {{%.*}}(s1) = G_UADDE %1, %3, [[CARRY]]
42 ; CHECK-NOT: G_MERGE_VALUES
43 ; CHECK-NOT: G_UNMERGE_VALUES
44 ; CHECK: %x0 = COPY [[RES_LO]]
45 ; CHECK: %x1 = COPY [[RES_HI]]
51 %4(s128) = G_MERGE_VALUES %0, %1
52 %5(s128) = G_MERGE_VALUES %2, %3
53 %6(s128) = G_ADD %4, %5
54 %7(s64), %8(s64) = G_UNMERGE_VALUES %6
60 name: test_scalar_add_small
70 liveins: %x0, %x1, %x2, %x3
71 ; CHECK-LABEL: name: test_scalar_add_small
72 ; CHECK: [[OP0:%.*]](s32) = G_ANYEXT %2(s8)
73 ; CHECK: [[OP1:%.*]](s32) = G_ANYEXT %3(s8)
74 ; CHECK: [[RES32:%.*]](s32) = G_ADD [[OP0]], [[OP1]]
75 ; CHECK: [[RES:%.*]](s8) = G_TRUNC [[RES32]](s32)
100 liveins: %q0, %q1, %q2, %q3
101 ; CHECK-LABEL: name: test_vector_add
102 ; CHECK-NOT: G_EXTRACT
103 ; CHECK-NOT: G_SEQUENCE
104 ; CHECK: [[RES_LO:%.*]](<2 x s64>) = G_ADD %0, %2
105 ; CHECK: [[RES_HI:%.*]](<2 x s64>) = G_ADD %1, %3
106 ; CHECK-NOT: G_EXTRACT
107 ; CHECK-NOT: G_SEQUENCE
108 ; CHECK: %q0 = COPY [[RES_LO]]
109 ; CHECK: %q1 = COPY [[RES_HI]]
111 %0(<2 x s64>) = COPY %q0
112 %1(<2 x s64>) = COPY %q1
113 %2(<2 x s64>) = COPY %q2
114 %3(<2 x s64>) = COPY %q3
115 %4(<4 x s64>) = G_MERGE_VALUES %0, %1
116 %5(<4 x s64>) = G_MERGE_VALUES %2, %3
117 %6(<4 x s64>) = G_ADD %4, %5
118 %7(<2 x s64>), %8(<2 x s64>) = G_UNMERGE_VALUES %6