blob: ea0ec717c7a0cf8baaab99a18e26cea097f80c46 [file] [log] [blame]
Dan Gohmanb7c24002016-05-21 00:21:56 +00001; RUN: llc < %s -asm-verbose=false -disable-wasm-fallthrough-return-opt | FileCheck %s
JF Bastien73ff6af2015-08-31 22:24:11 +00002
3; Test that i1 extending loads and truncating stores are assembled properly.
4
Dan Gohman0c6f5ac2016-01-07 03:19:23 +00005target datalayout = "e-m:e-p:32:32-i64:64-n32:64-S128"
JF Bastien73ff6af2015-08-31 22:24:11 +00006target triple = "wasm32-unknown-unknown"
7
Dan Gohmane51c0582015-10-06 00:27:55 +00008; CHECK-LABEL: load_u_i1_i32:
Derek Schuff9d779522015-12-05 00:26:39 +00009; CHECK: i32.load8_u $push[[NUM0:[0-9]+]]=, 0($0){{$}}
Dan Gohman81719f82015-11-25 16:55:01 +000010; CHECK-NEXT: return $pop[[NUM0]]{{$}}
Dan Gohmand0bf9812015-09-26 01:09:44 +000011define i32 @load_u_i1_i32(i1* %p) {
JF Bastien73ff6af2015-08-31 22:24:11 +000012 %v = load i1, i1* %p
13 %e = zext i1 %v to i32
14 ret i32 %e
15}
16
Dan Gohmane51c0582015-10-06 00:27:55 +000017; CHECK-LABEL: load_s_i1_i32:
Derek Schuff7edf93b2016-10-20 00:10:34 +000018; CHECK: i32.const $push[[NUM3:[0-9]+]]=, 0{{$}}
19; CHECK-NEXT: i32.load8_u $push[[NUM0:[0-9]+]]=, 0($0){{$}}
20; CHECK-NEXT: i32.const $push[[NUM1:[0-9]+]]=, 1{{$}}
21; CHECK-NEXT: i32.and $push[[NUM2:[0-9]+]]=, $pop[[NUM0]], $pop[[NUM1]]{{$}}
22; CHECK-NEXT: i32.sub $push[[NUM4:[0-9]+]]=, $pop[[NUM3]], $pop[[NUM2]]{{$}}
23; CHECK-NEXT: return $pop[[NUM4]]{{$}}
Dan Gohmand0bf9812015-09-26 01:09:44 +000024define i32 @load_s_i1_i32(i1* %p) {
JF Bastien73ff6af2015-08-31 22:24:11 +000025 %v = load i1, i1* %p
26 %e = sext i1 %v to i32
27 ret i32 %e
28}
29
Dan Gohmane51c0582015-10-06 00:27:55 +000030; CHECK-LABEL: load_u_i1_i64:
Derek Schuff9d779522015-12-05 00:26:39 +000031; CHECK: i64.load8_u $push[[NUM0:[0-9]+]]=, 0($0){{$}}
Dan Gohman81719f82015-11-25 16:55:01 +000032; CHECK-NEXT: return $pop[[NUM0]]{{$}}
Dan Gohmand0bf9812015-09-26 01:09:44 +000033define i64 @load_u_i1_i64(i1* %p) {
JF Bastien73ff6af2015-08-31 22:24:11 +000034 %v = load i1, i1* %p
35 %e = zext i1 %v to i64
36 ret i64 %e
37}
38
Dan Gohmane51c0582015-10-06 00:27:55 +000039; CHECK-LABEL: load_s_i1_i64:
Derek Schuff7edf93b2016-10-20 00:10:34 +000040; CHECK: i64.const $push[[NUM3:[0-9]+]]=, 0{{$}}
41; CHECK-NEXT: i64.load8_u $push[[NUM0:[0-9]+]]=, 0($0){{$}}
42; CHECK-NEXT: i64.const $push[[NUM1:[0-9]+]]=, 1{{$}}
43; CHECK-NEXT: i64.and $push[[NUM2:[0-9]+]]=, $pop[[NUM0]], $pop[[NUM1]]{{$}}
44; CHECK-NEXT: i64.sub $push[[NUM4:[0-9]+]]=, $pop[[NUM3]], $pop[[NUM2]]{{$}}
45; CHECK-NEXT: return $pop[[NUM4]]{{$}}
Dan Gohmand0bf9812015-09-26 01:09:44 +000046define i64 @load_s_i1_i64(i1* %p) {
JF Bastien73ff6af2015-08-31 22:24:11 +000047 %v = load i1, i1* %p
48 %e = sext i1 %v to i64
49 ret i64 %e
50}
51
Dan Gohmane51c0582015-10-06 00:27:55 +000052; CHECK-LABEL: store_i32_i1:
Dan Gohman700515f2015-11-23 21:55:57 +000053; CHECK: i32.const $push[[NUM0:[0-9]+]]=, 1{{$}}
54; CHECK-NEXT: i32.and $push[[NUM1:[0-9]+]]=, $1, $pop[[NUM0]]{{$}}
Dan Gohman7f1bdb22016-10-06 22:08:28 +000055; CHECK-NEXT: i32.store8 0($0), $pop[[NUM1]]{{$}}
JF Bastien73ff6af2015-08-31 22:24:11 +000056define void @store_i32_i1(i1* %p, i32 %v) {
57 %t = trunc i32 %v to i1
58 store i1 %t, i1* %p
59 ret void
60}
61
Dan Gohmane51c0582015-10-06 00:27:55 +000062; CHECK-LABEL: store_i64_i1:
Dan Gohman700515f2015-11-23 21:55:57 +000063; CHECK: i64.const $push[[NUM0:[0-9]+]]=, 1{{$}}
64; CHECK-NEXT: i64.and $push[[NUM1:[0-9]+]]=, $1, $pop[[NUM0]]{{$}}
Dan Gohman7f1bdb22016-10-06 22:08:28 +000065; CHECK-NEXT: i64.store8 0($0), $pop[[NUM1]]{{$}}
JF Bastien73ff6af2015-08-31 22:24:11 +000066define void @store_i64_i1(i1* %p, i64 %v) {
67 %t = trunc i64 %v to i1
68 store i1 %t, i1* %p
69 ret void
70}