| author | |
| committer | |
| log | 43a09f7efcc34567f119ca315ceba5a7a7e09956 |
| tree | 733599dfd6daff2080a7bf3e6e535107d65093bc |
| parent | 2a7fdd56c6cb9e13634e48eef99b27755f7d2819 |
Take into account the increased number of parameters when flattening a
structure into one or more SSE registers.
Fixes #90613 files changed, 12 insertions(+), 2 deletions(-)
src/stage1/codegen.cpp+2-2| ... | ... | @@ -2161,11 +2161,11 @@ static bool iter_function_params_c_abi(CodeGen *g, ZigType *fn_type, FnWalk *fn_ |
| 2161 | 2161 | // Register 2: (ptr + 1).* |
| 2162 | 2162 | |
| 2163 | 2163 | // One floating point register per f64 or 2 f32's |
| 2164 | size_t number_of_fp_regs = (size_t)ceilf((float)ty_size / (float)8); | |
| 2164 | size_t number_of_fp_regs = (ty_size + 7) / 8; | |
| 2165 | 2165 | |
| 2166 | 2166 | switch (fn_walk->id) { |
| 2167 | 2167 | case FnWalkIdAttrs: { |
| 2168 | fn_walk->data.attrs.gen_i += 1; | |
| 2168 | fn_walk->data.attrs.gen_i += number_of_fp_regs; | |
| 2169 | 2169 | break; |
| 2170 | 2170 | } |
| 2171 | 2171 | case FnWalkIdCall: { |
test/stage1/c_abi/cfuncs.c+8| ... | ... | @@ -1,6 +1,7 @@ |
| 1 | 1 | #include <inttypes.h> |
| 2 | 2 | #include <stdlib.h> |
| 3 | 3 | #include <stdbool.h> |
| 4 | #include <string.h> | |
| 4 | 5 | |
| 5 | 6 | void zig_panic(); |
| 6 | 7 | |
| ... | ... | @@ -253,6 +254,13 @@ void c_small_struct_floats(Vector3 vec) { |
| 253 | 254 | assert_or_panic(vec.z == 12.0); |
| 254 | 255 | } |
| 255 | 256 | |
| 257 | void c_small_struct_floats_extra(Vector3 vec, const char *str) { | |
| 258 | assert_or_panic(vec.x == 3.0); | |
| 259 | assert_or_panic(vec.y == 6.0); | |
| 260 | assert_or_panic(vec.z == 12.0); | |
| 261 | assert_or_panic(!strcmp(str, "hello")); | |
| 262 | } | |
| 263 | ||
| 256 | 264 | void c_big_struct_floats(Vector5 vec) { |
| 257 | 265 | assert_or_panic(vec.x == 76.0); |
| 258 | 266 | assert_or_panic(vec.y == -1.0); |
test/stage1/c_abi/main.zig+2| ... | ... | @@ -257,6 +257,7 @@ const Vector3 = extern struct { |
| 257 | 257 | z: f32, |
| 258 | 258 | }; |
| 259 | 259 | extern fn c_small_struct_floats(Vector3) void; |
| 260 | extern fn c_small_struct_floats_extra(Vector3, ?[*]const u8) void; | |
| 260 | 261 | |
| 261 | 262 | const Vector5 = extern struct { |
| 262 | 263 | x: f32, |
| ... | ... | @@ -274,6 +275,7 @@ test "C ABI structs of floats as parameter" { |
| 274 | 275 | .z = 12.0, |
| 275 | 276 | }; |
| 276 | 277 | c_small_struct_floats(v3); |
| 278 | c_small_struct_floats_extra(v3, "hello"); | |
| 277 | 279 | |
| 278 | 280 | var v5 = Vector5{ |
| 279 | 281 | .x = 76.0, |