diff --git a/src/hir/asm.hpp b/src/hir/asm.hpp index 3b1d0313e..28115d904 100644 --- a/src/hir/asm.hpp +++ b/src/hir/asm.hpp @@ -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, @@ -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 ""; } diff --git a/src/hir_conv/constant_evaluation.cpp b/src/hir_conv/constant_evaluation.cpp index 882558379..6aa5a2f63 100644 --- a/src/hir_conv/constant_evaluation.cpp +++ b/src/hir_conv/constant_evaluation.cpp @@ -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; diff --git a/src/trans/codegen_c.cpp b/src/trans/codegen_c.cpp index 8d36ae418..e09ece19c 100644 --- a/src/trans/codegen_c.cpp +++ b/src/trans/codegen_c.cpp @@ -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 @@ -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"; @@ -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); diff --git a/src/trans/target.cpp b/src/trans/target.cpp index 78d1cd8c3..10ba157f7 100644 --- a/src/trans/target.cpp +++ b/src/trans/target.cpp @@ -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 {