@@ -85,3 +85,44 @@ define i128 @i128_addc_4(i128 %a, i128 %b) {
8585 ret i128 %ext
8686}
8787
88+ define i128 @i128_addc_xor (i128 %a , i128 %b ) {
89+ ; CHECK-LABEL: i128_addc_xor:
90+ ; CHECK: # %bb.0:
91+ ; CHECK-NEXT: vl %v1, 0(%r4), 3
92+ ; CHECK-NEXT: vl %v0, 0(%r3), 3
93+ ; CHECK-NEXT: vno %v1, %v1, %v1
94+ ; CHECK-NEXT: veclg %v1, %v0
95+ ; CHECK-NEXT: jlh .LBB6_2
96+ ; CHECK-NEXT: # %bb.1:
97+ ; CHECK-NEXT: vchlgs %v0, %v0, %v1
98+ ; CHECK-NEXT: .LBB6_2:
99+ ; CHECK-NEXT: jnl .LBB6_4
100+ ; CHECK-NEXT: # %bb.3:
101+ ; CHECK-NEXT: larl %r1, .LCPI6_0
102+ ; CHECK-NEXT: vl %v0, 0(%r1), 3
103+ ; CHECK-NEXT: vst %v0, 0(%r2), 3
104+ ; CHECK-NEXT: br %r14
105+ ; CHECK-NEXT: .LBB6_4:
106+ ; CHECK-NEXT: vgbm %v0, 0
107+ ; CHECK-NEXT: vst %v0, 0(%r2), 3
108+ ; CHECK-NEXT: br %r14
109+ %b.not = xor i128 %b , -1
110+ %cmp = icmp ugt i128 %a , %b.not
111+ %ext = zext i1 %cmp to i128
112+ ret i128 %ext
113+ }
114+
115+ define i128 @i128_addc_xor_inv (i128 %a , i128 %b ) {
116+ ; CHECK-LABEL: i128_addc_xor_inv:
117+ ; CHECK: # %bb.0:
118+ ; CHECK-NEXT: vl %v1, 0(%r4), 3
119+ ; CHECK-NEXT: vl %v0, 0(%r3), 3
120+ ; CHECK-NEXT: vno %v1, %v1, %v1
121+ ; CHECK-NEXT: vscbiq %v0, %v1, %v0
122+ ; CHECK-NEXT: vst %v0, 0(%r2), 3
123+ ; CHECK-NEXT: br %r14
124+ %b.not = xor i128 %b , -1
125+ %cmp = icmp ule i128 %a , %b.not
126+ %ext = zext i1 %cmp to i128
127+ ret i128 %ext
128+ }
0 commit comments