| ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py | |
| ; RUN: llc -verify-machineinstrs -csky-no-aliases < %s -mtriple=csky -float-abi=hard -mattr=+hard-float -mattr=+2e3 -mattr=+fpuv2_sf -mattr=+fpuv2_df | FileCheck %s --check-prefix=CHECK-DF | |
| ; RUN: llc -verify-machineinstrs -csky-no-aliases < %s -mtriple=csky -float-abi=hard -mattr=+hard-float -mattr=+2e3 -mattr=+fpuv3_sf -mattr=+fpuv3_df | FileCheck %s --check-prefix=CHECK-DF2 | |
| define double @FADD_DOUBLE(double %x, double %y) { | |
| ; CHECK-DF-LABEL: FADD_DOUBLE: | |
| ; CHECK-DF: # %bb.0: # %entry | |
| ; CHECK-DF-NEXT: faddd vr0, vr1, vr0 | |
| ; CHECK-DF-NEXT: rts16 | |
| ; | |
| ; CHECK-DF2-LABEL: FADD_DOUBLE: | |
| ; CHECK-DF2: # %bb.0: # %entry | |
| ; CHECK-DF2-NEXT: fadd.64 vr0, vr1, vr0 | |
| ; CHECK-DF2-NEXT: rts16 | |
| entry: | |
| %fadd = fadd double %y, %x | |
| ret double %fadd | |
| } | |
| define double @FADD_DOUBLE_I(double %x) { | |
| ; CHECK-DF-LABEL: FADD_DOUBLE_I: | |
| ; CHECK-DF: # %bb.0: # %entry | |
| ; CHECK-DF-NEXT: grs32 a0, .LCPI1_0 | |
| ; CHECK-DF-NEXT: fldd vr1, (a0, 0) | |
| ; CHECK-DF-NEXT: faddd vr0, vr0, vr1 | |
| ; CHECK-DF-NEXT: rts16 | |
| ; CHECK-DF-NEXT: .p2align 1 | |
| ; CHECK-DF-NEXT: # %bb.1: | |
| ; CHECK-DF-NEXT: .p2align 2, 0x0 | |
| ; CHECK-DF-NEXT: .LCPI1_0: | |
| ; CHECK-DF-NEXT: .quad 0xbff0000000000000 # double -1 | |
| ; | |
| ; CHECK-DF2-LABEL: FADD_DOUBLE_I: | |
| ; CHECK-DF2: # %bb.0: # %entry | |
| ; CHECK-DF2-NEXT: flrw.64 vr1, [.LCPI1_0] | |
| ; CHECK-DF2-NEXT: fadd.64 vr0, vr0, vr1 | |
| ; CHECK-DF2-NEXT: rts16 | |
| ; CHECK-DF2-NEXT: .p2align 1 | |
| ; CHECK-DF2-NEXT: # %bb.1: | |
| ; CHECK-DF2-NEXT: .p2align 2, 0x0 | |
| ; CHECK-DF2-NEXT: .LCPI1_0: | |
| ; CHECK-DF2-NEXT: .quad 0xbff0000000000000 # double -1 | |
| entry: | |
| %fadd = fadd double %x, -1.0 | |
| ret double %fadd | |
| } | |
| define double @FSUB_DOUBLE(double %x, double %y) { | |
| ; CHECK-DF-LABEL: FSUB_DOUBLE: | |
| ; CHECK-DF: # %bb.0: # %entry | |
| ; CHECK-DF-NEXT: fsubd vr0, vr1, vr0 | |
| ; CHECK-DF-NEXT: rts16 | |
| ; | |
| ; CHECK-DF2-LABEL: FSUB_DOUBLE: | |
| ; CHECK-DF2: # %bb.0: # %entry | |
| ; CHECK-DF2-NEXT: fsub.64 vr0, vr1, vr0 | |
| ; CHECK-DF2-NEXT: rts16 | |
| entry: | |
| %fsub = fsub double %y, %x | |
| ret double %fsub | |
| } | |
| define double @FSUB_DOUBLE_I(double %x) { | |
| ; | |
| ; CHECK-DF-LABEL: FSUB_DOUBLE_I: | |
| ; CHECK-DF: # %bb.0: # %entry | |
| ; CHECK-DF-NEXT: grs32 a0, .LCPI3_0 | |
| ; CHECK-DF-NEXT: fldd vr1, (a0, 0) | |
| ; CHECK-DF-NEXT: faddd vr0, vr0, vr1 | |
| ; CHECK-DF-NEXT: rts16 | |
| ; CHECK-DF-NEXT: .p2align 1 | |
| ; CHECK-DF-NEXT: # %bb.1: | |
| ; CHECK-DF-NEXT: .p2align 2, 0x0 | |
| ; CHECK-DF-NEXT: .LCPI3_0: | |
| ; CHECK-DF-NEXT: .quad 0x3ff0000000000000 # double 1 | |
| ; | |
| ; CHECK-DF2-LABEL: FSUB_DOUBLE_I: | |
| ; CHECK-DF2: # %bb.0: # %entry | |
| ; CHECK-DF2-NEXT: flrw.64 vr1, [.LCPI3_0] | |
| ; CHECK-DF2-NEXT: fadd.64 vr0, vr0, vr1 | |
| ; CHECK-DF2-NEXT: rts16 | |
| ; CHECK-DF2-NEXT: .p2align 1 | |
| ; CHECK-DF2-NEXT: # %bb.1: | |
| ; CHECK-DF2-NEXT: .p2align 2, 0x0 | |
| ; CHECK-DF2-NEXT: .LCPI3_0: | |
| ; CHECK-DF2-NEXT: .quad 0x3ff0000000000000 # double 1 | |
| entry: | |
| %fsub = fsub double %x, -1.0 | |
| ret double %fsub | |
| } | |
| define double @FMUL_DOUBLE(double %x, double %y) { | |
| ; | |
| ; CHECK-DF-LABEL: FMUL_DOUBLE: | |
| ; CHECK-DF: # %bb.0: # %entry | |
| ; CHECK-DF-NEXT: fmuld vr0, vr1, vr0 | |
| ; CHECK-DF-NEXT: rts16 | |
| ; | |
| ; CHECK-DF2-LABEL: FMUL_DOUBLE: | |
| ; CHECK-DF2: # %bb.0: # %entry | |
| ; CHECK-DF2-NEXT: fmul.64 vr0, vr1, vr0 | |
| ; CHECK-DF2-NEXT: rts16 | |
| entry: | |
| %fmul = fmul double %y, %x | |
| ret double %fmul | |
| } | |
| define double @FNMUL_DOUBLE_a(double %x, double %y) { | |
| ; | |
| ; CHECK-DF-LABEL: FNMUL_DOUBLE_a: | |
| ; CHECK-DF: # %bb.0: # %entry | |
| ; CHECK-DF-NEXT: fnmuld vr0, vr1, vr0 | |
| ; CHECK-DF-NEXT: rts16 | |
| ; | |
| ; CHECK-DF2-LABEL: FNMUL_DOUBLE_a: | |
| ; CHECK-DF2: # %bb.0: # %entry | |
| ; CHECK-DF2-NEXT: fnmul.64 vr0, vr1, vr0 | |
| ; CHECK-DF2-NEXT: rts16 | |
| entry: | |
| %z = fneg double %y | |
| %fnmul = fmul double %z, %x | |
| ret double %fnmul | |
| } | |
| define double @FNMUL_DOUBLE_b(double %x, double %y) { | |
| ; CHECK-DF-LABEL: FNMUL_DOUBLE_b: | |
| ; CHECK-DF: # %bb.0: # %entry | |
| ; CHECK-DF-NEXT: fnmuld vr0, vr0, vr1 | |
| ; CHECK-DF-NEXT: rts16 | |
| ; | |
| ; CHECK-DF2-LABEL: FNMUL_DOUBLE_b: | |
| ; CHECK-DF2: # %bb.0: # %entry | |
| ; CHECK-DF2-NEXT: fnmul.64 vr0, vr0, vr1 | |
| ; CHECK-DF2-NEXT: rts16 | |
| entry: | |
| %z = fneg double %x | |
| %fnmul = fmul double %y, %z | |
| ret double %fnmul | |
| } | |
| define double @FMUL_DOUBLE_I(double %x) { | |
| ; | |
| ; CHECK-DF-LABEL: FMUL_DOUBLE_I: | |
| ; CHECK-DF: # %bb.0: # %entry | |
| ; CHECK-DF-NEXT: grs32 a0, .LCPI7_0 | |
| ; CHECK-DF-NEXT: fldd vr1, (a0, 0) | |
| ; CHECK-DF-NEXT: fmuld vr0, vr0, vr1 | |
| ; CHECK-DF-NEXT: rts16 | |
| ; CHECK-DF-NEXT: .p2align 1 | |
| ; CHECK-DF-NEXT: # %bb.1: | |
| ; CHECK-DF-NEXT: .p2align 2, 0x0 | |
| ; CHECK-DF-NEXT: .LCPI7_0: | |
| ; CHECK-DF-NEXT: .quad 0xc01c000000000000 # double -7 | |
| ; | |
| ; CHECK-DF2-LABEL: FMUL_DOUBLE_I: | |
| ; CHECK-DF2: # %bb.0: # %entry | |
| ; CHECK-DF2-NEXT: flrw.64 vr1, [.LCPI7_0] | |
| ; CHECK-DF2-NEXT: fmul.64 vr0, vr0, vr1 | |
| ; CHECK-DF2-NEXT: rts16 | |
| ; CHECK-DF2-NEXT: .p2align 1 | |
| ; CHECK-DF2-NEXT: # %bb.1: | |
| ; CHECK-DF2-NEXT: .p2align 2, 0x0 | |
| ; CHECK-DF2-NEXT: .LCPI7_0: | |
| ; CHECK-DF2-NEXT: .quad 0xc01c000000000000 # double -7 | |
| entry: | |
| %fmul = fmul double %x, -7.0 | |
| ret double %fmul | |
| } | |
| define double @FDIV_DOUBLE(double %x, double %y) { | |
| ; | |
| ; | |
| ; CHECK-DF-LABEL: FDIV_DOUBLE: | |
| ; CHECK-DF: # %bb.0: # %entry | |
| ; CHECK-DF-NEXT: fdivd vr0, vr1, vr0 | |
| ; CHECK-DF-NEXT: rts16 | |
| ; | |
| ; CHECK-DF2-LABEL: FDIV_DOUBLE: | |
| ; CHECK-DF2: # %bb.0: # %entry | |
| ; CHECK-DF2-NEXT: fdiv.64 vr0, vr1, vr0 | |
| ; CHECK-DF2-NEXT: rts16 | |
| entry: | |
| %fdiv = fdiv double %y, %x | |
| ret double %fdiv | |
| } | |
| define double @FDIV_DOUBLE_I(double %x) { | |
| ; | |
| ; CHECK-DF-LABEL: FDIV_DOUBLE_I: | |
| ; CHECK-DF: # %bb.0: # %entry | |
| ; CHECK-DF-NEXT: grs32 a0, .LCPI9_0 | |
| ; CHECK-DF-NEXT: fldd vr1, (a0, 0) | |
| ; CHECK-DF-NEXT: fdivd vr0, vr0, vr1 | |
| ; CHECK-DF-NEXT: rts16 | |
| ; CHECK-DF-NEXT: .p2align 1 | |
| ; CHECK-DF-NEXT: # %bb.1: | |
| ; CHECK-DF-NEXT: .p2align 2, 0x0 | |
| ; CHECK-DF-NEXT: .LCPI9_0: | |
| ; CHECK-DF-NEXT: .quad 0xc01c000000000000 # double -7 | |
| ; | |
| ; CHECK-DF2-LABEL: FDIV_DOUBLE_I: | |
| ; CHECK-DF2: # %bb.0: # %entry | |
| ; CHECK-DF2-NEXT: flrw.64 vr1, [.LCPI9_0] | |
| ; CHECK-DF2-NEXT: fdiv.64 vr0, vr0, vr1 | |
| ; CHECK-DF2-NEXT: rts16 | |
| ; CHECK-DF2-NEXT: .p2align 1 | |
| ; CHECK-DF2-NEXT: # %bb.1: | |
| ; CHECK-DF2-NEXT: .p2align 2, 0x0 | |
| ; CHECK-DF2-NEXT: .LCPI9_0: | |
| ; CHECK-DF2-NEXT: .quad 0xc01c000000000000 # double -7 | |
| entry: | |
| %fdiv = fdiv double %x, -7.0 | |
| ret double %fdiv | |
| } | |
| define double @FNEG_DOUBLE(double %x) { | |
| ; | |
| ; CHECK-DF-LABEL: FNEG_DOUBLE: | |
| ; CHECK-DF: # %bb.0: # %entry | |
| ; CHECK-DF-NEXT: fnegd vr0, vr0 | |
| ; CHECK-DF-NEXT: rts16 | |
| ; | |
| ; CHECK-DF2-LABEL: FNEG_DOUBLE: | |
| ; CHECK-DF2: # %bb.0: # %entry | |
| ; CHECK-DF2-NEXT: fneg.64 vr0, vr0 | |
| ; CHECK-DF2-NEXT: rts16 | |
| entry: | |
| %fneg = fneg double %x | |
| ret double %fneg | |
| } | |
| ; double --> float | |
| define float @fptruncR_double_0(double %x) { | |
| ; | |
| ; CHECK-DF-LABEL: fptruncR_double_0: | |
| ; CHECK-DF: # %bb.0: # %entry | |
| ; CHECK-DF-NEXT: fdtos vr0, vr0 | |
| ; CHECK-DF-NEXT: rts16 | |
| ; | |
| ; CHECK-DF2-LABEL: fptruncR_double_0: | |
| ; CHECK-DF2: # %bb.0: # %entry | |
| ; CHECK-DF2-NEXT: fdtos vr0, vr0 | |
| ; CHECK-DF2-NEXT: rts16 | |
| entry: | |
| %fptrunc = fptrunc double %x to float | |
| ret float %fptrunc | |
| } | |
| define double @fpextR_double_0(float %x) { | |
| ; | |
| ; CHECK-DF-LABEL: fpextR_double_0: | |
| ; CHECK-DF: # %bb.0: # %entry | |
| ; CHECK-DF-NEXT: fstod vr0, vr0 | |
| ; CHECK-DF-NEXT: rts16 | |
| ; | |
| ; CHECK-DF2-LABEL: fpextR_double_0: | |
| ; CHECK-DF2: # %bb.0: # %entry | |
| ; CHECK-DF2-NEXT: fstod vr0, vr0 | |
| ; CHECK-DF2-NEXT: rts16 | |
| entry: | |
| %fpext = fpext float %x to double | |
| ret double %fpext | |
| } |