void llvm::GetSignature(const WebAssemblySubtarget &Subtarget, RTLIB::Libcall LC, SmallVectorImpl<wasm::ValType> &Rets, SmallVectorImpl<wasm::ValType> &Params) { assert(Rets.empty()); assert(Params.empty()); WebAssembly::ExprType iPTR = Subtarget.hasAddr64() ? WebAssembly::ExprType::I64 : WebAssembly::ExprType::I32; switch (RuntimeLibcallSignatures[LC]) { case func: break; case f32_func_f32: Rets.push_back(wasm::ValType::F32); Params.push_back(wasm::ValType::F32); break; case f32_func_f64: Rets.push_back(wasm::ValType::F32); Params.push_back(wasm::ValType::F64); break; case f32_func_i32: Rets.push_back(wasm::ValType::F32); Params.push_back(wasm::ValType::I32); break; case f32_func_i64: Rets.push_back(wasm::ValType::F32); Params.push_back(wasm::ValType::I64); break; case f32_func_i16: Rets.push_back(wasm::ValType::F32); Params.push_back(wasm::ValType::I32); break; case f64_func_f32: Rets.push_back(wasm::ValType::F64); Params.push_back(wasm::ValType::F32); break; case f64_func_f64: Rets.push_back(wasm::ValType::F64); Params.push_back(wasm::ValType::F64); break; case f64_func_i32: Rets.push_back(wasm::ValType::F64); Params.push_back(wasm::ValType::I32); break; case f64_func_i64: Rets.push_back(wasm::ValType::F64); Params.push_back(wasm::ValType::I64); break; case i32_func_f32: Rets.push_back(wasm::ValType::I32); Params.push_back(wasm::ValType::F32); break; case i32_func_f64: Rets.push_back(wasm::ValType::I32); Params.push_back(wasm::ValType::F64); break; case i32_func_i32: Rets.push_back(wasm::ValType::I32); Params.push_back(wasm::ValType::I32); break; case i64_func_f32: Rets.push_back(wasm::ValType::I64); Params.push_back(wasm::ValType::F32); break; case i64_func_f64: Rets.push_back(wasm::ValType::I64); Params.push_back(wasm::ValType::F64); break; case i64_func_i64: Rets.push_back(wasm::ValType::I64); Params.push_back(wasm::ValType::I64); break; case f32_func_f32_f32: Rets.push_back(wasm::ValType::F32); Params.push_back(wasm::ValType::F32); Params.push_back(wasm::ValType::F32); break; case f32_func_f32_i32: Rets.push_back(wasm::ValType::F32); Params.push_back(wasm::ValType::F32); Params.push_back(wasm::ValType::I32); break; case f32_func_i64_i64: Rets.push_back(wasm::ValType::F32); Params.push_back(wasm::ValType::I64); Params.push_back(wasm::ValType::I64); break; case f64_func_f64_f64: Rets.push_back(wasm::ValType::F64); Params.push_back(wasm::ValType::F64); Params.push_back(wasm::ValType::F64); break; case f64_func_f64_i32: Rets.push_back(wasm::ValType::F64); Params.push_back(wasm::ValType::F64); Params.push_back(wasm::ValType::I32); break; case f64_func_i64_i64: Rets.push_back(wasm::ValType::F64); Params.push_back(wasm::ValType::I64); Params.push_back(wasm::ValType::I64); break; case i16_func_f32: Rets.push_back(wasm::ValType::I32); Params.push_back(wasm::ValType::F32); break; case i8_func_i8_i8: Rets.push_back(wasm::ValType::I32); Params.push_back(wasm::ValType::I32); Params.push_back(wasm::ValType::I32); break; case func_f32_iPTR_iPTR: Params.push_back(wasm::ValType::F32); Params.push_back(wasm::ValType(iPTR)); Params.push_back(wasm::ValType(iPTR)); break; case func_f64_iPTR_iPTR: Params.push_back(wasm::ValType::F64); Params.push_back(wasm::ValType(iPTR)); Params.push_back(wasm::ValType(iPTR)); break; case i16_func_i16_i16: Rets.push_back(wasm::ValType::I32); Params.push_back(wasm::ValType::I32); Params.push_back(wasm::ValType::I32); break; case i32_func_f32_f32: Rets.push_back(wasm::ValType::I32); Params.push_back(wasm::ValType::F32); Params.push_back(wasm::ValType::F32); break; case i32_func_f64_f64: Rets.push_back(wasm::ValType::I32); Params.push_back(wasm::ValType::F64); Params.push_back(wasm::ValType::F64); break; case i32_func_i32_i32: Rets.push_back(wasm::ValType::I32); Params.push_back(wasm::ValType::I32); Params.push_back(wasm::ValType::I32); break; case i64_func_i64_i64: Rets.push_back(wasm::ValType::I64); Params.push_back(wasm::ValType::I64); Params.push_back(wasm::ValType::I64); break; case i64_i64_func_f32: #if 0 // TODO: Enable this when wasm gets multiple-return-value support. Rets.push_back(wasm::ValType::I64); Rets.push_back(wasm::ValType::I64); #else Params.push_back(wasm::ValType(iPTR)); #endif Params.push_back(wasm::ValType::F32); break; case i64_i64_func_f64: #if 0 // TODO: Enable this when wasm gets multiple-return-value support. Rets.push_back(wasm::ValType::I64); Rets.push_back(wasm::ValType::I64); #else Params.push_back(wasm::ValType(iPTR)); #endif Params.push_back(wasm::ValType::F64); break; case i16_i16_func_i16_i16: #if 0 // TODO: Enable this when wasm gets multiple-return-value support. Rets.push_back(wasm::ValType::I32); Rets.push_back(wasm::ValType::I32); #else Params.push_back(wasm::ValType(iPTR)); #endif Params.push_back(wasm::ValType::I32); Params.push_back(wasm::ValType::I32); break; case i32_i32_func_i32_i32: #if 0 // TODO: Enable this when wasm gets multiple-return-value support. Rets.push_back(wasm::ValType::I32); Rets.push_back(wasm::ValType::I32); #else Params.push_back(wasm::ValType(iPTR)); #endif Params.push_back(wasm::ValType::I32); Params.push_back(wasm::ValType::I32); break; case i64_i64_func_i64_i64: #if 0 // TODO: Enable this when wasm gets multiple-return-value support. Rets.push_back(wasm::ValType::I64); Rets.push_back(wasm::ValType::I64); #else Params.push_back(wasm::ValType(iPTR)); #endif Params.push_back(wasm::ValType::I64); Params.push_back(wasm::ValType::I64); break; case i64_i64_func_i64_i64_i64_i64: #if 0 // TODO: Enable this when wasm gets multiple-return-value support. Rets.push_back(wasm::ValType::I64); Rets.push_back(wasm::ValType::I64); #else Params.push_back(wasm::ValType(iPTR)); #endif Params.push_back(wasm::ValType::I64); Params.push_back(wasm::ValType::I64); Params.push_back(wasm::ValType::I64); Params.push_back(wasm::ValType::I64); break; case i64_i64_i64_i64_func_i64_i64_i64_i64: #if 0 // TODO: Enable this when wasm gets multiple-return-value support. Rets.push_back(wasm::ValType::I64); Rets.push_back(wasm::ValType::I64); Rets.push_back(wasm::ValType::I64); Rets.push_back(wasm::ValType::I64); #else Params.push_back(wasm::ValType(iPTR)); #endif Params.push_back(wasm::ValType::I64); Params.push_back(wasm::ValType::I64); Params.push_back(wasm::ValType::I64); Params.push_back(wasm::ValType::I64); break; case i64_i64_func_i64_i64_i32: #if 0 // TODO: Enable this when wasm gets multiple-return-value support. Rets.push_back(wasm::ValType::I64); Rets.push_back(wasm::ValType::I64); Rets.push_back(wasm::ValType::I64); Rets.push_back(wasm::ValType::I64); #else Params.push_back(wasm::ValType(iPTR)); #endif Params.push_back(wasm::ValType::I64); Params.push_back(wasm::ValType::I64); Params.push_back(wasm::ValType::I32); break; case iPTR_func_iPTR_i32_iPTR: Rets.push_back(wasm::ValType(iPTR)); Params.push_back(wasm::ValType(iPTR)); Params.push_back(wasm::ValType::I32); Params.push_back(wasm::ValType(iPTR)); break; case iPTR_func_iPTR_iPTR_iPTR: Rets.push_back(wasm::ValType(iPTR)); Params.push_back(wasm::ValType(iPTR)); Params.push_back(wasm::ValType(iPTR)); Params.push_back(wasm::ValType(iPTR)); break; case f32_func_f32_f32_f32: Rets.push_back(wasm::ValType::F32); Params.push_back(wasm::ValType::F32); Params.push_back(wasm::ValType::F32); Params.push_back(wasm::ValType::F32); break; case f64_func_f64_f64_f64: Rets.push_back(wasm::ValType::F64); Params.push_back(wasm::ValType::F64); Params.push_back(wasm::ValType::F64); Params.push_back(wasm::ValType::F64); break; case func_i64_i64_iPTR_iPTR: Params.push_back(wasm::ValType::I64); Params.push_back(wasm::ValType::I64); Params.push_back(wasm::ValType(iPTR)); Params.push_back(wasm::ValType(iPTR)); break; case func_iPTR_f32: Params.push_back(wasm::ValType(iPTR)); Params.push_back(wasm::ValType::F32); break; case func_iPTR_f64: Params.push_back(wasm::ValType(iPTR)); Params.push_back(wasm::ValType::F64); break; case func_iPTR_i32: Params.push_back(wasm::ValType(iPTR)); Params.push_back(wasm::ValType::I32); break; case func_iPTR_i64: Params.push_back(wasm::ValType(iPTR)); Params.push_back(wasm::ValType::I64); break; case func_iPTR_i64_i64: Params.push_back(wasm::ValType(iPTR)); Params.push_back(wasm::ValType::I64); Params.push_back(wasm::ValType::I64); break; case func_iPTR_i64_i64_i64_i64: Params.push_back(wasm::ValType(iPTR)); Params.push_back(wasm::ValType::I64); Params.push_back(wasm::ValType::I64); Params.push_back(wasm::ValType::I64); Params.push_back(wasm::ValType::I64); break; case func_iPTR_i64_i64_i64_i64_i64_i64: Params.push_back(wasm::ValType(iPTR)); Params.push_back(wasm::ValType::I64); Params.push_back(wasm::ValType::I64); Params.push_back(wasm::ValType::I64); Params.push_back(wasm::ValType::I64); Params.push_back(wasm::ValType::I64); Params.push_back(wasm::ValType::I64); break; case i32_func_i64_i64: Rets.push_back(wasm::ValType::I32); Params.push_back(wasm::ValType::I64); Params.push_back(wasm::ValType::I64); break; case i32_func_i64_i64_i64_i64: Rets.push_back(wasm::ValType::I32); Params.push_back(wasm::ValType::I64); Params.push_back(wasm::ValType::I64); Params.push_back(wasm::ValType::I64); Params.push_back(wasm::ValType::I64); break; case unsupported: llvm_unreachable("unsupported runtime library signature"); } }
WebAssemblyInstrInfo::WebAssemblyInstrInfo(const WebAssemblySubtarget &STI) : WebAssemblyGenInstrInfo(WebAssembly::ADJCALLSTACKDOWN, WebAssembly::ADJCALLSTACKUP, WebAssembly::CATCHRET), RI(STI.getTargetTriple()) {}
WebAssemblyInstrInfo::WebAssemblyInstrInfo(const WebAssemblySubtarget &STI) : RI(STI.getTargetTriple()) {}