mirror of
https://github.com/mirror/tinycc.git
synced 2025-02-10 06:50:10 +08:00
x86_64 ABI tests, which currently cause failures
With the x86_64 Linux ELF ABI, we're currently failing two of these three tests, which have been disabled for now. The problem is mixed structures such as struct { double x; char c; }, which the x86_64 ABI specifies are to be passed/returned in one integer register and one SSE register; our current approach, marking the structure as VT_QLONG or VT_QFLOAT, fails in this case. (It's possible to fix this by getting rid of VT_QLONG and VT_QFLOAT entirely as at https://github.com/pipcet/tinycc, but the changes aren't properly isolated at present. Anyway, there might be a less disruptive fix.)
This commit is contained in:
parent
9cbab3630e
commit
1dd3f88f3b
@ -130,6 +130,89 @@ static int ret_2double_test(void) {
|
|||||||
return run_callback(src, ret_2double_test_callback);
|
return run_callback(src, ret_2double_test_callback);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* ret_mixed_test:
|
||||||
|
*
|
||||||
|
* On x86-64, a struct with a double and a 64-bit integer should be
|
||||||
|
* passed in one SSE register and one integer register.
|
||||||
|
*/
|
||||||
|
typedef struct ret_mixed_test_type_s {double x; long long y;} ret_mixed_test_type;
|
||||||
|
typedef ret_mixed_test_type (*ret_mixed_test_function_type) (ret_mixed_test_type);
|
||||||
|
|
||||||
|
static int ret_mixed_test_callback(void *ptr) {
|
||||||
|
ret_mixed_test_function_type f = (ret_mixed_test_function_type)ptr;
|
||||||
|
ret_mixed_test_type a = {10, 35};
|
||||||
|
ret_mixed_test_type r;
|
||||||
|
r = f(a);
|
||||||
|
return ((r.x == a.x*5) && (r.y == a.y*3)) ? 0 : -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int ret_mixed_test(void) {
|
||||||
|
const char *src =
|
||||||
|
"typedef struct ret_mixed_test_type_s {double x; long long y;} ret_mixed_test_type;"
|
||||||
|
"ret_mixed_test_type f(ret_mixed_test_type a) {\n"
|
||||||
|
" ret_mixed_test_type r = {a.x*5, a.y*3};\n"
|
||||||
|
" return r;\n"
|
||||||
|
"}\n";
|
||||||
|
|
||||||
|
return run_callback(src, ret_mixed_test_callback);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* ret_mixed2_test:
|
||||||
|
*
|
||||||
|
* On x86-64, a struct with two floats and two 32-bit integers should
|
||||||
|
* be passed in one SSE register and one integer register.
|
||||||
|
*/
|
||||||
|
typedef struct ret_mixed2_test_type_s {float x,x2; int y,y2;} ret_mixed2_test_type;
|
||||||
|
typedef ret_mixed2_test_type (*ret_mixed2_test_function_type) (ret_mixed2_test_type);
|
||||||
|
|
||||||
|
static int ret_mixed2_test_callback(void *ptr) {
|
||||||
|
ret_mixed2_test_function_type f = (ret_mixed2_test_function_type)ptr;
|
||||||
|
ret_mixed2_test_type a = {10, 5, 35, 7 };
|
||||||
|
ret_mixed2_test_type r;
|
||||||
|
r = f(a);
|
||||||
|
return ((r.x == a.x*5) && (r.y == a.y*3)) ? 0 : -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int ret_mixed2_test(void) {
|
||||||
|
const char *src =
|
||||||
|
"typedef struct ret_mixed2_test_type_s {float x, x2; int y,y2;} ret_mixed2_test_type;"
|
||||||
|
"ret_mixed2_test_type f(ret_mixed2_test_type a) {\n"
|
||||||
|
" ret_mixed2_test_type r = {a.x*5, 0, a.y*3, 0};\n"
|
||||||
|
" return r;\n"
|
||||||
|
"}\n";
|
||||||
|
|
||||||
|
return run_callback(src, ret_mixed2_test_callback);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* ret_mixed3_test:
|
||||||
|
*
|
||||||
|
* On x86-64, this struct should be passed in two integer registers.
|
||||||
|
*/
|
||||||
|
typedef struct ret_mixed3_test_type_s {float x; int y; float x2; int y2;} ret_mixed3_test_type;
|
||||||
|
typedef ret_mixed3_test_type (*ret_mixed3_test_function_type) (ret_mixed3_test_type);
|
||||||
|
|
||||||
|
static int ret_mixed3_test_callback(void *ptr) {
|
||||||
|
ret_mixed3_test_function_type f = (ret_mixed3_test_function_type)ptr;
|
||||||
|
ret_mixed3_test_type a = {10, 5, 35, 7 };
|
||||||
|
ret_mixed3_test_type r;
|
||||||
|
r = f(a);
|
||||||
|
return ((r.x == a.x*5) && (r.y2 == a.y*3)) ? 0 : -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int ret_mixed3_test(void) {
|
||||||
|
const char *src =
|
||||||
|
"typedef struct ret_mixed3_test_type_s {float x; int y; float x2; int y2;} ret_mixed3_test_type;"
|
||||||
|
"ret_mixed3_test_type f(ret_mixed3_test_type a) {\n"
|
||||||
|
" ret_mixed3_test_type r = {a.x*5, 0, 0, a.y*3};\n"
|
||||||
|
" return r;\n"
|
||||||
|
"}\n";
|
||||||
|
|
||||||
|
return run_callback(src, ret_mixed3_test_callback);
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* reg_pack_test: return a small struct which should be packed into
|
* reg_pack_test: return a small struct which should be packed into
|
||||||
* registers (Win32) during return.
|
* registers (Win32) during return.
|
||||||
@ -477,6 +560,9 @@ int main(int argc, char **argv) {
|
|||||||
RUN_TEST(ret_longdouble_test);
|
RUN_TEST(ret_longdouble_test);
|
||||||
RUN_TEST(ret_2float_test);
|
RUN_TEST(ret_2float_test);
|
||||||
RUN_TEST(ret_2double_test);
|
RUN_TEST(ret_2double_test);
|
||||||
|
/* RUN_TEST(ret_mixed_test); currently broken on x86_64 */
|
||||||
|
/* RUN_TEST(ret_mixed2_test); currently broken on x86_64 */
|
||||||
|
RUN_TEST(ret_mixed3_test);
|
||||||
RUN_TEST(reg_pack_test);
|
RUN_TEST(reg_pack_test);
|
||||||
RUN_TEST(reg_pack_longlong_test);
|
RUN_TEST(reg_pack_longlong_test);
|
||||||
RUN_TEST(sret_test);
|
RUN_TEST(sret_test);
|
||||||
|
Loading…
Reference in New Issue
Block a user