mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-12-16 16:16:45 +00:00
LLVM Interpreter: fixed bug 16694
fix for: Bug 16694 - ExecutionEngine/test-interp-vec-loadstore.ll failing on powerpc-darwin8 (http://llvm.org/bugs/show_bug.cgi?id=16694) The ExecutionEngine/test-interp-vec-loadstore.ll test has been failing on powerpc-darwin8 (on other platforms it passed) the reason of fail was wrong output by printf. this output is checked by FileCheck, but on little-endian powerpc the output numeric data were printed inside out and FileCheck reported fail. the printfs have been replaced by checking data inside test and numeric output has been replaced by the text output like : "int test passed, float test passed". The text output is checked by FileCheck. the dependency on data layout has been removed. done by Yuri Veselov (Intel) llvm-svn: 187791
This commit is contained in:
parent
c51801370f
commit
3b1766cc40
@ -1,22 +1,12 @@
|
||||
; RUN: %lli -force-interpreter=true %s | FileCheck %s
|
||||
; XFAIL: mips
|
||||
; CHECK: 1
|
||||
; CHECK: 2
|
||||
; CHECK: 3
|
||||
; CHECK: 4
|
||||
; CHECK: 5.{{[0]+}}e+{{[0]+}}
|
||||
; CHECK: 6.{{[0]+}}e+{{[0]+}}
|
||||
; CHECK: 7.{{[0]+}}e+{{[0]+}}
|
||||
; CHECK: 8.{{[0]+}}e+{{[0]+}}
|
||||
; CHECK: 9.{{[0]+}}e+{{[0]+}}
|
||||
; CHECK: 1.{{[0]+}}e+{{[0]+}}1
|
||||
; CHECK: 1.1{{[0]+}}e+{{[0]+}}1
|
||||
; CHECK: 1.2{{[0]+}}e+{{[0]+}}1
|
||||
; CHECK: int test passed
|
||||
; CHECK: double test passed
|
||||
; CHECK: float test passed
|
||||
|
||||
target datalayout = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-f80:128:128-v64:64:64-v128:128:128-a0:0:64-f80:32:32-n8:16:32"
|
||||
|
||||
@format_i32 = internal global [4 x i8] c"%d\0A\00"
|
||||
@format_float = internal global [4 x i8] c"%e\0A\00"
|
||||
@msg_int = internal global [17 x i8] c"int test passed\0A\00"
|
||||
@msg_double = internal global [20 x i8] c"double test passed\0A\00"
|
||||
@msg_float = internal global [19 x i8] c"float test passed\0A\00"
|
||||
|
||||
declare i32 @printf(i8*, ...)
|
||||
|
||||
@ -24,62 +14,157 @@ define i32 @main() {
|
||||
%a = alloca <4 x i32>, align 16
|
||||
%b = alloca <4 x double>, align 16
|
||||
%c = alloca <4 x float>, align 16
|
||||
|
||||
store <4 x i32> <i32 1, i32 2, i32 3, i32 4>, <4 x i32>* %a, align 16
|
||||
%pint_0 = alloca i32
|
||||
%pint_1 = alloca i32
|
||||
%pint_2 = alloca i32
|
||||
%pint_3 = alloca i32
|
||||
%pdouble_0 = alloca double
|
||||
%pdouble_1 = alloca double
|
||||
%pdouble_2 = alloca double
|
||||
%pdouble_3 = alloca double
|
||||
%pfloat_0 = alloca float
|
||||
%pfloat_1 = alloca float
|
||||
%pfloat_2 = alloca float
|
||||
%pfloat_3 = alloca float
|
||||
|
||||
; store constants 1,2,3,4 as vector
|
||||
store <4 x i32> <i32 1, i32 2, i32 3, i32 4>, <4 x i32>* %a, align 16
|
||||
; store constants 1,2,3,4 as scalars
|
||||
store i32 1, i32* %pint_0
|
||||
store i32 2, i32* %pint_1
|
||||
store i32 3, i32* %pint_2
|
||||
store i32 4, i32* %pint_3
|
||||
|
||||
; load stored scalars
|
||||
%val_int0 = load i32* %pint_0
|
||||
%val_int1 = load i32* %pint_1
|
||||
%val_int2 = load i32* %pint_2
|
||||
%val_int3 = load i32* %pint_3
|
||||
|
||||
; load stored vector
|
||||
%val0 = load <4 x i32> *%a, align 16
|
||||
|
||||
; extract integers from the loaded vector
|
||||
%res_i32_0 = extractelement <4 x i32> %val0, i32 0
|
||||
%res_i32_1 = extractelement <4 x i32> %val0, i32 1
|
||||
%res_i32_2 = extractelement <4 x i32> %val0, i32 2
|
||||
%res_i32_3 = extractelement <4 x i32> %val0, i32 3
|
||||
|
||||
%ptr0 = getelementptr [4 x i8]* @format_i32, i32 0, i32 0
|
||||
call i32 (i8*,...)* @printf(i8* %ptr0, i32 %res_i32_0)
|
||||
call i32 (i8*,...)* @printf(i8* %ptr0, i32 %res_i32_1)
|
||||
call i32 (i8*,...)* @printf(i8* %ptr0, i32 %res_i32_2)
|
||||
call i32 (i8*,...)* @printf(i8* %ptr0, i32 %res_i32_3)
|
||||
|
||||
; compare extracted data with stored constants
|
||||
%test_result_int_0 = icmp eq i32 %res_i32_0, %val_int0
|
||||
%test_result_int_1 = icmp eq i32 %res_i32_1, %val_int1
|
||||
%test_result_int_2 = icmp eq i32 %res_i32_2, %val_int2
|
||||
%test_result_int_3 = icmp eq i32 %res_i32_3, %val_int3
|
||||
|
||||
%test_result_int_4 = icmp eq i32 %res_i32_0, %val_int3
|
||||
%test_result_int_5 = icmp eq i32 %res_i32_1, %val_int2
|
||||
%test_result_int_6 = icmp eq i32 %res_i32_2, %val_int1
|
||||
%test_result_int_7 = icmp eq i32 %res_i32_3, %val_int0
|
||||
|
||||
; it should be TRUE
|
||||
%A_i = or i1 %test_result_int_0, %test_result_int_4
|
||||
%B_i = or i1 %test_result_int_1, %test_result_int_5
|
||||
%C_i = or i1 %test_result_int_2, %test_result_int_6
|
||||
%D_i = or i1 %test_result_int_3, %test_result_int_7
|
||||
%E_i = and i1 %A_i, %B_i
|
||||
%F_i = and i1 %C_i, %D_i
|
||||
%res_i = and i1 %E_i, %F_i
|
||||
|
||||
; if TRUE print message
|
||||
br i1 %res_i, label %Print_int, label %Double
|
||||
Print_int:
|
||||
%ptr0 = getelementptr [17 x i8]* @msg_int, i32 0, i32 0
|
||||
call i32 (i8*,...)* @printf(i8* %ptr0)
|
||||
br label %Double
|
||||
Double:
|
||||
store <4 x double> <double 5.0, double 6.0, double 7.0, double 8.0>, <4 x double>* %b, align 16
|
||||
; store constants as scalars
|
||||
store double 5.0, double* %pdouble_0
|
||||
store double 6.0, double* %pdouble_1
|
||||
store double 7.0, double* %pdouble_2
|
||||
store double 8.0, double* %pdouble_3
|
||||
|
||||
; load stored vector
|
||||
%val1 = load <4 x double> *%b, align 16
|
||||
; load stored scalars
|
||||
%val_double0 = load double* %pdouble_0
|
||||
%val_double1 = load double* %pdouble_1
|
||||
%val_double2 = load double* %pdouble_2
|
||||
%val_double3 = load double* %pdouble_3
|
||||
|
||||
%res_double_0 = extractelement <4 x double> %val1, i32 0
|
||||
%res_double_1 = extractelement <4 x double> %val1, i32 1
|
||||
%res_double_2 = extractelement <4 x double> %val1, i32 2
|
||||
%res_double_3 = extractelement <4 x double> %val1, i32 3
|
||||
|
||||
%ptr1 = getelementptr [4 x i8]* @format_float, i32 0, i32 0
|
||||
call i32 (i8*,...)* @printf(i8* %ptr1, double %res_double_0)
|
||||
call i32 (i8*,...)* @printf(i8* %ptr1, double %res_double_1)
|
||||
call i32 (i8*,...)* @printf(i8* %ptr1, double %res_double_2)
|
||||
call i32 (i8*,...)* @printf(i8* %ptr1, double %res_double_3)
|
||||
|
||||
%test_result_double_0 = fcmp oeq double %res_double_0, %val_double0
|
||||
%test_result_double_1 = fcmp oeq double %res_double_1, %val_double1
|
||||
%test_result_double_2 = fcmp oeq double %res_double_2, %val_double2
|
||||
%test_result_double_3 = fcmp oeq double %res_double_3, %val_double3
|
||||
|
||||
%test_result_double_4 = fcmp oeq double %res_double_0, %val_double3
|
||||
%test_result_double_5 = fcmp oeq double %res_double_1, %val_double2
|
||||
%test_result_double_6 = fcmp oeq double %res_double_2, %val_double1
|
||||
%test_result_double_7 = fcmp oeq double %res_double_3, %val_double0
|
||||
|
||||
%A_double = or i1 %test_result_double_0, %test_result_double_4
|
||||
%B_double = or i1 %test_result_double_1, %test_result_double_5
|
||||
%C_double = or i1 %test_result_double_2, %test_result_double_6
|
||||
%D_double = or i1 %test_result_double_3, %test_result_double_7
|
||||
%E_double = and i1 %A_double, %B_double
|
||||
%F_double = and i1 %C_double, %D_double
|
||||
%res_double = and i1 %E_double, %F_double
|
||||
|
||||
br i1 %res_double, label %Print_double, label %Float
|
||||
Print_double:
|
||||
%ptr1 = getelementptr [20 x i8]* @msg_double, i32 0, i32 0
|
||||
call i32 (i8*,...)* @printf(i8* %ptr1)
|
||||
br label %Float
|
||||
Float:
|
||||
store <4 x float> <float 9.0, float 10.0, float 11.0, float 12.0>, <4 x float>* %c, align 16
|
||||
|
||||
|
||||
store float 9.0, float* %pfloat_0
|
||||
store float 10.0, float* %pfloat_1
|
||||
store float 11.0, float* %pfloat_2
|
||||
store float 12.0, float* %pfloat_3
|
||||
|
||||
; load stored vector
|
||||
%val2 = load <4 x float> *%c, align 16
|
||||
|
||||
%ptr2 = getelementptr [4 x i8]* @format_float, i32 0, i32 0
|
||||
; load stored scalars
|
||||
%val_float0 = load float* %pfloat_0
|
||||
%val_float1 = load float* %pfloat_1
|
||||
%val_float2 = load float* %pfloat_2
|
||||
%val_float3 = load float* %pfloat_3
|
||||
|
||||
; by some reason printf doesn't print float correctly, so
|
||||
; floats are casted to doubles and are printed as doubles
|
||||
|
||||
%res_serv_0 = extractelement <4 x float> %val2, i32 0
|
||||
%res_float_0 = fpext float %res_serv_0 to double
|
||||
%res_serv_1 = extractelement <4 x float> %val2, i32 1
|
||||
%res_float_1 = fpext float %res_serv_1 to double
|
||||
%res_serv_2 = extractelement <4 x float> %val2, i32 2
|
||||
%res_float_2 = fpext float %res_serv_2 to double
|
||||
%res_serv_3 = extractelement <4 x float> %val2, i32 3
|
||||
%res_float_3 = fpext float %res_serv_3 to double
|
||||
%res_float_0 = extractelement <4 x float> %val2, i32 0
|
||||
%res_float_1 = extractelement <4 x float> %val2, i32 1
|
||||
%res_float_2 = extractelement <4 x float> %val2, i32 2
|
||||
%res_float_3 = extractelement <4 x float> %val2, i32 3
|
||||
|
||||
%test_result_float_0 = fcmp oeq float %res_float_0, %val_float0
|
||||
%test_result_float_1 = fcmp oeq float %res_float_1, %val_float1
|
||||
%test_result_float_2 = fcmp oeq float %res_float_2, %val_float2
|
||||
%test_result_float_3 = fcmp oeq float %res_float_3, %val_float3
|
||||
|
||||
%test_result_float_4 = fcmp oeq float %res_float_0, %val_float3
|
||||
%test_result_float_5 = fcmp oeq float %res_float_1, %val_float2
|
||||
%test_result_float_6 = fcmp oeq float %res_float_2, %val_float1
|
||||
%test_result_float_7 = fcmp oeq float %res_float_3, %val_float0
|
||||
|
||||
%A_float = or i1 %test_result_float_0, %test_result_float_4
|
||||
%B_float = or i1 %test_result_float_1, %test_result_float_5
|
||||
%C_float = or i1 %test_result_float_2, %test_result_float_6
|
||||
%D_float = or i1 %test_result_float_3, %test_result_float_7
|
||||
%E_float = and i1 %A_float, %B_float
|
||||
%F_float = and i1 %C_float, %D_float
|
||||
%res_float = and i1 %E_float, %F_float
|
||||
|
||||
br i1 %res_float, label %Print_float, label %Exit
|
||||
Print_float:
|
||||
%ptr2 = getelementptr [19 x i8]* @msg_float, i32 0, i32 0
|
||||
call i32 (i8*,...)* @printf(i8* %ptr2)
|
||||
br label %Exit
|
||||
Exit:
|
||||
|
||||
|
||||
call i32 (i8*,...)* @printf(i8* %ptr1, double %res_float_0)
|
||||
call i32 (i8*,...)* @printf(i8* %ptr1, double %res_float_1)
|
||||
call i32 (i8*,...)* @printf(i8* %ptr1, double %res_float_2)
|
||||
call i32 (i8*,...)* @printf(i8* %ptr1, double %res_float_3)
|
||||
|
||||
|
||||
ret i32 0
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user