From a2af5c8242650ebc41db607efa5119510463866d Mon Sep 17 00:00:00 2001 From: Matthias Braun Date: Tue, 10 Jan 2012 13:32:03 +0100 Subject: [PATCH] sparc: implement 64bit from/to float conversions --- ir/be/sparc/sparc_lower64.c | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/ir/be/sparc/sparc_lower64.c b/ir/be/sparc/sparc_lower64.c index 0e9e5b0c1..f6fe6425f 100644 --- a/ir/be/sparc/sparc_lower64.c +++ b/ir/be/sparc/sparc_lower64.c @@ -105,6 +105,30 @@ static ir_entity *create_64_intrinsic_fkt(ir_type *method, const ir_op *op, name = mode_is_signed(imode) ? "__divdi3" : "__udivdi3"; } else if (op == op_Mod) { name = mode_is_signed(imode) ? "__moddi3" : "__umoddi3"; + } else if (op == op_Conv) { + if (mode_is_float(imode)) { + assert(get_mode_size_bits(omode) == 64); + if (get_mode_size_bits(imode) == 64) { + name = mode_is_signed(omode) ? "__fixdfdi" : "__fixunsdfdi"; + } else if (get_mode_size_bits(imode) == 32) { + name = mode_is_signed(omode) ? "__fixsfdi" : "__fixunssfdi"; + } else { + assert(get_mode_size_bits(imode) == 128); + panic("can't conver long double to long long yet"); + } + } else if (mode_is_float(omode)) { + assert(get_mode_size_bits(imode) == 64); + if (get_mode_size_bits(omode) == 64) { + name = mode_is_signed(imode) ? "__floatdidf" : "__floatundidf"; + } else if (get_mode_size_bits(omode) == 32) { + name = mode_is_signed(imode) ? "__floatdisf" : "__floatundisf"; + } else { + assert(get_mode_size_bits(omode) == 128); + panic("can't convert long long to long double yet"); + } + } else { + panic("can't lower 64bit Conv"); + } } else { panic("Can't lower unexpected 64bit operation %s", get_op_name(op)); } -- 2.20.1