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