1+ ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 5
12; RUN: llc -mattr=+wide-arithmetic < %s | FileCheck %s
23
34target triple = "wasm32-unknown-unknown"
45
56define i128 @add_i128 (i128 %a , i128 %b ) {
6- ; CHECK-LABEL: add_i128:
7- ; CHECK: i64.add128
7+ ; CHECK-LABEL: add_i128:
8+ ; CHECK: .functype add_i128 (i32, i64, i64, i64, i64) -> ()
9+ ; CHECK-NEXT: # %bb.0:
10+ ; CHECK-NEXT: local.get 1
11+ ; CHECK-NEXT: local.get 2
12+ ; CHECK-NEXT: local.get 3
13+ ; CHECK-NEXT: local.get 4
14+ ; CHECK-NEXT: i64.add128
15+ ; CHECK-NEXT: local.set 3
16+ ; CHECK-NEXT: local.set 4
17+ ; CHECK-NEXT: local.get 0
18+ ; CHECK-NEXT: local.get 3
19+ ; CHECK-NEXT: i64.store 8
20+ ; CHECK-NEXT: local.get 0
21+ ; CHECK-NEXT: local.get 4
22+ ; CHECK-NEXT: i64.store 0
23+ ; CHECK-NEXT: # fallthrough-return
824 %c = add i128 %a , %b
925 ret i128 %c
1026}
1127
1228define i128 @sub_i128 (i128 %a , i128 %b ) {
13- ; CHECK-LABEL: sub_i128:
14- ; CHECK: i64.sub128
29+ ; CHECK-LABEL: sub_i128:
30+ ; CHECK: .functype sub_i128 (i32, i64, i64, i64, i64) -> ()
31+ ; CHECK-NEXT: # %bb.0:
32+ ; CHECK-NEXT: local.get 1
33+ ; CHECK-NEXT: local.get 2
34+ ; CHECK-NEXT: local.get 3
35+ ; CHECK-NEXT: local.get 4
36+ ; CHECK-NEXT: i64.sub128
37+ ; CHECK-NEXT: local.set 3
38+ ; CHECK-NEXT: local.set 4
39+ ; CHECK-NEXT: local.get 0
40+ ; CHECK-NEXT: local.get 3
41+ ; CHECK-NEXT: i64.store 8
42+ ; CHECK-NEXT: local.get 0
43+ ; CHECK-NEXT: local.get 4
44+ ; CHECK-NEXT: i64.store 0
45+ ; CHECK-NEXT: # fallthrough-return
1546 %c = sub i128 %a , %b
1647 ret i128 %c
1748}
1849
1950define i128 @mul_i128 (i128 %a , i128 %b ) {
20- ; CHECK-LABEL: mul_i128:
21- ; CHECK: i64.mul_wide_u
51+ ; CHECK-LABEL: mul_i128:
52+ ; CHECK: .functype mul_i128 (i32, i64, i64, i64, i64) -> ()
53+ ; CHECK-NEXT: .local i64
54+ ; CHECK-NEXT: # %bb.0:
55+ ; CHECK-NEXT: local.get 0
56+ ; CHECK-NEXT: local.get 1
57+ ; CHECK-NEXT: local.get 3
58+ ; CHECK-NEXT: i64.mul_wide_u
59+ ; CHECK-NEXT: local.set 5
60+ ; CHECK-NEXT: i64.store 0
61+ ; CHECK-NEXT: local.get 0
62+ ; CHECK-NEXT: local.get 5
63+ ; CHECK-NEXT: local.get 1
64+ ; CHECK-NEXT: local.get 4
65+ ; CHECK-NEXT: i64.mul
66+ ; CHECK-NEXT: i64.add
67+ ; CHECK-NEXT: local.get 2
68+ ; CHECK-NEXT: local.get 3
69+ ; CHECK-NEXT: i64.mul
70+ ; CHECK-NEXT: i64.add
71+ ; CHECK-NEXT: i64.store 8
72+ ; CHECK-NEXT: # fallthrough-return
2273 %c = mul i128 %a , %b
2374 ret i128 %c
2475}
2576
2677define i128 @i64_mul_wide_s (i64 %a , i64 %b ) {
2778; CHECK-LABEL: i64_mul_wide_s:
28- ; CHECK: i64.mul_wide_s
79+ ; CHECK: .functype i64_mul_wide_s (i32, i64, i64) -> ()
80+ ; CHECK-NEXT: # %bb.0:
81+ ; CHECK-NEXT: local.get 1
82+ ; CHECK-NEXT: local.get 2
83+ ; CHECK-NEXT: i64.mul_wide_s
84+ ; CHECK-NEXT: local.set 1
85+ ; CHECK-NEXT: local.set 2
86+ ; CHECK-NEXT: local.get 0
87+ ; CHECK-NEXT: local.get 1
88+ ; CHECK-NEXT: i64.store 8
89+ ; CHECK-NEXT: local.get 0
90+ ; CHECK-NEXT: local.get 2
91+ ; CHECK-NEXT: i64.store 0
92+ ; CHECK-NEXT: # fallthrough-return
2993 %a128 = sext i64 %a to i128
3094 %b128 = sext i64 %b to i128
3195 %c = mul i128 %a128 , %b128
@@ -34,17 +98,34 @@ define i128 @i64_mul_wide_s(i64 %a, i64 %b) {
3498
3599define i128 @i64_mul_wide_u (i64 %a , i64 %b ) {
36100; CHECK-LABEL: i64_mul_wide_u:
37- ; CHECK: i64.mul_wide_u
101+ ; CHECK: .functype i64_mul_wide_u (i32, i64, i64) -> ()
102+ ; CHECK-NEXT: # %bb.0:
103+ ; CHECK-NEXT: local.get 1
104+ ; CHECK-NEXT: local.get 2
105+ ; CHECK-NEXT: i64.mul_wide_u
106+ ; CHECK-NEXT: local.set 1
107+ ; CHECK-NEXT: local.set 2
108+ ; CHECK-NEXT: local.get 0
109+ ; CHECK-NEXT: local.get 1
110+ ; CHECK-NEXT: i64.store 8
111+ ; CHECK-NEXT: local.get 0
112+ ; CHECK-NEXT: local.get 2
113+ ; CHECK-NEXT: i64.store 0
114+ ; CHECK-NEXT: # fallthrough-return
38115 %a128 = zext i64 %a to i128
39116 %b128 = zext i64 %b to i128
40117 %c = mul i128 %a128 , %b128
41118 ret i128 %c
42119}
43120
44121define i64 @mul_i128_only_lo (i128 %a , i128 %b ) {
45- ; CHECK-LABEL: mul_i128_only_lo:
46- ; CHECK-NOT: i64.mul128
47- ; CHECK: i64.mul
122+ ; CHECK-LABEL: mul_i128_only_lo:
123+ ; CHECK: .functype mul_i128_only_lo (i64, i64, i64, i64) -> (i64)
124+ ; CHECK-NEXT: # %bb.0:
125+ ; CHECK-NEXT: local.get 0
126+ ; CHECK-NEXT: local.get 2
127+ ; CHECK-NEXT: i64.mul
128+ ; CHECK-NEXT: # fallthrough-return
48129 %c = mul i128 %a , %b
49130 %d = trunc i128 %c to i64
50131 ret i64 %d
0 commit comments