# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py UTC_ARGS: --version 6 # RUN: llc -mtriple=aarch64 -run-pass=legalizer %s -o - | FileCheck %s --- name: test_modf_f16 body: | bb.0.entry: ; CHECK-LABEL: name: test_modf_f16 ; CHECK: [[COPY:%[0-9]+]]:_(f16) = COPY $h0 ; CHECK-NEXT: [[FPEXT:%[0-9]+]]:_(f32) = G_FPEXT [[COPY]](f16) ; CHECK-NEXT: [[FRAME_INDEX:%[0-9]+]]:_(p0) = G_FRAME_INDEX %stack.0 ; CHECK-NEXT: ADJCALLSTACKDOWN 0, 0, implicit-def $sp, implicit $sp ; CHECK-NEXT: $s0 = COPY [[FPEXT]](f32) ; CHECK-NEXT: $x0 = COPY [[FRAME_INDEX]](p0) ; CHECK-NEXT: BL &modff, csr_aarch64_aapcs, implicit-def $lr, implicit $sp, implicit $s0, implicit $x0, implicit-def $s0 ; CHECK-NEXT: ADJCALLSTACKUP 0, 0, implicit-def $sp, implicit $sp ; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(f32) = COPY $s0 ; CHECK-NEXT: [[LOAD:%[0-9]+]]:_(f32) = G_LOAD [[FRAME_INDEX]](p0) :: (load (s32) from %stack.0) ; CHECK-NEXT: [[FPTRUNC:%[0-9]+]]:_(f16) = G_FPTRUNC [[LOAD]](f32) ; CHECK-NEXT: [[FPTRUNC1:%[0-9]+]]:_(f16) = G_FPTRUNC [[COPY1]](f32) ; CHECK-NEXT: $h0 = COPY [[FPTRUNC1]](f16) ; CHECK-NEXT: $h1 = COPY [[FPTRUNC]](f16) ; CHECK-NEXT: RET_ReallyLR implicit $h0, implicit $h1 %0:_(f16) = COPY $h0 %1:_(f16), %2:_(f16) = G_FMODF %0 $h0 = COPY %1(f16) $h1 = COPY %2(f16) RET_ReallyLR implicit $h0, implicit $h1 ... --- name: test_modf_f16_only_use_fractional_part body: | bb.0.entry: ; CHECK-LABEL: name: test_modf_f16_only_use_fractional_part ; CHECK: [[COPY:%[0-9]+]]:_(f16) = COPY $h0 ; CHECK-NEXT: [[FPEXT:%[0-9]+]]:_(f32) = G_FPEXT [[COPY]](f16) ; CHECK-NEXT: [[FRAME_INDEX:%[0-9]+]]:_(p0) = G_FRAME_INDEX %stack.0 ; CHECK-NEXT: ADJCALLSTACKDOWN 0, 0, implicit-def $sp, implicit $sp ; CHECK-NEXT: $s0 = COPY [[FPEXT]](f32) ; CHECK-NEXT: $x0 = COPY [[FRAME_INDEX]](p0) ; CHECK-NEXT: BL &modff, csr_aarch64_aapcs, implicit-def $lr, implicit $sp, implicit $s0, implicit $x0, implicit-def $s0 ; CHECK-NEXT: ADJCALLSTACKUP 0, 0, implicit-def $sp, implicit $sp ; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(f32) = COPY $s0 ; CHECK-NEXT: [[FPTRUNC:%[0-9]+]]:_(f16) = G_FPTRUNC [[COPY1]](f32) ; CHECK-NEXT: $h0 = COPY [[FPTRUNC]](f16) ; CHECK-NEXT: RET_ReallyLR implicit $h0 %0:_(f16) = COPY $h0 %1:_(f16), %2:_(f16) = G_FMODF %0 $h0 = COPY %1(f16) RET_ReallyLR implicit $h0 ... --- name: test_modf_v2f16 body: | bb.0.entry: ; CHECK-LABEL: name: test_modf_v2f16 ; CHECK: [[COPY:%[0-9]+]]:_(<4 x f16>) = COPY $d0 ; CHECK-NEXT: [[UV:%[0-9]+]]:_(f16), [[UV1:%[0-9]+]]:_(f16), [[UV2:%[0-9]+]]:_(f16), [[UV3:%[0-9]+]]:_(f16) = G_UNMERGE_VALUES [[COPY]](<4 x f16>) ; CHECK-NEXT: [[FPEXT:%[0-9]+]]:_(f32) = G_FPEXT [[UV]](f16) ; CHECK-NEXT: [[FRAME_INDEX:%[0-9]+]]:_(p0) = G_FRAME_INDEX %stack.1 ; CHECK-NEXT: ADJCALLSTACKDOWN 0, 0, implicit-def $sp, implicit $sp ; CHECK-NEXT: $s0 = COPY [[FPEXT]](f32) ; CHECK-NEXT: $x0 = COPY [[FRAME_INDEX]](p0) ; CHECK-NEXT: BL &modff, csr_aarch64_aapcs, implicit-def $lr, implicit $sp, implicit $s0, implicit $x0, implicit-def $s0 ; CHECK-NEXT: ADJCALLSTACKUP 0, 0, implicit-def $sp, implicit $sp ; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(f32) = COPY $s0 ; CHECK-NEXT: [[LOAD:%[0-9]+]]:_(f32) = G_LOAD [[FRAME_INDEX]](p0) :: (load (s32) from %stack.1) ; CHECK-NEXT: [[FPTRUNC:%[0-9]+]]:_(f16) = G_FPTRUNC [[LOAD]](f32) ; CHECK-NEXT: [[FPTRUNC1:%[0-9]+]]:_(f16) = G_FPTRUNC [[COPY1]](f32) ; CHECK-NEXT: [[FPEXT1:%[0-9]+]]:_(f32) = G_FPEXT [[UV1]](f16) ; CHECK-NEXT: [[FRAME_INDEX1:%[0-9]+]]:_(p0) = G_FRAME_INDEX %stack.0 ; CHECK-NEXT: ADJCALLSTACKDOWN 0, 0, implicit-def $sp, implicit $sp ; CHECK-NEXT: $s0 = COPY [[FPEXT1]](f32) ; CHECK-NEXT: $x0 = COPY [[FRAME_INDEX1]](p0) ; CHECK-NEXT: BL &modff, csr_aarch64_aapcs, implicit-def $lr, implicit $sp, implicit $s0, implicit $x0, implicit-def $s0 ; CHECK-NEXT: ADJCALLSTACKUP 0, 0, implicit-def $sp, implicit $sp ; CHECK-NEXT: [[COPY2:%[0-9]+]]:_(f32) = COPY $s0 ; CHECK-NEXT: [[LOAD1:%[0-9]+]]:_(f32) = G_LOAD [[FRAME_INDEX1]](p0) :: (load (s32) from %stack.0) ; CHECK-NEXT: [[FPTRUNC2:%[0-9]+]]:_(f16) = G_FPTRUNC [[LOAD1]](f32) ; CHECK-NEXT: [[FPTRUNC3:%[0-9]+]]:_(f16) = G_FPTRUNC [[COPY2]](f32) ; CHECK-NEXT: [[DEF:%[0-9]+]]:_(f16) = G_IMPLICIT_DEF ; CHECK-NEXT: [[BUILD_VECTOR:%[0-9]+]]:_(<4 x f16>) = G_BUILD_VECTOR [[FPTRUNC1]](f16), [[FPTRUNC3]](f16), [[DEF]](f16), [[DEF]](f16) ; CHECK-NEXT: [[BUILD_VECTOR1:%[0-9]+]]:_(<4 x f16>) = G_BUILD_VECTOR [[FPTRUNC]](f16), [[FPTRUNC2]](f16), [[DEF]](f16), [[DEF]](f16) ; CHECK-NEXT: $d0 = COPY [[BUILD_VECTOR]](<4 x f16>) ; CHECK-NEXT: $d1 = COPY [[BUILD_VECTOR1]](<4 x f16>) ; CHECK-NEXT: RET_ReallyLR implicit $d0, implicit $d1 %1:_(<4 x f16>) = COPY $d0 %0:_(<2 x f16>), %2:_(<2 x f16>) = G_UNMERGE_VALUES %1(<4 x f16>) %3:_(<2 x f16>), %4:_(<2 x f16>) = G_FMODF %0 %5:_(f16), %6:_(f16) = G_UNMERGE_VALUES %3(<2 x f16>) %7:_(f16) = G_IMPLICIT_DEF %8:_(<4 x f16>) = G_BUILD_VECTOR %5(f16), %6(f16), %7(f16), %7(f16) %9:_(f16), %10:_(f16) = G_UNMERGE_VALUES %4(<2 x f16>) %11:_(<4 x f16>) = G_BUILD_VECTOR %9(f16), %10(f16), %7(f16), %7(f16) $d0 = COPY %8(<4 x f16>) $d1 = COPY %11(<4 x f16>) RET_ReallyLR implicit $d0, implicit $d1 ... --- name: test_modf_v3f32 body: | bb.0.entry: ; CHECK-LABEL: name: test_modf_v3f32 ; CHECK: [[COPY:%[0-9]+]]:_(<2 x f64>) = COPY $q0 ; CHECK-NEXT: [[BITCAST:%[0-9]+]]:_(<4 x f32>) = G_BITCAST [[COPY]](<2 x f64>) ; CHECK-NEXT: [[UV:%[0-9]+]]:_(f32), [[UV1:%[0-9]+]]:_(f32), [[UV2:%[0-9]+]]:_(f32), [[UV3:%[0-9]+]]:_(f32) = G_UNMERGE_VALUES [[BITCAST]](<4 x f32>) ; CHECK-NEXT: [[FRAME_INDEX:%[0-9]+]]:_(p0) = G_FRAME_INDEX %stack.2 ; CHECK-NEXT: ADJCALLSTACKDOWN 0, 0, implicit-def $sp, implicit $sp ; CHECK-NEXT: $s0 = COPY [[UV]](f32) ; CHECK-NEXT: $x0 = COPY [[FRAME_INDEX]](p0) ; CHECK-NEXT: BL &modff, csr_aarch64_aapcs, implicit-def $lr, implicit $sp, implicit $s0, implicit $x0, implicit-def $s0 ; CHECK-NEXT: ADJCALLSTACKUP 0, 0, implicit-def $sp, implicit $sp ; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(f32) = COPY $s0 ; CHECK-NEXT: [[LOAD:%[0-9]+]]:_(f32) = G_LOAD [[FRAME_INDEX]](p0) :: (load (s32) from %stack.2) ; CHECK-NEXT: [[FRAME_INDEX1:%[0-9]+]]:_(p0) = G_FRAME_INDEX %stack.1 ; CHECK-NEXT: ADJCALLSTACKDOWN 0, 0, implicit-def $sp, implicit $sp ; CHECK-NEXT: $s0 = COPY [[UV1]](f32) ; CHECK-NEXT: $x0 = COPY [[FRAME_INDEX1]](p0) ; CHECK-NEXT: BL &modff, csr_aarch64_aapcs, implicit-def $lr, implicit $sp, implicit $s0, implicit $x0, implicit-def $s0 ; CHECK-NEXT: ADJCALLSTACKUP 0, 0, implicit-def $sp, implicit $sp ; CHECK-NEXT: [[COPY2:%[0-9]+]]:_(f32) = COPY $s0 ; CHECK-NEXT: [[LOAD1:%[0-9]+]]:_(f32) = G_LOAD [[FRAME_INDEX1]](p0) :: (load (s32) from %stack.1) ; CHECK-NEXT: [[FRAME_INDEX2:%[0-9]+]]:_(p0) = G_FRAME_INDEX %stack.0 ; CHECK-NEXT: ADJCALLSTACKDOWN 0, 0, implicit-def $sp, implicit $sp ; CHECK-NEXT: $s0 = COPY [[UV2]](f32) ; CHECK-NEXT: $x0 = COPY [[FRAME_INDEX2]](p0) ; CHECK-NEXT: BL &modff, csr_aarch64_aapcs, implicit-def $lr, implicit $sp, implicit $s0, implicit $x0, implicit-def $s0 ; CHECK-NEXT: ADJCALLSTACKUP 0, 0, implicit-def $sp, implicit $sp ; CHECK-NEXT: [[COPY3:%[0-9]+]]:_(f32) = COPY $s0 ; CHECK-NEXT: [[LOAD2:%[0-9]+]]:_(f32) = G_LOAD [[FRAME_INDEX2]](p0) :: (load (s32) from %stack.0) ; CHECK-NEXT: [[DEF:%[0-9]+]]:_(f32) = G_IMPLICIT_DEF ; CHECK-NEXT: [[BUILD_VECTOR:%[0-9]+]]:_(<4 x f32>) = G_BUILD_VECTOR [[COPY1]](f32), [[COPY2]](f32), [[COPY3]](f32), [[DEF]](f32) ; CHECK-NEXT: [[BUILD_VECTOR1:%[0-9]+]]:_(<4 x f32>) = G_BUILD_VECTOR [[LOAD]](f32), [[LOAD1]](f32), [[LOAD2]](f32), [[DEF]](f32) ; CHECK-NEXT: $q0 = COPY [[BUILD_VECTOR]](<4 x f32>) ; CHECK-NEXT: $q1 = COPY [[BUILD_VECTOR1]](<4 x f32>) ; CHECK-NEXT: RET_ReallyLR implicit $q0, implicit $q1 %1:_(<2 x f64>) = COPY $q0 %2:_(<4 x f32>) = G_BITCAST %1(<2 x f64>) %3:_(f32), %4:_(f32), %5:_(f32), %6:_(f32) = G_UNMERGE_VALUES %2(<4 x f32>) %0:_(<3 x f32>) = G_BUILD_VECTOR %3(f32), %4(f32), %5(f32) %7:_(<3 x f32>), %8:_(<3 x f32>) = G_FMODF %0 %9:_(f32), %10:_(f32), %11:_(f32) = G_UNMERGE_VALUES %7(<3 x f32>) %12:_(f32) = G_IMPLICIT_DEF %13:_(<4 x f32>) = G_BUILD_VECTOR %9(f32), %10(f32), %11(f32), %12(f32) %14:_(f32), %15:_(f32), %16:_(f32) = G_UNMERGE_VALUES %8(<3 x f32>) %17:_(<4 x f32>) = G_BUILD_VECTOR %14(f32), %15(f32), %16(f32), %12(f32) $q0 = COPY %13(<4 x f32>) $q1 = COPY %17(<4 x f32>) RET_ReallyLR implicit $q0, implicit $q1 ... --- name: test_modf_v2f64 body: | bb.0.entry: ; CHECK-LABEL: name: test_modf_v2f64 ; CHECK: [[COPY:%[0-9]+]]:_(<2 x f64>) = COPY $q0 ; CHECK-NEXT: [[UV:%[0-9]+]]:_(f64), [[UV1:%[0-9]+]]:_(f64) = G_UNMERGE_VALUES [[COPY]](<2 x f64>) ; CHECK-NEXT: [[FRAME_INDEX:%[0-9]+]]:_(p0) = G_FRAME_INDEX %stack.1 ; CHECK-NEXT: ADJCALLSTACKDOWN 0, 0, implicit-def $sp, implicit $sp ; CHECK-NEXT: $d0 = COPY [[UV]](f64) ; CHECK-NEXT: $x0 = COPY [[FRAME_INDEX]](p0) ; CHECK-NEXT: BL &modf, csr_aarch64_aapcs, implicit-def $lr, implicit $sp, implicit $d0, implicit $x0, implicit-def $d0 ; CHECK-NEXT: ADJCALLSTACKUP 0, 0, implicit-def $sp, implicit $sp ; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(f64) = COPY $d0 ; CHECK-NEXT: [[LOAD:%[0-9]+]]:_(f64) = G_LOAD [[FRAME_INDEX]](p0) :: (load (s64) from %stack.1) ; CHECK-NEXT: [[FRAME_INDEX1:%[0-9]+]]:_(p0) = G_FRAME_INDEX %stack.0 ; CHECK-NEXT: ADJCALLSTACKDOWN 0, 0, implicit-def $sp, implicit $sp ; CHECK-NEXT: $d0 = COPY [[UV1]](f64) ; CHECK-NEXT: $x0 = COPY [[FRAME_INDEX1]](p0) ; CHECK-NEXT: BL &modf, csr_aarch64_aapcs, implicit-def $lr, implicit $sp, implicit $d0, implicit $x0, implicit-def $d0 ; CHECK-NEXT: ADJCALLSTACKUP 0, 0, implicit-def $sp, implicit $sp ; CHECK-NEXT: [[COPY2:%[0-9]+]]:_(f64) = COPY $d0 ; CHECK-NEXT: [[LOAD1:%[0-9]+]]:_(f64) = G_LOAD [[FRAME_INDEX1]](p0) :: (load (s64) from %stack.0) ; CHECK-NEXT: [[BUILD_VECTOR:%[0-9]+]]:_(<2 x f64>) = G_BUILD_VECTOR [[COPY1]](f64), [[COPY2]](f64) ; CHECK-NEXT: [[BUILD_VECTOR1:%[0-9]+]]:_(<2 x f64>) = G_BUILD_VECTOR [[LOAD]](f64), [[LOAD1]](f64) ; CHECK-NEXT: $q0 = COPY [[BUILD_VECTOR]](<2 x f64>) ; CHECK-NEXT: $q1 = COPY [[BUILD_VECTOR1]](<2 x f64>) ; CHECK-NEXT: RET_ReallyLR implicit $q0, implicit $q1 %0:_(<2 x f64>) = COPY $q0 %1:_(<2 x f64>), %2:_(<2 x f64>) = G_FMODF %0 $q0 = COPY %1(<2 x f64>) $q1 = COPY %2(<2 x f64>) RET_ReallyLR implicit $q0, implicit $q1 ... --- name: test_modf_fp128 body: | bb.0.entry: ; CHECK-LABEL: name: test_modf_fp128 ; CHECK: [[COPY:%[0-9]+]]:_(s128) = COPY $q0 ; CHECK-NEXT: [[FRAME_INDEX:%[0-9]+]]:_(p0) = G_FRAME_INDEX %stack.0 ; CHECK-NEXT: ADJCALLSTACKDOWN 0, 0, implicit-def $sp, implicit $sp ; CHECK-NEXT: $q0 = COPY [[COPY]](s128) ; CHECK-NEXT: $x0 = COPY [[FRAME_INDEX]](p0) ; CHECK-NEXT: BL &modfl, csr_aarch64_aapcs, implicit-def $lr, implicit $sp, implicit $q0, implicit $x0, implicit-def $q0 ; CHECK-NEXT: ADJCALLSTACKUP 0, 0, implicit-def $sp, implicit $sp ; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(s128) = COPY $q0 ; CHECK-NEXT: [[LOAD:%[0-9]+]]:_(s128) = G_LOAD [[FRAME_INDEX]](p0) :: (load (s128) from %stack.0) ; CHECK-NEXT: $q0 = COPY [[COPY1]](s128) ; CHECK-NEXT: $q1 = COPY [[LOAD]](s128) ; CHECK-NEXT: RET_ReallyLR implicit $q0, implicit $q1 %0:_(s128) = COPY $q0 %1:_(s128), %2:_(s128) = G_FMODF %0 $q0 = COPY %1(s128) $q1 = COPY %2(s128) RET_ReallyLR implicit $q0, implicit $q1 ...