JWebAssembly/src/de/inetsoftware/jwebassembly/module/WasmConvertInstruction.java

100 lines
2.4 KiB
Java
Raw Normal View History

/*
* Copyright 2018 - 2019 Volker Berlin (i-net software)
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package de.inetsoftware.jwebassembly.module;
import java.io.IOException;
2018-12-16 18:22:44 +01:00
import de.inetsoftware.jwebassembly.module.WasmInstruction.Type;
import de.inetsoftware.jwebassembly.wasm.AnyType;
2018-12-03 21:09:22 +01:00
import de.inetsoftware.jwebassembly.wasm.ValueType;
/**
* Cast operations for converting one data type to another
*
* @author Volker Berlin
*
*/
class WasmConvertInstruction extends WasmInstruction {
private ValueTypeConvertion conversion;
/**
* Create an instance of a convert instruction
*
* @param conversion
* the conversion type
* @param javaCodePos
* the code position/offset in the Java method
*/
WasmConvertInstruction( ValueTypeConvertion conversion, int javaCodePos ) {
super( javaCodePos );
this.conversion = conversion;
}
2018-12-16 18:22:44 +01:00
/**
* {@inheritDoc}
*/
@Override
Type getType() {
return Type.Convert;
}
/**
* {@inheritDoc}
*/
@Override
public void writeTo( ModuleWriter writer ) throws IOException {
writer.writeCast( conversion );
}
2018-08-06 12:52:44 +02:00
/**
* {@inheritDoc}
*/
AnyType getPushValueType() {
2018-08-06 12:52:44 +02:00
switch( conversion ) {
case l2i:
case f2i:
case d2i:
case i2b:
case i2c:
case i2s:
return ValueType.i32;
case i2l:
case f2l:
case d2l:
return ValueType.i64;
case i2f:
case l2f:
case d2f:
return ValueType.f32;
case i2d:
case l2d:
case f2d:
return ValueType.f64;
default:
throw new Error( conversion.toString() );
}
}
2018-08-10 18:25:38 +02:00
/**
* {@inheritDoc}
*/
@Override
int getPopCount() {
return 1;
}
}