@@ -5,17 +5,18 @@ struct twoFldT {
5
5
char a , b ;
6
6
};
7
7
// CIR: !ty_twoFldT = !cir.struct<struct "twoFldT" {!s8i, !s8i}
8
+
8
9
int test_ldrex (char * addr , long long * addr64 , float * addrfloat ) {
9
10
// CIR-LABEL: @test_ldrex
10
11
int sum = 0 ;
11
12
sum += __builtin_arm_ldrex (addr );
12
- // CIR: [[INTRES0:%.*]] = cir.llvm.intrinsic "aarch64.ldxr" {{%[0-9]+}} : (!cir.ptr<!s8i>) -> !s64i
13
- // CIR: [[CAST0:%.*]] = cir.cast(integral, [[INTRES0]] : !s64i), !s8i
13
+ // CIR: [[INTRES0:%.*]] = cir.llvm.intrinsic "aarch64.ldxr" {{%[0-9]+}} : (!cir.ptr<!s8i>) -> !s64i
14
+ // CIR: [[CAST0:%.*]] = cir.cast(integral, [[INTRES0]] : !s64i), !s8i
14
15
// CIR: [[CAST_I32:%.*]] = cir.cast(integral, [[CAST0]] : !s8i), !s32i
15
16
16
17
sum += __builtin_arm_ldrex ((short * )addr );
17
18
// CIR: [[INTRES1:%.*]] = cir.llvm.intrinsic "aarch64.ldxr" {{%[0-9]+}} : (!cir.ptr<!s16i>) -> !s64i
18
- // CIR: [[CAST1:%.*]] = cir.cast(integral, [[INTRES1]] : !s64i), !s16i
19
+ // CIR: [[CAST1:%.*]] = cir.cast(integral, [[INTRES1]] : !s64i), !s16i
19
20
// CIR: [[CAST_I16:%.*]] = cir.cast(integral, [[CAST1]] : !s16i), !s32i
20
21
21
22
sum += __builtin_arm_ldrex ((int * )addr );
@@ -44,5 +45,47 @@ int test_ldrex(char *addr, long long *addr64, float *addrfloat) {
44
45
// sum += __builtin_arm_ldrex((double *)addr);
45
46
46
47
48
+ return sum ;
49
+ }
50
+
51
+ int test_ldaex (char * addr , long long * addr64 , float * addrfloat ) {
52
+ // CIR-LABEL: @test_ldaex
53
+ int sum = 0 ;
54
+ sum += __builtin_arm_ldaex (addr );
55
+ // CIR: [[INTRES0:%.*]] = cir.llvm.intrinsic "aarch64.ldaxr" {{%[0-9]+}} : (!cir.ptr<!s8i>) -> !s64i
56
+ // CIR: [[CAST0:%.*]] = cir.cast(integral, [[INTRES0]] : !s64i), !s8i
57
+ // CIR: [[CAST_I32:%.*]] = cir.cast(integral, [[CAST0]] : !s8i), !s32i
58
+
59
+ sum += __builtin_arm_ldaex ((short * )addr );
60
+ // CIR: [[INTRES1:%.*]] = cir.llvm.intrinsic "aarch64.ldaxr" {{%[0-9]+}} : (!cir.ptr<!s16i>) -> !s64i
61
+ // CIR: [[CAST1:%.*]] = cir.cast(integral, [[INTRES1]] : !s64i), !s16i
62
+ // CIR: [[CAST_I16:%.*]] = cir.cast(integral, [[CAST1]] : !s16i), !s32i
63
+
64
+ sum += __builtin_arm_ldaex ((int * )addr );
65
+ // CIR: [[INTRES2:%.*]] = cir.llvm.intrinsic "aarch64.ldaxr" {{%[0-9]+}} : (!cir.ptr<!s32i>) -> !s64i
66
+ // CIR: [[CAST2:%.*]] = cir.cast(integral, [[INTRES2]] : !s64i), !s32i
67
+
68
+ sum += __builtin_arm_ldaex ((long long * )addr );
69
+ // CIR: [[INTRES3:%.*]] = cir.llvm.intrinsic "aarch64.ldaxr" {{%[0-9]+}} : (!cir.ptr<!s64i>) -> !s64i
70
+
71
+ sum += __builtin_arm_ldaex (addr64 );
72
+ // CIR: [[INTRES4:%.*]] = cir.llvm.intrinsic "aarch64.ldaxr" {{%[0-9]+}} : (!cir.ptr<!s64i>) -> !s64i
73
+
74
+
75
+ sum += * __builtin_arm_ldaex ((int * * )addr );
76
+ // CIR: [[INTRES5:%.*]] = cir.llvm.intrinsic "aarch64.ldaxr" {{%[0-9]+}} : (!cir.ptr<!cir.ptr<!s32i>>) -> !s64i
77
+
78
+ sum += __builtin_arm_ldaex ((struct twoFldT * * )addr )-> a ;
79
+ // CIR: [[INTRES6:%.*]] = cir.llvm.intrinsic "aarch64.ldaxr" {{%[0-9]+}} : (!cir.ptr<!cir.ptr<!ty_twoFldT>>) -> !s64i
80
+ // CIR: [[CAST3:%.*]] = cir.cast(int_to_ptr, [[INTRES6]] : !s64i), !cir.ptr<!ty_twoFldT>
81
+ // CIR: [[MEMBER_A:%.*]] = cir.get_member [[CAST3]][0] {name = "a"} : !cir.ptr<!ty_twoFldT> -> !cir.ptr<!s8i>
82
+
83
+
84
+ // TODO: Uncomment next 2 lines, add tests when floating result type supported
85
+ // sum += __builtin_arm_ldaex(addrfloat);
86
+
87
+ // sum += __builtin_arm_ldaex((double *)addr);
88
+
89
+
47
90
return sum ;
48
91
}
0 commit comments