xref: /llvm-project/llvm/test/CodeGen/WebAssembly/wide-arithmetic.ll (revision c2293b33ddc6c722178087d85b2b4312ea830d12)
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 5
2; RUN: llc -mattr=+wide-arithmetic < %s | FileCheck %s
3
4target triple = "wasm32-unknown-unknown"
5
6define i128 @add_i128(i128 %a, i128 %b) {
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
24  %c = add i128 %a, %b
25  ret i128 %c
26}
27
28define i128 @sub_i128(i128 %a, i128 %b) {
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
46  %c = sub i128 %a, %b
47  ret i128 %c
48}
49
50define i128 @mul_i128(i128 %a, i128 %b) {
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
73  %c = mul i128 %a, %b
74  ret i128 %c
75}
76
77define i128 @i64_mul_wide_s(i64 %a, i64 %b) {
78; CHECK-LABEL: 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
93  %a128 = sext i64 %a to i128
94  %b128 = sext i64 %b to i128
95  %c = mul i128 %a128, %b128
96  ret i128 %c
97}
98
99define i128 @i64_mul_wide_u(i64 %a, i64 %b) {
100; CHECK-LABEL: 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
115  %a128 = zext i64 %a to i128
116  %b128 = zext i64 %b to i128
117  %c = mul i128 %a128, %b128
118  ret i128 %c
119}
120
121define i64 @mul_i128_only_lo(i128 %a, i128 %b) {
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
129  %c = mul i128 %a, %b
130  %d = trunc i128 %c to i64
131  ret i64 %d
132}
133