mirror of
				https://git.suyu.dev/suyu/suyu
				synced 2025-11-03 16:39:01 -06:00 
			
		
		
		
	lower_int64_to_int32: Add 64-bit atomic fallbacks
This commit is contained in:
		@@ -363,15 +363,15 @@ OPCODE(GlobalAtomicAnd64,                                   U64,            U64,
 | 
			
		||||
OPCODE(GlobalAtomicOr64,                                    U64,            U64,            U64,                                                            )
 | 
			
		||||
OPCODE(GlobalAtomicXor64,                                   U64,            U64,            U64,                                                            )
 | 
			
		||||
OPCODE(GlobalAtomicExchange64,                              U64,            U64,            U64,                                                            )
 | 
			
		||||
OPCODE(GlobalAtomicIAdd32x2,                                U32x2,          U64,            U32x2,                                                          )
 | 
			
		||||
OPCODE(GlobalAtomicSMin32x2,                                U32x2,          U64,            U32x2,                                                          )
 | 
			
		||||
OPCODE(GlobalAtomicUMin32x2,                                U32x2,          U64,            U32x2,                                                          )
 | 
			
		||||
OPCODE(GlobalAtomicSMax32x2,                                U32x2,          U64,            U32x2,                                                          )
 | 
			
		||||
OPCODE(GlobalAtomicUMax32x2,                                U32x2,          U64,            U32x2,                                                          )
 | 
			
		||||
OPCODE(GlobalAtomicAnd32x2,                                 U32x2,          U64,            U32x2,                                                          )
 | 
			
		||||
OPCODE(GlobalAtomicOr32x2,                                  U32x2,          U64,            U32x2,                                                          )
 | 
			
		||||
OPCODE(GlobalAtomicXor32x2,                                 U32x2,          U64,            U32x2,                                                          )
 | 
			
		||||
OPCODE(GlobalAtomicExchange32x2,                            U32x2,          U64,            U32x2,                                                          )
 | 
			
		||||
OPCODE(GlobalAtomicIAdd32x2,                                U32x2,          U32x2,          U32x2,                                                          )
 | 
			
		||||
OPCODE(GlobalAtomicSMin32x2,                                U32x2,          U32x2,          U32x2,                                                          )
 | 
			
		||||
OPCODE(GlobalAtomicUMin32x2,                                U32x2,          U32x2,          U32x2,                                                          )
 | 
			
		||||
OPCODE(GlobalAtomicSMax32x2,                                U32x2,          U32x2,          U32x2,                                                          )
 | 
			
		||||
OPCODE(GlobalAtomicUMax32x2,                                U32x2,          U32x2,          U32x2,                                                          )
 | 
			
		||||
OPCODE(GlobalAtomicAnd32x2,                                 U32x2,          U32x2,          U32x2,                                                          )
 | 
			
		||||
OPCODE(GlobalAtomicOr32x2,                                  U32x2,          U32x2,          U32x2,                                                          )
 | 
			
		||||
OPCODE(GlobalAtomicXor32x2,                                 U32x2,          U32x2,          U32x2,                                                          )
 | 
			
		||||
OPCODE(GlobalAtomicExchange32x2,                            U32x2,          U32x2,          U32x2,                                                          )
 | 
			
		||||
OPCODE(GlobalAtomicAddF32,                                  F32,            U64,            F32,                                                            )
 | 
			
		||||
OPCODE(GlobalAtomicAddF16x2,                                U32,            U64,            F16x2,                                                          )
 | 
			
		||||
OPCODE(GlobalAtomicAddF32x2,                                U32,            U64,            F32x2,                                                          )
 | 
			
		||||
 
 | 
			
		||||
@@ -92,6 +92,15 @@ bool IsGlobalMemory(const IR::Inst& inst) {
 | 
			
		||||
    case IR::Opcode::GlobalAtomicOr64:
 | 
			
		||||
    case IR::Opcode::GlobalAtomicXor64:
 | 
			
		||||
    case IR::Opcode::GlobalAtomicExchange64:
 | 
			
		||||
    case IR::Opcode::GlobalAtomicIAdd32x2:
 | 
			
		||||
    case IR::Opcode::GlobalAtomicSMin32x2:
 | 
			
		||||
    case IR::Opcode::GlobalAtomicUMin32x2:
 | 
			
		||||
    case IR::Opcode::GlobalAtomicSMax32x2:
 | 
			
		||||
    case IR::Opcode::GlobalAtomicUMax32x2:
 | 
			
		||||
    case IR::Opcode::GlobalAtomicAnd32x2:
 | 
			
		||||
    case IR::Opcode::GlobalAtomicOr32x2:
 | 
			
		||||
    case IR::Opcode::GlobalAtomicXor32x2:
 | 
			
		||||
    case IR::Opcode::GlobalAtomicExchange32x2:
 | 
			
		||||
    case IR::Opcode::GlobalAtomicAddF32:
 | 
			
		||||
    case IR::Opcode::GlobalAtomicAddF16x2:
 | 
			
		||||
    case IR::Opcode::GlobalAtomicAddF32x2:
 | 
			
		||||
@@ -135,6 +144,15 @@ bool IsGlobalMemoryWrite(const IR::Inst& inst) {
 | 
			
		||||
    case IR::Opcode::GlobalAtomicOr64:
 | 
			
		||||
    case IR::Opcode::GlobalAtomicXor64:
 | 
			
		||||
    case IR::Opcode::GlobalAtomicExchange64:
 | 
			
		||||
    case IR::Opcode::GlobalAtomicIAdd32x2:
 | 
			
		||||
    case IR::Opcode::GlobalAtomicSMin32x2:
 | 
			
		||||
    case IR::Opcode::GlobalAtomicUMin32x2:
 | 
			
		||||
    case IR::Opcode::GlobalAtomicSMax32x2:
 | 
			
		||||
    case IR::Opcode::GlobalAtomicUMax32x2:
 | 
			
		||||
    case IR::Opcode::GlobalAtomicAnd32x2:
 | 
			
		||||
    case IR::Opcode::GlobalAtomicOr32x2:
 | 
			
		||||
    case IR::Opcode::GlobalAtomicXor32x2:
 | 
			
		||||
    case IR::Opcode::GlobalAtomicExchange32x2:
 | 
			
		||||
    case IR::Opcode::GlobalAtomicAddF32:
 | 
			
		||||
    case IR::Opcode::GlobalAtomicAddF16x2:
 | 
			
		||||
    case IR::Opcode::GlobalAtomicAddF32x2:
 | 
			
		||||
@@ -199,6 +217,8 @@ IR::Opcode GlobalToStorage(IR::Opcode opcode) {
 | 
			
		||||
        return IR::Opcode::StorageAtomicOr32;
 | 
			
		||||
    case IR::Opcode::GlobalAtomicXor32:
 | 
			
		||||
        return IR::Opcode::StorageAtomicXor32;
 | 
			
		||||
    case IR::Opcode::GlobalAtomicExchange32:
 | 
			
		||||
        return IR::Opcode::StorageAtomicExchange32;
 | 
			
		||||
    case IR::Opcode::GlobalAtomicIAdd64:
 | 
			
		||||
        return IR::Opcode::StorageAtomicIAdd64;
 | 
			
		||||
    case IR::Opcode::GlobalAtomicSMin64:
 | 
			
		||||
@@ -215,10 +235,26 @@ IR::Opcode GlobalToStorage(IR::Opcode opcode) {
 | 
			
		||||
        return IR::Opcode::StorageAtomicOr64;
 | 
			
		||||
    case IR::Opcode::GlobalAtomicXor64:
 | 
			
		||||
        return IR::Opcode::StorageAtomicXor64;
 | 
			
		||||
    case IR::Opcode::GlobalAtomicExchange32:
 | 
			
		||||
        return IR::Opcode::StorageAtomicExchange32;
 | 
			
		||||
    case IR::Opcode::GlobalAtomicExchange64:
 | 
			
		||||
        return IR::Opcode::StorageAtomicExchange64;
 | 
			
		||||
    case IR::Opcode::GlobalAtomicIAdd32x2:
 | 
			
		||||
        return IR::Opcode::StorageAtomicIAdd32x2;
 | 
			
		||||
    case IR::Opcode::GlobalAtomicSMin32x2:
 | 
			
		||||
        return IR::Opcode::StorageAtomicSMin32x2;
 | 
			
		||||
    case IR::Opcode::GlobalAtomicUMin32x2:
 | 
			
		||||
        return IR::Opcode::StorageAtomicUMin32x2;
 | 
			
		||||
    case IR::Opcode::GlobalAtomicSMax32x2:
 | 
			
		||||
        return IR::Opcode::StorageAtomicSMax32x2;
 | 
			
		||||
    case IR::Opcode::GlobalAtomicUMax32x2:
 | 
			
		||||
        return IR::Opcode::StorageAtomicUMax32x2;
 | 
			
		||||
    case IR::Opcode::GlobalAtomicAnd32x2:
 | 
			
		||||
        return IR::Opcode::StorageAtomicAnd32x2;
 | 
			
		||||
    case IR::Opcode::GlobalAtomicOr32x2:
 | 
			
		||||
        return IR::Opcode::StorageAtomicOr32x2;
 | 
			
		||||
    case IR::Opcode::GlobalAtomicXor32x2:
 | 
			
		||||
        return IR::Opcode::StorageAtomicXor32x2;
 | 
			
		||||
    case IR::Opcode::GlobalAtomicExchange32x2:
 | 
			
		||||
        return IR::Opcode::StorageAtomicExchange32x2;
 | 
			
		||||
    case IR::Opcode::GlobalAtomicAddF32:
 | 
			
		||||
        return IR::Opcode::StorageAtomicAddF32;
 | 
			
		||||
    case IR::Opcode::GlobalAtomicAddF16x2:
 | 
			
		||||
@@ -454,6 +490,15 @@ void Replace(IR::Block& block, IR::Inst& inst, const IR::U32& storage_index,
 | 
			
		||||
    case IR::Opcode::GlobalAtomicOr64:
 | 
			
		||||
    case IR::Opcode::GlobalAtomicXor64:
 | 
			
		||||
    case IR::Opcode::GlobalAtomicExchange64:
 | 
			
		||||
    case IR::Opcode::GlobalAtomicIAdd32x2:
 | 
			
		||||
    case IR::Opcode::GlobalAtomicSMin32x2:
 | 
			
		||||
    case IR::Opcode::GlobalAtomicUMin32x2:
 | 
			
		||||
    case IR::Opcode::GlobalAtomicSMax32x2:
 | 
			
		||||
    case IR::Opcode::GlobalAtomicUMax32x2:
 | 
			
		||||
    case IR::Opcode::GlobalAtomicAnd32x2:
 | 
			
		||||
    case IR::Opcode::GlobalAtomicOr32x2:
 | 
			
		||||
    case IR::Opcode::GlobalAtomicXor32x2:
 | 
			
		||||
    case IR::Opcode::GlobalAtomicExchange32x2:
 | 
			
		||||
    case IR::Opcode::GlobalAtomicAddF32:
 | 
			
		||||
    case IR::Opcode::GlobalAtomicAddF16x2:
 | 
			
		||||
    case IR::Opcode::GlobalAtomicAddF32x2:
 | 
			
		||||
 
 | 
			
		||||
@@ -199,6 +199,26 @@ void Lower(IR::Block& block, IR::Inst& inst) {
 | 
			
		||||
        return ShiftRightLogical64To32(block, inst);
 | 
			
		||||
    case IR::Opcode::ShiftRightArithmetic64:
 | 
			
		||||
        return ShiftRightArithmetic64To32(block, inst);
 | 
			
		||||
    case IR::Opcode::SharedAtomicExchange64:
 | 
			
		||||
        return inst.ReplaceOpcode(IR::Opcode::SharedAtomicExchange32x2);
 | 
			
		||||
    case IR::Opcode::GlobalAtomicIAdd64:
 | 
			
		||||
        return inst.ReplaceOpcode(IR::Opcode::GlobalAtomicIAdd32x2);
 | 
			
		||||
    case IR::Opcode::GlobalAtomicSMin64:
 | 
			
		||||
        return inst.ReplaceOpcode(IR::Opcode::GlobalAtomicSMin32x2);
 | 
			
		||||
    case IR::Opcode::GlobalAtomicUMin64:
 | 
			
		||||
        return inst.ReplaceOpcode(IR::Opcode::GlobalAtomicUMin32x2);
 | 
			
		||||
    case IR::Opcode::GlobalAtomicSMax64:
 | 
			
		||||
        return inst.ReplaceOpcode(IR::Opcode::GlobalAtomicSMax32x2);
 | 
			
		||||
    case IR::Opcode::GlobalAtomicUMax64:
 | 
			
		||||
        return inst.ReplaceOpcode(IR::Opcode::GlobalAtomicUMax32x2);
 | 
			
		||||
    case IR::Opcode::GlobalAtomicAnd64:
 | 
			
		||||
        return inst.ReplaceOpcode(IR::Opcode::GlobalAtomicAnd32x2);
 | 
			
		||||
    case IR::Opcode::GlobalAtomicOr64:
 | 
			
		||||
        return inst.ReplaceOpcode(IR::Opcode::GlobalAtomicOr32x2);
 | 
			
		||||
    case IR::Opcode::GlobalAtomicXor64:
 | 
			
		||||
        return inst.ReplaceOpcode(IR::Opcode::GlobalAtomicXor32x2);
 | 
			
		||||
    case IR::Opcode::GlobalAtomicExchange64:
 | 
			
		||||
        return inst.ReplaceOpcode(IR::Opcode::GlobalAtomicExchange32x2);
 | 
			
		||||
    default:
 | 
			
		||||
        break;
 | 
			
		||||
    }
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user