• Home
  • History
  • Annotate
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1; RUN: llc < %s --mtriple=wasm32-unknown-unknown -mattr=+atomics,+sign-ext -asm-verbose=false -disable-wasm-fallthrough-return-opt -wasm-disable-explicit-locals -wasm-keep-registers | FileCheck %s
2; RUN: llc < %s --mtriple=wasm64-unknown-unknown -mattr=+atomics,+sign-ext -asm-verbose=false -disable-wasm-fallthrough-return-opt -wasm-disable-explicit-locals -wasm-keep-registers | FileCheck %s
3
4; Test that extending loads are assembled properly.
5
6; CHECK-LABEL: sext_i8_i32:
7; CHECK: i32.atomic.load8_u $push0=, 0($0){{$}}
8; CHECK-NEXT: i32.extend8_s $push1=, $pop0{{$}}
9; CHECK-NEXT: return $pop1{{$}}
10define i32 @sext_i8_i32(i8 *%p) {
11  %v = load atomic i8, i8* %p seq_cst, align 1
12  %e = sext i8 %v to i32
13  ret i32 %e
14}
15
16; CHECK-LABEL: zext_i8_i32:
17; CHECK: i32.atomic.load8_u $push0=, 0($0){{$}}
18; CHECK-NEXT: return $pop0{{$}}
19define i32 @zext_i8_i32(i8 *%p) {
20e1:
21  %v = load atomic i8, i8* %p seq_cst, align 1
22  %e = zext i8 %v to i32
23  ret i32 %e
24}
25
26; CHECK-LABEL: sext_i16_i32:
27; CHECK: i32.atomic.load16_u $push0=, 0($0){{$}}
28; CHECK-NEXT: i32.extend16_s $push1=, $pop0{{$}}
29; CHECK-NEXT: return $pop1{{$}}
30define i32 @sext_i16_i32(i16 *%p) {
31  %v = load atomic i16, i16* %p seq_cst, align 2
32  %e = sext i16 %v to i32
33  ret i32 %e
34}
35
36; CHECK-LABEL: zext_i16_i32:
37; CHECK: i32.atomic.load16_u $push0=, 0($0){{$}}
38; CHECK-NEXT: return $pop0{{$}}
39define i32 @zext_i16_i32(i16 *%p) {
40  %v = load atomic i16, i16* %p seq_cst, align 2
41  %e = zext i16 %v to i32
42  ret i32 %e
43}
44
45; CHECK-LABEL: sext_i8_i64:
46; CHECK: i64.atomic.load8_u $push0=, 0($0){{$}}
47; CHECK: i64.extend8_s $push1=, $pop0{{$}}
48; CHECK-NEXT: return $pop1{{$}}
49define i64 @sext_i8_i64(i8 *%p) {
50  %v = load atomic i8, i8* %p seq_cst, align 1
51  %e = sext i8 %v to i64
52  ret i64 %e
53}
54
55; CHECK-LABEL: zext_i8_i64:
56; CHECK: i64.atomic.load8_u $push0=, 0($0){{$}}
57; CHECK-NEXT: return $pop0{{$}}
58define i64 @zext_i8_i64(i8 *%p) {
59  %v = load atomic i8, i8* %p seq_cst, align 1
60  %e = zext i8 %v to i64
61  ret i64 %e
62}
63
64; CHECK-LABEL: sext_i16_i64:
65; CHECK: i64.atomic.load16_u $push0=, 0($0){{$}}
66; CHECK: i64.extend16_s $push1=, $pop0{{$}}
67; CHECK-NEXT: return $pop1{{$}}
68define i64 @sext_i16_i64(i16 *%p) {
69  %v = load atomic i16, i16* %p seq_cst, align 2
70  %e = sext i16 %v to i64
71  ret i64 %e
72}
73
74; CHECK-LABEL: zext_i16_i64:
75; CHECK: i64.atomic.load16_u $push0=, 0($0){{$}}
76; CHECK-NEXT: return $pop0{{$}}
77define i64 @zext_i16_i64(i16 *%p) {
78  %v = load atomic i16, i16* %p seq_cst, align 2
79  %e = zext i16 %v to i64
80  ret i64 %e
81}
82
83; CHECK-LABEL: sext_i32_i64:
84; CHECK: i32.atomic.load $push0=, 0($0){{$}}
85; CHECK: i64.extend_i32_s $push1=, $pop0{{$}}
86; CHECK-NEXT: return $pop1{{$}}
87define i64 @sext_i32_i64(i32 *%p) {
88  %v = load atomic i32, i32* %p seq_cst, align 4
89  %e = sext i32 %v to i64
90  ret i64 %e
91}
92
93; CHECK-LABEL: zext_i32_i64:
94; CHECK: i64.atomic.load32_u $push0=, 0($0){{$}}
95; CHECK: return $pop0{{$}}
96define i64 @zext_i32_i64(i32 *%p) {
97  %v = load atomic i32, i32* %p seq_cst, align 4
98  %e = zext i32 %v to i64
99  ret i64 %e
100}
101