69 lines · plain
1; RUN: llc < %s --mtriple=wasm32-unknown-unknown -asm-verbose=false -disable-wasm-fallthrough-return-opt -wasm-disable-explicit-locals -wasm-keep-registers | FileCheck %s2; RUN: llc < %s --mtriple=wasm64-unknown-unknown -asm-verbose=false -disable-wasm-fallthrough-return-opt -wasm-disable-explicit-locals -wasm-keep-registers | FileCheck %s3 4; Test that i1 extending loads and truncating stores are assembled properly.5 6; CHECK-LABEL: load_u_i1_i32:7; CHECK: i32.load8_u $push[[NUM0:[0-9]+]]=, 0($0){{$}}8; CHECK-NEXT: return $pop[[NUM0]]{{$}}9define i32 @load_u_i1_i32(ptr %p) {10 %v = load i1, ptr %p11 %e = zext i1 %v to i3212 ret i32 %e13}14 15; CHECK-LABEL: load_s_i1_i32:16; CHECK: i32.const $push[[NUM3:[0-9]+]]=, 0{{$}}17; CHECK-NEXT: i32.load8_u $push[[NUM0:[0-9]+]]=, 0($0){{$}}18; CHECK-NEXT: i32.const $push[[NUM1:[0-9]+]]=, 1{{$}}19; CHECK-NEXT: i32.and $push[[NUM2:[0-9]+]]=, $pop[[NUM0]], $pop[[NUM1]]{{$}}20; CHECK-NEXT: i32.sub $push[[NUM4:[0-9]+]]=, $pop[[NUM3]], $pop[[NUM2]]{{$}}21; CHECK-NEXT: return $pop[[NUM4]]{{$}}22define i32 @load_s_i1_i32(ptr %p) {23 %v = load i1, ptr %p24 %e = sext i1 %v to i3225 ret i32 %e26}27 28; CHECK-LABEL: load_u_i1_i64:29; CHECK: i64.load8_u $push[[NUM0:[0-9]+]]=, 0($0){{$}}30; CHECK-NEXT: return $pop[[NUM0]]{{$}}31define i64 @load_u_i1_i64(ptr %p) {32 %v = load i1, ptr %p33 %e = zext i1 %v to i6434 ret i64 %e35}36 37; CHECK-LABEL: load_s_i1_i64:38; CHECK: i64.const $push[[NUM3:[0-9]+]]=, 0{{$}}39; CHECK-NEXT: i64.load8_u $push[[NUM0:[0-9]+]]=, 0($0){{$}}40; CHECK-NEXT: i64.const $push[[NUM1:[0-9]+]]=, 1{{$}}41; CHECK-NEXT: i64.and $push[[NUM2:[0-9]+]]=, $pop[[NUM0]], $pop[[NUM1]]{{$}}42; CHECK-NEXT: i64.sub $push[[NUM4:[0-9]+]]=, $pop[[NUM3]], $pop[[NUM2]]{{$}}43; CHECK-NEXT: return $pop[[NUM4]]{{$}}44define i64 @load_s_i1_i64(ptr %p) {45 %v = load i1, ptr %p46 %e = sext i1 %v to i6447 ret i64 %e48}49 50; CHECK-LABEL: store_i32_i1:51; CHECK: i32.const $push[[NUM0:[0-9]+]]=, 1{{$}}52; CHECK-NEXT: i32.and $push[[NUM1:[0-9]+]]=, $1, $pop[[NUM0]]{{$}}53; CHECK-NEXT: i32.store8 0($0), $pop[[NUM1]]{{$}}54define void @store_i32_i1(ptr %p, i32 %v) {55 %t = trunc i32 %v to i156 store i1 %t, ptr %p57 ret void58}59 60; CHECK-LABEL: store_i64_i1:61; CHECK: i64.const $push[[NUM0:[0-9]+]]=, 1{{$}}62; CHECK-NEXT: i64.and $push[[NUM1:[0-9]+]]=, $1, $pop[[NUM0]]{{$}}63; CHECK-NEXT: i64.store8 0($0), $pop[[NUM1]]{{$}}64define void @store_i64_i1(ptr %p, i64 %v) {65 %t = trunc i64 %v to i166 store i1 %t, ptr %p67 ret void68}69