@@ -324,7 +324,7 @@ func rewriteMOV(ctxt *obj.Link, newprog obj.ProgAlloc, p *obj.Prog) {
324
324
off := p .From .Offset
325
325
to := p .To
326
326
327
- low , high , err := split32BitImmediate (off )
327
+ low , high , err := Split32BitImmediate (off )
328
328
if err != nil {
329
329
ctxt .Diag ("%v: constant %d too large: %v" , p , off , err )
330
330
}
@@ -512,11 +512,11 @@ func signExtend(val int64, bit uint) int64 {
512
512
return val << (64 - bit ) >> (64 - bit )
513
513
}
514
514
515
- // split32BitImmediate splits a signed 32-bit immediate into a signed 20-bit
515
+ // Split32BitImmediate splits a signed 32-bit immediate into a signed 20-bit
516
516
// upper immediate and a signed 12-bit lower immediate to be added to the upper
517
517
// result. For example, high may be used in LUI and low in a following ADDI to
518
518
// generate a full 32-bit constant.
519
- func split32BitImmediate (imm int64 ) (low , high int64 , err error ) {
519
+ func Split32BitImmediate (imm int64 ) (low , high int64 , err error ) {
520
520
if ! immIFits (imm , 32 ) {
521
521
return 0 , 0 , fmt .Errorf ("immediate does not fit in 32-bits: %d" , imm )
522
522
}
@@ -909,6 +909,27 @@ func encodeRaw(p *obj.Prog) uint32 {
909
909
return uint32 (a .Offset )
910
910
}
911
911
912
+ func EncodeIImmediate (imm int64 ) (int64 , error ) {
913
+ if ! immIFits (imm , 12 ) {
914
+ return 0 , fmt .Errorf ("immediate %#x does not fit in 12 bits" , imm )
915
+ }
916
+ return imm << 20 , nil
917
+ }
918
+
919
+ func EncodeSImmediate (imm int64 ) (int64 , error ) {
920
+ if ! immIFits (imm , 12 ) {
921
+ return 0 , fmt .Errorf ("immediate %#x does not fit in 12 bits" , imm )
922
+ }
923
+ return ((imm >> 5 ) << 25 ) | ((imm & 0x1f ) << 7 ), nil
924
+ }
925
+
926
+ func EncodeUImmediate (imm int64 ) (int64 , error ) {
927
+ if ! immUFits (imm , 20 ) {
928
+ return 0 , fmt .Errorf ("immediate %#x does not fit in 20 bits" , imm )
929
+ }
930
+ return imm << 12 , nil
931
+ }
932
+
912
933
type encoding struct {
913
934
encode func (* obj.Prog ) uint32 // encode returns the machine code for an *obj.Prog
914
935
validate func (* obj.Prog ) // validate validates an *obj.Prog, calling ctxt.Diag for any issues
0 commit comments