mirror of
https://github.com/Ed94/Odin.git
synced 2026-08-02 12:48:14 +00:00
Merge pull request #5526 from laytan/fixes-for-vector-abi
amd64 abi fixes regarding vectors
This commit is contained in:
+36
-10
@@ -527,6 +527,8 @@ namespace lbAbiAmd64SysV {
|
|||||||
enum RegClass {
|
enum RegClass {
|
||||||
RegClass_NoClass,
|
RegClass_NoClass,
|
||||||
RegClass_Int,
|
RegClass_Int,
|
||||||
|
RegClass_SSEHs,
|
||||||
|
RegClass_SSEHv,
|
||||||
RegClass_SSEFs,
|
RegClass_SSEFs,
|
||||||
RegClass_SSEFv,
|
RegClass_SSEFv,
|
||||||
RegClass_SSEDs,
|
RegClass_SSEDs,
|
||||||
@@ -545,6 +547,8 @@ namespace lbAbiAmd64SysV {
|
|||||||
|
|
||||||
gb_internal bool is_sse(RegClass reg_class) {
|
gb_internal bool is_sse(RegClass reg_class) {
|
||||||
switch (reg_class) {
|
switch (reg_class) {
|
||||||
|
case RegClass_SSEHs:
|
||||||
|
case RegClass_SSEHv:
|
||||||
case RegClass_SSEFs:
|
case RegClass_SSEFs:
|
||||||
case RegClass_SSEFv:
|
case RegClass_SSEFv:
|
||||||
case RegClass_SSEDs:
|
case RegClass_SSEDs:
|
||||||
@@ -693,6 +697,8 @@ namespace lbAbiAmd64SysV {
|
|||||||
case RegClass_Int:
|
case RegClass_Int:
|
||||||
needed_int += 1;
|
needed_int += 1;
|
||||||
break;
|
break;
|
||||||
|
case RegClass_SSEHs:
|
||||||
|
case RegClass_SSEHv:
|
||||||
case RegClass_SSEFs:
|
case RegClass_SSEFs:
|
||||||
case RegClass_SSEFv:
|
case RegClass_SSEFv:
|
||||||
case RegClass_SSEDs:
|
case RegClass_SSEDs:
|
||||||
@@ -804,6 +810,8 @@ namespace lbAbiAmd64SysV {
|
|||||||
to_write = RegClass_Memory;
|
to_write = RegClass_Memory;
|
||||||
} else if (newv == RegClass_SSEUp) {
|
} else if (newv == RegClass_SSEUp) {
|
||||||
switch (oldv) {
|
switch (oldv) {
|
||||||
|
case RegClass_SSEHv:
|
||||||
|
case RegClass_SSEHs:
|
||||||
case RegClass_SSEFv:
|
case RegClass_SSEFv:
|
||||||
case RegClass_SSEFs:
|
case RegClass_SSEFs:
|
||||||
case RegClass_SSEDv:
|
case RegClass_SSEDv:
|
||||||
@@ -850,14 +858,18 @@ namespace lbAbiAmd64SysV {
|
|||||||
} else if (oldv == RegClass_SSEUp) {
|
} else if (oldv == RegClass_SSEUp) {
|
||||||
oldv = RegClass_SSEDv;
|
oldv = RegClass_SSEDv;
|
||||||
} else if (is_sse(oldv)) {
|
} else if (is_sse(oldv)) {
|
||||||
i++;
|
for (i++; i < e; i++) {
|
||||||
while (i != e && oldv == RegClass_SSEUp) {
|
RegClass v = (*cls)[cast(isize)i];
|
||||||
i++;
|
if (v != RegClass_SSEUp) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
} else if (oldv == RegClass_X87) {
|
} else if (oldv == RegClass_X87) {
|
||||||
i++;
|
for (i++; i < e; i++) {
|
||||||
while (i != e && oldv == RegClass_X87Up) {
|
RegClass v = (*cls)[cast(isize)i];
|
||||||
i++;
|
if (v != RegClass_X87Up) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
i++;
|
i++;
|
||||||
@@ -914,6 +926,7 @@ namespace lbAbiAmd64SysV {
|
|||||||
sz -= rs;
|
sz -= rs;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
case RegClass_SSEHv:
|
||||||
case RegClass_SSEFv:
|
case RegClass_SSEFv:
|
||||||
case RegClass_SSEDv:
|
case RegClass_SSEDv:
|
||||||
case RegClass_SSEInt8:
|
case RegClass_SSEInt8:
|
||||||
@@ -924,6 +937,10 @@ namespace lbAbiAmd64SysV {
|
|||||||
unsigned elems_per_word = 0;
|
unsigned elems_per_word = 0;
|
||||||
LLVMTypeRef elem_type = nullptr;
|
LLVMTypeRef elem_type = nullptr;
|
||||||
switch (reg_class) {
|
switch (reg_class) {
|
||||||
|
case RegClass_SSEHv:
|
||||||
|
elems_per_word = 4;
|
||||||
|
elem_type = LLVMHalfTypeInContext(c);
|
||||||
|
break;
|
||||||
case RegClass_SSEFv:
|
case RegClass_SSEFv:
|
||||||
elems_per_word = 2;
|
elems_per_word = 2;
|
||||||
elem_type = LLVMFloatTypeInContext(c);
|
elem_type = LLVMFloatTypeInContext(c);
|
||||||
@@ -958,6 +975,10 @@ namespace lbAbiAmd64SysV {
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
case RegClass_SSEHs:
|
||||||
|
array_add(&types, LLVMHalfTypeInContext(c));
|
||||||
|
sz -= 2;
|
||||||
|
break;
|
||||||
case RegClass_SSEFs:
|
case RegClass_SSEFs:
|
||||||
array_add(&types, LLVMFloatTypeInContext(c));
|
array_add(&types, LLVMFloatTypeInContext(c));
|
||||||
sz -= 4;
|
sz -= 4;
|
||||||
@@ -1004,9 +1025,11 @@ namespace lbAbiAmd64SysV {
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case LLVMPointerTypeKind:
|
case LLVMPointerTypeKind:
|
||||||
case LLVMHalfTypeKind:
|
|
||||||
unify(cls, ix + off/8, RegClass_Int);
|
unify(cls, ix + off/8, RegClass_Int);
|
||||||
break;
|
break;
|
||||||
|
case LLVMHalfTypeKind:
|
||||||
|
unify(cls, ix + off/8, (off%8 == 6) ? RegClass_SSEHv : RegClass_SSEHs);
|
||||||
|
break;
|
||||||
case LLVMFloatTypeKind:
|
case LLVMFloatTypeKind:
|
||||||
unify(cls, ix + off/8, (off%8 == 4) ? RegClass_SSEFv : RegClass_SSEFs);
|
unify(cls, ix + off/8, (off%8 == 4) ? RegClass_SSEFv : RegClass_SSEFs);
|
||||||
break;
|
break;
|
||||||
@@ -1046,10 +1069,9 @@ namespace lbAbiAmd64SysV {
|
|||||||
i64 elem_sz = lb_sizeof(elem);
|
i64 elem_sz = lb_sizeof(elem);
|
||||||
LLVMTypeKind elem_kind = LLVMGetTypeKind(elem);
|
LLVMTypeKind elem_kind = LLVMGetTypeKind(elem);
|
||||||
RegClass reg = RegClass_NoClass;
|
RegClass reg = RegClass_NoClass;
|
||||||
unsigned elem_width = LLVMGetIntTypeWidth(elem);
|
|
||||||
switch (elem_kind) {
|
switch (elem_kind) {
|
||||||
case LLVMIntegerTypeKind:
|
case LLVMIntegerTypeKind: {
|
||||||
case LLVMHalfTypeKind:
|
unsigned elem_width = LLVMGetIntTypeWidth(elem);
|
||||||
switch (elem_width) {
|
switch (elem_width) {
|
||||||
case 8: reg = RegClass_SSEInt8; break;
|
case 8: reg = RegClass_SSEInt8; break;
|
||||||
case 16: reg = RegClass_SSEInt16; break;
|
case 16: reg = RegClass_SSEInt16; break;
|
||||||
@@ -1065,6 +1087,10 @@ namespace lbAbiAmd64SysV {
|
|||||||
GB_PANIC("Unhandled integer width for vector type %u", elem_width);
|
GB_PANIC("Unhandled integer width for vector type %u", elem_width);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
};
|
||||||
|
case LLVMHalfTypeKind:
|
||||||
|
reg = RegClass_SSEHv;
|
||||||
|
break;
|
||||||
case LLVMFloatTypeKind:
|
case LLVMFloatTypeKind:
|
||||||
reg = RegClass_SSEFv;
|
reg = RegClass_SSEFv;
|
||||||
break;
|
break;
|
||||||
|
|||||||
Reference in New Issue
Block a user