|
@@ -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:
|
|
@@ -918,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:
|
|
@@ -928,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);
|
|
@@ -962,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;
|
|
@@ -1008,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 == 2) ? 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;
|
|
@@ -1070,7 +1089,7 @@ namespace lbAbiAmd64SysV {
|
|
break;
|
|
break;
|
|
};
|
|
};
|
|
case LLVMHalfTypeKind:
|
|
case LLVMHalfTypeKind:
|
|
- reg = RegClass_SSEInt16;
|
|
|
|
|
|
+ reg = RegClass_SSEHv;
|
|
break;
|
|
break;
|
|
case LLVMFloatTypeKind:
|
|
case LLVMFloatTypeKind:
|
|
reg = RegClass_SSEFv;
|
|
reg = RegClass_SSEFv;
|