Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 8 additions & 4 deletions src/hir/asm.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -42,10 +42,10 @@ namespace AsmCommon {
//aarch64_reg,
//aarch64_vreg,

//arm_reg,
//arm_sreg,
//arm_dreg,
//arm_qreg,
arm_reg,
arm_sreg,
arm_dreg,
arm_qreg,

//mips_reg,
//mips_freg,
Expand Down Expand Up @@ -108,6 +108,10 @@ namespace AsmCommon {
case RegisterClass::x86_kreg: return "kreg";
case RegisterClass::riscv_reg: return "reg";
case RegisterClass::riscv_freg: return "freg";
case RegisterClass::arm_reg: return "reg";
case RegisterClass::arm_sreg: return "sreg";
case RegisterClass::arm_dreg: return "dreg";
case RegisterClass::arm_qreg: return "qreg";
}
throw "";
}
Expand Down
12 changes: 12 additions & 0 deletions src/hir_conv/constant_evaluation.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2879,6 +2879,18 @@ namespace HIR {
auto vr_dst = ValueRef(ptr_dst.second, ptr_dst.first - EncodedLiteral::PTR_BASE).slice(0, nbytes);
vr_dst.copy_from(state, vr_src);
}
else if( te->name == "arith_offset" ) {
// XXX: This doesn't work, because te->params.m_types.at().data() is Generic, not Pointer
size_t element_size;
//auto ty = local_state.monomorph_expand(te->params.m_types.at(0).data().as_Pointer().inner);
//if( !Target_GetSizeOf(state.sp, resolve, ty, element_size) )
// throw Defer();

element_size = 1;
auto ptr_pair = local_state.read_param_ptr(e.args.at(0));
auto ofs = local_state.read_param_uint(Target_GetPointerBits(), e.args.at(1));
dst.write_ptr(state, ptr_pair.first + ofs.truncate_u64() * element_size, ptr_pair.second);
}
else if( te->name == "offset" ) {
auto ty = local_state.monomorph_expand(te->params.m_types.at(0).data().as_Pointer().inner);
size_t element_size;
Expand Down
11 changes: 11 additions & 0 deletions src/trans/codegen_c.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -5439,6 +5439,7 @@ namespace {
TU_MATCH_HDRA((p.spec), {)
TU_ARMA(Class, c)
// https://gcc.gnu.org/onlinedocs/gcc/Machine-Constraints.html
// arm: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=37188
switch(c)
{
// x86
Expand All @@ -5452,6 +5453,11 @@ namespace {
// riscv
case AsmCommon::RegisterClass::riscv_reg: m_of << "r"; break;
case AsmCommon::RegisterClass::riscv_freg: m_of << "f"; break;
// arm
case AsmCommon::RegisterClass::arm_reg: m_of << "r"; break;
case AsmCommon::RegisterClass::arm_sreg: m_of << "t"; break;
case AsmCommon::RegisterClass::arm_dreg: m_of << "w"; break;
case AsmCommon::RegisterClass::arm_qreg: m_of << "w"; break;
}
TU_ARMA(Explicit, name) {
m_of << "r";
Expand Down Expand Up @@ -5493,6 +5499,11 @@ namespace {
// riscv
case AsmCommon::RegisterClass::riscv_reg: m_of << "r"; break;
case AsmCommon::RegisterClass::riscv_freg: m_of << "f"; break;
// arm
case AsmCommon::RegisterClass::arm_reg: m_of << "r"; break;
case AsmCommon::RegisterClass::arm_sreg: m_of << "t"; break;
case AsmCommon::RegisterClass::arm_dreg: m_of << "w"; break;
case AsmCommon::RegisterClass::arm_qreg: m_of << "w"; break;
}
TU_ARMA(Explicit, name) {
auto it = ::std::find(outputs.begin(), outputs.end(), &r);
Expand Down
7 changes: 7 additions & 0 deletions src/trans/target.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -462,6 +462,13 @@ namespace
ARCH_ARM32
};
}
else if(target_name == "arm-linux-musl" || target_name == "arm-unknown-linux-musl")
{
return TargetSpec {
"unix", "linux", "musl", {CodegenMode::Gnu11, true, "arm-elf-eabi", BACKEND_C_OPTS_GNU},
ARCH_ARM32
};
}
else if(target_name == "aarch64-linux-gnu" || target_name == "aarch64-unknown-linux-gnu")
{
return TargetSpec {
Expand Down
Loading