; This tries to be a comprehensive test of f32 and f64 convert operations. ; The CHECK lines are only checking for basic instruction patterns ; that should be present regardless of the optimization level, so ; there are no special OPTM1 match lines. ; RUN: %p2i --filetype=obj --disassemble -i %s --args -O2 | FileCheck %s ; RUN: %p2i --filetype=obj --disassemble -i %s --args -Om1 | FileCheck %s ; RUN: %if --need=target_ARM32 --command %p2i --filetype=obj --disassemble \ ; RUN: --target arm32 -i %s --args -O2 \ ; RUN: | %if --need=target_ARM32 --command FileCheck %s \ ; RUN: --check-prefix=ARM32 ; RUN: %if --need=target_ARM32 --command %p2i --filetype=obj --disassemble \ ; RUN: --target arm32 -i %s --args -Om1 \ ; RUN: | %if --need=target_ARM32 --command FileCheck %s \ ; RUN: --check-prefix=ARM32 ; RUN: %if --need=allow_dump --need=target_MIPS32 --command %p2i \ ; RUN: --filetype=asm --target mips32 -i %s --args -Om1 \ ; RUN: | %if --need=allow_dump --need=target_MIPS32 --command FileCheck %s \ ; RUN: --check-prefix=MIPS32 ; RUN: %if --need=allow_dump --need=target_MIPS32 --command %p2i \ ; RUN: --filetype=asm --target mips32 -i %s --args -O2 \ ; RUN: | %if --need=allow_dump --need=target_MIPS32 --command FileCheck %s \ ; RUN: --check-prefix=MIPS32O2 define internal float @fptrunc(double %a) { entry: %conv = fptrunc double %a to float ret float %conv } ; CHECK-LABEL: fptrunc ; CHECK: cvtsd2ss ; CHECK: fld ; ARM32-LABEL: fptrunc ; ARM32: vcvt.f32.f64 {{s[0-9]+}}, {{d[0-9]+}} ; MIPS32-LABEL: fptrunc ; MIPS32: cvt.s.d ; MIPS32O2-LABEL: fptrunc ; MIPS32O2: cvt.s.d define internal double @fpext(float %a) { entry: %conv = fpext float %a to double ret double %conv } ; CHECK-LABEL: fpext ; CHECK: cvtss2sd ; CHECK: fld ; ARM32-LABEL: fpext ; ARM32: vcvt.f64.f32 {{d[0-9]+}}, {{s[0-9]+}} ; MIPS32-LABEL: fpext ; MIPS32: cvt.d.s ; MIPS32O2-LABEL: fpext ; MIPS32O2: cvt.d.s define internal i64 @doubleToSigned64(double %a) { entry: %conv = fptosi double %a to i64 ret i64 %conv } ; CHECK-LABEL: doubleToSigned64 ; CHECK: call {{.*}} R_{{.*}} __Sz_fptosi_f64_i64 ; ARM32-LABEL: doubleToSigned64 ; TODO(jpp): implement this test. ; MIPS32-LABEL: doubleToSigned64 ; MIPS32: jal __Sz_fptosi_f64_i64 ; MIPS32O2-LABEL: doubleToSigned64 ; MIPS32O2: jal __Sz_fptosi_f64_i64 define internal i64 @floatToSigned64(float %a) { entry: %conv = fptosi float %a to i64 ret i64 %conv } ; CHECK-LABEL: floatToSigned64 ; CHECK: call {{.*}} R_{{.*}} __Sz_fptosi_f32_i64 ; ARM32-LABEL: floatToSigned64 ; TODO(jpp): implement this test. ; MIPS32-LABEL: floatToSigned64 ; MIPS32: jal __Sz_fptosi_f32_i64 ; MIPS32O2-LABEL: floatToSigned64 ; MIPS32O2: jal __Sz_fptosi_f32_i64 define internal i64 @doubleToUnsigned64(double %a) { entry: %conv = fptoui double %a to i64 ret i64 %conv } ; CHECK-LABEL: doubleToUnsigned64 ; CHECK: call {{.*}} R_{{.*}} __Sz_fptoui_f64_i64 ; ARM32-LABEL: doubleToUnsigned64 ; TODO(jpp): implement this test. ; MIPS32-LABEL: doubleToUnsigned64 ; MIPS32: jal __Sz_fptoui_f64_i64 ; MIPS32O2-LABEL: doubleToUnsigned64 ; MIPS32O2: jal __Sz_fptoui_f64_i64 define internal i64 @floatToUnsigned64(float %a) { entry: %conv = fptoui float %a to i64 ret i64 %conv } ; CHECK-LABEL: floatToUnsigned64 ; CHECK: call {{.*}} R_{{.*}} __Sz_fptoui_f32_i64 ; ARM32-LABEL: floatToUnsigned64 ; TODO(jpp): implement this test. ; MIPS32-LABEL: floatToUnsigned64 ; MIPS32: jal __Sz_fptoui_f32_i64 ; MIPS32O2-LABEL: floatToUnsigned64 ; MIPS32O2: jal __Sz_fptoui_f32_i64 define internal i32 @doubleToSigned32(double %a) { entry: %conv = fptosi double %a to i32 ret i32 %conv } ; CHECK-LABEL: doubleToSigned32 ; CHECK: cvttsd2si ; ARM32-LABEL: doubleToSigned32 ; ARM32-DAG: vcvt.s32.f64 [[REG:s[0-9]*]], {{d[0-9]*}} ; ARM32-DAG: vmov {{r[0-9]+}}, [[REG]] ; MIPS32-LABEL: doubleToSigned32 ; MIPS32: trunc.w.d ; MIPS32O2-LABEL: doubleToSigned32 ; MIPS32O2: trunc.w.d define internal i32 @doubleToSigned32Const() { entry: %conv = fptosi double 867.5309 to i32 ret i32 %conv } ; CHECK-LABEL: doubleToSigned32Const ; CHECK: cvttsd2si ; ARM32-LABEL: doubleToSigned32Const ; ARM32-DAG: movw [[ADDR:r[0-9]+]], #{{.*_MOVW_}} ; ARM32-DAG: movt [[ADDR]], #{{.*_MOVT_}} ; ARM32-DAG: vldr [[DREG:d[0-9]+]], {{\[}}[[ADDR]]{{\]}} ; ARM32-DAG: vcvt.s32.f64 [[REG:s[0-9]+]], [[DREG]] ; ARM32-DAF: vmov {{r[0-9]+}}, [[REG]] ; MIPS32-LABEL: doubleToSigned32Const ; MIPS32: lui ; MIPS32: ldc1 ; MIPS32: trunc.w.d ; MIPS32O2-LABEL: doubleToSigned32Const ; MIPS32O2: lui ; MIPS32O2: ldc1 ; MIPS32O2: trunc.w.d define internal i32 @floatToSigned32(float %a) { entry: %conv = fptosi float %a to i32 ret i32 %conv } ; CHECK-LABEL: floatToSigned32 ; CHECK: cvttss2si ; ARM32-LABEL: floatToSigned32 ; ARM32-DAG: vcvt.s32.f32 [[REG:s[0-9]+]], {{s[0-9]+}} ; ARM32-DAG: vmov {{r[0-9]+}}, [[REG]] ; MIPS32-LABEL: floatToSigned32 ; MIPS32: trunc.w.s $f{{.*}}, $f{{.*}} ; MIPS32O2-LABEL: floatToSigned32 ; MIPS32O2: trunc.w.s $[[REG:f[0-9]+]], $f{{.*}} ; MIPS32O2: mfc1 $v0, $[[REG]] define internal i32 @doubleToUnsigned32(double %a) { entry: %conv = fptoui double %a to i32 ret i32 %conv } ; CHECK-LABEL: doubleToUnsigned32 ; CHECK: call {{.*}} R_{{.*}} __Sz_fptoui_f64_i32 ; ARM32-LABEL: doubleToUnsigned32 ; ARM32-DAG: vcvt.u32.f64 [[REG:s[0-9]+]], {{d[0-9]+}} ; ARM32-DAG: vmov {{r[0-9]+}}, [[REG]] ; MIPS32-LABEL: doubleToUnsigned32 ; MIPS32: jal __Sz_fptoui_f64_i32 ; MIPS32O2-LABEL: doubleToUnsigned32 ; MIPS32O2: jal __Sz_fptoui_f64_i32 define internal i32 @floatToUnsigned32(float %a) { entry: %conv = fptoui float %a to i32 ret i32 %conv } ; CHECK-LABEL: floatToUnsigned32 ; CHECK: call {{.*}} R_{{.*}} __Sz_fptoui_f32_i32 ; ARM32-LABEL: floatToUnsigned32 ; ARM32-DAG: vcvt.u32.f32 [[REG:s[0-9]+]], {{s[0-9]+}} ; ARM32-DAG: vmov {{r[0-9]+}}, [[REG]] ; MIPS32-LABEL: floatToUnsigned32 ; MIPS32: jal __Sz_fptoui_f32_i32 ; MIPS32O2-LABEL: floatToUnsigned32 ; MIPS32O2: jal __Sz_fptoui_f32_i32 define internal i32 @doubleToSigned16(double %a) { entry: %conv = fptosi double %a to i16 %conv.ret_ext = sext i16 %conv to i32 ret i32 %conv.ret_ext } ; CHECK-LABEL: doubleToSigned16 ; CHECK: cvttsd2si ; CHECK: movsx ; ARM32-LABEL: doubleToSigned16 ; ARM32-DAG: vcvt.s32.f64 [[REG:s[0-9]*]], {{d[0-9]*}} ; ARM32-DAG: vmov {{r[0-9]+}}, [[REG]] ; ARM32: sxth ; MIPS32-LABEL: doubleToSigned16 ; MIPS32: trunc.w.d ; MIPS32O2-LABEL: doubleToSigned16 ; MIPS32O2: trunc.w.d define internal i32 @floatToSigned16(float %a) { entry: %conv = fptosi float %a to i16 %conv.ret_ext = sext i16 %conv to i32 ret i32 %conv.ret_ext } ; CHECK-LABEL: floatToSigned16 ; CHECK: cvttss2si ; CHECK: movsx ; ARM32-LABEL: floatToSigned16 ; ARM32-DAG: vcvt.s32.f32 [[REG:s[0-9]*]], {{s[0-9]*}} ; ARM32-DAG: vmov {{r[0-9]+}}, [[REG]] ; ARM32: sxth ; MIPS32-LABEL: floatToSigned16 ; MIPS32: trunc.w.s ; MIPS32O2-LABEL: floatToSigned16 ; MIPS32O2: trunc.w.s define internal i32 @doubleToUnsigned16(double %a) { entry: %conv = fptoui double %a to i16 %conv.ret_ext = zext i16 %conv to i32 ret i32 %conv.ret_ext } ; CHECK-LABEL: doubleToUnsigned16 ; CHECK: cvttsd2si ; CHECK: movzx ; ARM32-LABEL: doubleToUnsigned16 ; ARM32-DAG: vcvt.u32.f64 [[REG:s[0-9]*]], {{d[0-9]*}} ; ARM32-DAG: vmov {{r[0-9]+}}, [[REG]] ; ARM32: uxth ; MIPS32-LABEL: doubleToUnsigned16 ; MIPS32: trunc.w.d ; MIPS32O2-LABEL: doubleToUnsigned16 ; MIPS32O2: trunc.w.d define internal i32 @floatToUnsigned16(float %a) { entry: %conv = fptoui float %a to i16 %conv.ret_ext = zext i16 %conv to i32 ret i32 %conv.ret_ext } ; CHECK-LABEL: floatToUnsigned16 ; CHECK: cvttss2si ; CHECK: movzx ; ARM32-LABEL: floatToUnsigned16 ; ARM32-DAG: vcvt.u32.f32 [[REG:s[0-9]*]], {{s[0-9]*}} ; ARM32-DAG: vmov {{r[0-9]+}}, [[REG]] ; ARM32: uxth ; MIPS32-LABEL: floatToUnsigned16 ; MIPS32: trunc.w.s ; MIPS32O2-LABEL: floatToUnsigned16 ; MIPS32O2: trunc.w.s define internal i32 @doubleToSigned8(double %a) { entry: %conv = fptosi double %a to i8 %conv.ret_ext = sext i8 %conv to i32 ret i32 %conv.ret_ext } ; CHECK-LABEL: doubleToSigned8 ; CHECK: cvttsd2si ; CHECK: movsx ; ARM32-LABEL: doubleToSigned8 ; ARM32-DAG: vcvt.s32.f64 [[REG:s[0-9]*]], {{d[0-9]*}} ; ARM32-DAG: vmov {{r[0-9]+}}, [[REG]] ; ARM32: sxtb ; MIPS32-LABEL: doubleToSigned8 ; MIPS32: trunc.w.d ; MIPS32O2-LABEL: doubleToSigned8 ; MIPS32O2: trunc.w.d define internal i32 @floatToSigned8(float %a) { entry: %conv = fptosi float %a to i8 %conv.ret_ext = sext i8 %conv to i32 ret i32 %conv.ret_ext } ; CHECK-LABEL: floatToSigned8 ; CHECK: cvttss2si ; CHECK: movsx ; ARM32-LABEL: floatToSigned8 ; ARM32-DAG: vcvt.s32.f32 [[REG:s[0-9]*]], {{s[0-9]*}} ; ARM32-DAG: vmov {{r[0-9]+}}, [[REG]] ; ARM32: sxtb ; MIPS32-LABEL: floatToSigned8 ; MIPS32: trunc.w.s ; MIPS32O2-LABEL: floatToSigned8 ; MIPS32O2: trunc.w.s define internal i32 @doubleToUnsigned8(double %a) { entry: %conv = fptoui double %a to i8 %conv.ret_ext = zext i8 %conv to i32 ret i32 %conv.ret_ext } ; CHECK-LABEL: doubleToUnsigned8 ; CHECK: cvttsd2si ; CHECK: movzx ; ARM32-LABEL: doubleToUnsigned8 ; ARM32-DAG: vcvt.u32.f64 [[REG:s[0-9]*]], {{d[0-9]*}} ; ARM32-DAG: vmov {{r[0-9]+}}, [[REG]] ; ARM32: uxtb ; MIPS32-LABEL: doubleToUnsigned8 ; MIPS32: trunc.w.d ; MIPS32O2-LABEL: doubleToUnsigned8 ; MIPS32O2: trunc.w.d define internal i32 @floatToUnsigned8(float %a) { entry: %conv = fptoui float %a to i8 %conv.ret_ext = zext i8 %conv to i32 ret i32 %conv.ret_ext } ; CHECK-LABEL: floatToUnsigned8 ; CHECK: cvttss2si ; CHECK: movzx ; ARM32-LABEL: floatToUnsigned8 ; ARM32-DAG: vcvt.u32.f32 [[REG:s[0-9]*]], {{s[0-9]*}} ; ARM32-DAG: vmov {{r[0-9]+}}, [[REG]] ; ARM32: uxtb ; MIPS32-LABEL: floatToUnsigned8 ; MIPS32: trunc.w.s ; MIPS32O2-LABEL: floatToUnsigned8 ; MIPS32O2: trunc.w.s define internal i32 @doubleToUnsigned1(double %a) { entry: %tobool = fptoui double %a to i1 %tobool.ret_ext = zext i1 %tobool to i32 ret i32 %tobool.ret_ext } ; CHECK-LABEL: doubleToUnsigned1 ; CHECK: cvttsd2si ; CHECK-NOT: and eax,0x1 ; ARM32-LABEL: doubleToUnsigned1 ; ARM32-DAG: vcvt.u32.f64 [[REG:s[0-9]*]], {{d[0-9]*}} ; ARM32-DAG: vmov [[RES:r[0-9]+]], [[REG]] ; ARM32-DAG: and {{r[0-9]+}}, [[RES]], #1 ; ARM32-NOT: uxth ; ARM32-NOT: uxtb ; MIPS32-LABEL: doubleToUnsigned1 ; MIPS32: trunc.w.d ; MIPS32O2-LABEL: doubleToUnsigned1 ; MIPS32O2: trunc.w.d define internal i32 @floatToUnsigned1(float %a) { entry: %tobool = fptoui float %a to i1 %tobool.ret_ext = zext i1 %tobool to i32 ret i32 %tobool.ret_ext } ; CHECK-LABEL: floatToUnsigned1 ; CHECK: cvttss2si ; CHECK-NOT: and eax,0x1 ; ARM32-LABEL: floatToUnsigned1 ; ARM32-DAG: vcvt.u32.f32 [[REG:s[0-9]*]], {{s[0-9]*}} ; ARM32-DAG: vmov [[RES:r[0-9]+]], [[REG]] ; ARM32-DAG: and {{r[0-9]+}}, [[RES]], #1 ; ARM32-NOT: uxth ; ARM32-NOT: uxtb ; MIPS32-LABEL: floatToUnsigned1 ; MIPS32: trunc.w.s ; MIPS32O2-LABEL: floatToUnsigned1 ; MIPS32O2: trunc.w.s define internal double @signed64ToDouble(i64 %a) { entry: %conv = sitofp i64 %a to double ret double %conv } ; CHECK-LABEL: signed64ToDouble ; CHECK: call {{.*}} R_{{.*}} __Sz_sitofp_i64_f64 ; CHECK: fstp QWORD ; ARM32-LABEL: signed64ToDouble ; TODO(jpp): implement this test. ; MIPS32-LABEL: signed64ToDouble ; MIPS32: jal __Sz_sitofp_i64_f64 ; MIPS32O2-LABEL: signed64ToDouble ; MIPS32O2: jal __Sz_sitofp_i64_f64 define internal float @signed64ToFloat(i64 %a) { entry: %conv = sitofp i64 %a to float ret float %conv } ; CHECK-LABEL: signed64ToFloat ; CHECK: call {{.*}} R_{{.*}} __Sz_sitofp_i64_f32 ; CHECK: fstp DWORD ; ARM32-LABEL: signed64ToFloat ; TODO(jpp): implement this test. ; MIPS32-LABEL: signed64ToFloat ; MIPS32: jal __Sz_sitofp_i64_f32 ; MIPS32O2-LABEL: signed64ToFloat ; MIPS32O2: jal __Sz_sitofp_i64_f32 define internal double @unsigned64ToDouble(i64 %a) { entry: %conv = uitofp i64 %a to double ret double %conv } ; CHECK-LABEL: unsigned64ToDouble ; CHECK: call {{.*}} R_{{.*}} __Sz_uitofp_i64_f64 ; CHECK: fstp ; ARM32-LABEL: unsigned64ToDouble ; TODO(jpp): implement this test. ; MIPS32-LABEL: unsigned64ToDouble ; MIPS32: jal __Sz_uitofp_i64_f64 ; MIPS32O2-LABEL: unsigned64ToDouble ; MIPS32O2: jal __Sz_uitofp_i64_f64 define internal float @unsigned64ToFloat(i64 %a) { entry: %conv = uitofp i64 %a to float ret float %conv } ; CHECK-LABEL: unsigned64ToFloat ; CHECK: call {{.*}} R_{{.*}} __Sz_uitofp_i64_f32 ; CHECK: fstp ; ARM32-LABEL: unsigned64ToFloat ; TODO(jpp): implement this test. ; MIPS32-LABEL: unsigned64ToFloat ; MIPS32: jal __Sz_uitofp_i64_f32 ; MIPS32O2-LABEL: unsigned64ToFloat ; MIPS32O2: jal __Sz_uitofp_i64_f32 define internal double @unsigned64ToDoubleConst() { entry: %conv = uitofp i64 12345678901234 to double ret double %conv } ; CHECK-LABEL: unsigned64ToDoubleConst ; CHECK: mov DWORD PTR [esp+0x4],0xb3a ; CHECK: mov DWORD PTR [esp],0x73ce2ff2 ; CHECK: call {{.*}} R_{{.*}} __Sz_uitofp_i64_f64 ; CHECK: fstp ; ARM32-LABEL: unsigned64ToDoubleConst ; TODO(jpp): implement this test. ; MIPS32-LABEL: unsigned64ToDoubleConst ; MIPS32: jal __Sz_uitofp_i64_f64 ; MIPS32O2-LABEL: unsigned64ToDoubleConst ; MIPS32O2: jal __Sz_uitofp_i64_f64 define internal double @signed32ToDouble(i32 %a) { entry: %conv = sitofp i32 %a to double ret double %conv } ; CHECK-LABEL: signed32ToDouble ; CHECK: cvtsi2sd ; CHECK: fld ; ARM32-LABEL: signed32ToDouble ; ARM32-DAG: vmov [[SRC:s[0-9]+]], {{r[0-9]+}} ; ARM32-DAG: vcvt.f64.s32 {{d[0-9]+}}, [[SRC]] ; MIPS32-LABEL: signed32ToDouble ; MIPS32: cvt.d.w ; MIPS32O2-LABEL: signed32ToDouble ; MIPS32O2: cvt.d.w define internal double @signed32ToDoubleConst() { entry: %conv = sitofp i32 123 to double ret double %conv } ; CHECK-LABEL: signed32ToDoubleConst ; CHECK: cvtsi2sd {{.*[^1]}} ; CHECK: fld ; ARM32-LABEL: signed32ToDoubleConst ; ARM32-DAG: mov [[CONST:r[0-9]+]], #123 ; ARM32-DAG: vmov [[SRC:s[0-9]+]], [[CONST]] ; ARM32-DAG: vcvt.f64.s32 {{d[0-9]+}}, [[SRC]] ; MIPS32-LABEL: signed32ToDoubleConst ; MIPS32: cvt.d.w ; MIPS32O2-LABEL: signed32ToDoubleConst ; MIPS32O2: cvt.d.w define internal float @signed32ToFloat(i32 %a) { entry: %conv = sitofp i32 %a to float ret float %conv } ; CHECK-LABEL: signed32ToFloat ; CHECK: cvtsi2ss ; CHECK: fld ; ARM32-LABEL: signed32ToFloat ; ARM32-DAG: vmov [[SRC:s[0-9]+]], {{r[0-9]+}} ; ARM32-DAG: vcvt.f32.s32 {{s[0-9]+}}, [[SRC]] ; MIPS32-LABEL: signed32ToFloat ; MIPS32: cvt.s.w $f{{.*}}, $f{{.*}} ; MIPS32O2-LABEL: signed32ToFloat ; MIPS32O2: mtc1 $a0, $[[REG:f[0-9]+]] ; MIPS32O2: cvt.s.w $f{{.*}}, $[[REG]] define internal double @unsigned32ToDouble(i32 %a) { entry: %conv = uitofp i32 %a to double ret double %conv } ; CHECK-LABEL: unsigned32ToDouble ; CHECK: call {{.*}} R_{{.*}} __Sz_uitofp_i32_f64 ; CHECK: fstp QWORD ; ARM32-LABEL: unsigned32ToDouble ; ARM32-DAG: vmov [[SRC:s[0-9]+]], {{r[0-9]+}} ; ARM32-DAG: vcvt.f64.u32 {{d[0-9]+}}, [[SRC]] ; MIPS32-LABEL: unsigned32ToDouble ; MIPS32: jal __Sz_uitofp_i32_f64 ; MIPS32O2-LABEL: unsigned32ToDouble ; MIPS32O2: jal __Sz_uitofp_i32_f64 define internal float @unsigned32ToFloat(i32 %a) { entry: %conv = uitofp i32 %a to float ret float %conv } ; CHECK-LABEL: unsigned32ToFloat ; CHECK: call {{.*}} R_{{.*}} __Sz_uitofp_i32_f32 ; CHECK: fstp DWORD ; ARM32-LABEL: unsigned32ToFloat ; ARM32-DAG: vmov [[SRC:s[0-9]+]], {{r[0-9]+}} ; ARM32-DAG: vcvt.f32.u32 {{s[0-9]+}}, [[SRC]] ; MIPS32-LABEL: unsigned32ToFloat ; MIPS32: jal __Sz_uitofp_i32_f32 ; MIPS32O2-LABEL: unsigned32ToFloat ; MIPS32O2: jal __Sz_uitofp_i32_f32 define internal double @signed16ToDouble(i32 %a) { entry: %a.arg_trunc = trunc i32 %a to i16 %conv = sitofp i16 %a.arg_trunc to double ret double %conv } ; CHECK-LABEL: signed16ToDouble ; CHECK: cvtsi2sd ; CHECK: fld QWORD ; ARM32-LABEL: signed16ToDouble ; ARM32-DAG: sxth [[INT:r[0-9]+]] ; ARM32-DAG: vmov [[SRC:s[0-9]+]], [[INT]] ; ARM32-DAG: vcvt.f64.s32 {{d[0-9]+}}, [[SRC]] ; MIPS32-LABEL: signed16ToDouble ; MIPS32: cvt.d.w ; MIPS32O2-LABEL: signed16ToDouble ; MIPS32O2: cvt.d.w define internal float @signed16ToFloat(i32 %a) { entry: %a.arg_trunc = trunc i32 %a to i16 %conv = sitofp i16 %a.arg_trunc to float ret float %conv } ; CHECK-LABEL: signed16ToFloat ; CHECK: cvtsi2ss ; CHECK: fld DWORD ; ARM32-LABEL: signed16ToFloat ; ARM32-DAG: sxth [[INT:r[0-9]+]] ; ARM32-DAG: vmov [[SRC:s[0-9]+]], [[INT]] ; ARM32-DAG: vcvt.f32.s32 {{s[0-9]+}}, [[SRC]] ; MIPS32-LABEL: signed16ToFloat ; MIPS32: cvt.s.w ; MIPS32O2-LABEL: signed16ToFloat ; MIPS32O2: cvt.s.w define internal double @unsigned16ToDouble(i32 %a) { entry: %a.arg_trunc = trunc i32 %a to i16 %conv = uitofp i16 %a.arg_trunc to double ret double %conv } ; CHECK-LABEL: unsigned16ToDouble ; CHECK: cvtsi2sd ; CHECK: fld ; ARM32-LABEL: unsigned16ToDouble ; ARM32-DAG: uxth [[INT:r[0-9]+]] ; ARM32-DAG: vmov [[SRC:s[0-9]+]], [[INT]] ; ARM32-DAG: vcvt.f64.u32 {{d[0-9]+}}, [[SRC]] ; MIPS32-LABEL: unsigned16ToDouble ; MIPS32: cvt.d.w ; MIPS32O2-LABEL: unsigned16ToDouble ; MIPS32O2: cvt.d.w define internal double @unsigned16ToDoubleConst() { entry: %conv = uitofp i16 12345 to double ret double %conv } ; CHECK-LABEL: unsigned16ToDoubleConst ; CHECK: cvtsi2sd ; CHECK: fld ; ARM32-LABEL: unsigned16ToDoubleConst ; ARM32-DAG: movw [[INT:r[0-9]+]], #12345 ; ARM32-DAG: uxth [[INT]] ; ARM32-DAG: vmov [[SRC:s[0-9]+]], [[INT]] ; ARM32-DAG: vcvt.f64.u32 {{d[0-9]+}}, [[SRC]] ; MIPS32-LABEL: unsigned16ToDoubleConst ; MIPS32: cvt.d.w ; MIPS32O2-LABEL: unsigned16ToDoubleConst ; MIPS32O2: cvt.d.w define internal float @unsigned16ToFloat(i32 %a) { entry: %a.arg_trunc = trunc i32 %a to i16 %conv = uitofp i16 %a.arg_trunc to float ret float %conv } ; CHECK-LABEL: unsigned16ToFloat ; CHECK: cvtsi2ss ; CHECK: fld ; ARM32-LABEL: unsigned16ToFloat ; ARM32-DAG: uxth [[INT:r[0-9]+]] ; ARM32-DAG: vmov [[SRC:s[0-9]+]], [[INT]] ; ARM32-DAG: vcvt.f32.u32 {{s[0-9]+}}, [[SRC]] ; MIPS32-LABEL: unsigned16ToFloat ; MIPS32: cvt.s.w ; MIPS32O2-LABEL: unsigned16ToFloat ; MIPS32O2: cvt.s.w define internal double @signed8ToDouble(i32 %a) { entry: %a.arg_trunc = trunc i32 %a to i8 %conv = sitofp i8 %a.arg_trunc to double ret double %conv } ; CHECK-LABEL: signed8ToDouble ; CHECK: cvtsi2sd ; CHECK: fld ; ARM32-LABEL: signed8ToDouble ; ARM32-DAG: sxtb [[INT:r[0-9]+]] ; ARM32-DAG: vmov [[SRC:s[0-9]+]], [[INT]] ; ARM32-DAG: vcvt.f64.s32 {{d[0-9]+}}, [[SRC]] ; MIPS32-LABEL: signed8ToDouble ; MIPS32: cvt.d.w ; MIPS32O2-LABEL: signed8ToDouble ; MIPS32O2: cvt.d.w define internal float @signed8ToFloat(i32 %a) { entry: %a.arg_trunc = trunc i32 %a to i8 %conv = sitofp i8 %a.arg_trunc to float ret float %conv } ; CHECK-LABEL: signed8ToFloat ; CHECK: cvtsi2ss ; CHECK: fld ; ARM32-LABEL: signed8ToFloat ; ARM32-DAG: sxtb [[INT:r[0-9]+]] ; ARM32-DAG: vmov [[SRC:s[0-9]+]], [[INT]] ; ARM32-DAG: vcvt.f32.s32 {{s[0-9]+}}, [[SRC]] ; MIPS32-LABEL: signed8ToFloat ; MIPS32: cvt.s.w ; MIPS32O2-LABEL: signed8ToFloat ; MIPS32O2: cvt.s.w define internal double @unsigned8ToDouble(i32 %a) { entry: %a.arg_trunc = trunc i32 %a to i8 %conv = uitofp i8 %a.arg_trunc to double ret double %conv } ; CHECK-LABEL: unsigned8ToDouble ; CHECK: cvtsi2sd ; CHECK: fld ; ARM32-LABEL: unsigned8ToDouble ; ARM32-DAG: uxtb [[INT:r[0-9]+]] ; ARM32-DAG: vmov [[SRC:s[0-9]+]], [[INT]] ; ARM32-DAG: vcvt.f64.u32 {{d[0-9]+}}, [[SRC]] ; MIPS32-LABEL: unsigned8ToDouble ; MIPS32: cvt.d.w ; MIPS32O2-LABEL: unsigned8ToDouble ; MIPS32O2: cvt.d.w define internal float @unsigned8ToFloat(i32 %a) { entry: %a.arg_trunc = trunc i32 %a to i8 %conv = uitofp i8 %a.arg_trunc to float ret float %conv } ; CHECK-LABEL: unsigned8ToFloat ; CHECK: cvtsi2ss ; CHECK: fld ; ARM32-LABEL: unsigned8ToFloat ; ARM32-DAG: uxtb [[INT:r[0-9]+]] ; ARM32-DAG: vmov [[SRC:s[0-9]+]], [[INT]] ; ARM32-DAG: vcvt.f32.u32 {{s[0-9]+}}, [[SRC]] ; MIPS32-LABEL: unsigned8ToFloat ; MIPS32: cvt.s.w ; MIPS32O2-LABEL: unsigned8ToFloat ; MIPS32O2: cvt.s.w define internal double @unsigned1ToDouble(i32 %a) { entry: %a.arg_trunc = trunc i32 %a to i1 %conv = uitofp i1 %a.arg_trunc to double ret double %conv } ; CHECK-LABEL: unsigned1ToDouble ; CHECK: cvtsi2sd ; CHECK: fld ; ARM32-LABEL: unsigned1ToDouble ; ARM32-DAG: and [[INT:r[0-9]+]], {{r[0-9]+}}, #1 ; ARM32-DAG: vmov [[SRC:s[0-9]+]], [[INT]] ; ARM32-DAG: vcvt.f64.u32 {{d[0-9]+}}, [[SRC]] ; MIPS32-LABEL: unsigned1ToDouble ; MIPS32: cvt.d.w ; MIPS32O2-LABEL: unsigned1ToDouble ; MIPS32O2: cvt.d.w define internal float @unsigned1ToFloat(i32 %a) { entry: %a.arg_trunc = trunc i32 %a to i1 %conv = uitofp i1 %a.arg_trunc to float ret float %conv } ; CHECK-LABEL: unsigned1ToFloat ; CHECK: cvtsi2ss ; CHECK: fld ; ARM32-LABEL: unsigned1ToFloat ; ARM32-DAG: and [[INT:r[0-9]+]], {{r[0-9]+}}, #1 ; ARM32-DAG: vmov [[SRC:s[0-9]+]], [[INT]] ; ARM32-DAG: vcvt.f32.u32 {{s[0-9]+}}, [[SRC]] ; MIPS32-LABEL: unsigned1ToFloat ; MIPS32: cvt.s.w ; MIPS32O2-LABEL: unsigned1ToFloat ; MIPS32O2: cvt.s.w define internal float @int32BitcastToFloat(i32 %a) { entry: %conv = bitcast i32 %a to float ret float %conv } ; CHECK-LABEL: int32BitcastToFloat ; CHECK: mov ; ARM32-LABEL: int32BitcastToFloat ; ARM32: vmov s{{[0-9]+}}, r{{[0-9]+}} ; MIPS32-LABEL: int32BitcastToFloat ; MIPS32: sw ; MIPS32: lwc1 ; MIPS32O2-LABEL: int32BitcastToFloat define internal float @int32BitcastToFloatConst() { entry: %conv = bitcast i32 8675309 to float ret float %conv } ; CHECK-LABEL: int32BitcastToFloatConst ; CHECK: mov ; ARM32-LABEL: int32BitcastToFloatConst ; ARM32-DAG: movw [[REG:r[0-9]+]], #24557 ; ARM32-DAG: movt [[REG]], #132 ; ARM32: vmov s{{[0-9]+}}, [[REG]] ; MIPS32-LABEL: int32BitcastToFloatConst ; MIPS32: lwc1 ; MIPS32O2-LABEL: int32BitcastToFloatConst define internal double @int64BitcastToDouble(i64 %a) { entry: %conv = bitcast i64 %a to double ret double %conv } ; CHECK-LABEL: int64BitcastToDouble ; CHECK: mov ; ARM32-LABEL: int64BitcastToDouble ; ARM32: vmov d{{[0-9]+}}, r{{[0-9]+}}, r{{[0-9]+}} ; MIPS32-LABEL: int64BitcastToDouble ; MIPS32: sw ; MIPS32: sw ; MIPS32: ldc1 ; MIPS32O2-LABEL: int64BitcastToDouble define internal double @int64BitcastToDoubleConst() { entry: %conv = bitcast i64 9035768 to double ret double %conv } ; CHECK-LABEL: int64BitcastToDoubleConst ; CHECK: mov ; ARM32-LABEL: int64BitcastToDoubleConst ; ARM32-DAG: movw [[REG0:r[0-9]+]], #57336 ; ARM32-DAG: movt [[REG0]], #137 ; ARM32-DAG: mov [[REG1:r[0-9]+]], #0 ; ARM32-DAG: vmov d{{[0-9]+}}, [[REG0]], [[REG1]] ; MIPS32-LABEL: int64BitcastToDoubleConst ; MIPS32: ldc1 ; MIPS32O2-LABEL: int64BitcastToDoubleConst