Skip to content

Commit b04672c

Browse files
Vasileios KalintirisVasileios Kalintiris
Vasileios Kalintiris
authored and
Vasileios Kalintiris
committedNov 6, 2015
[mips] Define patterns for the atomic_{load,store}_{8,16,32,64} nodes.
Summary: Without these patterns we would generate a complete LL/SC sequence. This would be problematic for memory regions marked as WRITE-only or READ-only, as the instructions LL/SC would read/write to the protected memory regions correspondingly. Reviewers: dsanders Subscribers: llvm-commits, dsanders Differential Revision: http://reviews.llvm.org/D14397 llvm-svn: 252293
1 parent 4cd631c commit b04672c

File tree

7 files changed

+136
-36
lines changed

7 files changed

+136
-36
lines changed
 

‎llvm/lib/Target/Mips/Mips64InstrInfo.td

+12
Original file line numberDiff line numberDiff line change
@@ -546,6 +546,18 @@ def : MipsPat<(brcond (i32 (setne (and i64:$lhs, PowerOf2HI:$mask), 0)), bb:$dst
546546
(BBIT132 i64:$lhs, (Log2HI PowerOf2HI:$mask), bb:$dst)>;
547547
}
548548

549+
// Atomic load patterns.
550+
def : MipsPat<(atomic_load_8 addr:$a), (LB64 addr:$a)>;
551+
def : MipsPat<(atomic_load_16 addr:$a), (LH64 addr:$a)>;
552+
def : MipsPat<(atomic_load_32 addr:$a), (LW64 addr:$a)>;
553+
def : MipsPat<(atomic_load_64 addr:$a), (LD addr:$a)>;
554+
555+
// Atomic store patterns.
556+
def : MipsPat<(atomic_store_8 addr:$a, GPR64:$v), (SB64 GPR64:$v, addr:$a)>;
557+
def : MipsPat<(atomic_store_16 addr:$a, GPR64:$v), (SH64 GPR64:$v, addr:$a)>;
558+
def : MipsPat<(atomic_store_32 addr:$a, GPR64:$v), (SW64 GPR64:$v, addr:$a)>;
559+
def : MipsPat<(atomic_store_64 addr:$a, GPR64:$v), (SD GPR64:$v, addr:$a)>;
560+
549561
//===----------------------------------------------------------------------===//
550562
// Instruction aliases
551563
//===----------------------------------------------------------------------===//

‎llvm/lib/Target/Mips/MipsISelLowering.cpp

+4-4
Original file line numberDiff line numberDiff line change
@@ -391,10 +391,10 @@ MipsTargetLowering::MipsTargetLowering(const MipsTargetMachine &TM,
391391
setOperationAction(ISD::STACKSAVE, MVT::Other, Expand);
392392
setOperationAction(ISD::STACKRESTORE, MVT::Other, Expand);
393393

394-
setOperationAction(ISD::ATOMIC_LOAD, MVT::i32, Expand);
395-
setOperationAction(ISD::ATOMIC_LOAD, MVT::i64, Expand);
396-
setOperationAction(ISD::ATOMIC_STORE, MVT::i32, Expand);
397-
setOperationAction(ISD::ATOMIC_STORE, MVT::i64, Expand);
394+
if (!Subtarget.isGP64bit()) {
395+
setOperationAction(ISD::ATOMIC_LOAD, MVT::i64, Expand);
396+
setOperationAction(ISD::ATOMIC_STORE, MVT::i64, Expand);
397+
}
398398

399399
setInsertFencesForAtomic(true);
400400

‎llvm/lib/Target/Mips/MipsInstrInfo.td

+10
Original file line numberDiff line numberDiff line change
@@ -2083,6 +2083,16 @@ let AddedComplexity = 40 in {
20832083
}
20842084
}
20852085

2086+
// Atomic load patterns.
2087+
def : MipsPat<(atomic_load_8 addr:$a), (LB addr:$a)>;
2088+
def : MipsPat<(atomic_load_16 addr:$a), (LH addr:$a)>;
2089+
def : MipsPat<(atomic_load_32 addr:$a), (LW addr:$a)>;
2090+
2091+
// Atomic store patterns.
2092+
def : MipsPat<(atomic_store_8 addr:$a, GPR32:$v), (SB GPR32:$v, addr:$a)>;
2093+
def : MipsPat<(atomic_store_16 addr:$a, GPR32:$v), (SH GPR32:$v, addr:$a)>;
2094+
def : MipsPat<(atomic_store_32 addr:$a, GPR32:$v), (SW GPR32:$v, addr:$a)>;
2095+
20862096
//===----------------------------------------------------------------------===//
20872097
// Floating Point Support
20882098
//===----------------------------------------------------------------------===//

‎llvm/test/CodeGen/Mips/atomicSCr6.ll

-32
This file was deleted.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
; RUN: llc -asm-show-inst -march=mipsel -mcpu=mips32r6 < %s | \
2+
; RUN: FileCheck %s -check-prefix=CHK32
3+
; RUN: llc -asm-show-inst -march=mips64el -mcpu=mips64r6 < %s | \
4+
; RUN: FileCheck %s -check-prefix=CHK64
5+
6+
@a = common global i32 0, align 4
7+
@b = common global i64 0, align 8
8+
9+
10+
define i32 @ll_sc(i32 signext %x) {
11+
; CHK32-LABEL: ll_sc
12+
13+
;CHK32: LL_R6
14+
;CHK32: SC_R6
15+
%1 = atomicrmw add i32* @a, i32 %x monotonic
16+
ret i32 %1
17+
}
18+
19+
define i64 @lld_scd(i64 signext %x) {
20+
; CHK64-LABEL: lld_scd
21+
22+
;CHK64: LLD_R6
23+
;CHK64: SCD_R6
24+
%1 = atomicrmw add i64* @b, i64 %x monotonic
25+
ret i64 %1
26+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
; RUN: llc -march=mips -mcpu=mips32r2 < %s | FileCheck %s -check-prefix=ALL
2+
; RUN: llc -march=mips -mcpu=mips32r6 < %s | FileCheck %s -check-prefix=ALL
3+
; RUN: llc -march=mips64 -mcpu=mips64r2 < %s | \
4+
; RUN: FileCheck %s -check-prefix=ALL -check-prefix=M64
5+
; RUN: llc -march=mips64 -mcpu=mips64r6 < %s | \
6+
; RUN: FileCheck %s -check-prefix=ALL -check-prefix=M64
7+
8+
define i8 @load_i8(i8* %ptr) {
9+
; ALL-LABEL: load_i8
10+
11+
; ALL: lb $2, 0($4)
12+
; ALL: sync
13+
%val = load atomic i8, i8* %ptr acquire, align 1
14+
ret i8 %val
15+
}
16+
17+
define i16 @load_i16(i16* %ptr) {
18+
; ALL-LABEL: load_i16
19+
20+
; ALL: lh $2, 0($4)
21+
; ALL: sync
22+
%val = load atomic i16, i16* %ptr acquire, align 2
23+
ret i16 %val
24+
}
25+
26+
define i32 @load_i32(i32* %ptr) {
27+
; ALL-LABEL: load_i32
28+
29+
; ALL: lw $2, 0($4)
30+
; ALL: sync
31+
%val = load atomic i32, i32* %ptr acquire, align 4
32+
ret i32 %val
33+
}
34+
35+
define i64 @load_i64(i64* %ptr) {
36+
; M64-LABEL: load_i64
37+
38+
; M64: ld $2, 0($4)
39+
; M64: sync
40+
%val = load atomic i64, i64* %ptr acquire, align 8
41+
ret i64 %val
42+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
; RUN: llc -march=mips -mcpu=mips32r2 < %s | FileCheck %s -check-prefix=ALL
2+
; RUN: llc -march=mips -mcpu=mips32r6 < %s | FileCheck %s -check-prefix=ALL
3+
; RUN: llc -march=mips64 -mcpu=mips64r2 < %s | \
4+
; RUN: FileCheck %s -check-prefix=ALL -check-prefix=M64
5+
; RUN: llc -march=mips64 -mcpu=mips64r6 < %s | \
6+
; RUN: FileCheck %s -check-prefix=ALL -check-prefix=M64
7+
8+
define void @store_i8(i8* %ptr, i8 signext %v) {
9+
; ALL-LABEL: store_i8
10+
11+
; ALL: sync
12+
; ALL: sb $5, 0($4)
13+
store atomic i8 %v, i8* %ptr release, align 1
14+
ret void
15+
}
16+
17+
define void @store_i16(i16* %ptr, i16 signext %v) {
18+
; ALL-LABEL: store_i16
19+
20+
; ALL: sync
21+
; ALL: sh $5, 0($4)
22+
store atomic i16 %v, i16* %ptr release, align 2
23+
ret void
24+
}
25+
26+
define void @store_i32(i32* %ptr, i32 signext %v) {
27+
; ALL-LABEL: store_i32
28+
29+
; ALL: sync
30+
; ALL: sw $5, 0($4)
31+
store atomic i32 %v, i32* %ptr release, align 4
32+
ret void
33+
}
34+
35+
define void @store_i64(i64* %ptr, i64 %v) {
36+
; M64-LABEL: store_i64
37+
38+
; M64: sync
39+
; M64: sd $5, 0($4)
40+
store atomic i64 %v, i64* %ptr release, align 8
41+
ret void
42+
}

0 commit comments

Comments
 (0)
Please sign in to comment.