blob: f15d1a247779bfb09a1941b0ed3e6f971d69422d [file] [log] [blame]
Thomas Livelyb6dac892018-12-21 06:58:15 +00001; RUN: llc < %s -asm-verbose=false -verify-machineinstrs -wasm-keep-registers -disable-wasm-fallthrough-return-opt -wasm-disable-explicit-locals -wasm-enable-unimplemented-simd -mattr=+simd128,+sign-ext | FileCheck %s --check-prefixes CHECK,SIMD128
2; RUN: llc < %s -asm-verbose=false -verify-machineinstrs -wasm-keep-registers -disable-wasm-fallthrough-return-opt -wasm-disable-explicit-locals -mattr=+simd128,+sign-ext | FileCheck %s --check-prefixes CHECK,SIMD128-VM
3; RUN: llc < %s -asm-verbose=false -verify-machineinstrs -wasm-keep-registers -disable-wasm-fallthrough-return-opt -wasm-disable-explicit-locals -mattr=-simd128,+sign-ext | FileCheck %s --check-prefixes CHECK,NO-SIMD128
Thomas Livelyc9498572018-09-26 00:34:36 +00004
5; Test that vector float-to-int and int-to-float instructions lower correctly
6
7target datalayout = "e-m:e-p:32:32-i64:64-n32:64-S128"
8target triple = "wasm32-unknown-unknown"
9
10; CHECK-LABEL: convert_s_v4f32:
11; NO-SIMD128-NOT: i32x4
Wouter van Oortmerssen49482f82018-11-19 17:10:36 +000012; SIMD128-NEXT: .functype convert_s_v4f32 (v128) -> (v128){{$}}
Thomas Lively6f778112018-10-02 01:52:21 +000013; SIMD128-NEXT: f32x4.convert_s/i32x4 $push[[R:[0-9]+]]=, $0
Thomas Livelyc9498572018-09-26 00:34:36 +000014; SIMD128-NEXT: return $pop[[R]]
15define <4 x float> @convert_s_v4f32(<4 x i32> %x) {
16 %a = sitofp <4 x i32> %x to <4 x float>
17 ret <4 x float> %a
18}
19
20; CHECK-LABEL: convert_u_v4f32:
21; NO-SIMD128-NOT: i32x4
Wouter van Oortmerssen49482f82018-11-19 17:10:36 +000022; SIMD128-NEXT: .functype convert_u_v4f32 (v128) -> (v128){{$}}
Thomas Lively6f778112018-10-02 01:52:21 +000023; SIMD128-NEXT: f32x4.convert_u/i32x4 $push[[R:[0-9]+]]=, $0
Thomas Livelyc9498572018-09-26 00:34:36 +000024; SIMD128-NEXT: return $pop[[R]]
25define <4 x float> @convert_u_v4f32(<4 x i32> %x) {
26 %a = uitofp <4 x i32> %x to <4 x float>
27 ret <4 x float> %a
28}
29
30; CHECK-LABEL: convert_s_v2f64:
31; NO-SIMD128-NOT: i64x2
Thomas Lively6f778112018-10-02 01:52:21 +000032; SIMD128-VM-NOT: f64x2.convert_s/i64x2
Wouter van Oortmerssen49482f82018-11-19 17:10:36 +000033; SIMD128-NEXT: .functype convert_s_v2f64 (v128) -> (v128){{$}}
Thomas Lively6f778112018-10-02 01:52:21 +000034; SIMD128-NEXT: f64x2.convert_s/i64x2 $push[[R:[0-9]+]]=, $0
Thomas Livelyc9498572018-09-26 00:34:36 +000035; SIMD128-NEXT: return $pop[[R]]
36define <2 x double> @convert_s_v2f64(<2 x i64> %x) {
37 %a = sitofp <2 x i64> %x to <2 x double>
38 ret <2 x double> %a
39}
40
41; CHECK-LABEL: convert_u_v2f64:
42; NO-SIMD128-NOT: i64x2
Thomas Lively6f778112018-10-02 01:52:21 +000043; SIMD128-VM-NOT: f64x2.convert_u/i64x2
Wouter van Oortmerssen49482f82018-11-19 17:10:36 +000044; SIMD128-NEXT: .functype convert_u_v2f64 (v128) -> (v128){{$}}
Thomas Lively6f778112018-10-02 01:52:21 +000045; SIMD128-NEXT: f64x2.convert_u/i64x2 $push[[R:[0-9]+]]=, $0
Thomas Livelyc9498572018-09-26 00:34:36 +000046; SIMD128-NEXT: return $pop[[R]]
47define <2 x double> @convert_u_v2f64(<2 x i64> %x) {
48 %a = uitofp <2 x i64> %x to <2 x double>
49 ret <2 x double> %a
50}
51
Thomas Lively6f778112018-10-02 01:52:21 +000052; CHECK-LABEL: trunc_sat_s_v4i32:
Thomas Livelyc9498572018-09-26 00:34:36 +000053; NO-SIMD128-NOT: f32x4
Wouter van Oortmerssen49482f82018-11-19 17:10:36 +000054; SIMD128-NEXT: .functype trunc_sat_s_v4i32 (v128) -> (v128){{$}}
Thomas Lively6f778112018-10-02 01:52:21 +000055; SIMD128-NEXT: i32x4.trunc_sat_s/f32x4 $push[[R:[0-9]+]]=, $0
Thomas Livelyc9498572018-09-26 00:34:36 +000056; SIMD128-NEXT: return $pop[[R]]
Thomas Lively6f778112018-10-02 01:52:21 +000057define <4 x i32> @trunc_sat_s_v4i32(<4 x float> %x) {
Thomas Livelyc9498572018-09-26 00:34:36 +000058 %a = fptosi <4 x float> %x to <4 x i32>
59 ret <4 x i32> %a
60}
61
Thomas Lively6f778112018-10-02 01:52:21 +000062; CHECK-LABEL: trunc_sat_u_v4i32:
Thomas Livelyc9498572018-09-26 00:34:36 +000063; NO-SIMD128-NOT: f32x4
Wouter van Oortmerssen49482f82018-11-19 17:10:36 +000064; SIMD128-NEXT: .functype trunc_sat_u_v4i32 (v128) -> (v128){{$}}
Thomas Lively6f778112018-10-02 01:52:21 +000065; SIMD128-NEXT: i32x4.trunc_sat_u/f32x4 $push[[R:[0-9]+]]=, $0
Thomas Livelyc9498572018-09-26 00:34:36 +000066; SIMD128-NEXT: return $pop[[R]]
Thomas Lively6f778112018-10-02 01:52:21 +000067define <4 x i32> @trunc_sat_u_v4i32(<4 x float> %x) {
Thomas Livelyc9498572018-09-26 00:34:36 +000068 %a = fptoui <4 x float> %x to <4 x i32>
69 ret <4 x i32> %a
70}
71
Thomas Lively6f778112018-10-02 01:52:21 +000072; CHECK-LABEL: trunc_sat_s_v2i64:
Thomas Livelyc9498572018-09-26 00:34:36 +000073; NO-SIMD128-NOT: f64x2
Thomas Lively6f778112018-10-02 01:52:21 +000074; SIMD128-VM-NOT: i64x2.trunc_sat_s/f64x2
Wouter van Oortmerssen49482f82018-11-19 17:10:36 +000075; SIMD128-NEXT: .functype trunc_sat_s_v2i64 (v128) -> (v128){{$}}
Thomas Lively6f778112018-10-02 01:52:21 +000076; SIMD128-NEXT: i64x2.trunc_sat_s/f64x2 $push[[R:[0-9]+]]=, $0
Thomas Livelyc9498572018-09-26 00:34:36 +000077; SIMD128-NEXT: return $pop[[R]]
Thomas Lively6f778112018-10-02 01:52:21 +000078define <2 x i64> @trunc_sat_s_v2i64(<2 x double> %x) {
Thomas Livelyc9498572018-09-26 00:34:36 +000079 %a = fptosi <2 x double> %x to <2 x i64>
80 ret <2 x i64> %a
81}
82
Thomas Lively6f778112018-10-02 01:52:21 +000083; CHECK-LABEL: trunc_sat_u_v2i64:
Thomas Livelyc9498572018-09-26 00:34:36 +000084; NO-SIMD128-NOT: f64x2
Thomas Lively6f778112018-10-02 01:52:21 +000085; SIMD128-VM-NOT: i64x2.trunc_sat_u/f64x2
Wouter van Oortmerssen49482f82018-11-19 17:10:36 +000086; SIMD128-NEXT: .functype trunc_sat_u_v2i64 (v128) -> (v128){{$}}
Thomas Lively6f778112018-10-02 01:52:21 +000087; SIMD128-NEXT: i64x2.trunc_sat_u/f64x2 $push[[R:[0-9]+]]=, $0
Thomas Livelyc9498572018-09-26 00:34:36 +000088; SIMD128-NEXT: return $pop[[R]]
Thomas Lively6f778112018-10-02 01:52:21 +000089define <2 x i64> @trunc_sat_u_v2i64(<2 x double> %x) {
Thomas Livelyc9498572018-09-26 00:34:36 +000090 %a = fptoui <2 x double> %x to <2 x i64>
91 ret <2 x i64> %a
92}