1; RUN: llc < %s -mattr=+sign-ext -asm-verbose=false -disable-wasm-fallthrough-return-opt -disable-wasm-explicit-locals | FileCheck %s
2; RUN: llc < %s -asm-verbose=false -disable-wasm-fallthrough-return-opt -disable-wasm-explicit-locals | FileCheck %s --check-prefix=NOSIGNEXT
3
4target datalayout = "e-m:e-p:32:32-i64:64-n32:64-S128"
5target triple = "wasm32-unknown-unknown"
6
7; CHECK-LABEL: i32_extend8_s:
8; CHECK-NEXT: .param i32{{$}}
9; CHECK-NEXT: .result i32{{$}}
10; CHECK-NEXT: i32.extend8_s $push[[NUM:[0-9]+]]=, $0{{$}}
11; CHECK-NEXT: return $pop[[NUM]]{{$}}
12
13; NOSIGNEXT-LABEL: i32_extend8_s
14; NOSIGNEXT-NOT: i32.extend8_s
15define i32 @i32_extend8_s(i8 %x) {
16  %a = sext i8 %x to i32
17  ret i32 %a
18}
19
20; CHECK-LABEL: i32_extend16_s:
21; CHECK-NEXT: .param i32{{$}}
22; CHECK-NEXT: .result i32{{$}}
23; CHECK-NEXT: i32.extend16_s $push[[NUM:[0-9]+]]=, $0{{$}}
24; CHECK-NEXT: return $pop[[NUM]]{{$}}
25
26; NOSIGNEXT-LABEL: i32_extend16_s
27; NOSIGNEXT-NOT: i32.extend16_s
28define i32 @i32_extend16_s(i16 %x) {
29  %a = sext i16 %x to i32
30  ret i32 %a
31}
32
33; CHECK-LABEL: i64_extend8_s:
34; CHECK-NEXT: .param i32{{$}}
35; CHECK-NEXT: .result i64{{$}}
36; CHECK-NEXT: i64.extend_u/i32 $push[[NUM1:[0-9]+]]=, $0{{$}}
37; CHECK-NEXT: i64.extend8_s $push[[NUM2:[0-9]+]]=, $pop[[NUM1]]{{$}}
38; CHECK-NEXT: return $pop[[NUM2]]{{$}}
39
40; NOSIGNEXT-LABEL: i64_extend8_s
41; NOSIGNEXT-NOT: i64.extend8_s
42define i64 @i64_extend8_s(i8 %x) {
43  %a = sext i8 %x to i64
44  ret i64 %a
45}
46
47; CHECK-LABEL: i64_extend16_s:
48; CHECK-NEXT: .param i32{{$}}
49; CHECK-NEXT: .result i64{{$}}
50; CHECK-NEXT: i64.extend_u/i32 $push[[NUM1:[0-9]+]]=, $0{{$}}
51; CHECK-NEXT: i64.extend16_s $push[[NUM2:[0-9]+]]=, $pop[[NUM1]]{{$}}
52; CHECK-NEXT: return $pop[[NUM2]]{{$}}
53
54; NOSIGNEXT-LABEL: i64_extend16_s
55; NOSIGNEXT-NOT: i16.extend16_s
56define i64 @i64_extend16_s(i16 %x) {
57  %a = sext i16 %x to i64
58  ret i64 %a
59}
60
61; No SIGN_EXTEND_INREG is needed for 32->64 extension.
62; CHECK-LABEL: i64_extend32_s:
63; CHECK-NEXT: .param i32{{$}}
64; CHECK-NEXT: .result i64{{$}}
65; CHECK-NEXT: i64.extend_s/i32 $push[[NUM:[0-9]+]]=, $0{{$}}
66; CHECK-NEXT: return $pop[[NUM]]{{$}}
67define i64 @i64_extend32_s(i32 %x) {
68  %a = sext i32 %x to i64
69  ret i64 %a
70}
71
72