mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-09-02 11:30:10 +00:00
based on the Function. This is currently used to implement mips16 support in the mips backend via the existing module pass resetting the subtarget. Things to note: a) This involved running resetTargetOptions before creating a new subtarget so that code generation options like soft-float could be recognized when creating the new subtarget. This is to deal with initialization code in isel lowering that only paid attention to the initial value. b) Many of the existing testcases weren't using the soft-float feature correctly. I've corrected these based on the check values assuming that was the desired behavior. c) The mips port now pays attention to the target-cpu and target-features strings when generating code for a particular function. I've removed these from one function where the requested cpu and features didn't match the check lines in the testcase. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@218492 91177308-0d34-0410-b5e6-96231b3b80d8
126 lines
5.3 KiB
LLVM
126 lines
5.3 KiB
LLVM
; RUN: llc -mtriple=mipsel-linux-gnu -march=mipsel -mcpu=mips16 -relocation-model=pic < %s | FileCheck %s -check-prefix=picel
|
|
|
|
@ptrsv = global float ()* @sv, align 4
|
|
@ptrdv = global double ()* @dv, align 4
|
|
@ptrscv = global { float, float } ()* @scv, align 4
|
|
@ptrdcv = global { double, double } ()* @dcv, align 4
|
|
@x = common global float 0.000000e+00, align 4
|
|
@.str = private unnamed_addr constant [4 x i8] c"%f\0A\00", align 1
|
|
@xd = common global double 0.000000e+00, align 8
|
|
@xy = common global { float, float } zeroinitializer, align 4
|
|
@.str1 = private unnamed_addr constant [10 x i8] c"%f + %fi\0A\00", align 1
|
|
@xyd = common global { double, double } zeroinitializer, align 8
|
|
|
|
; Function Attrs: nounwind
|
|
define float @sv() #0 {
|
|
entry:
|
|
ret float 1.000000e+01
|
|
}
|
|
; picel: .ent sv
|
|
; picel: lw ${{[0-9]+}}, %call16(__mips16_ret_sf)(${{[0-9]+}})
|
|
; picel: .end sv
|
|
|
|
; Function Attrs: nounwind
|
|
define double @dv() #0 {
|
|
entry:
|
|
ret double 1.500000e+01
|
|
}
|
|
|
|
; picel: .ent dv
|
|
; picel: lw ${{[0-9]+}}, %call16(__mips16_ret_df)(${{[0-9]+}})
|
|
; picel: .end dv
|
|
|
|
; Function Attrs: nounwind
|
|
define { float, float } @scv() #0 {
|
|
entry:
|
|
%retval = alloca { float, float }, align 4
|
|
%real = getelementptr inbounds { float, float }* %retval, i32 0, i32 0
|
|
%imag = getelementptr inbounds { float, float }* %retval, i32 0, i32 1
|
|
store float 5.000000e+00, float* %real
|
|
store float 9.900000e+01, float* %imag
|
|
%0 = load { float, float }* %retval
|
|
ret { float, float } %0
|
|
}
|
|
|
|
; picel: .ent scv
|
|
; picel: lw ${{[0-9]+}}, %call16(__mips16_ret_sc)(${{[0-9]+}})
|
|
; picel: .end scv
|
|
|
|
; Function Attrs: nounwind
|
|
define { double, double } @dcv() #0 {
|
|
entry:
|
|
%retval = alloca { double, double }, align 8
|
|
%real = getelementptr inbounds { double, double }* %retval, i32 0, i32 0
|
|
%imag = getelementptr inbounds { double, double }* %retval, i32 0, i32 1
|
|
store double 0x416BC8B0A0000000, double* %real
|
|
store double 0x41CDCCB763800000, double* %imag
|
|
%0 = load { double, double }* %retval
|
|
ret { double, double } %0
|
|
}
|
|
|
|
; picel: .ent dcv
|
|
; picel: lw ${{[0-9]+}}, %call16(__mips16_ret_dc)(${{[0-9]+}})
|
|
; picel: .end dcv
|
|
|
|
; Function Attrs: nounwind
|
|
define i32 @main() #0 {
|
|
entry:
|
|
%0 = load float ()** @ptrsv, align 4
|
|
%call = call float %0()
|
|
store float %call, float* @x, align 4
|
|
%1 = load float* @x, align 4
|
|
%conv = fpext float %1 to double
|
|
%call1 = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([4 x i8]* @.str, i32 0, i32 0), double %conv)
|
|
%2 = load double ()** @ptrdv, align 4
|
|
%call2 = call double %2()
|
|
store double %call2, double* @xd, align 8
|
|
%3 = load double* @xd, align 8
|
|
%call3 = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([4 x i8]* @.str, i32 0, i32 0), double %3)
|
|
%4 = load { float, float } ()** @ptrscv, align 4
|
|
%call4 = call { float, float } %4()
|
|
%5 = extractvalue { float, float } %call4, 0
|
|
%6 = extractvalue { float, float } %call4, 1
|
|
store float %5, float* getelementptr inbounds ({ float, float }* @xy, i32 0, i32 0)
|
|
store float %6, float* getelementptr inbounds ({ float, float }* @xy, i32 0, i32 1)
|
|
%xy.real = load float* getelementptr inbounds ({ float, float }* @xy, i32 0, i32 0)
|
|
%xy.imag = load float* getelementptr inbounds ({ float, float }* @xy, i32 0, i32 1)
|
|
%conv5 = fpext float %xy.real to double
|
|
%conv6 = fpext float %xy.imag to double
|
|
%xy.real7 = load float* getelementptr inbounds ({ float, float }* @xy, i32 0, i32 0)
|
|
%xy.imag8 = load float* getelementptr inbounds ({ float, float }* @xy, i32 0, i32 1)
|
|
%conv9 = fpext float %xy.real7 to double
|
|
%conv10 = fpext float %xy.imag8 to double
|
|
%call11 = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([10 x i8]* @.str1, i32 0, i32 0), double %conv5, double %conv10)
|
|
%7 = load { double, double } ()** @ptrdcv, align 4
|
|
%call12 = call { double, double } %7()
|
|
%8 = extractvalue { double, double } %call12, 0
|
|
%9 = extractvalue { double, double } %call12, 1
|
|
store double %8, double* getelementptr inbounds ({ double, double }* @xyd, i32 0, i32 0)
|
|
store double %9, double* getelementptr inbounds ({ double, double }* @xyd, i32 0, i32 1)
|
|
%xyd.real = load double* getelementptr inbounds ({ double, double }* @xyd, i32 0, i32 0)
|
|
%xyd.imag = load double* getelementptr inbounds ({ double, double }* @xyd, i32 0, i32 1)
|
|
%xyd.real13 = load double* getelementptr inbounds ({ double, double }* @xyd, i32 0, i32 0)
|
|
%xyd.imag14 = load double* getelementptr inbounds ({ double, double }* @xyd, i32 0, i32 1)
|
|
%call15 = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([10 x i8]* @.str1, i32 0, i32 0), double %xyd.real, double %xyd.imag14)
|
|
ret i32 0
|
|
}
|
|
|
|
; picel: .ent main
|
|
|
|
; picel: lw ${{[0-9]+}}, %got(__mips16_call_stub_sf_0)(${{[0-9]+}})
|
|
|
|
; picel: lw ${{[0-9]+}}, %got(__mips16_call_stub_df_0)(${{[0-9]+}})
|
|
|
|
; picel: lw ${{[0-9]+}}, %got(__mips16_call_stub_sc_0)(${{[0-9]+}})
|
|
|
|
; picel: lw ${{[0-9]+}}, %got(__mips16_call_stub_dc_0)(${{[0-9]+}})
|
|
|
|
|
|
declare i32 @printf(i8*, ...) #1
|
|
|
|
attributes #0 = { nounwind "less-precise-fpmad"="false" "no-frame-pointer-elim"="true" "no-frame-pointer-elim-non-leaf" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "unsafe-fp-math"="false" "use-soft-float"="false" }
|
|
attributes #1 = { "less-precise-fpmad"="false" "no-frame-pointer-elim"="true" "no-frame-pointer-elim-non-leaf" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "unsafe-fp-math"="false" "use-soft-float"="false" }
|
|
|
|
|
|
|