[Mesa-dev] [PATCH v5 10/34] nvir/nir: add nir type helper functions
Pierre Moreau
pierre.morrow at free.fr
Sun Mar 11 17:37:20 UTC 2018
On 2018-02-20 — 22:02, Karol Herbst wrote:
> v4: treat imul as unsigned
> v5: remove pointless !!
>
> Signed-off-by: Karol Herbst <kherbst at redhat.com>
> ---
> .../drivers/nouveau/codegen/nv50_ir_from_nir.cpp | 117 +++++++++++++++++++++
> 1 file changed, 117 insertions(+)
>
> diff --git a/src/gallium/drivers/nouveau/codegen/nv50_ir_from_nir.cpp b/src/gallium/drivers/nouveau/codegen/nv50_ir_from_nir.cpp
> index 60036a0fc3..9dd484cabb 100644
> --- a/src/gallium/drivers/nouveau/codegen/nv50_ir_from_nir.cpp
> +++ b/src/gallium/drivers/nouveau/codegen/nv50_ir_from_nir.cpp
> @@ -47,6 +47,7 @@ class Converter : public ConverterCommon
> public:
> typedef std::vector<LValue*> LValues;
> typedef decltype(nir_ssa_def().index) NirSSADefIdx;
> + typedef decltype(nir_ssa_def().bit_size) NirSSADefBitSize;
> typedef std::unordered_map<NirSSADefIdx, LValues> NirDefMap;
>
> Converter(Program *, nir_shader *, nv50_ir_prog_info *);
> @@ -65,6 +66,17 @@ public:
> uint32_t getIndirect(nir_intrinsic_instr *, uint8_t s, uint8_t c, Value**);
>
> bool run();
> +
> + bool isFloatType(nir_alu_type);
> + bool isSignedType(nir_alu_type);
> + bool isResultFloat(nir_op);
> + bool isResultSigned(nir_op);
> + DataType getDType(nir_alu_instr*);
> + DataType getDType(nir_intrinsic_instr*);
> + DataType getDType(nir_op, NirSSADefBitSize);
> + std::vector<DataType> getSTypes(nir_alu_instr*);
> + DataType getSType(nir_src&, bool isFloat, bool isSigned);
> +
> private:
> nir_shader *nir;
>
> @@ -76,6 +88,111 @@ Converter::Converter(Program *prog, nir_shader *nir, nv50_ir_prog_info *info)
> : ConverterCommon(prog, info),
> nir(nir) {}
>
> +bool
> +Converter::isFloatType(nir_alu_type type)
> +{
> + return nir_alu_type_get_base_type(type) == nir_type_float;
> +}
> +
> +bool
> +Converter::isSignedType(nir_alu_type type)
> +{
> + return nir_alu_type_get_base_type(type) == nir_type_int;
> +}
> +
> +bool
> +Converter::isResultFloat(nir_op op)
> +{
> + const nir_op_info &info = nir_op_infos[op];
> + if (info.output_type != nir_type_invalid)
> + return isFloatType(info.output_type);
> +
> + switch (op) {
You could have a simple if-statement here instead.
> + default:
> + ERROR("isResultFloat not implemented for %s\n", nir_op_infos[op].name);
> + assert(false);
> + return true;
> + }
> +}
> +
> +bool
> +Converter::isResultSigned(nir_op op)
> +{
> + switch (op) {
> + case nir_op_imul:
> + return false;
> + default:
> + const nir_op_info &info = nir_op_infos[op];
> + if (info.output_type != nir_type_invalid)
> + return isSignedType(info.output_type);
> + ERROR("isResultSigned not implemented for %s\n", nir_op_infos[op].name);
> + assert(false);
> + return true;
> + }
> +}
> +
> +DataType
> +Converter::getDType(nir_alu_instr *insn)
I would rename getDType and getSType(s) to getDestType and getSrcType, to match
other names in codegen.
> +{
> + if (insn->dest.dest.is_ssa)
> + return getDType(insn->op, insn->dest.dest.ssa.bit_size);
> + else
> + return getDType(insn->op, insn->dest.dest.reg.reg->bit_size);
> +}
> +
> +DataType
> +Converter::getDType(nir_intrinsic_instr *insn)
> +{
> + if (insn->dest.is_ssa)
> + return typeOfSize(insn->dest.ssa.bit_size / 8, false, false);
> + else
> + return typeOfSize(insn->dest.reg.reg->bit_size / 8, false, false);
> +}
> +
> +DataType
> +Converter::getDType(nir_op op, Converter::NirSSADefBitSize bitSize)
> +{
> + DataType ty = typeOfSize(bitSize / 8, isResultFloat(op), isResultSigned(op));
> + if (ty == TYPE_NONE) {
> + ERROR("couldn't get Type for op %s with bitSize %u\n", nir_op_infos[op].name, bitSize);
> + assert(false);
> + }
> + return ty;
> +}
> +
> +std::vector<DataType>
> +Converter::getSTypes(nir_alu_instr *insn)
> +{
> + const nir_op_info &info = nir_op_infos[insn->op];
> + std::vector<DataType> res(info.num_inputs);
> +
> + for (auto i = 0u; i < info.num_inputs; ++i) {
> + if (info.input_types[i] != nir_type_invalid)
> + res[i] = getSType(insn->src[i].src, isFloatType(info.input_types[i]), isSignedType(info.input_types[i]));
> + else switch (insn->op) {
No need for a switch here either.
Make sure that you don’t go over 80 characters per line, unless it’s a message
string which shouldn’t be split.
> + default:
> + ERROR("getSType not implemented for %s idx %u\n", info.name, i);
> + assert(false);
> + res[i] = TYPE_NONE;
> + break;
> + }
> + }
> +
> + return res;
> +}
> +
> +DataType
> +Converter::getSType(nir_src &src, bool isFloat, bool isSigned)
> +{
> + NirSSADefBitSize bitSize;
> + if (src.is_ssa)
> + bitSize = src.ssa->bit_size;
> + else
> + bitSize = src.reg.reg->bit_size;
> +
> + return typeOfSize(bitSize / 8, isFloat, isSigned);
> +}
> +
> Converter::LValues&
> Converter::convert(nir_dest *dest)
> {
> --
> 2.14.3
>
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/mesa-dev
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 833 bytes
Desc: not available
URL: <https://lists.freedesktop.org/archives/mesa-dev/attachments/20180311/cb7ba84c/attachment.sig>
More information about the mesa-dev
mailing list