Skip to content

Commit

Permalink
[CIR][CIRGen][Builtin][Clang] Lowering clang::AArch64::BI__builtin_ar…
Browse files Browse the repository at this point in the history
…m_ldaex
  • Loading branch information
AmrDeveloper committed Jan 26, 2025
1 parent 7bdf358 commit e1ed516
Show file tree
Hide file tree
Showing 2 changed files with 50 additions and 9 deletions.
10 changes: 4 additions & 6 deletions clang/lib/CIR/CodeGen/CIRGenBuiltinAArch64.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2124,12 +2124,10 @@ mlir::Value CIRGenFunction::emitScalarOrConstFoldImmArg(unsigned ICEArguments,
static mlir::Value emitArmLdrexNon128Intrinsic(unsigned int builtinID,
const CallExpr *clangCallExpr,
CIRGenFunction &cgf) {
StringRef intrinsicName;
if (builtinID == clang::AArch64::BI__builtin_arm_ldrex) {
intrinsicName = "aarch64.ldxr";
} else {
llvm_unreachable("Unknown builtinID");
}
StringRef intrinsicName = builtinID == clang::AArch64::BI__builtin_arm_ldrex
? "aarch64.ldxr"
: "aarch64.ldaex";

// Argument
mlir::Value loadAddr = cgf.emitScalarExpr(clangCallExpr->getArg(0));
// Get Instrinc call
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,17 +5,18 @@ struct twoFldT {
char a, b;
};
// CIR: !ty_twoFldT = !cir.struct<struct "twoFldT" {!s8i, !s8i}

int test_ldrex(char *addr, long long *addr64, float *addrfloat) {
// CIR-LABEL: @test_ldrex
int sum = 0;
sum += __builtin_arm_ldrex(addr);
// CIR: [[INTRES0:%.*]] = cir.llvm.intrinsic "aarch64.ldxr" {{%[0-9]+}} : (!cir.ptr<!s8i>) -> !s64i
// CIR: [[CAST0:%.*]] = cir.cast(integral, [[INTRES0]] : !s64i), !s8i
// CIR: [[INTRES0:%.*]] = cir.llvm.intrinsic "aarch64.ldxr" {{%[0-9]+}} : (!cir.ptr<!s8i>) -> !s64i
// CIR: [[CAST0:%.*]] = cir.cast(integral, [[INTRES0]] : !s64i), !s8i
// CIR: [[CAST_I32:%.*]] = cir.cast(integral, [[CAST0]] : !s8i), !s32i

sum += __builtin_arm_ldrex((short *)addr);
// CIR: [[INTRES1:%.*]] = cir.llvm.intrinsic "aarch64.ldxr" {{%[0-9]+}} : (!cir.ptr<!s16i>) -> !s64i
// CIR: [[CAST1:%.*]] = cir.cast(integral, [[INTRES1]] : !s64i), !s16i
// CIR: [[CAST1:%.*]] = cir.cast(integral, [[INTRES1]] : !s64i), !s16i
// CIR: [[CAST_I16:%.*]] = cir.cast(integral, [[CAST1]] : !s16i), !s32i

sum += __builtin_arm_ldrex((int *)addr);
Expand Down Expand Up @@ -44,5 +45,47 @@ int test_ldrex(char *addr, long long *addr64, float *addrfloat) {
// sum += __builtin_arm_ldrex((double *)addr);


return sum;
}

int test_ldaex(char *addr, long long *addr64, float *addrfloat) {
// CIR-LABEL: @test_ldaex
int sum = 0;
sum += __builtin_arm_ldaex(addr);
// CIR: [[INTRES0:%.*]] = cir.llvm.intrinsic "aarch64.ldaex" {{%[0-9]+}} : (!cir.ptr<!s8i>) -> !s64i
// CIR: [[CAST0:%.*]] = cir.cast(integral, [[INTRES0]] : !s64i), !s8i
// CIR: [[CAST_I32:%.*]] = cir.cast(integral, [[CAST0]] : !s8i), !s32i

sum += __builtin_arm_ldaex((short *)addr);
// CIR: [[INTRES1:%.*]] = cir.llvm.intrinsic "aarch64.ldaex" {{%[0-9]+}} : (!cir.ptr<!s16i>) -> !s64i
// CIR: [[CAST1:%.*]] = cir.cast(integral, [[INTRES1]] : !s64i), !s16i
// CIR: [[CAST_I16:%.*]] = cir.cast(integral, [[CAST1]] : !s16i), !s32i

sum += __builtin_arm_ldaex((int *)addr);
// CIR: [[INTRES2:%.*]] = cir.llvm.intrinsic "aarch64.ldaex" {{%[0-9]+}} : (!cir.ptr<!s32i>) -> !s64i
// CIR: [[CAST2:%.*]] = cir.cast(integral, [[INTRES2]] : !s64i), !s32i

sum += __builtin_arm_ldaex((long long *)addr);
// CIR: [[INTRES3:%.*]] = cir.llvm.intrinsic "aarch64.ldaex" {{%[0-9]+}} : (!cir.ptr<!s64i>) -> !s64i

sum += __builtin_arm_ldaex(addr64);
// CIR: [[INTRES4:%.*]] = cir.llvm.intrinsic "aarch64.ldaex" {{%[0-9]+}} : (!cir.ptr<!s64i>) -> !s64i


sum += *__builtin_arm_ldaex((int **)addr);
// CIR: [[INTRES5:%.*]] = cir.llvm.intrinsic "aarch64.ldaex" {{%[0-9]+}} : (!cir.ptr<!cir.ptr<!s32i>>) -> !s64i

sum += __builtin_arm_ldaex((struct twoFldT **)addr)->a;
// CIR: [[INTRES6:%.*]] = cir.llvm.intrinsic "aarch64.ldaex" {{%[0-9]+}} : (!cir.ptr<!cir.ptr<!ty_twoFldT>>) -> !s64i
// CIR: [[CAST3:%.*]] = cir.cast(int_to_ptr, [[INTRES6]] : !s64i), !cir.ptr<!ty_twoFldT>
// CIR: [[MEMBER_A:%.*]] = cir.get_member [[CAST3]][0] {name = "a"} : !cir.ptr<!ty_twoFldT> -> !cir.ptr<!s8i>


// TODO: Uncomment next 2 lines, add tests when floating result type supported
// sum += __builtin_arm_ldaex(addrfloat);

// sum += __builtin_arm_ldaex((double *)addr);


return sum;
}

0 comments on commit e1ed516

Please sign in to comment.