summaryrefslogtreecommitdiffstats
path: root/llvm/lib
diff options
context:
space:
mode:
authorDan Gohman <dan433584@gmail.com>2015-10-03 02:10:28 +0000
committerDan Gohman <dan433584@gmail.com>2015-10-03 02:10:28 +0000
commitdc51b96b7f70d7616acb38aa74471cdac9c1240b (patch)
treeb55419ca8c17c53ab03f866911e99a5f3cdfc6f0 /llvm/lib
parent81413c0ca0e42e55101d0fc2381a000b4196c8b5 (diff)
downloadbcm5719-llvm-dc51b96b7f70d7616acb38aa74471cdac9c1240b.tar.gz
bcm5719-llvm-dc51b96b7f70d7616acb38aa74471cdac9c1240b.zip
[WebAssembly] Implement the remaining conversion operations.
This is a temporary assembly syntax that will likely evolve along with broader upcoming syntax changes. llvm-svn: 249225
Diffstat (limited to 'llvm/lib')
-rw-r--r--llvm/lib/Target/WebAssembly/WebAssemblyInstrConv.td85
1 files changed, 54 insertions, 31 deletions
diff --git a/llvm/lib/Target/WebAssembly/WebAssemblyInstrConv.td b/llvm/lib/Target/WebAssembly/WebAssemblyInstrConv.td
index ca1068f7f39..760b4ce5f41 100644
--- a/llvm/lib/Target/WebAssembly/WebAssemblyInstrConv.td
+++ b/llvm/lib/Target/WebAssembly/WebAssemblyInstrConv.td
@@ -13,35 +13,58 @@
///
//===----------------------------------------------------------------------===//
-/*
- * TODO(jfb): Add the following.
- *
- * i32.wrap[i64]: wrap a 64-bit integer to a 32-bit integer
- * i32.trunc_s[f32]: truncate a 32-bit float to a signed 32-bit integer
- * i32.trunc_s[f64]: truncate a 64-bit float to a signed 32-bit integer
- * i32.trunc_u[f32]: truncate a 32-bit float to an unsigned 32-bit integer
- * i32.trunc_u[f64]: truncate a 64-bit float to an unsigned 32-bit integer
- * i32.reinterpret[f32]: reinterpret the bits of a 32-bit float as a 32-bit integer
- * i64.extend_s[i32]: extend a signed 32-bit integer to a 64-bit integer
- * i64.extend_u[i32]: extend an unsigned 32-bit integer to a 64-bit integer
- * i64.trunc_s[f32]: truncate a 32-bit float to a signed 64-bit integer
- * i64.trunc_s[f64]: truncate a 64-bit float to a signed 64-bit integer
- * i64.trunc_u[f32]: truncate a 32-bit float to an unsigned 64-bit integer
- * i64.trunc_u[f64]: truncate a 64-bit float to an unsigned 64-bit integer
- * i64.reinterpret[f64]: reinterpret the bits of a 64-bit float as a 64-bit integer
- * f32.demote[f64]: demote a 64-bit float to a 32-bit float
- * f32.convert_s[i32]: convert a signed 32-bit integer to a 32-bit float
- * f32.convert_s[i64]: convert a signed 64-bit integer to a 32-bit float
- * f32.convert_u[i32]: convert an unsigned 32-bit integer to a 32-bit float
- * f32.convert_u[i64]: convert an unsigned 64-bit integer to a 32-bit float
- * f32.reinterpret[i32]: reinterpret the bits of a 32-bit integer as a 32-bit float
- * f64.promote[f32]: promote a 32-bit float to a 64-bit float
- * f64.convert_s[i32]: convert a signed 32-bit integer to a 64-bit float
- * f64.convert_s[i64]: convert a signed 64-bit integer to a 64-bit float
- * f64.convert_u[i32]: convert an unsigned 32-bit integer to a 64-bit float
- * f64.convert_u[i64]: convert an unsigned 64-bit integer to a 64-bit float
- * f64.reinterpret[i64]: reinterpret the bits of a 64-bit integer as a 64-bit float
- */
-
-def WRAP_I64_I32 : I<(outs I32:$dst), (ins I64:$src),
+def I32_WRAP_I64 : I<(outs I32:$dst), (ins I64:$src),
[(set I32:$dst, (trunc I64:$src))]>;
+
+def I64_EXTEND_S_I32 : I<(outs I64:$dst), (ins I32:$src),
+ [(set I64:$dst, (sext I32:$src))]>;
+def I64_EXTEND_U_I32 : I<(outs I64:$dst), (ins I32:$src),
+ [(set I64:$dst, (zext I32:$src))]>;
+
+def I32_TRUNC_S_F32 : I<(outs I32:$dst), (ins F32:$src),
+ [(set I32:$dst, (fp_to_sint F32:$src))]>;
+def I32_TRUNC_U_F32 : I<(outs I32:$dst), (ins F32:$src),
+ [(set I32:$dst, (fp_to_uint F32:$src))]>;
+def I64_TRUNC_S_F32 : I<(outs I64:$dst), (ins F32:$src),
+ [(set I64:$dst, (fp_to_sint F32:$src))]>;
+def I64_TRUNC_U_F32 : I<(outs I64:$dst), (ins F32:$src),
+ [(set I64:$dst, (fp_to_uint F32:$src))]>;
+def I32_TRUNC_S_F64 : I<(outs I32:$dst), (ins F64:$src),
+ [(set I32:$dst, (fp_to_sint F64:$src))]>;
+def I32_TRUNC_U_F64 : I<(outs I32:$dst), (ins F64:$src),
+ [(set I32:$dst, (fp_to_uint F64:$src))]>;
+def I64_TRUNC_S_F64 : I<(outs I64:$dst), (ins F64:$src),
+ [(set I64:$dst, (fp_to_sint F64:$src))]>;
+def I64_TRUNC_U_F64 : I<(outs I64:$dst), (ins F64:$src),
+ [(set I64:$dst, (fp_to_uint F64:$src))]>;
+
+def F32_CONVERT_S_I32 : I<(outs F32:$dst), (ins I32:$src),
+ [(set F32:$dst, (sint_to_fp I32:$src))]>;
+def F32_CONVERT_U_I32 : I<(outs F32:$dst), (ins I32:$src),
+ [(set F32:$dst, (uint_to_fp I32:$src))]>;
+def F64_CONVERT_S_I32 : I<(outs F64:$dst), (ins I32:$src),
+ [(set F64:$dst, (sint_to_fp I32:$src))]>;
+def F64_CONVERT_U_I32 : I<(outs F64:$dst), (ins I32:$src),
+ [(set F64:$dst, (uint_to_fp I32:$src))]>;
+def F32_CONVERT_S_I64 : I<(outs F32:$dst), (ins I64:$src),
+ [(set F32:$dst, (sint_to_fp I64:$src))]>;
+def F32_CONVERT_U_I64 : I<(outs F32:$dst), (ins I64:$src),
+ [(set F32:$dst, (uint_to_fp I64:$src))]>;
+def F64_CONVERT_S_I64 : I<(outs F64:$dst), (ins I64:$src),
+ [(set F64:$dst, (sint_to_fp I64:$src))]>;
+def F64_CONVERT_U_I64 : I<(outs F64:$dst), (ins I64:$src),
+ [(set F64:$dst, (uint_to_fp I64:$src))]>;
+
+def F64_PROMOTE_F32 : I<(outs F64:$dst), (ins F32:$src),
+ [(set F64:$dst, (fextend F32:$src))]>;
+def F32_DEMOTE_F64 : I<(outs F32:$dst), (ins F64:$src),
+ [(set F32:$dst, (fround F64:$src))]>;
+
+def I32_REINTERPRET_F32 : I<(outs I32:$dst), (ins F32:$src),
+ [(set I32:$dst, (bitconvert F32:$src))]>;
+def F32_REINTERPRET_I32 : I<(outs F32:$dst), (ins I32:$src),
+ [(set F32:$dst, (bitconvert I32:$src))]>;
+def I64_REINTERPRET_F64 : I<(outs I64:$dst), (ins F64:$src),
+ [(set I64:$dst, (bitconvert F64:$src))]>;
+def F64_REINTERPRET_I64 : I<(outs F64:$dst), (ins I64:$src),
+ [(set F64:$dst, (bitconvert I64:$src))]>;
OpenPOWER on IntegriCloud