blob: 2a2318fde10ea126954f0adcff6e63d0373deab2 [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:
Dan Gohmanb6fd39a2016-01-19 16:59:23 +000018; CHECK: i32.load8_u $push[[NUM0:[0-9]+]]=, 0($0){{$}}
19; CHECK-NEXT: i32.const $push[[NUM1:[0-9]+]]=, 31{{$}}
20; CHECK-NEXT: shl $push[[NUM2:[0-9]+]]=, $pop[[NUM0]], $pop[[NUM1]]{{$}}
21; CHECK-NEXT: i32.const $push[[NUM4:[0-9]+]]=, 31{{$}}
22; CHECK-NEXT: shr_s $push[[NUM3:[0-9]+]]=, $pop[[NUM2]], $pop[[NUM4]]{{$}}
Dan Gohman4ba48162015-11-18 16:12:01 +000023; CHECK-NEXT: return $pop[[NUM3]]{{$}}
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:
Dan Gohmanb6fd39a2016-01-19 16:59:23 +000040; CHECK: i64.load8_u $push[[NUM0:[0-9]+]]=, 0($0){{$}}
41; CHECK-NEXT: i64.const $push[[NUM1:[0-9]+]]=, 63{{$}}
42; CHECK-NEXT: shl $push[[NUM2:[0-9]+]]=, $pop[[NUM0]], $pop[[NUM1]]{{$}}
43; CHECK-NEXT: i64.const $push[[NUM4:[0-9]+]]=, 63{{$}}
44; CHECK-NEXT: shr_s $push[[NUM3:[0-9]+]]=, $pop[[NUM2]], $pop[[NUM4]]{{$}}
Dan Gohman4ba48162015-11-18 16:12:01 +000045; CHECK-NEXT: return $pop[[NUM3]]{{$}}
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 Gohman71008092016-05-17 23:19:03 +000055; CHECK-NEXT: i32.store8 $drop=, 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 Gohman71008092016-05-17 23:19:03 +000065; CHECK-NEXT: i64.store8 $drop=, 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}