xref: /llvm-project/llvm/test/CodeGen/WebAssembly/multivalue_libcall.ll (revision e665e781dc3f8fac0400f6ac8e168805b0cdf74a)
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 2
2; RUN: llc < %s -verify-machineinstrs -mcpu=mvp -mattr=+multivalue -target-abi=experimental-mv | FileCheck %s --check-prefix=MULTIVALUE
3; RUN: llc < %s -verify-machineinstrs -mcpu=mvp | FileCheck %s --check-prefix=NO_MULTIVALUE
4
5; Test libcall signatures when multivalue is enabled and disabled
6
7target triple = "wasm32-unknown-unknown"
8
9define i128 @multivalue_sdiv(i128 %a, i128 %b) {
10; MULTIVALUE-LABEL: multivalue_sdiv:
11; MULTIVALUE:         .functype multivalue_sdiv (i64, i64, i64, i64) -> (i64, i64)
12; MULTIVALUE-NEXT:  # %bb.0:
13; MULTIVALUE-NEXT:    local.get 0
14; MULTIVALUE-NEXT:    local.get 1
15; MULTIVALUE-NEXT:    local.get 2
16; MULTIVALUE-NEXT:    local.get 3
17; MULTIVALUE-NEXT:    call __divti3
18; MULTIVALUE-NEXT:    # fallthrough-return
19;
20; NO_MULTIVALUE-LABEL: multivalue_sdiv:
21; NO_MULTIVALUE:         .functype multivalue_sdiv (i32, i64, i64, i64, i64) -> ()
22; NO_MULTIVALUE-NEXT:    .local i32
23; NO_MULTIVALUE-NEXT:  # %bb.0:
24; NO_MULTIVALUE-NEXT:    global.get __stack_pointer
25; NO_MULTIVALUE-NEXT:    i32.const 16
26; NO_MULTIVALUE-NEXT:    i32.sub
27; NO_MULTIVALUE-NEXT:    local.tee 5
28; NO_MULTIVALUE-NEXT:    global.set __stack_pointer
29; NO_MULTIVALUE-NEXT:    local.get 5
30; NO_MULTIVALUE-NEXT:    local.get 1
31; NO_MULTIVALUE-NEXT:    local.get 2
32; NO_MULTIVALUE-NEXT:    local.get 3
33; NO_MULTIVALUE-NEXT:    local.get 4
34; NO_MULTIVALUE-NEXT:    call __divti3
35; NO_MULTIVALUE-NEXT:    local.get 0
36; NO_MULTIVALUE-NEXT:    local.get 5
37; NO_MULTIVALUE-NEXT:    i64.load 8
38; NO_MULTIVALUE-NEXT:    i64.store 8
39; NO_MULTIVALUE-NEXT:    local.get 0
40; NO_MULTIVALUE-NEXT:    local.get 5
41; NO_MULTIVALUE-NEXT:    i64.load 0
42; NO_MULTIVALUE-NEXT:    i64.store 0
43; NO_MULTIVALUE-NEXT:    local.get 5
44; NO_MULTIVALUE-NEXT:    i32.const 16
45; NO_MULTIVALUE-NEXT:    i32.add
46; NO_MULTIVALUE-NEXT:    global.set __stack_pointer
47; NO_MULTIVALUE-NEXT:    # fallthrough-return
48  %div = sdiv i128 %a, %b
49  ret i128 %div
50}
51
52
53define fp128 @multivalue_fsub(fp128 %a, fp128 %b) {
54; MULTIVALUE-LABEL: multivalue_fsub:
55; MULTIVALUE:         .functype multivalue_fsub (i64, i64, i64, i64) -> (i64, i64)
56; MULTIVALUE-NEXT:  # %bb.0:
57; MULTIVALUE-NEXT:    local.get 0
58; MULTIVALUE-NEXT:    local.get 1
59; MULTIVALUE-NEXT:    local.get 2
60; MULTIVALUE-NEXT:    local.get 3
61; MULTIVALUE-NEXT:    call __subtf3
62; MULTIVALUE-NEXT:    # fallthrough-return
63;
64; NO_MULTIVALUE-LABEL: multivalue_fsub:
65; NO_MULTIVALUE:         .functype multivalue_fsub (i32, i64, i64, i64, i64) -> ()
66; NO_MULTIVALUE-NEXT:    .local i32
67; NO_MULTIVALUE-NEXT:  # %bb.0:
68; NO_MULTIVALUE-NEXT:    global.get __stack_pointer
69; NO_MULTIVALUE-NEXT:    i32.const 16
70; NO_MULTIVALUE-NEXT:    i32.sub
71; NO_MULTIVALUE-NEXT:    local.tee 5
72; NO_MULTIVALUE-NEXT:    global.set __stack_pointer
73; NO_MULTIVALUE-NEXT:    local.get 5
74; NO_MULTIVALUE-NEXT:    local.get 1
75; NO_MULTIVALUE-NEXT:    local.get 2
76; NO_MULTIVALUE-NEXT:    local.get 3
77; NO_MULTIVALUE-NEXT:    local.get 4
78; NO_MULTIVALUE-NEXT:    call __subtf3
79; NO_MULTIVALUE-NEXT:    local.get 0
80; NO_MULTIVALUE-NEXT:    local.get 5
81; NO_MULTIVALUE-NEXT:    i64.load 8
82; NO_MULTIVALUE-NEXT:    i64.store 8
83; NO_MULTIVALUE-NEXT:    local.get 0
84; NO_MULTIVALUE-NEXT:    local.get 5
85; NO_MULTIVALUE-NEXT:    i64.load 0
86; NO_MULTIVALUE-NEXT:    i64.store 0
87; NO_MULTIVALUE-NEXT:    local.get 5
88; NO_MULTIVALUE-NEXT:    i32.const 16
89; NO_MULTIVALUE-NEXT:    i32.add
90; NO_MULTIVALUE-NEXT:    global.set __stack_pointer
91; NO_MULTIVALUE-NEXT:    # fallthrough-return
92  %sub = fsub fp128 %a, %b
93  ret fp128 %sub
94}
95
96define i128 @multivalue_lshr(i128 %a, i128 %b) {
97; MULTIVALUE-LABEL: multivalue_lshr:
98; MULTIVALUE:         .functype multivalue_lshr (i64, i64, i64, i64) -> (i64, i64)
99; MULTIVALUE-NEXT:  # %bb.0:
100; MULTIVALUE-NEXT:    local.get 2
101; MULTIVALUE-NEXT:    local.get 3
102; MULTIVALUE-NEXT:    local.get 0
103; MULTIVALUE-NEXT:    i32.wrap_i64
104; MULTIVALUE-NEXT:    call __ashlti3
105; MULTIVALUE-NEXT:    # fallthrough-return
106;
107; NO_MULTIVALUE-LABEL: multivalue_lshr:
108; NO_MULTIVALUE:         .functype multivalue_lshr (i32, i64, i64, i64, i64) -> ()
109; NO_MULTIVALUE-NEXT:    .local i32
110; NO_MULTIVALUE-NEXT:  # %bb.0:
111; NO_MULTIVALUE-NEXT:    global.get __stack_pointer
112; NO_MULTIVALUE-NEXT:    i32.const 16
113; NO_MULTIVALUE-NEXT:    i32.sub
114; NO_MULTIVALUE-NEXT:    local.tee 5
115; NO_MULTIVALUE-NEXT:    global.set __stack_pointer
116; NO_MULTIVALUE-NEXT:    local.get 5
117; NO_MULTIVALUE-NEXT:    local.get 3
118; NO_MULTIVALUE-NEXT:    local.get 4
119; NO_MULTIVALUE-NEXT:    local.get 1
120; NO_MULTIVALUE-NEXT:    i32.wrap_i64
121; NO_MULTIVALUE-NEXT:    call __ashlti3
122; NO_MULTIVALUE-NEXT:    local.get 0
123; NO_MULTIVALUE-NEXT:    local.get 5
124; NO_MULTIVALUE-NEXT:    i64.load 8
125; NO_MULTIVALUE-NEXT:    i64.store 8
126; NO_MULTIVALUE-NEXT:    local.get 0
127; NO_MULTIVALUE-NEXT:    local.get 5
128; NO_MULTIVALUE-NEXT:    i64.load 0
129; NO_MULTIVALUE-NEXT:    i64.store 0
130; NO_MULTIVALUE-NEXT:    local.get 5
131; NO_MULTIVALUE-NEXT:    i32.const 16
132; NO_MULTIVALUE-NEXT:    i32.add
133; NO_MULTIVALUE-NEXT:    global.set __stack_pointer
134; NO_MULTIVALUE-NEXT:    # fallthrough-return
135  %tmp = shl i128 %b, %a
136  ret i128 %tmp
137}
138