diff options
author | Dan Gohman <dan433584@gmail.com> | 2015-10-03 02:10:28 +0000 |
---|---|---|
committer | Dan Gohman <dan433584@gmail.com> | 2015-10-03 02:10:28 +0000 |
commit | dc51b96b7f70d7616acb38aa74471cdac9c1240b (patch) | |
tree | b55419ca8c17c53ab03f866911e99a5f3cdfc6f0 /llvm/lib/Target | |
parent | 81413c0ca0e42e55101d0fc2381a000b4196c8b5 (diff) | |
download | bcm5719-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/Target')
-rw-r--r-- | llvm/lib/Target/WebAssembly/WebAssemblyInstrConv.td | 85 |
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))]>; |