Skip to content

Commit 20a8b6c

Browse files
committed
[CHERIoT] Fix instruction selection of load-ext and trunc-store operations on CHERIoT.
1 parent f4f1dfb commit 20a8b6c

File tree

2 files changed

+103
-0
lines changed

2 files changed

+103
-0
lines changed

llvm/lib/Target/RISCV/RISCVISelLowering.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -753,6 +753,11 @@ RISCVTargetLowering::RISCVTargetLowering(const TargetMachine &TM,
753753
ISD::BR_CC, ISD::SELECT};
754754
setOperationAction(CheriotF64ExpandOps, MVT::f64, Expand);
755755
setCondCodeAction(FPCCToExpand, MVT::f64, Expand);
756+
757+
setTruncStoreAction(MVT::f64, MVT::f16, Expand);
758+
setTruncStoreAction(MVT::f64, MVT::f32, Expand);
759+
setLoadExtAction(ISD::EXTLOAD, MVT::f64, MVT::f16, Expand);
760+
setLoadExtAction(ISD::EXTLOAD, MVT::f64, MVT::f32, Expand);
756761
}
757762

758763
// TODO: On M-mode only targets, the cycle[h]/time[h] CSR may not be present.

llvm/test/CodeGen/RISCV/cheri/cheriot-f64-abi.ll

Lines changed: 98 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -360,6 +360,104 @@ start:
360360
ret double %c
361361
}
362362

363+
define dso_local void @trunc_store(ptr addrspace(200) noundef writeonly captures(none) initializes((0, 4)) %a, double noundef %b) local_unnamed_addr addrspace(200) #0 {
364+
; CHECK-LABEL: trunc_store:
365+
; CHECK: # %bb.0: # %entry
366+
; CHECK-NEXT: ct.cincoffset csp, csp, -16
367+
; CHECK-NEXT: ct.csc cra, 8(csp) # 8-byte Folded Spill
368+
; CHECK-NEXT: ct.csc cs0, 0(csp) # 8-byte Folded Spill
369+
; CHECK-NEXT: ct.cmove cs0, ca0
370+
; CHECK-NEXT: ct.cmove ca0, ca1
371+
; CHECK-NEXT: .LBB19_1: # %entry
372+
; CHECK-NEXT: # Label of block must be emitted
373+
; CHECK-NEXT: ct.auipcc ct2, %cheriot_compartment_hi(__library_import_libcalls___truncdfsf2)
374+
; CHECK-NEXT: ct.clc ct2, %cheriot_compartment_lo_i(.LBB19_1)(ct2)
375+
; CHECK-NEXT: ct.cjalr ct2
376+
; CHECK-NEXT: ct.csw a0, 0(cs0)
377+
; CHECK-NEXT: ct.clc cra, 8(csp) # 8-byte Folded Reload
378+
; CHECK-NEXT: ct.clc cs0, 0(csp) # 8-byte Folded Reload
379+
; CHECK-NEXT: ct.cincoffset csp, csp, 16
380+
; CHECK-NEXT: ct.cret
381+
entry:
382+
%conv = fptrunc double %b to float
383+
store float %conv, ptr addrspace(200) %a, align 4, !tbaa !6
384+
ret void
385+
}
386+
387+
define dso_local void @ext_store(ptr addrspace(200) noundef writeonly captures(none) initializes((0, 8)) %a, float noundef %b) local_unnamed_addr addrspace(200) #0 {
388+
; CHECK-LABEL: ext_store:
389+
; CHECK: # %bb.0: # %entry
390+
; CHECK-NEXT: ct.cincoffset csp, csp, -16
391+
; CHECK-NEXT: ct.csc cra, 8(csp) # 8-byte Folded Spill
392+
; CHECK-NEXT: ct.csc cs0, 0(csp) # 8-byte Folded Spill
393+
; CHECK-NEXT: ct.cmove cs0, ca0
394+
; CHECK-NEXT: mv a0, a1
395+
; CHECK-NEXT: .LBB20_1: # %entry
396+
; CHECK-NEXT: # Label of block must be emitted
397+
; CHECK-NEXT: ct.auipcc ct2, %cheriot_compartment_hi(__library_import_libcalls___extendsfdf2)
398+
; CHECK-NEXT: ct.clc ct2, %cheriot_compartment_lo_i(.LBB20_1)(ct2)
399+
; CHECK-NEXT: ct.cjalr ct2
400+
; CHECK-NEXT: ct.csc ca0, 0(cs0)
401+
; CHECK-NEXT: ct.clc cra, 8(csp) # 8-byte Folded Reload
402+
; CHECK-NEXT: ct.clc cs0, 0(csp) # 8-byte Folded Reload
403+
; CHECK-NEXT: ct.cincoffset csp, csp, 16
404+
; CHECK-NEXT: ct.cret
405+
entry:
406+
%conv = fpext float %b to double
407+
store double %conv, ptr addrspace(200) %a, align 8, !tbaa !10
408+
ret void
409+
}
410+
411+
define dso_local void @load_ext_store(ptr addrspace(200) noundef writeonly captures(none) initializes((0, 8)) %a, ptr addrspace(200) noundef readonly captures(none) %b) local_unnamed_addr addrspace(200) #1 {
412+
; CHECK-LABEL: load_ext_store:
413+
; CHECK: # %bb.0: # %entry
414+
; CHECK-NEXT: ct.cincoffset csp, csp, -16
415+
; CHECK-NEXT: ct.csc cra, 8(csp) # 8-byte Folded Spill
416+
; CHECK-NEXT: ct.csc cs0, 0(csp) # 8-byte Folded Spill
417+
; CHECK-NEXT: ct.clw a1, 0(ca1)
418+
; CHECK-NEXT: ct.cmove cs0, ca0
419+
; CHECK-NEXT: mv a0, a1
420+
; CHECK-NEXT: .LBB21_1: # %entry
421+
; CHECK-NEXT: # Label of block must be emitted
422+
; CHECK-NEXT: ct.auipcc ct2, %cheriot_compartment_hi(__library_import_libcalls___extendsfdf2)
423+
; CHECK-NEXT: ct.clc ct2, %cheriot_compartment_lo_i(.LBB21_1)(ct2)
424+
; CHECK-NEXT: ct.cjalr ct2
425+
; CHECK-NEXT: ct.csc ca0, 0(cs0)
426+
; CHECK-NEXT: ct.clc cra, 8(csp) # 8-byte Folded Reload
427+
; CHECK-NEXT: ct.clc cs0, 0(csp) # 8-byte Folded Reload
428+
; CHECK-NEXT: ct.cincoffset csp, csp, 16
429+
; CHECK-NEXT: ct.cret
430+
entry:
431+
%0 = load float, ptr addrspace(200) %b, align 4, !tbaa !6
432+
%conv = fpext float %0 to double
433+
store double %conv, ptr addrspace(200) %a, align 8, !tbaa !10
434+
ret void
435+
}
436+
437+
define dso_local void @load_trunc_store(ptr addrspace(200) noundef readonly captures(none) %a, ptr addrspace(200) noundef writeonly captures(none) initializes((0, 4)) %b) local_unnamed_addr addrspace(200) #1 {
438+
; CHECK-LABEL: load_trunc_store:
439+
; CHECK: # %bb.0: # %entry
440+
; CHECK-NEXT: ct.cincoffset csp, csp, -16
441+
; CHECK-NEXT: ct.csc cra, 8(csp) # 8-byte Folded Spill
442+
; CHECK-NEXT: ct.csc cs0, 0(csp) # 8-byte Folded Spill
443+
; CHECK-NEXT: ct.clc ca0, 0(ca0)
444+
; CHECK-NEXT: ct.cmove cs0, ca1
445+
; CHECK-NEXT: .LBB22_1: # %entry
446+
; CHECK-NEXT: # Label of block must be emitted
447+
; CHECK-NEXT: ct.auipcc ct2, %cheriot_compartment_hi(__library_import_libcalls___truncdfsf2)
448+
; CHECK-NEXT: ct.clc ct2, %cheriot_compartment_lo_i(.LBB22_1)(ct2)
449+
; CHECK-NEXT: ct.cjalr ct2
450+
; CHECK-NEXT: ct.csw a0, 0(cs0)
451+
; CHECK-NEXT: ct.clc cra, 8(csp) # 8-byte Folded Reload
452+
; CHECK-NEXT: ct.clc cs0, 0(csp) # 8-byte Folded Reload
453+
; CHECK-NEXT: ct.cincoffset csp, csp, 16
454+
; CHECK-NEXT: ct.cret
455+
entry:
456+
%0 = load double, ptr addrspace(200) %a, align 8, !tbaa !10
457+
%conv = fptrunc double %0 to float
458+
store float %conv, ptr addrspace(200) %b, align 4, !tbaa !6
459+
ret void
460+
}
363461

364462
attributes #0 = { mustprogress nofree norecurse nosync nounwind willreturn memory(none) "cheri-compartment"="qoi_decode" "no-builtin-longjmp" "no-builtin-printf" "no-builtin-setjmp" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="cheriot" "target-features"="+32bit,+c,+e,+m,+relax,+unaligned-scalar-mem,+xcheri,+xcheriot,+zmmul,-a,-b,-d,-experimental-sdext,-experimental-sdtrig,-experimental-smctr,-experimental-ssctr,-experimental-svukte,-experimental-xqcia,-experimental-xqciac,-experimental-xqcicli,-experimental-xqcicm,-experimental-xqcics,-experimental-xqcicsr,-experimental-xqciint,-experimental-xqcilo,-experimental-xqcilsm,-experimental-xqcisls,-experimental-zalasr,-experimental-zicfilp,-experimental-zicfiss,-experimental-zvbc32e,-experimental-zvkgs,-f,-h,-i,-sha,-shcounterenw,-shgatpa,-shtvala,-shvsatpa,-shvstvala,-shvstvecd,-smaia,-smcdeleg,-smcsrind,-smdbltrp,-smepmp,-smmpm,-smnpm,-smrnmi,-smstateen,-ssaia,-ssccfg,-ssccptr,-sscofpmf,-sscounterenw,-sscsrind,-ssdbltrp,-ssnpm,-sspm,-ssqosid,-ssstateen,-ssstrict,-sstc,-sstvala,-sstvecd,-ssu64xl,-supm,-svade,-svadu,-svbare,-svinval,-svnapot,-svpbmt,-svvptc,-v,-xcheri-norvc,-xcvalu,-xcvbi,-xcvbitmanip,-xcvelw,-xcvmac,-xcvmem,-xcvsimd,-xmipscmove,-xmipslsp,-xsfcease,-xsfvcp,-xsfvfnrclipxfqf,-xsfvfwmaccqqq,-xsfvqmaccdod,-xsfvqmaccqoq,-xsifivecdiscarddlone,-xsifivecflushdlone,-xtheadba,-xtheadbb,-xtheadbs,-xtheadcmo,-xtheadcondmov,-xtheadfmemidx,-xtheadmac,-xtheadmemidx,-xtheadmempair,-xtheadsync,-xtheadvdot,-xventanacondops,-xwchc,-za128rs,-za64rs,-zaamo,-zabha,-zacas,-zalrsc,-zama16b,-zawrs,-zba,-zbb,-zbc,-zbkb,-zbkc,-zbkx,-zbs,-zca,-zcb,-zcd,-zce,-zcf,-zcmop,-zcmp,-zcmt,-zdinx,-zfa,-zfbfmin,-zfh,-zfhmin,-zfinx,-zhinx,-zhinxmin,-zic64b,-zicbom,-zicbop,-zicboz,-ziccamoa,-ziccif,-zicclsm,-ziccrse,-zicntr,-zicond,-zicsr,-zifencei,-zihintntl,-zihintpause,-zihpm,-zimop,-zk,-zkn,-zknd,-zkne,-zknh,-zkr,-zks,-zksed,-zksh,-zkt,-ztso,-zvbb,-zvbc,-zve32f,-zve32x,-zve64d,-zve64f,-zve64x,-zvfbfmin,-zvfbfwma,-zvfh,-zvfhmin,-zvkb,-zvkg,-zvkn,-zvknc,-zvkned,-zvkng,-zvknha,-zvknhb,-zvks,-zvksc,-zvksed,-zvksg,-zvksh,-zvkt,-zvl1024b,-zvl128b,-zvl16384b,-zvl2048b,-zvl256b,-zvl32768b,-zvl32b,-zvl4096b,-zvl512b,-zvl64b,-zvl65536b,-zvl8192b" }
365463
attributes #1 = { mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: read) "cheri-compartment"="qoi_decode" "no-builtin-longjmp" "no-builtin-printf" "no-builtin-setjmp" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="cheriot" "target-features"="+32bit,+c,+e,+m,+relax,+unaligned-scalar-mem,+xcheri,+xcheriot,+zmmul,-a,-b,-d,-experimental-sdext,-experimental-sdtrig,-experimental-smctr,-experimental-ssctr,-experimental-svukte,-experimental-xqcia,-experimental-xqciac,-experimental-xqcicli,-experimental-xqcicm,-experimental-xqcics,-experimental-xqcicsr,-experimental-xqciint,-experimental-xqcilo,-experimental-xqcilsm,-experimental-xqcisls,-experimental-zalasr,-experimental-zicfilp,-experimental-zicfiss,-experimental-zvbc32e,-experimental-zvkgs,-f,-h,-i,-sha,-shcounterenw,-shgatpa,-shtvala,-shvsatpa,-shvstvala,-shvstvecd,-smaia,-smcdeleg,-smcsrind,-smdbltrp,-smepmp,-smmpm,-smnpm,-smrnmi,-smstateen,-ssaia,-ssccfg,-ssccptr,-sscofpmf,-sscounterenw,-sscsrind,-ssdbltrp,-ssnpm,-sspm,-ssqosid,-ssstateen,-ssstrict,-sstc,-sstvala,-sstvecd,-ssu64xl,-supm,-svade,-svadu,-svbare,-svinval,-svnapot,-svpbmt,-svvptc,-v,-xcheri-norvc,-xcvalu,-xcvbi,-xcvbitmanip,-xcvelw,-xcvmac,-xcvmem,-xcvsimd,-xmipscmove,-xmipslsp,-xsfcease,-xsfvcp,-xsfvfnrclipxfqf,-xsfvfwmaccqqq,-xsfvqmaccdod,-xsfvqmaccqoq,-xsifivecdiscarddlone,-xsifivecflushdlone,-xtheadba,-xtheadbb,-xtheadbs,-xtheadcmo,-xtheadcondmov,-xtheadfmemidx,-xtheadmac,-xtheadmemidx,-xtheadmempair,-xtheadsync,-xtheadvdot,-xventanacondops,-xwchc,-za128rs,-za64rs,-zaamo,-zabha,-zacas,-zalrsc,-zama16b,-zawrs,-zba,-zbb,-zbc,-zbkb,-zbkc,-zbkx,-zbs,-zca,-zcb,-zcd,-zce,-zcf,-zcmop,-zcmp,-zcmt,-zdinx,-zfa,-zfbfmin,-zfh,-zfhmin,-zfinx,-zhinx,-zhinxmin,-zic64b,-zicbom,-zicbop,-zicboz,-ziccamoa,-ziccif,-zicclsm,-ziccrse,-zicntr,-zicond,-zicsr,-zifencei,-zihintntl,-zihintpause,-zihpm,-zimop,-zk,-zkn,-zknd,-zkne,-zknh,-zkr,-zks,-zksed,-zksh,-zkt,-ztso,-zvbb,-zvbc,-zve32f,-zve32x,-zve64d,-zve64f,-zve64x,-zvfbfmin,-zvfbfwma,-zvfh,-zvfhmin,-zvkb,-zvkg,-zvkn,-zvknc,-zvkned,-zvkng,-zvknha,-zvknhb,-zvks,-zvksc,-zvksed,-zvksg,-zvksh,-zvkt,-zvl1024b,-zvl128b,-zvl16384b,-zvl2048b,-zvl256b,-zvl32768b,-zvl32b,-zvl4096b,-zvl512b,-zvl64b,-zvl65536b,-zvl8192b" }

0 commit comments

Comments
 (0)